# Chainguard Documentation Bundle

_Compiled on: 2026-09-18 02:21:30_

This document contains Chainguard documentation compiled from multiple sources.

## Usage Guide

### File Information

This documentation bundle is approximately 11MB uncompressed.

**Compatibility Notes**:
- Large language models may have different file size limits
- Some tools may require splitting the content into sections
- Search functionality varies by tool

### Example Queries

**Container Security & CVEs:**
- "Search for Chainguard container security best practices and CVE management"
- "How do I migrate from Docker Hub images to Chainguard images?"
- "Show me examples of using Chainguard images in production"
- "What's the difference between Chainguard's latest and latest-dev tags?"
- "How do I scan Chainguard images for vulnerabilities?"
- "Explain Chainguard's approach to zero CVE images"

**Development Workflows:**
- "Find information about debugging distroless containers"
- "How do I use Chainguard images with Kubernetes?"
- "What are the differences between Chainguard development and production images?"
- "Show me how to use multi-stage builds with Chainguard images"
- "How do I add custom packages to a Chainguard image?"
- "Create a Dockerfile using Chainguard's Python image for a Flask app"

**Specific Technologies:**
- "Show me Chainguard's Python/Node.js/Go image documentation"
- "Find FIPS-compliant container information"
- "How do I use Chainguard images for AI/ML workloads?"
- "What Java versions are available in Chainguard images?"
- "How to use Chainguard's PostgreSQL image with custom extensions"
- "Show examples of using Chainguard's NGINX image with custom configs"

**Security & Compliance:**
- "Search for SBOM and supply chain security information"
- "Find information about Chainguard's compliance certifications"
- "How does Chainguard help with CVE remediation?"
- "Explain how to verify Chainguard image signatures with cosign"
- "What are Chainguard's SLSA compliance levels?"
- "How to generate and analyze SBOMs for Chainguard images"

**CI/CD Integration:**
- "How do I use Chainguard images in GitHub Actions?"
- "Show me examples of using Chainguard images with GitLab CI"
- "How to set up automated vulnerability scanning for Chainguard images"
- "Best practices for caching Chainguard images in CI pipelines"
- "How to use chainctl in CI/CD workflows"

**Troubleshooting:**
- "How do I troubleshoot 'command not found' errors in distroless images?"
- "Why is my application failing to start in a Chainguard image?"
- "How to debug permission issues in Chainguard containers"
- "Common migration issues when moving from Alpine to Wolfi-based images"
- "How to identify missing dependencies in distroless containers"

**Architecture & Best Practices:**
- "Explain the architecture of Wolfi and how it differs from Alpine"
- "What is apko and how does it relate to Chainguard images?"
- "Best practices for minimizing image size with Chainguard"
- "How to implement a secure software supply chain with Chainguard"
- "Explain melange and its role in package building"

### Search Strategies

For best results when searching this document:
1. Use specific product names: `wolfi`, `apko`, `melange`, `chainctl`
2. Search for image names directly: `nginx`, `python`, `node`, `postgres`
3. Include context: `production python image` vs just `python`
4. Use technical terms: `distroless`, `CVE`, `SBOM`, `FIPS`

### Document Structure

This bundle contains publicly available documentation from Chainguard Academy, including conceptual guides, tutorials, and best practices.

---
## Table of Contents

1. [Usage Guide](#usage-guide)
2. [Documentation Content](#documentation-content)

---

## Documentation Content

### MCP Server for AI Documentation
_Path: mcp-server-ai-docs.md_

## Overview

The Chainguard AI Documentation MCP server gives AI assistants and automation tools searchable access to Chainguard's container image docs, security guides, and tool references. The server returns only the sections that match each query, so clients avoid loading the full documentation bundle into context.

## What is MCP?

[Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open protocol that standardizes how AI applications access external data and tools. An MCP server exposes structured data and tools that AI clients can call to ground their responses in real information.

## Why use the MCP server?

- **Lower context cost.** Clients fetch only the sections they need instead of loading the entire multi-megabyte bundle into every prompt.
- **Structured queries.** Look up a specific image, search for a CVE, or find a package equivalent without writing custom scrapers.
- **IDE integration.** Works with Claude Code, Claude Desktop, Cursor, and other MCP-compatible clients, so developers can reference Chainguard docs while they write code.

## Getting started

### Prerequisites

- An MCP-compatible client such as Claude Code, Claude Desktop, or Cursor

### Hosted server (recommended)

Chainguard hosts a public MCP server at `https://mcp.edu.chainguard.dev/mcp`. This is the fastest way to get started — no Docker or local setup required.

How you register the server depends on your MCP client. Clients that support HTTP transport natively can connect to the URL directly. Clients that only spawn local processes (including Claude Desktop) need a small bridge such as [`mcp-remote`](https://github.com/geelen/mcp-remote).

#### Claude Code

Run this command:

```bash
claude mcp add --transport http chainguard-docs https://mcp.edu.chainguard.dev/mcp
```

The server is available immediately. Verify it with `claude mcp list`.

> **Note:** The command sets up the docs MCP for use in the current directory. To scope use of the MCP server's availability to any directory that your user account uses, adjust the command by adding `--scope user` to the end.

#### Claude Desktop

Claude Desktop reads MCP servers from a JSON file but does not yet support HTTP transport directly. Use `mcp-remote` to bridge to the hosted server:

```json
{
  "mcpServers": {
    "chainguard-docs": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://mcp.edu.chainguard.dev/mcp"
      ]
    }
  }
}
```

The configuration file lives at:

- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

`npx` downloads and runs `mcp-remote` on demand, so Node.js must be installed on the host. Restart Claude Desktop after saving the file.

#### Cursor and other clients with native HTTP transport

Add the server URL to your client's MCP configuration:

```json
{
  "mcpServers": {
    "chainguard-docs": {
      "url": "https://mcp.edu.chainguard.dev/mcp"
    }
  }
}
```

Consult your client's documentation for the configuration file location, then restart the client. The Chainguard documentation tools appear in the next conversation.

### Local Docker setup

To run the MCP server locally, pull the container image:

```bash
docker pull ghcr.io/chainguard-dev/ai-docs:latest
```

The image's `serve-mcp` entrypoint speaks stdio, which works with any MCP client that launches local processes. For Claude Desktop, add this block to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "chainguard-docs": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/chainguard-dev/ai-docs:latest",
        "serve-mcp"
      ]
    }
  }
}
```

Restart the client after saving the file.

## Available tools

The server exposes seven tools for querying documentation, mapping packages, and checking image availability.

### `search_docs`

Search across all Chainguard documentation for relevant content.

**Parameters:**

- `query` (string, required): Search query
- `max_results` (integer, optional): Maximum results to return (default: 5)

**Example prompts:**

- "Search Chainguard docs for python CVE management"
- "Find information about FIPS compliance"
- "Search for nginx configuration examples"

### `get_image_docs`

Get documentation for a specific Chainguard container image.

**Parameters:**

- `image_name` (string, required): Image name (e.g., "python", "node", "nginx")

**Example prompts:**

- "Show me the Python image documentation"
- "Get docs for the nginx image"
- "What's in the node image?"

### `list_images`

List Chainguard container images with optional filtering. When the image catalog is available, each result includes the image's registry reference and whether documentation is available.

**Parameters:**

- `filter` (string, optional): Filter images by name (for example, "python", "nginx", "apache")

**Example prompts:**

- "List all Chainguard images"
- "Show me images related to Python"

### `get_security_docs`

Get security-related documentation including CVE management, SBOMs, and signing.

**Example prompts:**

- "How does Chainguard handle CVEs?"
- "Show me security documentation"
- "Explain SBOM generation"

### `get_tool_docs`

Get documentation for Chainguard tools and ecosystem components.

**Parameters:**

- `tool_name` (string, required): Tool name: `wolfi`, `apko`, `melange`, or `chainctl`

**Example prompts:**

- "Show me wolfi documentation"
- "How do I use apko?"
- "Explain melange"

### `find_package_equivalent`

Find the Wolfi package that replaces a Debian, Fedora, or Alpine package. Use this when migrating a Dockerfile to a Chainguard image and translating package names for `apk add`.

**Parameters:**

- `package` (string, required): Upstream OS package name (e.g., "build-essential", "libssl-dev", "python3-pip")
- `distro` (string, optional): Source distribution to search: `debian`, `fedora`, or `alpine`. Searches all distributions if omitted.

**Example prompts:**

- "What's the Wolfi equivalent of Debian's build-essential?"
- "Find the Chainguard package for libssl-dev"
- "I need to replace python3-pip in my Alpine Dockerfile"

### `check_image_freshness`

Query `cgr.dev` for how current an image is. Returns the digest and build date of the image's `latest` tag, along with the repository's tags. Falls back to catalog data if the registry is unreachable.

Tag lists omit the `sha256-` attachment tags that carry each image's signature, attestation, and SBOM, because they outnumber the image's real tags by several hundred to one.

**Parameters:**

- `image_name` (string, required): Chainguard image name (such as "python", "node", "nginx")

**Example prompts:**

- "When was the Python image last built?"
- "What tags are available for the Python image?"
- "Show me the available tags for the nginx image"
- "Is the golang image available on cgr.dev?"

## Image catalog

The `list_images` and `find_package_equivalent` tools draw from a pre-built catalog that ships with the server. The `check_image_freshness` tool queries the registry directly, and uses the catalog only to report whether an image has documentation. The catalog includes:

- Every Chainguard container image with its registry reference, sourced from the image documentation
- Package mappings from Debian, Fedora, and Alpine to their Wolfi equivalents

Each documentation build regenerates the catalog.

## Example usage

Sample exchanges from a Claude Desktop session with the server connected:

```
You: Search for python image security best practices

Claude: [Uses search_docs tool]
Based on the Chainguard documentation, here are Python image security best practices:
...
```

```
You: Show me the nginx image documentation

Claude: [Uses get_image_docs tool]
Here's the complete documentation for the Chainguard nginx image:
...
```

```
You: What's the Wolfi equivalent of Debian's build-essential?

Claude: [Uses find_package_equivalent tool]
The Wolfi equivalent of Debian's build-essential is build-base. You can install it with:
apk add build-base
...
```

```
You: Is the python image up to date?

Claude: [Uses check_image_freshness tool]
The Chainguard Python image (cgr.dev/chainguard/python) was built today. The
current digest of latest is sha256:ecf07c37..., and the repository's tags are
latest and latest-dev.
```

## Standalone installation (without Docker)

The server script and its dependencies live in the [edu repository](https://github.com/chainguard-dev/edu). The documentation files ship inside the container image, which you can extract once and reuse.

```bash
# Download the MCP server script and requirements
curl -LO https://raw.githubusercontent.com/chainguard-dev/edu/main/scripts/mcp-server.py
curl -LO https://raw.githubusercontent.com/chainguard-dev/edu/main/scripts/mcp-requirements.txt

# Extract the documentation bundle from the container image
docker run --rm --user "$(id -u):$(id -g)" \
  -v $(pwd):/output ghcr.io/chainguard-dev/ai-docs:latest extract /output
# Writes chainguard-ai-docs.md, image-catalog.json, checksums.txt, and
# verification.sh into a chainguard-ai-docs/ subdirectory

# Install dependencies
pip install -r mcp-requirements.txt

# Run the server
DOCS_PATH=chainguard-ai-docs/chainguard-ai-docs.md \
CATALOG_PATH=chainguard-ai-docs/image-catalog.json \
python3 mcp-server.py
```

The container runs as a non-root user, so pass `--user` to let it write to the mounted directory and to leave the extracted files owned by you.

To run this script under Claude Desktop, point the configuration at the local files:

```json
{
  "mcpServers": {
    "chainguard-docs": {
      "command": "python3",
      "args": ["/path/to/mcp-server.py"],
      "env": {
        "DOCS_PATH": "/path/to/chainguard-ai-docs.md",
        "CATALOG_PATH": "/path/to/image-catalog.json"
      }
    }
  }
}
```

## Self-hosting with HTTP transport

Run your own HTTP instance when you need to expose the server inside a firewall or with custom configuration.

### From the standalone script

```bash
python3 mcp-server.py --transport http --port 8080
```

The server binds to `http://0.0.0.0:8080` with the MCP endpoint at `/mcp`.

Environment variables work too:

```bash
MCP_TRANSPORT=http MCP_PORT=8080 python3 mcp-server.py
```

### From Docker

```bash
docker run --rm -p 8080:8080 ghcr.io/chainguard-dev/ai-docs:latest serve-mcp-http
```

Point your MCP client at `http://localhost:8080/mcp/`.

### CLI flags

| Flag | Env var | Default | Description |
| --- | --- | --- | --- |
| `--transport` | `MCP_TRANSPORT` | `stdio` | Transport mode: `stdio` or `http` |
| `--host` | `MCP_HOST` | `0.0.0.0` | HTTP server bind address |
| `--port` | `MCP_PORT` | `8080` | HTTP server port |

## Alternative: static documentation

If you don't need the server at all, extract the documentation file from the container:

```bash
docker run --rm --user "$(id -u):$(id -g)" -v $(pwd):/output \
  ghcr.io/chainguard-dev/ai-docs:latest extract /output
```

The bundle lands at `chainguard-ai-docs/chainguard-ai-docs.md`. Refer to the [Developer Resources](/developer-resources/) page for more on static extraction.

## Security features

The container image follows the standard Chainguard pattern:

- Built on `cgr.dev/chainguard/wolfi-base`
- Runs as a non-root user
- Signed with Cosign, with SBOM and provenance attached
- Rebuilt regularly so known CVEs do not accumulate

## Troubleshooting

### Server does not appear in Claude Desktop

1. Confirm that the configuration file path is correct for your platform.
2. Restart Claude Desktop after editing the file.
3. Check Claude Desktop's logs for parse or connection errors.
4. For the local Docker block, confirm Docker is running.

### Connection issues

Test the hosted server with `curl`:

```bash
curl -X POST https://mcp.edu.chainguard.dev/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
```

A JSON response listing the server's capabilities confirms the connection.

To test a local Docker server:

```bash
docker run --rm -i ghcr.io/chainguard-dev/ai-docs:latest serve-mcp
```

The container prints startup messages and then waits for stdio input.

### Documentation out of date

The hosted server updates automatically. For the local Docker setup, pull a fresh image:

```bash
docker pull ghcr.io/chainguard-dev/ai-docs:latest
```

## Resources

- [Model Context Protocol documentation](https://modelcontextprotocol.io/)
- [Chainguard MCP blog post](https://www.chainguard.dev/unchained/meet-chainguard-mcps-bringing-supply-chain-security-to-the-ai-era)
- [Developer Resources](/developer-resources/)
- [Chainguard Images Directory](https://images.chainguard.dev/)

## Need help?

- [Get support](/get-started/get-support/)
- [Community Slack](https://join.slack.com/t/chainguardcommunity/shared_invite/zt-3nttdr807-V9BJHayWvsB0KbHsfZO5Rw)
- [GitHub Issues](https://github.com/chainguard-dev/edu/issues)

---

### Chainguard Community Guidelines!
_Path: guidelines.md_

This space is for developers, engineers, and security pros who are building and learning together to secure the software supply chain—from distroless containers to CVE-free deployments.

We’re glad you’re here. To keep this space productive and respectful, please follow these community guidelines:

## 1. Be kind and respectful to one another.

* Assume good intent. We all come from different backgrounds, skill levels, and communication styles.
* Encourage curiosity and questions — no gatekeeping or shaming.

## 2. Stay on topic when posting!

* Use the relevant channels.
* Ask questions, share tips, post relevant resources.
* For memes or off-topic convos, head to #memes or #overheard — we love a good laugh.

## 3. Help each other (there are no dumb questions, either!)

* Don't be afraid to ask “basic” questions—someone else is probably wondering the same.
* Share what worked for you. Bonus points for linking docs, examples, or GitHub issues.
* Be constructive when offering feedback or corrections.

## 4. Respect privacy & security.

* Don’t share private customer data, credentials, or anything sensitive.
* If you see something that violates these guidelines, DM the @chainguard-team.

## 5. This is a Community, Not Support

* While Chainguard team members may participate, this Slack isn’t a replacement for official support and is outside of our formal SLAs.
* If you are interested in Enterprise Support from Chainguard, we recommend getting in touch with our Sales team to discuss options tailored to your needs.

## 6. By Being Here, You Agree To:

* Follow these guidelines.
* Help us keep this a welcoming space.
* Remember: we're building something better—together.

Got questions about the guidelines or ideas for improvement? DM the @chainguard-team — we're always listening and here to help!

---

### AI Documentation Security
_Path: ai-docs-security.md_

## Overview

Chainguard's AI documentation bundles are compiled with multiple security measures to ensure developers can trust the content they're using with AI coding assistants. This page details our security practices and compilation process.

## Security Measures

### 1. Automated Security Scanning

Every compilation runs through multiple security checks:

- **Secret Detection**: We scan for API keys, tokens, and other sensitive data
- **Pattern Matching**: Common secret patterns are automatically redacted
- **Bundle Size Limit**: The build fails if the compiled bundle exceeds 50 MB
- **Extension Filtering**: Only `.md`, `.html`, `.json`, and `.yaml` files are processed

### 2. Cryptographic Signatures

All documentation bundles are signed using Sigstore/Cosign:

- **Keyless Signing**: Using OIDC identity verification
- **Transparency Log**: All signatures recorded in Rekor
- **Certificate Chain**: Full certificate provided for verification
- **Multiple Signatures**: Both individual files and bundles are signed

### 3. Content Integrity

We ensure content hasn't been tampered with:

- **SHA-256 Checksums**: For all files in the bundle
- **Signed Checksums**: The checksum file itself is signed
- **Build Provenance**: GitHub Actions workflow attestations
- **Container Signing**: Images signed by immutable digest with Cosign

## Compilation Process

### Source Repositories

Documentation is compiled from these official repositories:

1. **chainguard-dev/edu**: Main documentation site
2. **chainguard-dev/courses**: Learning materials
3. **chainguard-images/images-private**: Image documentation
4. **chainguard-dev/dfc**: Package and image mappings from the Dockerfile Converter

> **Note:** The Dockerfile Converter mappings do not currently reach the compiled bundle. We're tracking a fix.

### Build Environment

- **GitHub Actions**: Secure, ephemeral build environment
- **Resource Limits**: CPU and memory constraints enforced
- **Restricted Egress**: Network access limited to required endpoints via [StepSecurity Harden Runner](https://github.com/step-security/harden-runner)
- **Minimal Permissions**: Only required repository access

### What Gets Filtered

During compilation, we automatically remove:

- Environment variables and secrets
- Internal URLs and endpoints
- Base64 encoded data blocks
- Private key materials
- Authentication tokens

Example patterns we redact:

- `api_key=...`
- `password=...`
- `-----BEGIN PRIVATE KEY-----`
- GitHub tokens (`ghp_`, `ghs_`)

## Verification Guide

### Container Image Verification

Verify the container image signature before pulling documentation:

```bash
cosign verify ghcr.io/chainguard-dev/ai-docs:latest \
  --certificate-identity-regexp ".*github.com/chainguard-dev/edu.*" \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
```

## Build Frequency

- **Scheduled Builds**: Nightly at 2 AM UTC
- **On-Demand**: Triggered by documentation changes or cross-repo updates via `repository_dispatch`
- **Container Distribution**: Updated container pushed to GHCR on each build

## Security Reporting

If you discover a security issue:

1. **Do NOT** open a public issue
2. Email security@chainguard.dev
3. Include:
   - Description of the issue
   - Steps to reproduce
   - Potential impact

## FAQ

### Why are some sections marked [REDACTED]?

This indicates our security scanner detected potentially sensitive information and removed it to protect our systems and users.

### Can I build the bundle myself?

Yes! The compilation scripts are open source:

```bash
git clone https://github.com/chainguard-dev/edu
cd edu
python3 scripts/compile_docs.py
```

### How do I verify the build logs?

Build logs are public on GitHub Actions:

- [View Build Logs](https://github.com/chainguard-dev/edu/actions/workflows/compile-ai-docs-from-gcs.yaml)

### What if verification fails?

1. Ensure you have the latest version of cosign
2. Check your internet connection (for transparency log verification)
3. Try downloading the files again
4. Report persistent issues to support@chainguard.dev

## Additional Resources

- [Sigstore Documentation](https://docs.sigstore.dev/)
- [Cosign Installation](https://docs.sigstore.dev/cosign/system_config/installation/)
- [Supply Chain Security](https://slsa.dev/)
- [Chainguard Security Practices](https://security.chainguard.dev/)

---

### Developer Resources
_Path: developer-resources.md_

## AI-ready documentation bundle

This page describes a compiled bundle of Chainguard documentation that you can feed to AI coding assistants such as Claude, ChatGPT, or GitHub Copilot. Use it through the Chainguard-built container image or run the bundle as a Python MCP server.

### What's included

- Complete Chainguard Containers documentation
- Security best practices and CVE management
- Migration guides and tutorials
- API references and code examples
- Wolfi, melange, and apko documentation
- Compliance and supply chain security guides

## Download the AI documentation bundle

<div style="background-color: var(--blockquote-background); border-left: 4px solid var(--link-color, #2196F3); padding: 20px; border-radius: 4px; margin: 20px 0;">
  <h3 style="margin-top: 0; color: var(--body-color);">MCP server support</h3>
  <p style="color: var(--body-color);">Run the container as an <strong>MCP (Model Context Protocol) server</strong> for searchable, on-demand access to Chainguard documentation in AI assistants and IDEs.</p>
  <p><a href="/mcp-server-ai-docs/" style="font-weight: bold; text-decoration: none; color: var(--link-color, #2196F3);">→ Full MCP server documentation</a></p>
</div>

Two distribution methods are available:

<div style="background-color: var(--blockquote-background); border-left: 4px solid #4CAF50; padding: 16px; border-radius: 4px; margin: 20px 0;">
  <strong>Container distribution is recommended.</strong><br>
  The Chainguard container image includes verification scripts, runs as a non-root user, and is built on <code>wolfi-base</code>. Use it unless you have a reason to download files directly.
</div>

### Container distribution

Pull the container, then run it to print usage, verify the bundle, or extract the documentation:

```bash
# Pull the container image (built on Chainguard wolfi-base)
docker pull ghcr.io/chainguard-dev/ai-docs:latest

# Print available commands
docker run --rm ghcr.io/chainguard-dev/ai-docs:latest

# Verify documentation integrity
docker run --rm ghcr.io/chainguard-dev/ai-docs:latest verify

# Extract documentation into a chainguard-ai-docs/ subdirectory
docker run --rm --user "$(id -u):$(id -g)" \
  -v $(pwd):/output ghcr.io/chainguard-dev/ai-docs:latest extract /output
```

The container runs as a non-root user, so pass `--user` to let it write to the mounted directory and to leave the extracted files owned by you.

**Container features:**

- Built on Chainguard's minimal `wolfi-base` image
- Runs as a non-root user
- Includes verification scripts and checksums
- Signed with Cosign
- Rebuilt whenever the documentation changes

**Verify the container signature:**

```bash
cosign verify ghcr.io/chainguard-dev/ai-docs:latest \
  --certificate-identity-regexp ".*github.com/chainguard-dev/edu.*" \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
```

### MCP server (Model Context Protocol)

**Recommended for:** developers, agent workflows, IDE integration.

Run the same container as an MCP server so AI assistants can search the documentation on demand:

```bash
# Run as MCP server
docker run --rm -i ghcr.io/chainguard-dev/ai-docs:latest serve-mcp
```

**Available MCP tools:**

- `search_docs` — search across all documentation
- `get_image_docs` — return docs for a specific container image
- `list_images` — list and filter available images
- `get_security_docs` — return CVE and security information
- `get_tool_docs` — return Wolfi, apko, melange, or chainctl docs
- `find_package_equivalent` — map a Debian, Fedora, or Alpine package to its Wolfi equivalent
- `check_image_freshness` — query the registry for an image's current digest, build date, and tags

**Claude Desktop configuration:**

Add this block to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "chainguard-docs": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "ghcr.io/chainguard-dev/ai-docs:latest", "serve-mcp"]
    }
  }
}
```

To use the hosted server instead of running a container locally, refer to the [hosted server instructions](/mcp-server-ai-docs/#hosted-server-recommended) — Claude Desktop reaches it through the [`mcp-remote`](https://github.com/geelen/mcp-remote) bridge. A [standalone Python script](/mcp-server-ai-docs/#standalone-installation-without-docker) is also available for setups without Docker.

[**Full MCP server documentation →**](/mcp-server-ai-docs/)

### Quick start

```bash
# Extract current documentation from the container image
docker run --rm --user "$(id -u):$(id -g)" \
  -v $(pwd):/output ghcr.io/chainguard-dev/ai-docs:latest extract /output

# chainguard-ai-docs/chainguard-ai-docs.md is ready to use with your AI assistant
```

### Security features

<div style="border: 2px solid #4CAF50; padding: 20px; border-radius: 8px; margin: 20px 0;">
  <h4>Bundle security</h4>
  <ul>
    <li>Container image signed with Sigstore/Cosign</li>
    <li>Distributed through GitHub Container Registry</li>
    <li>Rebuilt through GitHub Actions whenever the documentation changes</li>
    <li>Scanned for credential patterns during the build</li>
  </ul>
</div>

### Security transparency

<div style="background-color: var(--blockquote-background); border: 1px solid var(--sidebar-item-list-item-selected-background); padding: 16px; border-radius: 6px; margin: 20px 0;">
  <strong>Security first.</strong> The documentation bundles are compiled under controls described on the security page.
  <a href="/ai-docs-security" style="font-weight: bold;">Learn about our security practices →</a>
</div>

Security resources:

- **[Security and compilation process](/ai-docs-security)** — measures and verification steps
- [Build logs](https://github.com/chainguard-dev/edu/actions/workflows/compile-ai-docs-from-gcs.yaml) — public compilation logs
- [Source code](https://github.com/chainguard-dev/edu/tree/main/scripts) — open-source compilation scripts

### How to use the bundle with AI assistants

1. Download and verify the documentation bundle using one of the methods above.
2. Open your AI assistant (Claude, ChatGPT, and others).
3. Upload or paste the markdown file into the conversation.
4. Start coding with Chainguard context available to the assistant.

### Example prompts for common tasks

Once the documentation is loaded, try these prompts with your AI assistant:

#### Container security and CVEs

- "Search for Chainguard container security best practices and CVE management"
- "How do I migrate from Docker Hub images to Chainguard images?"
- "Show me examples of using Chainguard images in production"
- "What's the difference between Chainguard's latest and latest-dev tags?"
- "How do I scan Chainguard images for vulnerabilities?"
- "Explain Chainguard's approach to zero CVE images"

#### Development workflows

- "Find information about debugging distroless containers"
- "How do I use Chainguard images with Kubernetes?"
- "What are the differences between Chainguard development and production images?"
- "Show me how to use multi-stage builds with Chainguard images"
- "How do I add custom packages to a Chainguard image?"
- "Create a Dockerfile using Chainguard's Python image for a Flask app"

#### Specific technologies

- "Show me Chainguard's Python/Node.js/Go image documentation"
- "Find FIPS-compliant container information"
- "How do I use Chainguard images for AI/ML workloads?"
- "What Java versions are available in Chainguard images?"
- "How to use Chainguard's PostgreSQL image with custom extensions"
- "Show examples of using Chainguard's NGINX image with custom configs"

#### Security and compliance

- "Search for SBOM and supply chain security information"
- "Find information about Chainguard's compliance certifications"
- "How does Chainguard help with CVE remediation?"
- "Explain how to verify Chainguard image signatures with cosign"
- "What are Chainguard's SLSA compliance levels?"
- "How to generate and analyze SBOMs for Chainguard images"

#### CI/CD integration

- "How do I use Chainguard images in GitHub Actions?"
- "Show me examples of using Chainguard images with GitLab CI"
- "How to set up automated vulnerability scanning for Chainguard images"
- "Best practices for caching Chainguard images in CI pipelines"
- "How to use chainctl in CI/CD workflows"

#### Troubleshooting

- "How do I troubleshoot 'command not found' errors in distroless images?"
- "Why is my application failing to start in a Chainguard image?"
- "How to debug permission issues in Chainguard containers"
- "Common migration issues when moving from Alpine to Wolfi-based images"
- "How to identify missing dependencies in distroless containers"

#### Architecture and best practices

- "Explain the architecture of Wolfi and how it differs from Alpine"
- "What is apko and how does it relate to Chainguard images?"
- "Best practices for minimizing image size with Chainguard"
- "How to implement a secure software supply chain with Chainguard"
- "Explain melange and its role in package building"

### Benefits for AI-assisted development

- **Complete context.** The assistant can see all Chainguard documentation at once.
- **Better code suggestions.** The assistant grounds its output in actual Chainguard patterns.
- **Faster development.** No need to search through multiple documentation pages.
- **Accurate answers.** Responses come from official Chainguard documentation rather than the model's training data.

### Updates

The container image rebuilds whenever the documentation changes, and the downloadable bundle refreshes nightly. Each one carries its compilation date at the top of the file.

### Need help?

If you have questions or need assistance:

- Read [Get support](/get-started/get-support/) to find the right channel and open a ticket
- Join our [community Slack](https://join.slack.com/t/chainguardcommunity/shared_invite/zt-3nttdr807-V9BJHayWvsB0KbHsfZO5Rw)
- Browse the [documentation site](https://edu.chainguard.dev)

---

### Overview of CIS Benchmarks
_Path: compliance/cis-benchmarks.md_

The [Center for Internet Security](https://www.cisecurity.org/) (CIS) is a nonprofit organization dedicated to enhancing the cybersecurity posture of organizations worldwide. Founded in 2000, CIS aims to develop best practices and guidelines that help organizations protect themselves against cyber threats.

CIS's mission is to foster collaboration among security professionals, policymakers, and industry leaders to safeguard both public and private organizations against cyber threats. One of the ways it does this is by publishing CIS Benchmarks: a set of recommendations that, when applied to a given tool, can help to harden it against threats.

This conceptual article serves as a high-level overview of CIS Benchmarks.

## What are CIS Benchmarks?

As mentioned in the introduction, CIS Benchmarks are a set of best practices and configuration guidelines designed to improve the security of various systems, applications, and networks. These benchmarks are widely recognized as authoritative standards for securing IT systems, and are developed through a consensus-driven process involving industry experts.

CIS benchmarks cover a wide range of platforms, including operating systems, cloud providers, web browsers, network devices, and application software. Each benchmark provides detailed recommendations and prescriptive guidance on how to configure systems securely. They focus on areas such as user access controls, password policies, and network security settings.

By following CIS benchmarks, organizations can significantly reduce their vulnerability to cyber threats. Additionally, many regulatory frameworks and standards recognize CIS benchmarks, making them useful for achieving compliance.

You can find the full list of available CIS Benchmarks on [the CIS website](https://www.cisecurity.org/cis-benchmarks).

### Structure of CIS Benchmarks

CIS Benchmarks are distributed as PDF documents from the CIS website at no cost. After completing the [CIS Benchmarks PDF download form](https://learn.cisecurity.org/benchmarks), you can access all the Benchmark documents.

> **Note**: By signing up for a CIS SecureSuite Membership you can download Benchmarks in a variety of other formats, including Word or Excel documents.

CIS Benchmarks start with a brief overview of what it covers and lay out any typographical conventions or definitions specific to the Benchmark. They also define configuration profiles which can help users understand what recommendations they actually need to implement.

For example, the CIS Google Chrome Benchmark has two profiles: Level 1 is for general use in Corporate/Enterprise environments and Level 2 is for High Security or Sensitive Data environments that only need limited functionality. In this case, Level 2 is an extension of Level 1; any recommendations for organizations that fit the Level 1 profile should also be implemented for Level 2 organizations, but not vice versa.

The Benchmark will then go into individual recommendations relating to the tool it covers. These recommendations typically have the following fields:

* **Profile Applicability**: the configuration profile (mentioned above) which the recommendation applies to
* **Description**: a brief description of the recommendation
* **Rationale**: the reasoning for the recommendation, with details on how it can improve security
* **Impact**: the effect that implementing the recommendation would have on the tool's default behavior
* **Audit**: details on how you can check whether the recommendation has been implemented
* **Remediation**: details on how to establish the recommended configuration
* **Default Value**: the tool's default value, before the recommendation has been implemented
* **References**: a list of resources which informed CIS's recommendation
* **CIS Controls**: the relevant CIS Controls for the recommendation

Regarding this last bullet, [CIS Controls](https://www.cisecurity.org/controls) are more high-level recommendations than Benchmarks. CIS Benchmarks are best practices for specific tools, while CIS Controls are more simplified general recommendations that can be applied to a variety of technologies.

## Chainguard Containers and the CIS Docker Benchmark

Section 4 of the CIS Docker Benchmark — **"Container Images and Build File Configuration"** — is the section most relevant to Chainguard Containers. Chainguard container images are generally conformant with Section 4, with a few caveats:

* **Benchmark 4.5 (Content Trust)**: Chainguard does not use [Docker Content Trust](https://docs.docker.com/engine/security/trust/). Instead, all images are signed with [Cosign](https://docs.sigstore.dev/cosign/signing/overview/), which is more robust and accomplishes the same security objective. Because the benchmark prescribes Docker Content Trust specifically, whether Cosign satisfies this requirement in a formal audit is at the auditor's discretion.
* **Benchmark 4.6 (HEALTHCHECK)**: Chainguard images do not include [Docker `HEALTHCHECK`](https://docs.docker.com/reference/dockerfile/#healthcheck) instructions. Docker health checks are not compatible with Kubernetes, where health checking is handled at the orchestration layer. Chainguard Containers do not meet this benchmark.
* **Build-time recommendations (e.g., 4.9)**: Some benchmarks apply to how images are built rather than to the base image itself. Chainguard base images follow these recommendations internally, but compliance of any downstream image depends on the practices you follow when extending them.

For all other Section 4 benchmarks, the security properties they describe (minimal footprint, non-root execution, trusted base images, and reduced attack surface) are core to what Chainguard Containers provide.

If you have specific compliance questions or need documentation for an audit, [contact Chainguard](https://www.chainguard.dev/contact).

## Learn more

By implementing CIS benchmarks, organizations not only improve their security against evolving cyber threats but also align with regulatory standards, ensuring compliance and minimizing risks. To explore the full range of benchmarks and start implementing these best practices, visit the [CIS website](https://www.cisecurity.org/cis-benchmarks) today.

Additionally, you may find our resources on other [compliance frameworks](/compliance/) to be of interest.

---

### SLSA 1.1
_Path: compliance/slsa/_index.md_

SLSA (pronounced “salsa”), or Supply chain Levels for Software Artifacts, is a framework to help you assess and improve the security of software you create or consume.

---

### Introduction to SLSA
_Path: compliance/slsa/what-is-slsa.md_

SLSA (pronounced “salsa”), or Supply chain Levels for Software Artifacts, is a security framework consisting of standards and controls that prevent tampering, improve integrity, and secure packages and infrastructure. While cyberattacks like [SolarWinds](/software-security/glossary/#solarwinds-hack) and [Codecov](https://www.reuters.com/technology/codecov-hackers-breached-hundreds-restricted-customer-sites-sources-2021-04-19/) have demonstrated the importance of protecting software from tampering and malicious compromise, the complexity of the software development lifecycle can leave many feeling unable to adequately understand or respond to these specific security issues.

[Released by Google’s Open Source Security Team](https://security.googleblog.com/2021/06/introducing-slsa-end-to-end-framework.html) in 2021, SLSA was created as a framework to help software creators understand where and how they can harden their supply chain security practices, and help software consumers evaluate the integrity of a software product or component before they decide to use it. SLSA was also designed around the creation of verifiable metadata, so that software consumers can set automated policies to prevent the deployment of code that does not meet their preferred SLSA level.

Today, SLSA is a vendor-neutral project supported by the [Open Source Security Foundation](https://openssf.org/) and is actively evolving its standards and supporting tools with industry input. In this guide, you will learn about SLSA tracks, levels, and security requirements, as well as emerging tools that can help you meet these requirements.

## SLSA tracks and levels

SLSA uses a track structure, dividing requirements for key pillars of supply chain security into separate categories. This permits organizations to focus on hardening one aspect of their security without being blocked by the status of a different track.

SLSA levels are designed to function as a ladder so that developers and organizations can work incrementally towards achieving a security posture appropriate for their risk profile. Some software projects may take more time to advance up the ladder, so this framework offers a piecemeal approach that may be more realistic (and encouraging) than trying to meet all of the requirements at once.

As of this writing, SLSA offers [a build track with three ascending levels of security](https://slsa.dev/spec/v1.2/#build-track), each containing a set of security requirements that expands on those of the prior level. The SLSA project has proposed adding additional tracks in a prospective version.

Note that these tracks, levels, and/or their requirements may shift with the release of [future SLSA versions](https://slsa.dev/spec/v1.2/future-directions).

### Build track

Focusing on an artifact's [_provenance_](/software-security/glossary/#provenance), the build track outlines three levels designed to provide verification that artifacts meet build expectations. Establishing provenance gives consumers information about who built an artifact, what inputs were used, and what process was used to build it. Comparing an artifact’s expected and actual provenance can help to stop supply chain threats in their tracks by ensuring artifacts are constructed from trustworthy materials, by credible sources. SLSA recommends its [SLSA Provenance format](https://slsa.dev/spec/v1.2/provenance) for meeting provenance expectations.

### Build level 1

_Provenance showing how the package was built_

Level 1 sets a foundation for working towards subsequent build track levels. Software production methods must be consistent so standard expectations for future builds are set. In addition, artifact provenance containing information on the build must be automatically generated by the build platform. Software producers are responsible for distributing provenance metadata with package releases.

While Level 1 does not prevent tampering, fulfilling its requirements represents an important first step in securing your software supply chain. Labeling your software with this level can also help consumers make informed decisions about whether it has been sufficiently secured and verified for their applications. For more information on getting started with reaching Level 1, visit [SLSA’s quick start guide](https://slsa.dev/get-started#slsa-1).

### Build level 2

_Signed provenance, generated by a hosted build platform_

Adding to the requirements of Level 1, Level 2 requires the use of a hosted build service like GitHub Actions, Google Cloud Build, or Travis CI rather than a developer’s local environment. The hosted service must sign the provenance it generates through the use of [_digital signatures_](/software-security/glossary/#code-signing), a method of verifying the authenticity and integrity of the software artifact.

The stricter requirements for Level 2 help provide more protection against software tampering and enable greater levels of trust that the provenance data is accurately represented. For more information, check out SLSA's guide on [reaching level 2](https://slsa.dev/get-started#slsa-2).

### Build level 3

_Hardened build platform_

As the highest level of the build track, Level 3 aims to increase trust and harden infrastructure through a variety of requirements designed to meet specific threats. The requirements are as follows:

* **[Isolated](https://slsa.dev/spec/v1.2/build-requirements#isolation-strength)**: The build steps must be run in an isolated environment without risk of influence from other build processes, such as a container or VM, that has been created specifically for the build. Environments must not be reused.
* **[Unforgeable](https://slsa.dev/spec/v1.2/build-requirements#provenance-generation)**:  It must be impossible for the build service’s users to falsify provenance information. All provenance information must be generated by the build service in a trusted control plane, except for noted exceptions.

Achieving Level 3 typically means the build system is resistant to most known supply-chain attacks — for example, it can prevent an attacker who has compromised one build from inserting code into another project’s build. It also often entails strong access controls, monitoring, and security policies on the pipeline. Level 3 provides a high level of assurance: even sophisticated adversaries would need to find novel vulnerabilities in the hardened build environment to compromise the software.

Generating provenance compliant with Level 3 requirements can help end users verify the integrity of the software before implementing it. Recently, SLSA released the open source [SLSA 3 Container Generator for GitHub Actions](https://github.com/slsa-framework/slsa-github-generator) that helps ease the process by allowing you to build automated provenance generation into your container workflows. To learn more about how it works, visit the [General availability of SLSA 3 Container Generator for GitHub Actions](https://slsa.dev/blog/2023/02/slsa-github-workflows-container-ga) announcement blog post. You can also check out SLSA's guide on [reaching level 3](https://slsa.dev/get-started#slsa-3).

## SLSA tools and practices

The SLSA framework and its supporting tools and practices are still actively evolving. Some of the previously listed level requirements can be met using popular build and version control systems. More specific requirements may require additional tooling, and SLSA hosts some supporting tools in its [GitHub repositories](https://github.com/slsa-framework). As mentioned in the description of Level 3, [SLSA released a tool for automating provenance generation](https://slsa.dev/blog/2023/02/slsa-github-workflows-container-ga) with GitHub Actions in February 2023.  

To verify the SLSA provenance of a piece of software, you can use the [`slsa-verifier` tool](https://github.com/slsa-framework/slsa-verifier), which can verify a provenance generated by the [`slsa-github-generator`](https://github.com/slsa-framework/slsa-github-generator) tool or Google Cloud Build. Other tools, like Sigstore’s open source [Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) allow you to create policies around SLSA requirements in your Kubernetes cluster.

Developers are also encouraged to include the corresponding SLSA level badge ([Level 1](https://slsa.dev/images/gh-badge-level1.svg), [Level 2](https://slsa.dev/images/gh-badge-level2.svg), [Level 3](https://slsa.dev/images/gh-badge-level3.svg)) in their README once their codebase meets the level’s requirements.  

## Learn more

In this guide, you learned about how SLSA helps secure the software supply chain, the requirements for its three build track security levels, and some of the tools used to implement or confirm these levels. This knowledge will help you work towards achieving SLSA levels for your software projects, assess external software based on its SLSA levels, and use admissions controllers to set SLSA-based policies in your codebase.

While SLSA provides a strong framework for verifying the authenticity and integrity of software, it is important to note that it does not protect against every type of supply chain attack. For example, SLSA requirements cannot prevent attacks enabled through vulnerable code, vulnerable build platforms, or collusion between high level actors. Still, SLSA offers a powerful framework for defending against common supply chain threats, and will likely emerge as a standard component of modern software as tooling and community adoption evolves.

To learn more about SLSA, you can visit the [SLSA website](https://slsa.dev/), read an [in-depth overview of SLSA requirements](https://slsa.dev/spec/v1.2/requirements), or explore the [SLSA repository on GitHub](https://github.com/slsa-framework).

---

### SLSA compliance at Chainguard
_Path: compliance/slsa/slsa-chainguard.md_

SLSA (pronounced "salsa"), or Supply chain Levels for Software Artifacts, is a security framework consisting of standards and controls that prevent tampering, improve integrity, and secure packages and infrastructure. It is described in depth in [What is SLSA?](/compliance/slsa/what-is-slsa/).

All Chainguard products — including Chainguard Containers, Guarded VMs, and Chainguard Libraries — are SLSA Level 3 compliant to provide confidence in the security of these products.

This page describes what we have done to bring Chainguard products into full SLSA Level 3 compliance.

## Isolated and tamper-resistant builds

Every Chainguard build now runs in a dedicated, ephemeral environment that starts from a clean slate. This build isolation ensures that no build can influence another, eliminating insider meddling or cross-contamination between builds. By provisioning short-lived build environments on demand, we greatly reduce the risk of any malware persistence or [cache poisoning](https://en.wikipedia.org/wiki/Cache_poisoning) across builds.

## Unforgeable provenance and chain of trust

SLSA 3 requires that each artifact’s provenance (the record of how, when, and by whom it was built) be generated by a trusted service and cryptographically signed. In our process, the build system’s control plane creates this tamper-proof provenance data — build runners cannot falsify it. This means every container image or VM has an auditable "paper trail" back to its source, establishing a robust chain-of-trust for our software.

## Secured signing keys and secrets

We’ve further hardened our build platform to protect sensitive credentials. Signing keys and other secrets never reside on the build workers; instead, signing happens in a separate, secure service after the build completes. This separation ensures that even if a build job were compromised, it cannot access the keys needed to sign artifacts or attestations. By keeping signing operations isolated and secured, we prevent attackers or rogue insiders from forging trusted artifacts.

## Full traceability and transparency

With SLSA 3, every Chainguard artifact comes with detailed metadata and documentation about how it was built. We generate build provenance and a Software Bill of Materials (SBOM) for each release, with complete visibility into the software supply chain behind our Container and VM images.

## Looking to the future

Reaching SLSA Level 3 compliance with any product is a major achievement, but even more is planned.

Refer to [the blog post announcement](http://chainguard.dev/unchained/this-shit-is-hard-slsa-l3-and-beyond) for more details.

## Sample provenance code

To pull an attestation, you must first [authenticate to Chainguard's registry](/chainguard/containers/registry/authenticating/).

Then you can download an attestation of provenance.

If you are a customer, replace $CUSTOMERNAME in this example with your Chainguard registry customer name.

```
cosign download attestation --predicate-type=https://slsa.dev/provenance/v1 cgr.dev/$CUSTOMERNAME/node-fips:latest | jq -r .payload | base64 -d | jq .predicate
```

This example returns the following output:

```
{
  "buildDefinition": {
    "buildType": "https://chainguard.dev/buildtypes/apkoaas/v1",
    "externalParameters": {
      "image-configuration": {
        "accounts": {
          "groups": [
            {
              "gid": 65532,
              "groupname": "nonroot"
            }
          ],
          "run-as": "0",
          "users": [
            {
              "gid": 65532,
              "homedir": "/home/nonroot",
              "uid": 65532,
              "username": "nonroot"
            }
          ]
        },
        "annotations": {
          "dev.chainguard.package.main": "bash",
          "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/",
          "org.opencontainers.image.base.digest": "sha256:fbc73f29218d5f88f09a0b5593a6f8ad7ea521e6406a3d30fad211935fb6a6a7",
          "org.opencontainers.image.source": "https://github.com/chainguard-images/images-private/tree/main/images/bash",
          "org.opencontainers.image.url": "https://images.chainguard.dev/directory/image/bash/overview",
          "org.opencontainers.image.vendor": "Chainguard"
        },
        "archs": [
          "amd64"
        ],
        "contents": {
          "packages": [
            "bash=5.2.37-r33",
            "busybox=1.37.0-r46",
            "ca-certificates-bundle=20241121-r42",
            "chainguard-baselayout=20230214-r13",
            "curl=8.14.1-r2",
            "cyrus-sasl=2.1.28-r42",
            "gdbm=1.25-r2",
            "glibc-locale-posix=2.41-r50",
            "glibc=2.41-r50",
            "heimdal-libs=7.8.0-r41",
            "keyutils-libs=1.6.3-r35",
            "krb5-conf=1.0-r6",
            "krb5-libs=1.21.3-r42",
            "ld-linux=2.41-r50",
            "libbrotlicommon1=1.1.0-r5",
            "libbrotlidec1=1.1.0-r5",
            "libcom_err=1.47.2-r22",
            "libcrypt1=2.41-r50",
            "libcrypto3=3.5.0-r3",
            "libcurl-openssl4=8.14.1-r2",
            "libgcc=15.1.0-r1",
            "libidn2=2.3.8-r2",
            "libldap=2.6.10-r2",
            "libnghttp2-14=1.66.0-r0",
            "libpsl=0.21.5-r5",
            "libssl3=3.5.0-r3",
            "libunistring=1.3-r3",
            "libverto=0.3.2-r5",
            "libxcrypt=4.4.38-r2",
            "ncurses-terminfo-base=6.5_p20241228-r3",
            "ncurses=6.5_p20241228-r3",
            "readline=8.2.13-r5",
            "sqlite-libs=3.50.1-r0",
            "wolfi-baselayout=20230201-r21",
            "zlib=1.3.1-r50"
          ],
          "repositories": [
            "https://apk.cgr.dev/f69ce42a381de40f0f386e5633b145e40ef84de3"
          ]
        },
        "entrypoint": {
          "command": "/bin/bash -c"
        },
        "layering": {
          "budget": 10,
          "strategy": "origin"
        }
      }
    },
    "internalParameters": {
      "cloud": {
        "instanceId": "0069c7a98814814175f936ea53c1d4106d910363a23ae2c7e1a8caae21b5c3a0e95ff40d47fcba2fa188ee3fef00c860323d445a8e89c2f864fc5bf5525d6c87f9fb6ea7caf33008b353bb7f0f74b095dc1d769c5dcf15",
        "region": "projects/554579655540/regions/us-central1",
        "type": "gcp"
      }
    }
  },
  "runDetails": {
    "builder": {
      "id": "https://chainguard.dev/prod/builders/apkoaas/v1",
      "version": {
        "apko": "v0.27.9",
        "apkoaas": "16913c6fa81a3c5448ae25068359c040dcb50a73"
      }
    },
    "metadata": {
      "finishedOn": "2025-06-24T08:00:45.200379604Z",
      "startedOn": "2025-06-24T08:00:42.738341658Z"
    }
  }
}
```

---

### CMMC 2.0 practices
_Path: compliance/cmmc-2/cmmc-practices.md_

Cybersecurity Maturity Model Certification (CMMC) 2.0 requires a progressive set of practices. Level 1 has 17 practices. Level 2 includes Level 1 practices plus an additional 110 practices. Level 3 practices include Level 2 practices, plus additional practices that are still being determined. These practices are divided into 14 domains, each of which covers a different aspect of cybersecurity.

Wait, you may be wondering. Are “practices” the same as “controls” or “requirements?” This can be a point of confusion, as CMMC 2.0 refers to its requirements as “practices”, yet the majority are taken from NIST SP 800-171 and NIST SP 800-172 standards or requirements.

## Naming conventions for CMMC 2.0 practices/controls

CMMC 2.0 practices are labeled using the format “DD.L#-REQ”, where:

- DD is the two-letter domain abbreviation
- L# is the level number
- REQ is the NIST SP 800-171 Rev 2 or NIST SP 800-172 security requirement number

## CMMC 2.0 practice/control domains

Below is a table overview of the domains:

| Domain | Description | Example Practice/Control |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| **Access Control (AC)** | Manage and restrict access to information systems to ensure that only authorized users and processes can interact with the system, protecting sensitive data from unauthorized access. | AC.L1-3.1.22 - Control information posted or processed on publicly accessible information systems. |
| **Awareness and Training (AT)** | Ensure that personnel are educated on cybersecurity practices and aware of their roles in maintaining security, improving overall organizational resilience against cyber threats. | AT.L2-3.2.3 - Provide security awareness training on recognizing and reporting potential indicators of insider threat. |
| **Audit and Accountability (AU)** | Involve the logging and monitoring of system activities to track and review actions, ensuring accountability and providing a means to detect and respond to potential security incidents. | AU.L2-3.3.2 - Ensure that the actions of individual system users can be uniquely traced to those users so they can be held accountable for their actions. |
| **Configuration Management (CM)** | Establish and maintain secure configurations for information systems to prevent vulnerabilities, ensuring that systems are set up and managed in a consistent and secure manner. | CM.L2-3.4.2 - Establish and enforce security configuration settings for information technology products employed in organizational systems. |
| **Identification and Authentication (IA)** | Focus on verifying the identity of users and devices to ensure that only authorized individuals and systems can access or interact with the organization’s information assets. | IA.L2-3.5.5 - Prevent reuse of identifiers for a defined period. |
| **Incident Response (IR)** | Prepare for and respond to cybersecurity incidents through structured plans and regular testing, ensuring that the organization can effectively manage and mitigate the impact of incidents. | IR.L2-3.6.2 - Track, document, and report incidents to designated officials and/or authorities both internal and external to the organization. |
| **Maintenance (MA)** | Maintain and update systems, ensuring that maintenance activities are performed securely. | MA.L2-3.7.1 - Perform maintenance on organizational systems. |
| **Media Protection (MP)** | Protect information stored on physical and digital media through encryption and other security measures to safeguard data from unauthorized access and exposure. | MP.L2-3.8.2 - Limit access to Controlled Unclassified Information (CUI) on system media to authorized users. |
| **Personnel Security (PS)** | Manage security risks related to personnel by ensuring thorough background checks and security clearances, addressing potential vulnerabilities from insider threats. | PS.L2-3.9.1 - Screen individuals prior to authorizing access to organizational systems containing CUI. |
| **Physical Protection (PE)** | Protect physical locations and systems through access controls, surveillance, and other security measures to prevent unauthorized physical access and potential tampering. | PE.L1-3.10.3 - Escort visitors and monitor visitor activity. |
| **Risk Assessment (RA)** | Assess and remediate risks and vulnerabilities in organizational operations, assets, and systems. | RA.L2-3.11.2 - Scan for vulnerabilities in organizational systems and applications periodically |
| **Security Assessment (CA)** | Evaluate the effectiveness of security controls through assessments and address any identified vulnerabilities to continuously improve the security posture. | CA.L2-3.12.1 - Periodically assess the security controls in organizational systems to determine if the controls are effective in their application. |
| **System and Communications Protection (SC)** | Secure communications and data transmitted across networks to protect information from interception and unauthorized access. | SC.L2-3.13.3 - Separate user functionality from system management functionality. |
| **System and Information Integrity (SI)** | Ensure the integrity of systems and information by monitoring for unauthorized changes, protecting against malicious code, and applying updates to maintain system security. | SI.L2-3.14.7 - Identify unauthorized use of organizational systems. |

For a list of all required practices, refer to pages 9 to 18 in the [Cybersecurity Maturity Model Certification - Model Overview](https://dodcio.defense.gov/Portals/0/Documents/CMMC/ModelOverview_V2.0_FINAL2_20211202_508.pdf) published by Carnegie Mellon University and The Johns Hopkins University Applied
Physics Laboratory LLC and funded by the Department of Defense (DoD).

To learn more about requirements for tracking compliance, continue to the next article in our guide, [CMMC 2.0 documentation requirements](/compliance/cmmc-2/cmmc-chainguard/)

## Browse all CMMC 2.0 articles

- [Introduction to CMMC 2.0](/compliance/cmmc-2/intro-cmmc-2/)
- [CMMC 2.0 maturity levels](/compliance/cmmc-2/cmmc-2-levels/)
- (Current article) Overview of CMMC 2.0 Practice/Control Groups
- [How Chainguard can help with CMMC 2.0](/compliance/cmmc-2/cmmc-chainguard/)

**[Get started with Chainguard FIPS images today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### CMMC at Chainguard
_Path: compliance/cmmc-2/cmmc-chainguard.md_

Achieving Cybersecurity Maturity Model Certification (CMMC) 2.0 Level 2 or Level 3 certification can be a complex and resource-intensive process, particularly for organizations managing containerized environments and addressing vulnerabilities. Chainguard simplifies this journey by offering specialized solutions that drastically reduce the time and effort needed to meet compliance requirements. Our FIPS-compliant [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) images, combined with detailed SBOM (Software Bill of Materials) and STIG-hardened (Security Technical Implementation Guide) configurations, provide a strong foundation for meeting the requirements of CMMC 2.0.

## What are STIG-hardened FIPS images?

STIG-hardened FIPS images are pre-configured container images that have been secured according to the Security Technical Implementation Guide (STIG) standards set by the Defense Information Systems Agency (DISA). These images meet stringent federal security requirements, combining FIPS-compliant encryption with robust security configurations that protect against vulnerabilities and threats. By using STIG-hardened FIPS images, organizations ensure that their systems adhere to federal encryption standards and best practices for cybersecurity, making them particularly valuable in environments that require high levels of security, such as those governed by CMMC 2.0.

## Why STIG-hardened FIPS images for CMMC 2.0?

STIG-hardened FIPS images are highly beneficial for achieving CMMC 2.0 compliance due to their enhanced security features and adherence to strict guidelines. Here’s how they can support your CMMC 2.0 efforts:

1. **Enhanced Security Posture**
   STIG hardening applies a set of security configurations and practices designed to protect systems from vulnerabilities and threats. By utilizing STIG-hardened FIPS images, organizations ensure that their systems meet rigorous security standards, reducing the risk of exploitation. This is particularly important for CMMC 2.0 Level 2 and Level 3 requirements, which emphasize advanced security practices and robust protection of Controlled Unclassified Information (CUI) and Federal Contract Information (FCI).

2. **Streamlined Compliance**
   FIPS-compliant images meet federal encryption standards, which are a key component of CMMC 2.0 requirements. STIG hardening adds an additional layer of security by ensuring that the system configurations are in line with best practices for securing systems. These hardened images come with pre-configured settings that address many of the CMMC controls, such as those related to access control, vulnerability management, and incident response, thereby simplifying the compliance process and reducing the time and effort needed to achieve certification.

3. **Simplified Reporting and Documentation**
   STIG-hardened FIPS images typically include detailed scan reports and documentation that can be used to demonstrate compliance with CMMC 2.0 controls. These reports help organizations quickly identify and address security gaps, and the detailed documentation supports the creation of necessary reports for auditors and assessors. This streamlining of the reporting process aids in maintaining and proving compliance with CMMC requirements, such as those related to vulnerability management (e.g., CM.2.062 and CM.3.068) and continuous monitoring (e.g., SC.3.177).

By leveraging Chainguard’s resources, organizations can accelerate their path to CMMC 2.0 certification while effectively managing and reporting on critical security controls. Our integrated approach not only ensures that compliance requirements are met but also enhances overall security posture, allowing organizations to focus on their core operations with confidence.

## Browse all CMMC 2.0 articles

- [Introduction to CMMC 2.0](/compliance/cmmc-2/intro-cmmc-2/)
- [CMMC 2.0 maturity levels](/compliance/cmmc-2/cmmc-2-levels/)
- [Overview of CMMC 2.0 practice/control groups](/compliance/cmmc-2/cmmc-practices/)
- (Current article) How Chainguard Can Help With CMMC 2.0

**[Get started with FIPS Chainguard Containers today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### Introduction to CMMC
_Path: compliance/cmmc-2/intro-cmmc-2.md_

CMMC 2.0, or Cybersecurity Maturity Model Certification, is a cybersecurity framework established by the U.S. Department of Defense (DoD). It aims to ensure that contractors and subcontractors within the Defense Industrial Base (DIB) comply with rigorous cybersecurity standards. CMMC 2.0 replaces the previous CMMC model with a streamlined and updated version that incorporates lessons learned and feedback from industry stakeholders.

If you are a contractor, subcontractor, or supplier contracting with the DoD, you will need to meet the requirements of CMMC 2.0 regardless of the size of your organization or the type of product or service you are providing. This guide will provide a comprehensive overview of CMMC 2.0, detailing its practices, the importance of compliance, and practical guidance on meeting its requirements. At the end of this guide, you will learn how Chainguard Containers can be used to significantly reduce the toil and time needed to achieve CMMC 2.0 compliance.

## Who is required to be compliant?

CMMC 2.0 compliance is mandatory for all organizations involved in DoD contracts where Controlled Unclassified Information (CUI) and Federal Contract Information (FCI) is handled. This includes:

- **Prime Contractors**: Organizations directly awarded contracts by the DoD that must meet specific CMMC certification levels based on contract requirements.
- **Subcontractors**: Companies providing goods or services to prime contractors, especially if they handle or access CUI or FCI.
- **Suppliers**: Entities within the supply chain that interact with sensitive information relevant to DoD projects.

The DIB encompasses a wide variety of contractors and suppliers, including commercial firms, not-for-profit research centers and university laboratories, and government-owned industrial facilities. The products and services these entities provide are even more diverse, ranging from large sophisticated weapons platforms (e.g., missile defense systems) to highly specialized operational support (e.g., satellite communications) to general commercial products (e.g., medical equipment). Regardless of the type of organization or the product or service they provide, all contractors servicing the DIB must achieve compliance with CMMC 2.0. However, as we will discuss more below, the compliance requirements vary according to the specific CMMC maturity level required for the contract in question.

## What are FCI and CUI?

**FCI** refers to information provided by or generated for the government under a contract that is not intended for public release. It includes data related to the performance of government contracts but does not involve classified or highly sensitive information. For example, an office furniture supplier providing delivery schedules and product specifications to a government agency under a contract would be handling FCI.

**CUI** is more sensitive and requires specific safeguarding and dissemination practices. CUI includes information that, while not classified, still requires protection under federal laws, regulations, or government-wide policies due to its potential impact on national security or other critical interests. A defense contractor managing blueprints for a new military vehicle that is not classified but still needs to be protected under export control laws would be handling CUI.

## Impact of non-compliance

Failure to comply with CMMC 2.0 can have several significant impacts:

- **Contract Loss**: Organizations that do not meet the required CMMC level will be ineligible for DoD contracts, leading to a loss of business opportunities and revenue.
- **Reputational Damage**: Non-compliance can damage an organization’s reputation, affecting relationships with clients and partners and potentially deterring future business opportunities.
- **Legal and Financial Penalties**: Organizations may face legal actions and financial penalties, especially if a security breach occurs involving sensitive information.
- **Increased Risk**: Non-compliance increases the risk of data breaches and cyberattacks, which can compromise organizational and client data.

Achieving compliance with CMMC 2.0 is not just a regulatory requirement but a critical step in safeguarding national security and contracting with the DoD. To prepare your organization for CMMC 2.0, continue on to the next section of our guide, [CMMC 2.0 maturity levels](/compliance/cmmc-2/cmmc-2-levels/), or read about [how Chainguard Containers can help simplify fulfilling CMMC 2.0 requirements](/compliance/cmmc-2/cmmc-chainguard/).

## Browse all CMMC 2.0 articles

- (Current article) Introduction to CMMC 2.0
- [CMMC 2.0 maturity levels](/compliance/cmmc-2/cmmc-2-levels/)
- [Overview of CMMC 2.0 practice/control groups](/compliance/cmmc-2/cmmc-practices/)
- [How Chainguard can help with CMMC 2.0](/compliance/cmmc-2/cmmc-chainguard/)

**[Get started with FIPS Chainguard Containers today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### CMMC maturity levels
_Path: compliance/cmmc-2/cmmc-2-levels/index.md_

The  **Cybersecurity Maturity Model Certification (CMMC) 2.0** integrates various cybersecurity standards and best practices into a unified model that encompasses three maturity levels. Each level builds upon the previous one, with increasing rigor in cybersecurity practices and processes. In this article, we’ll provide an overview of the three levels of maturity and example practices that are representative of their requirements.

![Overview of CMMC Model 2.0 showing three levels: Level 3 (Expert) with over 110 practices based on NIST SP 800-172 and triennial government-led assessments, Level 2 (Advanced) with 110 practices aligned with NIST SP 800-171 and a mix of triennial third-party assessments and annual self-assessments, and Level 1 (Foundational) with 17 practices and annual self-assessment.](CMMC-level.jpg)

## Level 1: Foundational

Contractors and subcontractors who handle only [Federal Contract Information](https://isoo.blogs.archives.gov/2020/06/19/%E2%80%8Bfci-and-cui-what-is-the-difference/) (FCI) typically need this level of certification. This is particularly relevant for small businesses that provide basic products or services without dealing with sensitive information. For example, a company supplying standard office supplies to a government agency would fall under this category. The focus at this level is on maintaining basic safeguards by implementing 17 fundamental cybersecurity practices. These practices are primarily derived from the Federal Acquisition Regulation (FAR) 52.204-21, a set of rules for government procurement in the United States. They are designed to protect FCI by ensuring that essential, straightforward protections are in place.

### Documentation requirements

At Level 1, the documentation requirements are minimal, focusing on basic cyber hygiene through the implementation of 17 foundational cybersecurity practices. The purpose is to establish essential protections without the need for extensive documentation.

For example, organizations may maintain basic policies and procedures for access control, media protection, and physical security, along with records of security awareness training. The emphasis at this level is on demonstrating that these fundamental practices are in place, rather than producing detailed documentation, as required in higher levels.

### Example level 1 practices

- Limiting information system access to authorized users.
- Conducting background checks on employees.
- Implementing basic measures such as antivirus and firewalls.

## Level 2: Advanced

Contractors and subcontractors who handle [Controlled Unclassified Information](https://www.ftc.gov/policy-notices/controlled-unclassified-information) (CUI) but are not involved in critical defense programs typically need Level 2 certification. This is relevant for companies involved in more complex projects that deal with sensitive, though not highly classified, data. For instance, a contractor providing technical support for military communication systems, where sensitive but not classified information is exchanged, would require this level.

Level two consists of implementing a subset of the security requirements specified in NIST SP 800-171, totaling 110 practices. This level is designed as a transitional step for organizations aiming to achieve Level 3, building upon the foundational practices established in Level 1.

### Documentation requirements

At Level 2, the documentation requirements are moderate, reflecting the need for intermediate cyber hygiene and addressing a subset of the NIST SP 800-171 requirements. Organizations must maintain a System Security Plan (SSP) that outlines security strategies and vulnerability assessment and remediation plans. They must also create a Plan of Action and Milestones (POA&M) addressing any aspects of the organization which are not yet implemented.

Other Level 2 documentation requirements may include audit logs, incident response reports, inventory of the organization’s systems, location of [Controlled Unclassified Information](https://www.ftc.gov/policy-notices/controlled-unclassified-information) (CUI) in the organization’s environment, and other documents related to the implementation and management of cybersecurity practices.

### Example level 2 practices

- Implementing multifactor authentication.
- Conducting regular vulnerability assessments.
- Establishing and maintaining an operational incident-handling capability for organizational
systems.

## Level 3: Expert

Contractors handling highly sensitive CUI and involved in critical defense programs typically require this level of certification. This applies to large defense contractors developing advanced military technologies, such as a company designing next-generation fighter jets for the DoD. The focus at this level is on advanced and proactive cyber hygiene, requiring organizations to implement all 110 practices from NIST SP 800-171, along with additional practices from a subset of NIST SP 800-172.

This level demands advanced security measures to protect CUI against advanced persistent threats (APTs), such as cyber-espionage campaigns, zero-day exploits, and coordinated attacks targeting vulnerabilities in critical infrastructure. It requires three government-led assessments a year to maintain compliance.

### Documentation requirements

Level 3 requires the same documentation requirements as Level 2, including the [System Security Plan](https://csrc.nist.gov/glossary/term/system_security_plan) (SSP) and [Plan of Action and Milestones](https://csrc.nist.gov/glossary/term/poaandm) (POA&M). Further documentation requirements will be clear once the DoD determines which additional practices from NIST SP 800-172 will also be required.

### Example level 3 practices

At the time of publication, specific Level 3 practices are still being determined. However, the Department of Defense has indicated that they will be pulled from a subset of NIST SP 800-172, Enhanced Security Requirements for Protecting Controlled Unclassified Information.

Each CMMC level builds upon the previous one, ensuring that as organizations progress through the levels, their cybersecurity posture becomes more robust and capable of addressing increasingly sophisticated threats. This tiered approach allows organizations of varying sizes and capabilities to incrementally improve their cybersecurity measures while meeting the specific requirements necessary to handle sensitive information.

To learn more about the specific required practices of CMMC 2.0, continue to the [Overview of CMMC 2.0 practice/control groups](/compliance/cmmc-2/cmmc-practices/).

## Browse all CMMC 2.0 articles

- [Introduction to CMMC 2.0](/compliance/cmmc-2/intro-cmmc-2/)
- (Current article) CMMC 2.0 Maturity Levels
- [Overview of CMMC 2.0 practice/control groups](/compliance/cmmc-2/cmmc-practices/)
- [How Chainguard can help with CMMC 2.0](/compliance/cmmc-2/cmmc-chainguard/)

**[Get started with Chainguard FIPS images today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### PCI DSS at Chainguard
_Path: compliance/pci-dss-4/pci-dss-chainguard.md_

Compliance with PCI DSS 4.0, or Payment Card Industry Data Security Standard, requires adherence to strong security standards. Rigorous requirements must be met in order to secure your networks, systems, storage, and access according to the guidelines.

Chainguard doesn't build images specifically for PCI DSS, but our images can help you meet the requirements in many ways, easing your burden in the process of achieving compliance. Securing your software supply chain provides a solid foundation for minimizing vulnerabilities.

All Chainguard Containers save time and costs required to triage, patch, and remediate CVEs. They are created by and officially maintained by Chainguard engineers. Our images are designed to be minimal, removing unnecessary software that is not specifically used. This eliminates a number of potential attack vectors.

On top of this, you must authenticate into Chainguard to use Chainguard Containers, giving you reassurance of the provenance of your images. They include digitally signed [build-time SBOMs](/chainguard/containers/working-with-images/retrieve-image-sboms/) (software bill of materials) documenting and attesting to the full provenance.

Our FIPS-compliant [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) images, combined with  STIG-hardened (Security Technical Implementation Guide) configurations, provide an even stronger foundation for meeting the requirements of PCI DSS because they are hardened further to meet the more stringent FedRAMP requirements.

## What are STIG-hardened FIPS images?

STIG-hardened FIPS images are pre-configured container images that have been secured according to the Security Technical Implementation Guide (STIG) standards set by the Defense Information Systems Agency (DISA). These images meet stringent federal security requirements, combining FIPS-compliant encryption with robust security configurations that protect against vulnerabilities and threats. By using STIG-hardened FIPS images, organizations ensure that their systems adhere to federal encryption standards and best practices for cybersecurity, making them particularly valuable in environments that require high levels of security.

## How do Chainguard Containers help?

One of the main requirements of PCI DSS is to maintain a vulnerability management program. PCI DSS requires you to scan for vulnerabilities once every three months (Requirement 11.3.1) and triage and address all vulnerabilities (Requirement 11.3.11). Chainguard protects you from malicious attacks by supplying you with images where CVEs have already been dealt with, removing vulnerabilities for you.

PCI DSS requires that you catalog and classify vulnerabilities in bespoke and third-party software (Requirements 6.3.1 and 6.3.2). You must fix all critical and high vulnerabilities and have a plan of action for the rest (Requirement 11.4.4). Chainguard does that for you.

Vulnerability scanners can be noisy and sifting through false positives while cataloging true vulnerabilities can be tedious work. Providing justifications for vulnerabilities that aren't applicable takes time, and that is after investigating them thoroughly.

Chainguard Containers are carefully engineered to contain low-to-no CVEs. Organizations can use them as their source to build their applications on. The benefits of our solution are:

- **You’re secured by default** : Our images contain low-to-no CVEs. Check out our [Images Directory](https://images.chainguard.dev) yourself. ‍
- **Extensive scanner partnerships**: We partner with industry-leading scanners such as Snyk, Crowdstrike, Wiz, [and many others](https://www.chainguard.dev/scanners).
- **SBOM for all Chainguard Containers**: Get full transparency into the packages actually used in our images and ultimately run in your environment. ‍
- **Less ongoing human overhead**: Every new Chainguard Container version is carefully scanned and any addressable CVEs are fixed. ‍
- **Trust in our industry-leading CVE SLA**: We are committed to supplying secure software and commit to fixing CVEs [quickly](https://www.chainguard.dev/cve-sla) so you don’t have to.

## Browse all CMMC 2.0 articles

- [Introduction to PCI DSS 4.0](/compliance/pci-dss-4/intro-pci-dss-4/)
- [Overview of PCI DSS 4.0 practices/requirements](/compliance/pci-dss-4/pci-dss-practices/)
- (Current article) How Chainguard Can Help With PCI DSS 4.0

**[Get started with FIPS Chainguard Containers today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### Introduction to PCI DSS
_Path: compliance/pci-dss-4/intro-pci-dss-4.md_

PCI DSS 4.0, or Payment Card Industry Data Security Standard, is a global standard in the payments industry that includes a set of foundational technical and operational requirements surrounding the protection of payment data. Its goal is to ensure the security of information involved when payment cards are used and while those payments are processed. PCI DSS 4.0 replaces the earlier PCI DSS 3.2.1, which was retired in March 2024.

Cashless transactions have become the norm around the world. This is a convenient way for buyers and sellers to transact business. It has also attracted the attention of criminals looking for easy money. Payment account information, and especially payment card and card-owner data, are especially targeted. All payment system stakeholders have a responsibility to secure this information. PCI DSS helps to alleviate vulnerabilities and protect payment account data.

This guide will provide a comprehensive overview of PCI DSS 4.0, detailing its practices, the importance of compliance, and practical guidance on meeting its requirements. At the end of this guide, you will learn how Chainguard Containers can be used to significantly reduce the toil and time needed to achieve PCI DSS 4.0 compliance.

## Who is required to be compliant?

The PCI Security Standards Council (PCI SSC) is a global forum for the industry to come together to develop, enhance, disseminate, and assist with the understanding of security standards for payment account security.

The standards developed are agreed upon by all members and provide a measure of mutual trust across the industry. The standards are not directly developed or required by governmental entities. The PCI DSS is not a law, but compliance is enforced by the PCI SSC using a yearly assessment.

Participation and membership in the PCI SSC is open globally to those affiliated with the payments industry. Compliance is expected of all members and validated using the PCI DSS 4.0 and is assessed using a set of defined testing procedures to verify requirements are met.

Membership in the PCI SSC includes:

- **Merchants**
- **Banks**
- **Processors**
- **Hardware and software developers**
- **Point of sale vendors**
- **Payment brands**, such as Visa, Mastercard, and American Express

Participation in the PCI SCC is encouraged for all industry stakeholders and is required for any who wish to participate in reviewing proposed additions or modifications to the standards.

Regardless of membership status, all entities that store, process, or transmit cardholder data and/or sensitive authentication data are expected to comply with PCI DSS requirements.

## What is the importance of protecting payment account data?

Lax security enables criminals to steal and use consumer financial information from payment transactions and processing systems for fraudulent purposes. Vulnerabilities may appear anywhere in the card-processing ecosystem, including but not limited to:

- Point of sale devices
- Cloud-based systems
- Mobile devices, personal computers, and servers
- Wireless hotspots
- Web shopping applications
- Paper-based storage systems
- The transmission of cardholder data to service providers
- Remote access connections

These vulnerabilities may also extend to systems operated by service providers, such as the financial institutions that initiate and maintain the relationships with merchants that accept payment cards.

Compliance with PCI DSS helps to alleviate these vulnerabilities and protect payment account data.

## Impact of non-compliance

PCI DSS is designed to protect both customers and entities that handle payment data. Beyond the following, a failure to comply leaves you and your customers vulnerable to data and financial losses, most of which are preventable.

Further, any entity that handles covered data and does not comply with PCI DSS requirements can expect:

- Fines and penalties from contracted partners, such as payment processors
- Data breach compensation costs, beyond just the initial losses
- Legal action
- A damaged reputation

These consequences may further result in cancelled contracts, additional revenue losses, and even closures.

Achieving compliance with PCI DSS 4.0 is not just an industry self-regulatory requirement but a critical step in safeguarding payment information. To prepare your organization for PCI DSS 4.0, read about [how Chainguard Containers can help simplify fulfilling PCI DSS 4.0 requirements](/compliance/pci-dss-4/pci-dss-chainguard/).

## Browse all PCI DSS 4.0 articles

- (Current article) Introduction to PCI DSS 4.0
- [Overview of PCI DSS 4.0 practices/requirements](/compliance/pci-dss-4/pci-dss-practices/)
- [How Chainguard can help with PCI DSS 4.0](/compliance/pci-dss-4/pci-dss-chainguard/)

**[Get started with FIPS Chainguard Containers today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### PCI DSS practices
_Path: compliance/pci-dss-4/pci-dss-practices.md_

PCI DSS 4.0, or Payment Card Industry Data Security Standard is intended for all entities that store, process, or transmit cardholder data and/or authentication data that could impact the security of the cardholder data environment. This includes all entities interacting with information such as the following:

| Cardholder Data |
|------------------------|
| Primary account number |
| Cardholder name |
| Expiration date |

| Authentication Data |
|-------------------------------------------------------|
| Full track data, such as on a magnetic stripe or chip |
| Card verification code (the number on the back) |
| PINs |

PCI DSS 4.0 requires compliance with a set of requirements, each related to an information security practice or goal. All of these are intended to protect cardholder data from theft and fraud.

## PCI DSS 4.0 goals and requirements

Below is a table overview with a high-level description of the goals and requirements, summarized from the PCI DSS v4.0 Quick Reference Guide from the PCI Security Standards Council, available from their [Document Library](https://east.pcisecuritystandards.org/document_library):

| Goals | Requirements |
|------------------------|-------------------------------------------------------|
| **Build and maintain a secure network and systems** | Install and maintain network security controls and apply secure configurations to all system components |
| **Protect account data** | Protect stored account data as well as during transmission over open, public networks |
| **Maintain a vulnerability management program** | Protect all systems and networks from malicious software, develop and maintain secure systems and software |
| **Implement strong access control measures** | Restrict access to system components and cardholder data by business need to know, identify users and authenticate access to system components, restrict physical access to cardholder data |
| **Regularly monitor and test networks** | Log and monitor all access to system components and cardholder data, test security of all systems regularly |
| **Maintain an information security policy** | Support information security with organizational policies and programs |

For a list of all required practices, refer to the PCI DSS documentation available in the [PCI Security Standards Council's Document Library](https://east.pcisecuritystandards.org/document_library).

## Browse all PCI DSS 4.0 articles

- [Introduction to PCI DSS 4.0](/compliance/pci-dss-4/intro-pci-dss-4/)
- (Current article) Overview of PCI DSS 4.0 Practices/Requirements
- [How Chainguard can help with PCI DSS 4.0](/compliance/pci-dss-4/pci-dss-chainguard/)

**[Get started with Chainguard FIPS images today!](https://images.chainguard.dev/?category=fips?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)**

---

### Chainguard glossary
_Path: software-security/glossary.md_

## General terms

### Software supply chain

Like in material good supply chains, a software supply chain is composed of activities that an organization undertakes to deliver an end product or service to a consumer. Software supply chain activities involve the transformation of dependencies, packages, components, binaries, build and packaging scripts, code and other software artifacts, and infrastructure into a finished software deliverable that is deployed into production. Participants in the supply chain include actors like developers, reviewers, testers, and maintainers who are working on the product at hand, but also includes those who maintain and contribute to packages and package managers, and other software that may be incorporated into a given product. Software supply chains also include information relevant to the software, such as versioning, signatures, and hashes.

---

### Software supply chain attacks

An intentional act of inserting malicious functionality into — or taking advantage of a known vulnerability within — the build, source, components or deployment software or infrastructure with the goal of propagating that harmful functionality through current distribution methods.

---

### Software development life cycle

The methodology and process for planning, designing, creating, testing, deploying, and maintaining software.

---

### Software artifact

An artifact is an immutable blob of data. Examples of artifacts include a file, a git commit, a container image, a firmware image.

---

### Software vulnerability

A software vulnerability is a weakness in a program which, if left unaddressed, may be used by attackers to access, manipulate, or compromise a computer system. A vulnerability can impact various parts of a system depending on where or how it is introduced, and can be targeted through different vectors based on the type of weakness it introduces. Developers refer to vulnerabilities by their corresponding CVE ID when patching or remediating any known security flaws.

---

### Attestation

An attestation allows consumers of a software artifact to verify the quality of that artifact independently from the producer of the software. It also requires software producers to provide verifiable proof of the quality of their software. You can think of an attestation as a **proclamation** that _software artifact X was produced by Y person at Z time._

---

### CI/CD

A pipeline approach to code development and release. CI stands for **c**ontinuous **i**ntegration, referring to the automation of testing code modifications frequently to avoid conflict between developer changes. CD stands for **c**ontinuous **d**elivery and/or **d**eployment, referring to the next stage of the pipeline where code is automatically merged to a repository or production environment after passing tests to fast-track the release of new changes to customers. CI/CD aims to reduce slowdowns experienced by manual code checking and approval, shortening the development cycle and allowing for more updates to reach consumers.

---

### CISA

The [**C**ybersecurity and **I**nfrastructure **S**ecurity **A**gency (CISA)](https://www.cisa.gov/) is a U.S. federal government agency under the Department of Homeland Security. Since its inception in 2018, CISA has championed the adoption of secure software development practices, such as the use of SBOMs and VEX documentation. CISA operates the Known Exploited Vulnerabilities (KEV) Catalog, a helpful tool to software developers who are working on vulnerability remediation. Additionally, they sponsor the National Vulnerability Database (NVD).

---

### CVE

Standing for **C**ommon **V**ulnerabilities and **E**xposures, CVEs are records assigned to publicly disclosed software vulnerabilities, stored in a searchable catalog. Each CVE consists of a unique CVE ID, a description of the vulnerability, and any relevant references or advisories. The CVE Program is operated by The MITRE Corporation and supported by a variety of U.S. government agencies.

---

### KEV Catalog

The [**K**nown **E**xploited **V**ulnerabilities (KEV) Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) is populated with CVEs that have existing exploits “in the wild”. Operated by the Cybersecurity and Infrastructure Security Agency (CISA), the KEV Catalog serves as a tool for developers as it identifies CVEs that need to be prioritized for remediation because of their exploitability status.

---

### NVD

The [National Vulnerability Database (NVD)](https://nvd.nist.gov/) is operated by the [National Institute of Standards and Technology (NIST)](https://www.nist.gov/), an agency of the U.S. Department of Commerce. The NVD analyzes CVE records and their related public advisories to provide additional information on how a vulnerability impacts a software product. The NVD is often used by vulnerability scanners as a primary reference.

---

### Provenance

Provenance is the verifiable information about software artifacts describing _where_, _when_ and _how_ something was produced.

---

### Zero-day

The origin and exact meaning of this term varies among sources, but a zero-day is a recently discovered vulnerability. One explanation for the term is that a zero-day vulnerability is a very new vulnerability for which there isn't a fix, and developers have "zero days" to find a solution. Others define it as an unknown vulnerability or exploit already affecting your system. "Zero-day" refers to the age of the vulnerability, as derived from when you or your security org first becomes aware of it; because the vulnerability is "zero days" old, no one is yet aware of it and there isn't a known fix for it. The derivative terms **zero-day attack** or **zero-day exploit** refer to an attack taking advantage of such a previously unknown vulnerability.

---

## Security tools and frameworks

### Certificate authority

Often abbreviated as **CA**, a certificate or certification authority is a governing body that stores, signs, and issues digital certificates that can verify claims about the ownership of a given public key. Software consumers can use a CA to verify the assertions made about the private key that corresponds with the certified public key. A trusted third party, CAs use the X.509 or EMV standard to format certificates.

---

### Code signing

The process of digitally signing software artifacts to verify the author of the software as well as guarantee that the code has not been altered in any way since it was signed. Cryptographic hashes are used to sign software in order to validate authenticity and integrity. Code signing results in a signature.

---

### OCI

OCI stands for the **O**pen **C**ontainer **I**nitiative, which is an open governance structure that was set up to create and foster open industry standards around software container formats and runtimes.

---

### OIDC

OIDC is short for **O**pen**ID** **C**onnect, an identity layer that is built on top of the OAuth 2.0 protocol, and is governed by the OpenID Foundation. The tool allows for identity authentication and identity verification based on the authentication performed by a provider such as Apple, Google, GitLab, Microsoft, and others.

---

### PKI

Standing for **p**ublic **k**ey **i**nfrastructure, PKI arranges the necessary elements of infrastructure to manage public-key encryption, binding public keys with respective identities of entities (including individuals and organizations).

---

### Red teaming

Conducting a red team assessment consists of a goal-based adversarial activity to demonstrate how attackers can combine exploits to compromise the integrity of software or other technology.

---

### SBOM

An acronym, SBOM stands for a **s**oftware **b**ill **o**f **m**aterials (plural: SBOMs or software bill*s* of materials). An SBOM is like an electronic packaging slip or receipt, it is a formal record that contains the details and supply chain relationships (such as dependencies) of the components used in building given software.

---

### Sigstore

A suite of tools to sign, verify, and monitor software artifacts. Within the umbrella of Sigstore are Cosign for artifact signing and verification, the certificate authority Fulcio, and the transparency log Rekor. All of this tooling can be used independently of each other.

---

### SLSA

Standing for **S**upply chain **L**evels for **S**oftware **A**rtifacts, SLSA (pronounced “salsa”) is a security framework that offers a check-list of standards and controls in order to prevent tampering, improve integrity, and secure packages and infrastructure. SLSA has a build track with three levels of increasing security.

---

### SSDF

A project of the United States Department of Commerce's National Institute of Standards and Technology (NIST), the **S**ecure **S**oftware **D**evelopment **F**ramework (SSDF) is a set of guidelines and recommendations to establish a secure software development practice.

---

### Tekton

Tekton provides a cloud-native solution for building CI/CD systems with a focus on software supply chain security through offering artifact signatures and attestations through Tekton Chains.

---

### TUF

**T**he **U**pdate **F**ramework, known as TUF, offers a framework for securing software update systems.

---

## Attacks and vulnerabilities

### Codecov hack

An example of a software supply chain attack that took place in early 2021. The code coverage tool Codecov experienced a sophisticated attack in which their Bash uploader script was modified by a malicious actor. The affected script allowed the attacker to extract customer credentials passing through Codecov’s continuous integration (CI) platform, exposing services accessible with these credentials to further exploitation.

---

### Log4Shell

An internet vulnerability involving a nearly ubiquitous piece of software, Log4j. The vulnerability received attention in December 2021 and much work was done to mitigate the vulnerability, which can be exploited by a remote code execution attack.

---

### SolarWinds hack

The commonly used term to refer to the software supply chain breach that involved the SolarWinds Orion system, which occurred in 2020. Hackers gained access to networks, systems, and data of thousands of SolarWinds customers, and compromised the systems of over 30,000 organizations who relied on Orion software. This was one of the largest software supply chain attacks of its kind recorded to date.

---

### Typosquatting

Typosquatting is a cyber attack that is done by adversaries who try to pass a string (such as a URL) that they own as something that is official. For example, instead of the official chainguard.dev an adversary may register chain-guard.dev, cha1nguard.dev, or chainguar.dev in order to pretend to be the official site.

---

### What is software supply chain security
_Path: software-security/what-is-software-supply-chain-security.md_

_An earlier version of this material was published in the [first chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@1623557b9fc849d5a1e38177502b1499/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@825d4b442d1346ba8e9d7c3b4f765e76) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Software producers have a supply chain just like manufacturing businesses have a supply chain. And just like manufacturers require physical inputs and then perform a manufacturing process to build a finished product, so do software producers, whether the producer is a company or individual. In other words, a software producer uses components, developed by third parties and themselves, and technologies to write, build, and distribute software. A compromise introduced anywhere in this chain is an example of a software supply chain security issue. Tools and practices like those implemented in Chainguard's containers help organizations protect against these risks through built-in SBOMs, provenance attestations, and SLSA compliance.

Some observers might think that all software security issues are software supply chain issues. How else would vulnerabilities end up in the finished software if not through the software supply chain?  A generic example can help illustrate the difference. Imagine ACME company unintentionally creates a SQL injection vulnerability in a piece of software that ACME company distributes. This is not a software supply chain security issue. Code from ACME’s own developers is responsible for this security issue. But should ACME company use an open source software component that has been maliciously tampered with to send sensitive secrets to an attacker when the code was built, then ACME would be the victim of a software supply chain attack. In that case, the supply chain of ACME’s developers is the origin of the security issue.

Software supply chain compromises can involve both malicious and unintentional vulnerabilities. The insertion of malicious code anywhere along the supply chain poses a severe risk to downstream users, but unintentional vulnerabilities in the software supply chain can also lead to risks should some party choose to exploit these vulnerabilities. For instance, the [log4j (PDF)](https://www.cisa.gov/sites/default/files/publications/CSRB-Report-on-Log4-July-11-2022_508.pdf) open source software vulnerability in late 2021 exemplifies the danger of vulnerabilities in the supply chain, including the open source software supply chain. In this case, log4j, a popular open source Java logging library, had a severe and relatively easily exploitable security bug. Many of the companies and individuals using software built with log4j found themselves vulnerable because of this bug.

Malicious attacks, or what often amounts to code tampering, deserve special recognition though. In these attacks, an attacker controls the functionality inserted into the software supply chain and can often target attacks on specific victims. These attacks often prey on the lack of integrity in the software supply chain, taking advantage of the trust that software developers place in the components and tools they use to build software. Notable attack vectors include compromises of source code systems, such as GitHub or GitLab; build systems, like Jenkins; and publishing infrastructure attacks on either corporate software publishing servers, update servers, or on community package infrastructure. Another important attack vector is when an attacker steals the credentials of an individual open source software developer and adds malicious code to a source code management system or published package.

Fortunately, a number of promising counters to software supply chain attacks have emerged. For instance, projects like Sigstore offer a chance to restore integrity to the software supply chain and initiatives like the Open Source Security Foundation provide a forum for concerted action. Further information on software supply chain security compromises and counters can be found in [this reading list](https://github.com/chainguard-dev/ssc-reading-list).

One further term merits a definition and explanation. Cloud-native software supply chain security refers to software supply chain security efforts that are related to container technology. The process of selecting, building, and operating containers has a number of important implications for software supply chain security. For instance, signing containers with a digital signature (via a tool like [Cosign](https://github.com/sigstore/cosign)) is one way to ensure that an attacker that tampers with a container is detected. Container technology both epitomizes the potential software supply chain security perils that modern organizations must confront while also enabling approaches that can make a software supply chain secure by default.

---

### What is a build horizon?
_Path: software-security/build-horizon.md_

A _build horizon_ is the maximum amount of time a build artifact — such as a compiled binary or container image — is permitted to remain in use before it must be rebuilt. Once an artifact exceeds its build horizon, it is considered stale and must be regenerated from up-to-date sources.

The practice has been adopted broadly to maintain production hygiene, reduce technical debt, and limit exposure to vulnerabilities in aging dependencies.

## Why build horizons matter

Software artifacts do not exist in isolation. They encode the state of their dependencies — base images, libraries, language runtimes, and operating system packages — at the time they were built. As time passes, new vulnerabilities are discovered in those dependencies, fixes are released, and the artifact falls behind the current security baseline.

Without a policy that enforces a maximum artifact age, old builds can quietly persist in production long after their dependencies have become insecure. This is especially common with infrastructure services and long-running background jobs, where the pressure to ship new features is lower and images are less likely to be rebuilt as a side effect of application changes.

Build horizons address this by making staleness a first-class concern. Rather than relying on developers to proactively update artifacts, a build horizon policy makes freshness a default requirement.

## What a build horizon applies to

Build horizon practices apply across three broad categories of artifacts:

**Internal software** — services and tools your organization builds and owns. A continuous delivery philosophy encourages frequent delivery of small changes, which naturally limits artifact age. A build horizon formalizes this expectation and makes it enforceable.

**Off-the-shelf components** — third-party software such as Prometheus, Flux, the OpenTelemetry Collector, or Cilium that is deployed as-is inside your infrastructure. These components are often deployed and then forgotten, making them prime candidates for staleness.

**Compiled dependencies, including base images** — the foundational layers on which your software is built. A container image inherits all of the packages in its base image, which means an outdated base image can silently introduce hundreds of known vulnerabilities into an otherwise current application.

## The principle of ephemerality

Build horizons are most effective when paired with [the _principle of ephemerality_](https://www.chainguard.dev/unchained/the-principle-of-ephemerality): the idea that build artifacts should be treated as temporary by design, expected to be regularly discarded and regenerated rather than maintained indefinitely.

Under this principle, the goal is not to keep an artifact running as long as possible but to make the process of rebuilding it so reliable and automated that freshness becomes the default state. When rebuilding is routine, there is little cost to enforcing a short build horizon.

## Automating dependency updates

Enforcing a build horizon at scale requires automation. Manual processes are insufficient when an organization manages dozens or hundreds of services and dependencies. Common automation strategies include:

- **Dependency update bots** such as Dependabot, Renovate, or similar tools that open pull requests to upgrade library dependencies as new versions are released.
- **Base image update automation** — tools that monitor upstream base images and automatically trigger rebuilds or open pull requests when new image digests are published.
- **Scheduled rebuilds** — CI/CD pipelines configured to rebuild images on a regular cadence (for example, nightly or weekly), regardless of whether application code has changed.

These approaches reduce the manual burden of staying current and ensure that most artifacts are refreshed before they approach their horizon.

## Enforcing the policy

Automation reduces drift, but it does not eliminate it entirely. Misconfigurations, forgotten services, and exceptions that outlive their justification can all result in artifacts exceeding their build horizon. Policy enforcement provides a backstop.

In Kubernetes environments, build horizon policies can be enforced using admission controllers. The [sigstore/policy-controller](https://docs.sigstore.dev/policy-controller/overview/) project, for example, exposes the `fetchConfigFile` function to inspect the `created` timestamp embedded in a container image's configuration. A policy written in [Rego](https://www.openpolicyagent.org/docs/latest/policy-language/) can then validate that the image was built within the permitted window:

```rego
isCompliant {
  created := time.parse_rfc3339_ns(input.config[_].created)
  time.now_ns() < created + maximum_age
}
```

This policy can be wrapped in a `ClusterImagePolicy` resource that scopes enforcement to specific namespaces or workload selectors. Policies can initially be configured in _warn_ mode, which surfaces violations as warnings without blocking deployments, giving teams time to remediate before strict enforcement is enabled.

## A note on reproducible builds

Build horizon policies that rely on the `created` timestamp in a container image can fail for images produced with [reproducible build](https://reproducible-builds.org/) tooling. Some reproducible build tools set the `created` timestamp to the Unix epoch — January 1, 1970 — as a way to ensure that builds are deterministic regardless of when they are run. An image with a 1970 timestamp will always appear to exceed any reasonable build horizon.

The recommended solution is to use the `SOURCE_DATE_EPOCH` environment variable, which many reproducible build tools support. When set, this variable causes the build tool to derive timestamps from the date of the source commit rather than the current system clock. This preserves reproducibility while producing a meaningful, policy-compatible timestamp.

## Learn more

To learn more about related practices and tools, you can explore:

- [What is software supply chain security](/software-security/what-is-software-supply-chain-security/) — for background on the broader threat landscape that build horizons help address.
- [Selecting a base container image](/software-security/selecting-a-base-image/) — for guidance on choosing base images that are rebuilt frequently and carry few known vulnerabilities.
- [Strategies and tooling for updating containers](/chainguard/containers/security-and-compliance/updating-containers/strategies-tools-updating-images/) — which outlines different strategies and tools for keeping images up to date and avoiding the use of end-of-life software.
- [Reproducible builds](https://reproducible-builds.org/) — for information on the reproducible builds initiative and the `SOURCE_DATE_EPOCH` convention.

---

### Chainguard Trademark Use Policy
_Path: software-security/trademark.md_

Chainguard has a [Trademark Use Policy](https://www.chainguard.dev/legal/chainguard-trademark-use-policy) for Chainguard™ and Wolfi™. The Trademark Use Policy for Chainguard™ is in connection with its software tools and platforms for container image registry services and related educational services. The Trademark Use Policy for Wolfi™ is in connection with software tools and related community services. This policy helps ensure that Chainguard’s trademarks remain reliable indicators of the qualities that they are meant to preserve.

The Trademark Policy details:

* How you may use Chainguard’s trademarks,
* Scenarios where trademark use is not permitted,
* When Chainguard’s permission may be required to use a given trademark.

Under Chainguard’s Trademark Policy, when using Chainguard's free-tier container images and Wolfi components, artifacts that are created by you must clearly delineate which software is installed by you (instead of Chainguard) in such a way that is clear to vulnerability scanners and end users that you are the author of said changes to the software and not Chainguard. Further, if you attempt to rebuild Chainguard packages or Containers from source, you must remove all references to Chainguard or Wolfi in adherence to the Trademark Policy.

## How not to use Chainguard trademarks

Chainguard Marks must not be used in a way that is confusing, false, or misleading, or imply affiliation, endorsement, or sponsorship where it does not exist.

In connection with the same, similar, or related goods or services, it is not permitted to:

* Misspell, hyphenate, abbreviate, or otherwise change Chainguard Marks (as in `Chain guard`, `Chain-guard`, `W0lfi`, etc.),
* Transliterate or translate Chainguard Marks,
* Use marks that are confusingly similar to the Chainguard Marks (such as `Chainguardian`, `Wolfy`, etc.),
* Combine the Chainguard Marks with other words or symbols.

The above non-exhaustive examples are all considered to be confusing, false, or misleading uses of the Chainguard Marks.

Below are non-exhaustive examples of how you may not use the Chainguard Marks:

* In the name of your business, products, service, app, publication, domain name, subdomain, or other offering,
* More prominently than your own company name, product, or service,
* On merchandise or other promotional goods for sale,
* In any other forms of commercial use, unless it’s for truthful descriptive reference to Chainguard products or services.

Chainguard remains committed to open source licensing principles, which primarily concern copyright associated with software. The Chainguard Trademark Policy clearly defines how the organization is protecting consumers as to what products and services are coming from Chainguard and therefore meet relevant security guarantees.

We encourage you to can review the full [Chainguard Trademark Policy](https://www.chainguard.dev/legal/chainguard-trademark-use-policy).

---

### Selecting a base container image
_Path: software-security/selecting-a-base-image.md_

Software teams building and deploying container-based software applications often use a "base image," an initial set of software packages often associated with a Linux distribution. Software developers, security professionals, and infrastructure teams seeking to make an informed decision about what base image to use must consider a number of criteria when selecting a base image appropriate for their needs. Base images like those provided by Chainguard are designed to meet these security criteria while maintaining compatibility. To help these parties make a more informed decision when selecting a base image, this article describes a range of criteria:

- Ensuring the image contains needed core functionality
- The number of known vulnerabilities
- The frequency at which the image is rebuilt
- The number of packages
- The update frequency and security hygiene of the underlying distribution
- The amount of maintainer support associated with the base image
- The size of the image in MB
- Whether the image is signed
- Whether the image has an SBOM

After reading this section, software professionals will have a mental checklist that makes them better prepared to select a base image for container-based software applications.

## Ensure the base image contains needed core functionality

First and foremost, the base image needs to contain the necessary minimum functionality. For instance, for a team that is developing a Python application, this would include the Python runtime, the software that translates source code into machine code. Without the appropriate core functionality, the base image will be unable to serve the needs of the software developer and his or her application. More technical users might also be interested in aspects such as whether there is glibc or musl support.

## Choose an image with few or no known vulnerabilities

Another key factor is the number of known vulnerabilities associated with the packages inside the image. Popular open source scanners such as [`trivy`](https://github.com/aquasecurity/trivy) and [`grype`](https://github.com/anchore/grype) allow a user to scan container images to identify vulnerabilities. Known vulnerabilities, consistently ranked a [critical security threat](https://owasp.org/www-project-top-ten/) for web applications, allow attackers to exploit a piece of software without the work of discovering a previously unknown vulnerability. Recent empirical software security [research](https://decan.lexpage.net/files/EMSE-2021.pdf) indicates that many popular images have hundreds of known vulnerabilities.

Software teams should select base images with as few known vulnerabilities as possible. This not only has security benefits but also reduces the toil of manually triaging vulnerabilities, i.e. determining whether the vulnerability is a true positive or false positive and whether the vulnerability is exploitable in the context of the deployed application.

While some specialists point out that many reported vulnerabilities have never been known to be exploited [in the wild](https://www.cisa.gov/known-exploited-vulnerabilities), this observation should not be mistaken as an invitation to disregard vulnerability counts. Because many, perhaps most, compromises are never reported, any list of vulnerabilities known to have been exploited should be treated as imperfect knowledge. Other vulnerabilities might have been exploited in the wild and no defender knows yet. In short, maintaining a low known vulnerability count reduces security risk and staff toil, thereby enabling faster development.

## Choose an image that is frequently rebuilt

Of course, choosing an image that has a low vulnerability count today does not guarantee a low vulnerability count tomorrow. New vulnerabilities can arise, new non-security bugs are patched, and new features emerge for the many packages inside a base image. To enable a software team to take advantage of new fixes, security or otherwise, developers ought to prefer images that are rebuilt frequently. Rebuilding entails using the latest versions of all the constituent packages, which reduces the vulnerability count and enables downstream consumers of the base image to upgrade the version if desired.

Some research suggests that over half of the container images found on Docker Hub, a repository for container images, haven’t been updated for four months or longer. Likewise, official Docker images can have similarly slow update cadences. When selecting a base image, a software team should examine the frequency of updating.

## Choose an image with a minimal number of packages

Choosing base images with a minimal number of packages is also a sensible principle. This reduces the "attack surface" and also reduces complexity. Fewer packages, all things equal, means fewer vulnerabilities (both known and unknown). Additionally, for teams that must use a pinned image and thus can’t take advantage of frequent rebuilds, fewer packages also means a slower vulnerability accumulation rate.

Additionally, choosing ["distroless"](/software-security/videos/distroless/) images, which strips out package managers, package manager dependencies, and other build-time dependencies, is another way to ensure that your team is choosing a secure-by-default base image.

## Choose an image based on a software distribution that prioritizes package update frequency and security hygiene

The packages inside a container are often sourced from a Linux distribution such as Debian, Ubuntu, or [Wolfi](/open-source/wolfi/overview/). The update frequency and hence the security of an image therefore also depends on the software development practices associated with that distribution. Software teams should therefore assess the distribution underlying the packages in their images. All things equal, software teams should prefer a distribution that prioritizes frequent updates so that vulnerabilities are quickly fixed.

## Choose an image with maintainers that actively support it

Not all container images are actively maintained. Like open source software packages in general, container images require one or more persons to ensure timely and frequent rebuilds, manage broader security concerns, and respond to bugs and issues. Unmaintained or lightly maintained images can pose a problem to software teams that want to prioritize development velocity and security. Without the ability to rapidly work with upstream image maintainers, software teams must either accept the risk of using old versions of the image that potentially have unpatched bugs, or consider creating and maintaining a fork with the overhead associated with that course of action.

## Choose an image that is smaller

Smaller images (fewer MB) means less storage costs and less transmission costs. When an image is pulled thousands of times a day, even a small difference in size can quickly add to the cost.

## Choose an image that is signed

Software signing ensures that attackers that tamper with a software artifact, such as a container image, can be detected. Software teams should choose to use container images that have been signed, with tools such as [Cosign](/open-source/sigstore/cosign/how-to-sign-a-container-with-cosign/), and verify the signatures to ensure that the images on which they depend are tamper-free.

## Choose an image with an SBOM

A [software bill of materials](/open-source/sbom/what-is-an-sbom/) (SBOM), a list of ingredients for a piece of software, provides visibility into the components of a piece of software, enabling transparency and informed decision-making. Choosing base images with SBOMs generated by the party responsible for building the artifact helps the image consumer make better-informed decisions related to the security and health of the code.

## Self-assessment

<details>
  <summary>
   [True or False] The frequency at which a container image is rebuilt does not affect the number of known software vulnerabilities associated with the container image.
  </summary>
False: Infrequently rebuilt images accumulate vulnerabilities as new vulnerabilities are discovered for the packages inside an image.
</details>

<details>
  <summary>
   [True or False] Choosing base images with few or no known vulnerabilities reduces security risk and reduces staff toil.
  </summary>
True: Fewer known vulnerabilities, all things equal, makes the attacker's job harder and reduces the vulnerability triage burden on security teams and developers.
</details>

For readers interested in an example of images that prioritize the criteria described above, [Chainguard Containers](https://github.com/chainguard-images) offers one option.

---

### Software vulnerability remediation
_Path: software-security/cves/cve-remediation.md_

At worst, a software vulnerability can impose a critical security flaw that warrants attention. Developers [care about mitigating software vulnerabilities](/software-security/cves/cve-why-care/) because their presence may harm the integrity of their product, negatively affect downstream users, or slow down efforts toward meeting regulatory requirements. However, modern software development practices which incorporate third-party packages in addition to newly scripted code can complicate the vulnerability remediation process. Keeping track of how and where vulnerabilities are introduced, as well as what introduced them, is an arduous task when multitudes of dependencies are working together.

In this article, you will explore some steps you can take to make vulnerability remediation easier from start to finish. You will begin by learning how various tools can help you catalog the components of your software. Next, you will move on to identifying, triaging, and remediating vulnerabilities, and learn how to address vulnerabilities present in container images.

## Step 1: Knowing your software

Vulnerability remediation can be difficult when your code incorporates a wide array of packages. On top of this, projects often rely on dependencies which have their own dependencies (called *transitive dependencies*), thus further adding to the layers which compose a piece of software. When working on large-scale projects with hundreds of files, dependencies, and collaborators, keeping track of everything can become overwhelming.

To combat this, an [*SBOM*](/open-source/sbom/what-is-an-sbom/), or Software Bill of Materials, can be used. SBOMs are machine-readable documents that track the dependencies of a project. A [good SBOM](/open-source/sbom/what-makes-a-good-sbom/) includes dependency names and their version numbers, enabling accurate identification of every component. By using an SBOM to catalog project dependencies, you can gain insight into the many inputs comprising a piece of software.

In addition to generating an SBOM for your project, you can take your software security one step further with the use of *attestations*, which guarantee the [*provenance*](/software-security/glossary/#provenance) of a software artifact. Establishing provenance of an artifact ensures that it has not been altered after generation, enabling trust and confidence in its composition.

To learn more about using SBOMs and attestations to secure your software supply chain, check out [our article comparing the two options](/open-source/sbom/sboms-and-attestations/).

## Step 2: Vulnerability scanning

After taking steps to understand and catalog your software components, you can move on to scanning for vulnerabilities. A *vulnerability scanner* is a tool which ingests databases of known software vulnerabilities (most notably [the National Vulnerability Database](https://nvd.nist.gov/vuln)) and scans your software to determine if any reported vulnerabilities may be present. Having an SBOM generated for your software can streamline this process, as the SBOM itself can be scanned to determine if you’re running any packages affected by vulnerabilities.

A couple examples of open source vulnerability scanners that you can use are as follows:

* [**Trivy**](https://github.com/aquasecurity/trivy) is a jack-of-all-trades project that can scan a variety of targets including containers, filesystems, and remote Git repositories.

* [**Grype**](https://github.com/anchore/grype) integrates with [Syft](https://github.com/anchore/syft), an SBOM generation tool, making it easier to generate and then scan an SBOM for your software.

## Step 3: Triage

After identifying what vulnerabilities may be present in your software, you can begin triaging them. Vulnerability *triage* is the process of sorting and prioritizing which vulnerabilities need to be addressed first. There are a few factors to be considered when triaging, including false positive vulnerabilities, vulnerability severity, and exploitability status.

* **False positives** - Though vulnerability scanners may find and report a CVE for a given dependency, it may not be present in your software. If the vulnerability is outside of your program’s scope (for example, in a function that you are not calling) then the vulnerability may not truly impact your application, and you do not need to spend time addressing it.

* **Vulnerability severity** – CVEs are assigned a Common Vulnerability Scoring System (CVSS) score to assess the severity of their impacts if exploited. A CVE with a CVSS score of critical may have serious consequences to the [confidentiality, integrity, and availability](https://www.cisecurity.org/insights/spotlight/ei-isac-cybersecurity-spotlight-cia-triad) of a system, making it a priority to remediate. In comparison, a CVE with a low severity score may be difficult to exploit or has minimal impact, so it can be remediated after higher priorities are addressed.

* **Exploitability status** – Not all vulnerabilities have been observed to be exploited. Checking to see if a vulnerability is in the [Known Exploited Vulnerabilities (KEV) Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) can tell you if there is an active attacker threat "in the wild" for vulnerabilities present in your software. Note that a vulnerability’s absence from the KEV Catalog does not mean it won’t be exploitable, as unreported or unobserved attacks on a vulnerability may still exist (or may occur in the future).

[Vulnerability Exploitability eXchange (VEX)](https://www.cisa.gov/sites/default/files/2023-01/VEX_Use_Cases_Aprill2022.pdf) documents can be helpful references when triaging vulnerabilities. VEX is a model which allows software developers to report the status of vulnerabilities in a software product to inform downstream users of what actions they should take to address them. If a scanner reports a vulnerability in a product, a VEX document can elaborate on how the vulnerability truly impacts it.

To learn more about how you can use VEX, check out [OpenVEX](/open-source/sbom/what-is-openvex/), an open source implementation of VEX that you can leverage when generating or ingesting VEX documents.

## Step 4: Remediation

Once you have triaged the vulnerabilities found in your software, you can move on to remediating them. Vulnerability *remediation* is the act of correcting and removing CVEs from your software. Using a CVE ID, you can check sources such as the [National Vulnerability Database (NVD)](https://nvd.nist.gov/) for advisories regarding a vulnerability. Here, you can learn what steps should be taken to address the vulnerability. Oftentimes, this will include updating dependencies to patched versions. After you have followed guidance to fix the vulnerability, you should scan your software again to ensure that it was properly remediated.

Note that not all true positive vulnerabilities may be remediable. In some cases, a patch is not yet made available to address the vulnerability, or updating the package version may introduce breaking changes to your program. In situations like these, focus on what you can remediate given your resources at the time.

## Vulnerabilities in container images

*Container images* are like little bundles of code containing the files and dependencies they each need to run. They are called containers because they operate as a discrete unit; each container has what it needs, and can run independently from other containers.

Container images are helpful as they prevent inputs, permissions, and dependencies from clashing with one another. However, containers are prone to accumulating vulnerabilities if they are not properly maintained. As vulnerabilities are discovered and reported, containers should be *rebuilt* to use updated, secured versions, or else they will begin to collect vulnerabilities. Research from Chainguard Labs has shown that container images from Docker Hub, a popular container image registry, will [accumulate one vulnerability per day if not updated](https://www.chainguard.dev/unchained/enforce-against-vulnerability-sprawl-with-up-to-date-images).

To combat the accumulation of vulnerabilities in containers, you should choose lightweight, minimal container images which are frequently rebuilt. Popular container images often come bundled with hundreds of packages, some of which may be unnecessary for your applications. These extra components contribute to vulnerability accumulation as they don’t necessarily add functionality, but add more vectors to attack.

Using a distribution such as [Alpine Linux](https://alpinelinux.org/about/) or the [Wolfi *undistro*](/open-source/wolfi/overview/), both of which prioritize security and size, can reduce dead weight in your containers. In addition, frequently rebuilding your images ensures that packages are up-to-date and include security patches.

[Chainguard Containers](https://www.chainguard.dev/chainguard-images) offer minimal, frequently rebuilt images to help you reduce vulnerabilities present in your containers. Built on top of [Wolfi](/open-source/wolfi/overview/), the goal of Chainguard Containers is to minimize total attack surface and update continuously in order to reduce your CVE count.

Check out our article on [selecting a base image](/software-security/selecting-a-base-image/) to explore more factors that should impact your container image choice.

## Next steps

After identifying, triaging, and remediating vulnerabilities, you will be left with both a better understanding of your software and a more secure product. However, vulnerability remediation does not stop there. As your software is developed further, new vulnerabilities may be introduced or discovered. It is important to continue scanning your software frequently in order to address any new security concerns that may arise.

## Learn more

Vulnerability management can be daunting at first, especially when your scanners report high CVE counts across hundreds of project dependencies. By leveraging the tools and procedures fit for your needs, you can work towards securing your software, one vulnerability at a time.

In this article, you learned four steps that you can take towards reducing vulnerabilities in your software. You learned how you can use resources such as SBOMs, VEX, and the KEV Catalog to aid you in vulnerability triage. In addition, you explored factors that impact triage and remediation, and how you can choose container images with less vulnerabilities.

To learn more about software vulnerabilities, you can read our [other articles about CVEs](/software-security/cves/). For more information on getting started with Chainguard Containers, check out [our website](https://www.chainguard.dev/chainguard-images) and [documentation](/chainguard/containers/).

---

### Why care about software vulnerabilities?
_Path: software-security/cves/cve-why-care.md_

Software products are prone to [*vulnerabilities*](/software-security/cves/cve-intro/) which, if exploited by an attacker, may negatively impact the systems and consumers relying on them. Attacks against vulnerable software systems can result in the unintended exposure and misuse of sensitive data (like the theft of user account credentials). In other cases, these attacks could affect the provision of a service, or compromise critical infrastructure that relies on the software. Given the considerable threat that they can pose, it is important that developers spend time mitigating vulnerabilities to protect against hackers seeking to exploit them.

Addressing the vulnerabilities present in your software helps secure the systems you support, use, and maintain. In this article, you will explore why you should care about vulnerabilities as a software developer, and learn about federal regulations that draw importance to CVE management.

## As a developer

Discovering and mitigating software vulnerabilities is a difficult – but necessary – task for developers to tackle. Development teams are ultimately the authorities who are able to remediate vulnerabilities at the source. Depending on the severity of a vulnerability, its exploitation could significantly impact the integrity of the software product. The trust, safety, and operations of the consumers who rely on the software may be affected as well.

Vulnerability *triage* is an important step developers must take to work toward reducing risks posed by vulnerabilities in their software. Using [*vulnerability scanners*](https://owasp.org/www-community/Vulnerability_Scanning_Tools) can give developers information about the number, type, and severity of CVEs present in their work. With this data, developers can prioritize critical CVEs, therefore ensuring that major security concerns are addressed first.

## Federal regulations

With notable software supply chain security attacks occurring in recent years (such as the [SolarWinds attack in 2020](/software-security/glossary/#solarwinds-hack)), the U.S. federal government has increased efforts to improve U.S. cybersecurity. These initiatives aim to strengthen software supply chain security by promoting safer development habits, such as frequent vulnerability scanning.

### FedRAMP

The [Federal Risk and Authorization Management Program](https://www.fedramp.gov/) (FedRAMP) is a security framework that must be adopted by cloud service providers (CSPs) before they service U.S. federal government agencies. The framework aims to promote the use of cloud services across agencies by standardizing security authorization practices. Based on the service being offered, FedRAMP sorts cloud services into low, moderate, and high impact levels, with increased security expectations for each level.

In order to achieve FedRAMP authorization, certain requirements need to be met as follows:

- Container images used by CSPs must be *hardened* according to benchmarks laid out in the [NIST SP 800-70](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-70r4.pdf). Our solution is Chainguard Containers, which offers [hardened, minimal base images](https://www.chainguard.dev/chainguard-images) designed to help you meet FedRAMP compliance requirements.

- Vulnerability scanners are expected to report information about discovered vulnerabilities, such as its CVE ID and CVSSv3 score.

Meeting FedRAMP container image and vulnerability scanning requirements allows your organization to expand and reinforce its offerings as a CSP. To learn how we can help you meet FedRAMP container image requirements, check out our blog post on how you can [Fortify, comply and conquer FedRAMP with Chainguard Containers](https://www.chainguard.dev/unchained/fortify-comply-and-conquer-fedramp-with-chainguard-images).

### DHS software self attestation

The Department of Homeland Security (DHS) Cybersecurity and Infrastructure Security Agency (CISA) released their [Secure Software Attestation Form](https://www.cisa.gov/sites/default/files/2023-04/secure-software-self-attestation_common-form_508.pdf) in response to [Executive Order 14028](https://web.archive.org/web/20250119085114/https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/). The attestation form identifies the secure software development practices that developers must verify to have met in order for their software to be utilized by federal agencies. Meeting the criteria laid out by the form is another critical step toward securing your software development processes.

## Learn more

In this article, we discussed reasons why you should care about software vulnerabilities from a development perspective. In addition, you were introduced to federal regulations that draw importance to vulnerability management and secure development practices. This knowledge will help you begin managing vulnerabilities present in the software you develop, improving your security profile and giving you a head start toward meeting regulations like FedRAMP.

To learn more about the importance of software vulnerability management and meeting federal regulations, you can explore the process of [gaining FedRAMP authorization](https://www.fedramp.gov/rev5/agency-authorization/), or learn [how Chainguard Containers can help reduce CVEs in your container images](https://www.chainguard.dev/chainguard-images).

---

### CVEs
_Path: software-security/cves/_index.md_

CVEs, or Common Vulnerabilities and Exposures, are entries of publicly disclosed software vulnerabilities which, if not addressed, may be used by attackers to access, manipulate, or compromise a computer system.

---

### What are software vulnerabilities and CVEs?
_Path: software-security/cves/cve-intro.md_

A [_software vulnerability_](/software-security/glossary/#software-vulnerability) is a weakness in a program which, if left unaddressed, may be used by attackers to access, manipulate, or compromise a computer system. Vulnerabilities can be introduced at different stages of development and vary in their scope, criticality, and potential attack vector depending on their root cause. As a consequence, software developers spend time and resources triaging, remediating, and patching vulnerabilities to harden their software security and to prevent attackers from exploiting unintended program behavior.

With software supply chain attacks [on the rise](https://www.gartner.com/en/articles/7-top-trends-in-cybersecurity-for-2022#:~:text=supply%20chains%2C%20a-,three%2Dfold%20increase,-from%202021.), it is essential that developers and other technology professionals become knowledgeable about software vulnerabilities. Staying on top of the latest threats helps protect against targeted cyber attacks, ensuring the safety of important information and computer systems.

Understanding software vulnerabilities is the first step in mitigating them in order to improve the security of the software you consume, develop, and release. In this article, you will be introduced to software vulnerabilities, examples of their causes and impacts, and learn how known vulnerabilities are documented through the CVE Program.

## What makes a vulnerability?

Any party, process, or other input (like a dependency or package) involved in software production can introduce vulnerabilities into the final release. When third-party inputs used in development have software vulnerabilities, the resulting product may be impacted by them as well. Alternatively, developers writing their own code may unintentionally introduce vulnerabilities to a project through their programming, processes, or habits.

If left unresolved, software weaknesses can advance to become vulnerabilities if hackers are able to exploit them via an attack. For example, not conducting input validation in a program could allow unfiltered or malicious input to affect the program, creating an [_improper input validation_](https://cwe.mitre.org/data/definitions/20.html) vulnerability. A notorious example of this is the [Log4Shell vulnerability](https://www.cisa.gov/news-events/cybersecurity-advisories/aa21-356a), which widely impacted many systems that used the Log4j logging utility.

Attackers may target software vulnerabilities if they see an opportunity to compromise sensitive data or systems for their own benefit. They may choose to prioritize some vulnerabilities over others depending on how lucrative and accessible the opportunity is.

Malicious actors can approach a vulnerability from different [attack vectors](https://www.cloudflare.com/learning/security/glossary/attack-vector/) depending on the weakness type being targeted. In some cases, attack vectors are easier to reach, meaning less leverage is required to expose and exploit the software’s weaknesses.

## The CVE program

Founded by the MITRE Corporation in 1999, the [CVE Program](https://www.cve.org/About/Overview) was established with the goal to collect and document information surrounding known vulnerabilities in software products. Standing for Common Vulnerabilities and Exposures, CVEs are records of publicly disclosed software vulnerabilities. Over time, the program catalog has expanded to include [over 200,000 software vulnerabilities](https://www.cve.org/About/Metrics), with more being added every day.

The CVE Program is supported by the U.S. Department of Homeland Security [Cybersecurity and Infrastructure Security Agency](https://www.cisa.gov/) (CISA). In addition, the CVE Program feeds the [U.S. National Vulnerability Database](https://nvd.nist.gov/vuln) (NVD), which provides additional information for each CVE entry.

## What is a CVE?

A CVE entry represents a known weakness in a software product and contains information to help address any potential risks to the integrity of a system caused by the vulnerability. Each CVE is [assigned a unique CVE ID](https://www.cve.org/About/Process) and is recorded with a description of the vulnerability, a list of affected software releases, any relevant references, and other pertinent information.

[CVE Numbering Authorities](https://www.cve.org/ProgramOrganization/CNAs) (CNAs) are the entities responsible for assigning CVE IDs. CNAs can be software vendors, research groups, open source sponsors, and similar organizations. When a new vulnerability is discovered and reported to a CNA, the CNA will request that a CVE ID is reserved for it. Once reserved, details are added to the CVE record and the entry is published to the database.

## Related software vulnerability efforts

While the CVE Program database functions stand-alone to communicate known vulnerabilities with developers, a variety of related efforts provide additional information and context to support the database.

- The [Common Vulnerability Scoring System](https://www.first.org/cvss/), or CVSS, is a metric which helps assess the severity of any given vulnerability and serves as a tool for developers who are determining which CVEs to address first.

- Similar to the CVE Program, MITRE also supports the [Common Weaknesses Enumeration](https://cwe.mitre.org/index.html), or CWE. The CWE catalogs product-unspecific types of software weaknesses which may produce vulnerabilities if present in a program.

- The [U.S. National Vulnerability Database](https://nvd.nist.gov/vuln/search) (NVD) connects to the CVE database to provide further information regarding CVE entries. The NVD provides additional references and public advisories regarding each vulnerability. It also connects each CVE with a CVSS score, links a vulnerability’s associated CWE(s), and reports whether it is in the CISA’s [Known Exploited Vulnerabilities](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) (KEV) catalog.

## Learn more

In this article, you were introduced to software vulnerabilities, learned about their characteristics, and how they are tracked in the CVE Program catalog. This understanding will help you to start triaging and addressing vulnerabilities present in the software you produce or consume to limit the potential for attackers to successfully exploit your systems.

To learn more about software vulnerabilities, you can visit the [CVE Program website](https://www.cve.org/About/Overview), [explore the NVD](https://nvd.nist.gov/vuln/search), or [take a look at the KEV Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog).

You can also check out our other articles on [why you should care about vulnerabilities in your software](/software-security/cves/cve-why-care/), [infamous software vulnerabilities](/software-security/cves/infamous-cves/), and [our guide to addressing vulnerabilities in your software](/software-security/cves/cve-remediation/).

---

### Infamous software vulnerabilities
_Path: software-security/cves/infamous-cves.md_

[Software vulnerabilities](/software-security/cves/cve-intro/) vary in their severity – some are difficult to exploit and have minimal implications, while others can be exploited easily, giving an attacker significant leverage over a computer system. In cases where widely-implemented software contains high-severity vulnerabilities, the damage caused by their exploitation can affect millions of developers and services worldwide.

In this article, you will learn how the KEV Catalog tracks known exploited software vulnerabilities, and how it serves as a tool for developers and federal agencies. In addition, you will explore Log4Shell, Heartbleed, and Shellshock, three infamous software vulnerabilities which have had major impacts on software security worldwide.

## CISA KEV Catalog

The U.S. Cybersecurity and Infrastructure Security Agency (CISA) operates the Known Exploited Vulnerabilities (KEV) Catalog, which is populated with CVEs that have existing exploits “in the wild”. The KEV Catalog serves as a tool for developers as it identifies CVEs that need to be prioritized for remediation because of their exploitability status. Federal civilian executive branch agencies [must remediate vulnerabilities](https://www.cisa.gov/news-events/directives/binding-operational-directive-22-01) present in the KEV Catalog by a due date specified by the CISA. Focusing on patching out these vulnerabilities limits the ability of attackers to find a potential known route into a system.

Some of the vulnerabilities in the KEV Catalog are infamous for the impacts of their exploitation. When a vulnerability affects a piece of software present in an array of systems, its exploitation can reach far and wide, and efforts to remediate it can be difficult to fully implement. The following vulnerabilities are present in the KEV Catalog and serve as examples of how damaging ubiquitous software vulnerabilities can be.

### Log4Shell (CVE-2021-44228)

[Log4Shell](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) is a vulnerability impacting the Apache Log4j Java logging utility, a popular library used on millions of devices worldwide. The vulnerability allows an attacker to perform a remote code execution (RCE) attack by logging code that runs a Java Naming and Directory Interface (JNDI) endpoint lookup. An attacker can exploit this behavior by performing a JNDI lookup to a server under their control containing malicious code. This vulnerability has affected Log4j since version 2.0-beta9 (released in 2013), and was patched out in version 2.16.0 in 2021.

Due to the popularity of Log4j, Log4Shell was extremely pervasive, impacting a variety of services such as those offered by [Amazon Web Services](https://aws.amazon.com/security/security-bulletins/AWS-2021-006/) and [IBM](https://www.ibm.com/support/pages/apache-log4j2-cve-2021-44228-security-vulnerability), among others. Its widespread use makes this vulnerability difficult to completely remediate as it may be unknown if a vulnerable version of Log4j is present on a system, such as in the case of [a federal network being affected](https://www.cisa.gov/news-events/cybersecurity-advisories/aa22-320a) months after the vulnerability was first documented.

To learn more about Log4Shell, check out its listing on the [Apache Log4j Security Vulnerabilities](https://logging.apache.org/log4j/2.x/security.html#fixed-in-log4j-2-15-0-java-8) page.

### Heartbleed (CVE-2014-0160)

[Heartbleed](https://nvd.nist.gov/vuln/detail/CVE-2014-0160) is a buffer over-read vulnerability in OpenSSL, a popular cryptographic library commonly used for encrypting SSL/TLS communications on the internet. The vulnerability allows an attacker to read the memory of a system without detection. As a result, cryptographic keys, credentials, and other content can be silently extracted from a server’s memory.

Heartbleed affected OpenSSL versions 1.0.1-1.0.1f (inclusive) and was discovered in 2014, about two years after the vulnerability was first introduced to OpenSSL. Due to its undetectable nature, determining if it was exploited against a particular server is difficult. It was estimated at the time of discovery that around [half a million websites](https://www.netcraft.com/blog/half-a-million-widely-trusted-websites-vulnerable-to-heartbleed-bug/) may have been vulnerable to the bug.

To learn more about the Heartbleed vulnerability, check out the [Heartbleed website](https://heartbleed.com/).

### Shellshock (CVE-2014-6271)

[Shellshock](https://nvd.nist.gov/vuln/detail/CVE-2014-6271) is an arbitrary code execution vulnerability which went unnoticed for 25 years, existing in Bash since 1989 and first being reported in version 4.3 in 2014. Through this vulnerability, commands that should be inaccessible can instead be executed through Bash’s function export feature. In affected versions, Bash processes function definitions stored in environment variables, causing the unintended behavior that enables malicious code to be run. Following the initial CVE report, further CVEs were soon filed addressing additional related vulnerabilities.

As Shellshock was not discovered for over two decades after its inception, the scope of its influence is significant, with it still being leveraged against systems today. Soon after the vulnerability was uncovered, large-scale [attacks using botnets](https://www.itnews.com.au/news/first-shellshock-botnet-attacks-akamai-us-dod-networks-396197) were deployed against high-profile entities like the U.S. Department of Defense.

To learn more about Shellshock and its related vulnerabilities, check out [the CISA’s Shellshock alert](https://www.cisa.gov/news-events/alerts/2014/09/25/gnu-bourne-again-shell-bash-shellshock-vulnerability-cve-2014-6271).

## Learn more

In this article, you learned how the CISA’s KEV Catalog tracks exploited vulnerabilities, and how the catalog is used by developers and federal agencies to prioritize vulnerability remediation. You also explored three infamous software vulnerabilities: Log4Shell, Heartbleed, and Shellshock, and learned how they have impacted systems across the world.

To learn more about these vulnerabilities and other exploited vulnerabilities, dive further into [the KEV Catalog](https://www.cisa.gov/known-exploited-vulnerabilities), or check out [the full CVE database](https://cve.mitre.org/cve/search_cve_list.html).

---

### Sea-curing Software With Linky
_Path: software-security/comics/_index.md_

Join Linky on their mission to sea-cure the software supply chain!

---

### Sea-curing Software #1 - Fighting Vulnerabilities
_Path: software-security/comics/fighting-vulnerabilities/index.md_

<img alt="Comic featuring Chainguard's mascot, Linky the octopus, using their tentacles to defend a vulnerable computer from software vulnerabilities. The vulnerabilities take the form of robotic octopuses charging forward as an army toward the computer." src="seacuring-software-ep1.png" />

---

### WTF happened with the PyPI phishing attack?
_Path: software-security/videos/PyPI.md_

{{< youtube IvxWXk5jSsc >}}

<br>
On 8/24/22, PyPI, an open source repository of software for the Python programming language, announced an active phishing campaign targeting PyPI users. How did it happen and how can we prevent future attacks? Let’s recap:

Before we cover the phishing attack, it’s worthwhile to mention that on July eighth, PyPI announced it would require the implementation of two-factor authentication (2FA) for projects deemed critical — that is, any project in the top 1% of downloads of the past 6 months. It is a huge step forward for open source security, and as of August twenty-fourth (today/yesterday), nearly ~30k PyPI maintainers have 2FA enabled.

About a month and a half later, on August, twenty-fourth, PyPI tweeted that they had reports of phishing, or fake emails, that appeared to be from PyPI requiring a mandatory validation process which led users to a fake login page. When the user went to enter credentials, they were stolen.

Legitimate projects have been compromised, and malware published as the latest release for those projects. PyPI has already taken down several hundred typosquats of the malicious releases.

It’s important to note that accounts protected by hardware security keys, the strongest form of 2FA, are not vulnerable. It is currently unclear if timed-based one-time passwords (for example a one-time use SMS pin) were affected.

What happens now?

PyPI is actively reviewing reports of new malicious releases, and ensuring that they are removed and the maintainer accounts restored. They are also recommending to reset passwords and 2FA recovery codes if you have entered your credentials to the phishing site.

This attack highlights the importance of MFA, especially hardware or WebAuthn 2FA.
Hardware keys are not vulnerable to these types of attacks because, in order to authenticate with it, you physically have to have the key, which makes it impossible for attackers to get the information they need to log in from afar. [Dan to show a Yubikey].

PyPI is run largely by volunteer maintainers who are working to make the open source ecosystem more secure. Having checks in place that may require a small amount of time for individual maintainers to set up can have an outsized impact on the overall wellness of the software supply chain.

If you haven’t already, enable 2FA at https://pypi.org/2fa/ and shout out to the PyPI team for their transparency and their continued efforts toward keeping open source more secure!

---

### WTF is a distroless container?
_Path: software-security/videos/distroless.md_

{{< youtube rCy7PrS2REY >}}

Have you heard of distroless container images? This video is going to break down what they are, how they work, and why they're better.

The easiest way to explain what a distroless container image is and how it differs from a traditional fat container image is by starting with the fat container image, then we'll point out the parts that aren't necessary and how distroless images let you build smaller, leaner, more secure container images.

In a traditional fat container image like this one shown in the video, we have a bunch of different stuff installed in it. We start out with a package manager that we typically use to install a bunch of dependencies and then all the way on the other side we have our application. The dependencies that we install with the package manager might be needed to build our application or to operate it at runtime. Additionally, the package manager itself is an application and that comes with its own set of dependencies which we can see here. Some of those dependencies are used for our application because they might be shared or used for a bunch of different things, but some of those dependencies are only used for the package manager. All of those build tools and the package manager dependencies are left in the container image at the end, making it larger, taking up space, and potentially introducing an increased attack surface.

The package manager itself and all of its dependencies and build tools aren't actually needed at run time to operate our application, so a distroless container image works by stripping all of those out so that the only thing left in the image at runtime is your application and the exact dependencies that it needs. You don't have the build tools, the compilers, the package manager or its dependencies.

A fun metaphor or comparison is this massive ship here, full of giant containers and cranes used to load all of them. This is like a typical fat container image.

Distroless images are so slim, you can hold them in your hand. It also makes them a lot more transparent and easier to use and see what's inside of them.

Another metaphor here is this massive ship that has a crane on the ship itself. Sure that crane is useful for loading and unloading the packages once you get to the ports, but it's much more efficient to leave the cranes at those ports so you can have smaller ships.

A distroless analogy would be small ships here, holding exactly one container each. There's no extra or wasted space, there's no crane to load or unload them; you have to do that from the outside before you go on your journey.

To figure out how they work, let's again start with the traditional fat container image. These images are built up in layers. You start with a base image that contains the package manager, a shell, and other tools you might need to get your application inside. Then you add on layers, one at a time. These layers can only really add things they can add compiled executables or new packages. You can't remove things from previous layers.

---

### WTF is Sigstore?
_Path: software-security/videos/sigstore.md_

{{< youtube veiCVgDpYcY >}}
<br>
Let’s talk about software supply chain security.

Vulnerabilities and attacks in software have been increasing in recent years, and the U.S. government recently passed a Bill in the House that would forbid the Department of Defense (DoD) from procuring any software applications that contain a single security vulnerability or CVE (short for common vulnerability or exposure). Attacks and other security issues can exist all across the software supply chain, from the dependencies or packages you leverage in your code, to the code you write, to your deployment and integration strategy, to your packaging.

With so many opportunities for attack vectors and vulnerability risks, what can software developers do?

Luckily there is an open source solution that can help with mitigating some of these security concerns. It’s called Sigstore, and it offers a suite of tools that provides a new standard for signing, verifying and protecting software. Sigstore handles digital signing, verification and checks for the provenance needed to make it safer to distribute and use open source software.

So what does that all mean? Let’s use a in real life example:
If you’re going to a concert that has an age restriction, or you want to open a new bank account, someone is going to ask you for your ID. Neither the concert venue nor the bank issued you this ID, probably a national or local governmental body did. But your ID still attests to your identity and the venue or bank will accept this ID as your identity because of the trust root that exists with this ID-issuing authority. In the case of the bank account, once you open it, your bank account number will now be part of a database or log that is connected to your identity. This is similar to how Sigstore works, bringing identity (your ID), a certificate authority (the governmental body that issued your ID), and a transparency log (bank account database) together to enable verification and trust to exist at each step of the software supply chain.

We’ll break down how this happens with each part of the Sigstore project (Cosign, Rekor, Fulcio, and Gitsign) in upcoming videos so follow for more!

Cosign
Cosign is a tool that helps make software more secure. Part of the Sigstore project, Cosign supports container signing, verification, and storage in an OCI (open container images) registry. Cosign makes it so that code signatures can be a part of invisible infrastructure.

If we think about something physical that we want to keep secure, we may think of keys and a lock. Cosign lets developers generate a key pair with a private signing key that only you have access to, and a public verification key that can be stored with the software or in a transparency log. These keys are attached to the software artifact as a signature when it is released (whether that’s as a package, binary, container, whatever). Once that software is out in the world, another developer or user can verify the claims of the signature by checking that the public key matches up with the claims.

We can also think about Cosign as like a wax seal on old paper letters. When someone — say a queen or public official — wrote a letter that needed to be secured, they would close up the letter and drip wax on it, then stamp into it with their seal or emblem. This would let the person who receives the letter know that the letter is from whom it claims to be from, and also that that letter wasn’t tampered with, which the recipient would know if the wax seal was broken.

Another neat thing about Sigstore is that it enables keyless signing, meaning you don’t need to generate a key pair but can use an OIDC (OpenID Connect) protocol to authenticate your identity instead. This can currently be done through Google, GitHub, or Microsoft, and it will tie your identity — based on an email address or username — to the code you are signing.

We’ll go into the rest of the Sigstore suite soon — including certificates, transparency logs, and signing Git commits — so follow for more!

---

### WTF is a typo squatting attack?
_Path: software-security/videos/github-typosquatting.md_

{{< youtube nB3xw3Nazgc >}}

<br>
Hi, I’m Dan Lorenc, CEO & Co-founder of Chainguard and I’ve been working in the open source software supply chain security space for a long time.

Today, we’re going to recap the massive typo squatting attack that was carried out against a bunch of open source projects on GitHub on August 3, 2022.

Typosquatting is a type of attack where an attacker changes the name of a real project subtly to make it look like that project but it's not actually the same repository or package and it is really hard to detect because there are a lot of subtle ways to do it. You can change underscores to hyphens, mess around with Unicode characters, plurals, just to name a few.

On August 3, a tweet went viral about over 35,000 fake repositories created cloning after real projects, things like Kubernetes, cryptography, libraries, and programming languages, all designed with very similar names. This got a little bit over sensationalized because of the scale of the attack until everyone found out what really happened.

Fortunately, this was caught early, so no malicious commits are actually found in real projects. That's where a lot of the confusion came from. Only malicious code slipped into these imposter repositories. Typically, there's a second phase of these attacks where developers may unknowingly use the malicious fake repository’s code, thinking it was the real one, thus compromising their project. Thankfully, though, this one was caught in the middle, so nothing bad actually happened.

But we don't know how bad this one really could have been if it hadn't been noticed and played out for longer. This attack was the largest and most advanced I've seen so far. The scale of over 35,000 repositories showed some clear automation. The malicious commands were slipped in and hidden inside of real ones and they were all semantically correct, too. So it'd be tough to catch, if you were just casually looking around.

So what can you do to protect yourself against stuff like this?  
There's a couple of different ways:

As an end user, pay very close attention to your dependencies, it's going to be hard to notice typosquatting attacks like this, but these are all very recently created repositories with very few stars and little activity as a maintainer.

To prevent someone from creating an imposter repository, the only protection really available today is to sign your commits. There's a bunch of different tooling to do this, including a new one called Gitsign, it's part of the Sigstore project. None of these are perfect and solve it completely. But if you pay enough attention, and if enough people start signing their commits, it will be easier for us to detect these across the open source ecosystem at scale.

---

### Static Chainguard container images
_Path: software-security/learning-labs/ll202509.md_

The September 2025 Learning Lab, led by Adrian Moat, focuses on minimizing the
attack surface of container images by adopting Chainguard's static and minimal
images, which boast zero known CVEs. Adrian demonstrated a container build for a
Go-based application and explains more complex use cases.

{{< youtube 4Cjy_iBNr3I >}}

## Sections

- [00:01](http://www.youtube.com/watch?v=4Cjy_iBNr3I&) Welcome and introductions
- [03:34](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=214) Talk outline and prerequisites
- [04:34](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=274) Understanding CVEs
- [07:34](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=454) Introducing Chainguard Containers
- [08:58](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=538) Vulnerability and size comparison
- [10:14](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=614) Why Chainguard images are more secure
- [11:46](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=706) Practical demo: Migrating a Go container image
- [15:01](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=901) Initial build
- [17:59](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=1079) Migration to Chainguard base image
- [20:45](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=1245) Multi-stage build and static image optimization
- [27:39](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=1659) Static vs. dynamic binaries
- [30:16](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=1816) Chainguard Container variants
- [32:34](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=1954) Distroless Containers and dev images
- [33:30](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=2010) Debugging Distroless containers demonstration
- [44:57](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=2697) Key takeaways and wrap-up
- [46:44](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=2804) Next Learning Lab announcement
- [47:50](http://www.youtube.com/watch?v=4Cjy_iBNr3I&t=2870) Resources for further learning

## Resources

- [Slide deck](/downloads/learning-lab-static-images-202509.pdf)

---

### Chainguard Libraries for JavaScript and CVE remediation for Python libraries
_Path: software-security/learning-labs/ll202510.md_

The October 2025 Learning Lab with Manfred Moser covers Chainguard Libraries for
JavaScript and CVE remediation with Chainguard Libraries for Python. It starts
with an overview about libraries and the JavaScript ecosystem and moves on to a
demo with npm and pnpm. In the second section Manfred explains the approach for
CVE remediation and shows an example project with remediation and scanning with
grype.

{{< youtube 6V7IHtYekwM >}}

## Sections

* [0:00](https://www.youtube.com/watch?v=6V7IHtYekwM) Introduction
* [1:55](https://www.youtube.com/watch?v=6V7IHtYekwM&t=115s) Agenda
* [2:54](https://www.youtube.com/watch?v=6V7IHtYekwM&t=174s) Secure container and the role of libraries
* [5:20](https://www.youtube.com/watch?v=6V7IHtYekwM&t=320s) Software supply chain for libraries and security
* [6:51](https://www.youtube.com/watch?v=6V7IHtYekwM&t=411s) Chainguard Libraries and the JavaScript ecosystem
* [14:33](https://www.youtube.com/watch?v=6V7IHtYekwM&t=873s) Malware in the npm ecosystem
* [18:39](https://www.youtube.com/watch?v=6V7IHtYekwM&t=1119s) Chainguard Libraries for JavaScript
* [25:57](https://www.youtube.com/watch?v=6V7IHtYekwM&t=1557s) Demoes with npm and pnpm
* [33:50](https://www.youtube.com/watch?v=6V7IHtYekwM&t=2030s) Troubleshooting results and additional demos
* [41:34](https://www.youtube.com/watch?v=6V7IHtYekwM&t=2494s) Chainguard Libraries for Python
* [43:39](https://www.youtube.com/watch?v=6V7IHtYekwM&t=2619s) CVE remediation process and examples
* [52:03](https://www.youtube.com/watch?v=6V7IHtYekwM&t=3123s) Demoes with uv and grype
* [56:25](https://www.youtube.com/watch?v=6V7IHtYekwM&t=3385s) Further resources
* [57:35](https://www.youtube.com/watch?v=6V7IHtYekwM&t=3455s) Next up
* [58:18](https://www.youtube.com/watch?v=6V7IHtYekwM&t=3498s) Questions
* [1:06:00](https://www.youtube.com/watch?v=6V7IHtYekwM&t=3960s) Wrapping up

## JavaScript demo

The demonstration of Chainguard Libraries for JavaScript walks through the
[minimal example for
pnpm](/chainguard/libraries/javascript/build-configuration/#pnpm-minimal) with
direct access to the registry and with access to a local repository manager, and
shows an equivalent project with npm as well.

## CVE remediation demo

The example project to showcase the CVE remediation for Python packages uses a
simple project setup for use with `uv`.

The pyproject.toml file contains all relevant configuration:

```toml
[project]
name = "uv-example"
version = "0.1.0"
description = "An example project with uv for Chainguard Libraries"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
    "flask==2.0.0",          # fix with 2.0.0+cgr.1
    "werkzeug==3.0.2",       # fix in 3.0.2+cgr.1
    "urllib3==1.26.7",       # fix in 1.26.7+cgr.1
    "setuptools==77.0.3"     # fix in 77.0.3+cgr.1
]

[[tool.uv.index]]
name = "nexus"
#url = "http://localhost:8081/repository/python-all/simple/"
url = "http://localhost:8081/repository/python-all-remediated/simple/"
```

Note the declared dependencies just using the plain semantic version. These
versions are resolved to the specific versions with the CVE fixes in place if
the remediated packages are available.

The script sets up a new virtual environment, builds the project with uv, and
then scans for vulnerabilities with grype:

```shell
rm -rf bin dist uv.lock
python3 -m venv .
source ./bin/activate
uv cache clean
rm -rf lib include
uv build
uv lock
grype .
```

## Resources

* [Slide deck](/downloads/learning-lab-javascript-cve-202510.pdf)
* [Chainguard Libraries product site](https://www.chainguard.dev/libraries)
* [Chainguard Libraries documentation](/chainguard/libraries/)
* [Chainguard Libraries for JavaScript documentation](/chainguard/libraries/javascript/)
* [Chainguard Libraries for Python documentation](/chainguard/libraries/python/)
* [CVE remediation for Chainguard Libraries](/chainguard/libraries/policies-and-security/cve-remediation/)
* [Vulnerability scanners and Chainguard Libraries](/chainguard/libraries/policies-and-security/scanners/)

---

### Chainguard OS on Raspberry Pi
_Path: software-security/learning-labs/ll202511.md_

The November 2025 Learning Lab with Erika Heidi covers the [release of Chainguard OS for the Raspberry Pi](https://www.chainguard.dev/unchained/a-gift-for-the-open-source-community-chainguards-cve-free-raspberry-pi-images-beta), showing how Chainguard OS has evolved to power new environments.

{{< youtube SvUU2n2mQ7M >}}

## Sections

- [0:46](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=46s) Presentation Starts
- [2:55](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=175s) How We Got Here: Wolfi and Chainguard OS
- [5:47](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=347s) Presenting Chainguard OS for the Raspberry Pi
- [8:42](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=522s) How to Set Up your Raspberry Pi with Chainguard OS
- [11:23](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=683s) Grype scan on the Raspberry images
- [14:47](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=887s) Demo Overview: Guardcraft Pi
- [18:10](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=1090s) Grype scan on the Guardcraft image
- [20:59](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=1259s) Live Demo: Minecraft server on the Raspberry Pi
- [24:14](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=1454s) Demo Overview: Open Source LLM server
- [30:51](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=1851s) Grype scan on the wolfi-llama image
- [32:35](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=1955s) Live Demo: Open Source Llama.cpp Server
- [35:03](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2103s) Live image description with Qwen3-VL and Llama.cpp
- [39:18](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2358s) Live Demo: ALT description CLI tool using Llama.cpp server API
- [41:24](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2484s) What's Next
- [42:22](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2542s) New Compliance Features for Chainguard VMs
- [44:20](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2660s) Chainguard VMs Roadmap
- [45:40](https://www.youtube.com/watch?v=SvUU2n2mQ7M&t=2740s) Announcing the next Learning Labs

## Quickstart

To get started with Chainguard OS on the Raspberry Pi, and to be able to run the demos in this presentation, you'll need:

- A Raspberry Pi 5
- Power source for the Raspberry Pi 5
- MicroSD card (and reader)
- Ethernet connection
- Micro-hdmi to hdmi cable (to connect your Pi to a display )
- USB Keyboard

You also need to download the Chainguard Raspberry Pi Docker image by filling in [the request form](http://images.chainguard.dev/rpi).

### Creating the startup disk

Unpack the image contents:

```shell
gunzip rpi-generic-docker-arm64-*.raw.gz
```

Create the disk - this assumes your microSD card reader is on `/dev/sda`:

```shell
sudo dd if=rpi-generic-docker-arm64-*.raw of=/dev/sda bs=1M
```

After the disk is ready, plug it into the Pi and connect the board to the power source, ethernet cable, micro-hdmi, and keyboard. You can log in with user **linky** and password **linky**.

Then, you can run `ip addr` to find out your local network IP address and connect to the Pi via SSH from another computer.

## Demo 1: Guardcraft Minecraft server on Raspberry Pi

On the first demo, Erika demonstrates how to build a minimal Minecraft Java server with Chainguard Containers, running Chainguard OS on the Raspberry Pi.

From the Raspberry Pi, clone the [Guardcraft](https://github.com/chainguard-demo/guardcraft-server) repository:

```shell
git clone https://github.com/chainguard-demo/guardcraft-server.git && cd guardcraft-server
```

Build the image:

```shell
docker build . -t guardcraft-server
```

Then, run the Minecraft server with:

```shell
docker-compose up
```

This starts a Minecraft Java server using default settings configured via environment variables on the `docker-compose.yaml` file. You can connect from any compatible client on your local network.

## Demo 2: Llama.cpp LLM server on Raspberry Pi

On the second demo, Erika shows how to build a Llama.cpp container image using Chainguard Containers, and how to run the Llama.cpp server with vision-capable LLMs for generating rich ALT image descriptions, on the Raspberry Pi with Chainguard OS.

### Step 1: Building the wolfi-llama image

From the Raspberry Pi, clone the [Wolfi-llama](https://github.com/erikaheidi/wolfi-llama) repository:

```shell
git clone https://github.com/erikaheidi/wolfi-llama.git && cd wolfi-llama
```

Next, run the command to build the `wolfi-llama` container image. This step compiles Llama.cpp from source, which may take several minutes to complete.

```shell
docker build . -t wolfi-llama
```

### Step 2: Downloading LLMs into the Pi

For this demo, we're using the [Qwen3-VL](https://huggingface.co/unsloth/Qwen3-VL-2B-Instruct-GGUF/tree/main) open source LLM, since that has vision capabilities. We picked the 2B-Instruct version since that runs well on the Raspberry Pi.

Access the `models` directory from the repository. This is where the model files should be stored in order to be shared with the container when the server is running:

```shell
cd models/
```

Download the LLM model from Huggingface:

```shell
curl -L -O https://huggingface.co/unsloth/Qwen3-VL-2B-Instruct-GGUF/resolve/main/Qwen3-VL-2B-Instruct-Q8_0.gguf?download=true
```

Next, download the `mmproj` file for that model, since that is required for advanced image features:

```shell
curl -L -O https://huggingface.co/unsloth/Qwen3-VL-2B-Instruct-GGUF/resolve/main/mmproj-F32.gguf?download=true
```

When download is complete, you can run the server.

### Step 3: Running the Llama server

The `docker-compose.yaml` file includes a custom **command** directive that includes all options required for running the server using the models you just downloaded. These values are hardcoded so you don't need to type a long `docker run` command every time you want to get the server up and running. As a reference, here is the command that you'll be running via `docker-compose`:

```shell
docker run --rm --device /dev/dri/card1 --device /dev/dri/renderD128 \
 -v ${PWD}/models:/models -p 8000:8000 wolfi-llama:latest --no-mmap --no-warmup \
 -m /models/Qwen3-VL-2B-Instruct-Q8_0.gguf --mmproj /models/mmproj-F32.gguf \
 --port 8000 --host 0.0.0.0 -n 512 \
 --temp 0.7 \
 --top-p 0.8 \
 --top-k 20 \
 --presence-penalty 1.5
```

To start the server, run:

```shell
docker-compose up
```

When the server is up and running, you can access the chatbot interface from your browser by pointing it to the Raspberry Pi IP address in your local network, on port `8000`.

## Resources

- [Slide deck](/downloads/learning-lab-raspberrypi-202511.pdf)
- Blog: [Chainguard’s FIPS-validated, hardened VM images: compliance without the complexity](https://www.chainguard.dev/unchained/chainguards-fips-validated-hardened-vm-images-compliance-without-the-complexity)
- Blog: [A Gift for the Open Source Community: Chainguard’s CVE-Free Raspberry Pi Images (Beta)](https://www.chainguard.dev/unchained/a-gift-for-the-open-source-community-chainguards-cve-free-raspberry-pi-images-beta)
- Tutorial: [Tutorial: Running Open Source LLMs on a Raspberry Pi 5 with Llama.cpp](https://eheidi.dev/posts/raspberry-llama/)
- Repository: [Guardcraft demo](https://github.com/chainguard-demo/guardcraft-server)
- Repository: [Wolfi-Llama demo](https://github.com/erikaheidi/wolfi-llama)

---

### Learning Labs
_Path: software-security/learning-labs/_index.md_

Learning Labs are [regularly run, virtual events from
Chainguard](https://www.chainguard.dev/events) that provide educational and
training material about Chainguard products, software supply chain security, and
related topics.

## Lab notes

The lab notes often include demo projects, a slide presentation, sample
commands, links to specific sections in the video, and pointers to more
resources:

- [{{<icon "play-circle-fill">}} Chainguard Libraries for Java with CVE remediation and fallback - July 2026](/software-security/learning-labs/ll202607/)
- [{{<icon "play-circle-fill">}} Build safely with AI - May 2026](/software-security/learning-labs/ll202605/)
- [{{<icon "play-circle-fill">}} Securing CI/CD with Chainguard - April 2026](/software-security/learning-labs/ll202604/)
- [{{<icon "play-circle-fill">}} Software supply chain attacks and Chainguard Libraries - March 2026](/software-security/learning-labs/ll202603/)
- [{{<icon "play-circle-fill">}} AI-assisted migration to Chainguard Containers - February 2026](https://www.youtube.com/watch?v=JUPBtq3DyUw&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} AI with hardened containers and libraries - January 2026](https://www.youtube.com/watch?v=hkoj-dm-5z8&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Shipping safer container runtimes in 2026 - December 2025](/software-security/learning-labs/ll202512/)
- [{{<icon "play-circle-fill">}} Chainguard OS on Raspberry Pi - November 2025](/software-security/learning-labs/ll202511/)
- [{{<icon "play-circle-fill">}} Chainguard Libraries for JavaScript and CVE remediation for Python libraries - October 2025](/software-security/learning-labs/ll202510/)
- [{{<icon "play-circle-fill">}} Static Chainguard container images - September 2025](/software-security/learning-labs/ll202509/)
- [{{<icon "play-circle-fill">}} Getting started with Chainguard's Dockerfile Converter - August 2025](/software-security/learning-labs/ll202508/)
- [{{<icon "play-circle-fill">}} AI with hardened container images - July 2025](/software-security/learning-labs/ll202507/)
- [{{<icon "play-circle-fill">}} Chainguard Libraries for Python - June 2025](/software-security/learning-labs/ll202506/)
- [{{<icon "play-circle-fill">}} Chainguard Libraries for Java - May 2025](/software-security/learning-labs/ll202505/)

Older labs are available in the [YouTube
playlist](https://www.youtube.com/playlist?list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn):

- [{{<icon "play-circle-fill">}} Building Guardcraft using Chainguard images - Mar 2025](https://www.youtube.com/watch?v=q6I0JC3h06U&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard's Python image - Feb 2025](https://www.youtube.com/watch?v=922G7SLs0b0&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard static images – Jan 2025](https://www.youtube.com/watch?v=YAo7Bp6S4bY&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard FIPS images – Dec 2024](https://www.youtube.com/watch?v=SYeym1SinA0&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard's Python image – Nov 2024](https://www.youtube.com/watch?v=Pja990V0Rfc&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Building secure Java images with Chainguard images - Oct 2024](https://www.youtube.com/watch?v=SX4xeRzbpYo&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard's WordPress image - Sep 2024](https://www.youtube.com/watch?v=HAC0Nyt6_Uc&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard AI images - Aug 2024](https://www.youtube.com/watch?v=Dbh4OMsZkNg&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Building secure and minimal images with Chainguard static images - Jun 2024](https://www.youtube.com/watch?v=IQr-wmVzaK0&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Unlock 0 CVEs by migrating your Python application to Chainguard images - May 2024](https://www.youtube.com/watch?v=cc2qxhZmMDo&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)
- [{{<icon "play-circle-fill">}} Chainguard's PHP and Laravel image - Apr 2024](https://www.youtube.com/watch?v=0PSsJsKXqok&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn&index=12)
- [{{<icon "play-circle-fill">}} Chainguard's Java container image - Mar 2024](https://www.youtube.com/watch?v=8v8xlFnRHfs&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn&index=14)
- [{{<icon "play-circle-fill">}} Build and secure minimal images with Chainguard static images - Feb 2024](https://www.youtube.com/watch?v=YBrczgb7e58&list=PLLjvkjPNmuZmvi2ZDXicVAWAC_mg2Jpgn)

---

### Chainguard Libraries for Java
_Path: software-security/learning-labs/ll202607.md_

AI frontier models are accelerating the discovery of vulnerabilities in Java
applications at a pace that teams can't keep up with. If your team is stuck on
older Java versions that are hard to upgrade, you need support to remediate
those vulnerabilities so you can get time back in your day to build.

In the July 2026 Learning Lab, Manfred Moser shares the details behind
Chainguard Libraries for Java, with an overview of how to start using
remediated versions directly with Apache Maven.

Manfred covers and demonstrates the following new features:

- CVE remediation for Spring Framework and other libraries
- Protected fallback to Maven Central
- Cooldown and other policies

The lab uses a hands-on demo project to migrate a typical Maven build to
Chainguard Libraries.

{{< youtube c6n_SQgx4xI >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=0s) Introduction
- [2:42](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=162s) Software supply chain and open source components
- [6:20](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=380s) History of software supply chain security issues and attacks
- [8:30](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=510s) Chainguard Libraries and Chainguard Factory overview
- [11:30](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=690s) Details about Chainguard Libraries
- [17:36](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=1056s) CVE remediation
- [24:30](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=1470s) What is remediated?
- [25:47](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=1547s) Browsing remediated libraries
- [30:14](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=1814s) Fallback and policies
- [35:24](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=2124s) Start of demos
- [35:50](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=2150s) chainctl demo
- [40:47](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=2447s) Simple artifact download scripts demo
- [43:08](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=2588s) Example application and Maven settings.xml file
- [46:02](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=2762s) Building and running the example application
- [50:10](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=3010s) Advanced pom.xml modification
- [55:43](https://www.youtube.com/watch?v=c6n_SQgx4xI&t=3343s) Final Q&A

## Questions

The following questions were asked by the audience during the event, and
responses are added since time ran out to answer them all:

### How does Chainguard differ from eg: "pip-audit" for Python? or npm run audit for Node? ..etc.

`pip-audit` and `npm audit` are reactive scanners that flag known
vulnerabilities in dependencies you already pulled from public registries.
Chainguard Libraries is preventive: dependencies are rebuilt from source in the
hardened Chainguard Factory and served with malware scanning and cooldown
controls, closing off the build and distribution attack surface a scanner cannot
see. The two are complementary. The VEX feed from Chainguard includes
information about remediated CVEs on Chainguard Libraries and can be used by
scanners.

### For backported fixes for Java specifically, does Chainguard have an n-? support model as to which versions fixes will be backported to?

There is no fixed n-minus matrix. Backports target critical and high CVEs on
older versions that customers still run and that upstream no longer patches,
prioritized by usage and demand. Request specific libraries through your account
team. Typically n-? policies also are not meaningful since they are heavily
impacted by the release cadence of upstream projects and the presence of
multiple maintained major version streams. Chainguard focuses on the customer
demand for backports.

### When you say. "source" - is it the source Github repo? or the public registry (Eg: PyPI for python)

Source means the upstream code in a source code manager such as GitHub or
GitLab, not the binary from a registry like PyPI, npm, or Maven Central.
Chainguard verifies the project's source URL and rebuilds from that code, so
packages without a valid, verifiable source URL are out of scope and no binary
is produced.

### I don't see "Manage pull tokens" option under my Profile for Libraries

Creating pull tokens requires the ecosystem entitlement and the matching
`pull_token_creator` role, such as `libraries.java.pull_token_creator`. Without
both, the option does not appear. Tokens live under **Overview** on the **Manage
pull tokens** tab, not a personal profile menu. Ask an administrator to confirm
your entitlement and role, or create tokens with `chainctl auth pull-token`.

### Is there a way to update the policy, change cooldown period

Yes. With the Owner role, and upstream fallback enabled, create a policy with a
cooldown value and enforce it:

```bash
chainctl libraries policy create --name=java-trust --cooldown-days=0
chainctl libraries policy enable java-trust --ecosystem=JAVA --mode=ENFORCE
```

The default is 7 days, and `--cooldown-days=0` deactivates cooldown. One custom
policy per ecosystem carries all your cooldown, block, and override rules.

### Any support for other tech - Golang, Rust

Chainguard Libraries currently covers the Java, JavaScript, and Python
ecosystems. Future plans are considering Golang, Rust, .NET, and others.

### How do you deal with custom / non-standard / non-one-step builds? E.e. build that require (undocumented) properties set?

In the context of Chainguard Libraries on the Chainguard side, we determine how
to build libraries with the help of our expert engineers and our agentic
infrastructure.

In the context of customers using Chainguard Libraries on their own projects,
you must troubleshoot and debug these details with the help of Apache Maven and
other tools.

### For the fix using this as an example do these fixes get pushed to the open source package instead of a private Chainguard repo? If not how come?

Remediated fixes ship from the dedicated `java-remediated` Chainguard repository
with a `-0.cgr.N` suffix, not upstream as the released artifact. These backports
target older versions upstream no longer patches. Chainguard cannot publish them
under the same coordinates on Maven Central. Chainguard does collaborate with
upstream projects to contribute fixes as source code where possible and the
project is interested.

### If we are overriding versions how do we ensure integrity and stability of the application?

Overriding dependency versions with CVE-remediated Java libraries allows you to
keep the version difference of the change minimal and isolated to the CVE fixes.
Nevertheless you must test your application thoroughly to ensure the integrity
and stability of your application. When upgrading more libraries, and
introducing larger version drifts, this need for verification and potentially
adjusted code becomes more and more critical, and can result in significant
necessary changes, that must be tested and verified like any other application
change.

### How do you ensure that the dependencies that you use during build do not contain any malicious code?

When using Chainguard Libraries for Java with the fallback to upstream Maven
Central, you can rely on the extensive analysis and scanning of the artifacts
performed by Chainguard.

## Resources

- [Demo project on GitHub](https://github.com/chainguard-demo/chainguard-libraries-java)
- [Slide deck](/downloads/learning-lab-202607.pdf)
- [Chainguard Libraries documentation](/chainguard/libraries/introduction/overview/)

---

### Chainguard Libraries for Python
_Path: software-security/learning-labs/ll202506.md_

The June 2025 Learning Lab with Patrick Smyth covers Chainguard Libraries for
Python. Open source libraries help you move fast, but pulling in external
dependencies can introduce supply chain risk. This session covers fundamental
concepts of Chainguard Libraries, package managers and dependencies, PyPI and
build tools, configuring repository managers, and running example application builds.

{{< youtube h_nzhPY_vDA >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=h_nzhPY_vDA) Introduction and welcome
- [0:54](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=54s) Patrick Smyth introduction and background
- [1:47](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=107s) Chainguard! Who are we?
- [2:47](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=167s) Chainguard Containers and the "boss assigned me to fix Ubuntu" problem
- [4:12](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=252s) Introduction to Chainguard Libraries for Python
- [5:04](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=304s) Python libraries fundamentals - modules, packages, and libraries
- [6:34](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=394s) The dependency graph problem and modern ecosystem challenges
- [8:57](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=537s) PyPI (Python Package Index) overview and infrastructure
- [10:53](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=653s) Supply chain attacks on the rise and threats to the Python ecosystem
- [11:39](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=699s) Supply chain meme calendar - an attack every month this year
- [13:54](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=834s) Anatomy of supply chain attacks and attack vectors
- [17:43](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1063s) Chainguard Libraries!
- [19:34](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1174s) Chainguard Factory overview and operational security
- [21:33](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1293s) Case study: Ultralytics YOLO December 2024 attack
- [23:22](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1402s) Technical caveats and requirements for Chainguard Libraries
- [25:06](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1506s) Demo introduction and Flask project overview
- [27:48](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1668s) Accessing demo materials on Chainguard Academy
- [29:00](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1740s) Demo: Cloning and setting up the Flask project
- [31:17](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1877s) Demo: Creating virtual environment and installing from PyPI
- [33:06](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=1986s) Demo: Running Flask application and testing with libCheck tool
- [34:28](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2068s) Demo: Configuring pip for Chainguard Libraries via repository manager
- [36:19](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2179s) Demo: Installing dependencies from Chainguard Libraries
- [37:02](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2222s) Demo: Verification with libCheck
- [38:22](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2302s) Demo: Containerizing the demo application
- [40:25](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2425s) Demo: Building and running containerized Flask application
- [41:41](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2501s) Additional configuration options and documentation resources
- [42:19](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2539s) Q&A: Repository manager setup and configuration
- [43:26](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2606s) Q&A: Architecture support and glibc requirements
- [44:34](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2674s) Q&A: libCheck tool open source plans and detailed output
- [46:05](https://www.youtube.com/watch?v=h_nzhPY_vDA&t=2765s) Q&A: CVE scanning with Grype and vulnerability management

## Demo

In the demo, Patrick switches a Flask application to use Chainguard Libraries for Python, sourcing dependencies from a repository manager (Artifactory) set up to pull first from the Chainguard Libraries for Python index with a fallback to the Python Package Index (PyPI).

[Demo Flask application](https://github.com/chainguard-dev/cg-images-python-migration/tree/libraries-demo)

Patrick demonstrates two approaches. First, he modifies the `~/.pip/pip.conf` file to pull from the virtual repository set up in the repository manager:

```
[global]
index-url = <repository-url>
```

After changing this global setting, Patrick installs and runs the application from a virtual environment, then uses Chainguard's `libCheck` tool to test the provenance of the packages in the virtual environment. Chainguard is in the process of releasing this tool under an open source license.

Patrick  also updates the demo application's `requirements.txt` file and build and run the application from a Chainguard Container.

## Resource links

- [Slide deck](/downloads/learning-lab-python-libraries.pdf)
- [Chainguard Libraries](https://www.chainguard.dev/libraries)
- [Chainguard Libraries documentation](/chainguard/libraries/introduction/overview/)
- [Chainguard Libraries for Python documentation](/chainguard/libraries/python/overview/)
- [Python global configuration](/chainguard/libraries/python/global-configuration/)
- [Python build configuration](/chainguard/libraries/python/build-configuration/)
- [Python Package Index (PyPI)](https://pypi.org/)
- [pip documentation](https://pip.pypa.io/)
- [Python Packaging User Guide](https://packaging.python.org/)
- [Cheese Must Stand: Defending the Python Library Ecosystem in 2025 at PyCon 2025](https://www.youtube.com/watch?v=5cdC5pVkCvU)

---

### Securing CI/CD with Chainguard
_Path: software-security/learning-labs/ll202604.md_

The April 2026 Learning Lab with Erika Heidi goes through how attackers exploit vulnerable GitHub Actions workflows, and how Chainguard can protect your CI/CD pipelines from these threats.
{{< youtube D9tORVR4H9g >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=D9tORVR4H9g) Introduction and agenda
- [5:31](https://www.youtube.com/watch?v=D9tORVR4H9g&t=331s) Timeline of CI/CD software supply chain incidents
- [11:25](https://www.youtube.com/watch?v=D9tORVR4H9g&t=685s) Open Source and CI/CD as the new target
- [12:47](https://www.youtube.com/watch?v=D9tORVR4H9g&t=767s) 2026: the year of AI-assisted attacks
- [15:16](https://www.youtube.com/watch?v=D9tORVR4H9g&t=916s) Unpacking the Trivy Compromise
- [19:57](https://www.youtube.com/watch?v=D9tORVR4H9g&t=1197s) Secret exfiltration live demo
- [36:17](https://www.youtube.com/watch?v=D9tORVR4H9g&t=2177s) What could unfold from here
- [39:04](https://www.youtube.com/watch?v=D9tORVR4H9g&t=2344s) Strategies to mitigate risks
- [39:24](https://www.youtube.com/watch?v=D9tORVR4H9g&t=2364s) Repository inspection for insecure defaults
- [44:03](https://www.youtube.com/watch?v=D9tORVR4H9g&t=2643s) Minimize attack surface
- [48:48](https://www.youtube.com/watch?v=D9tORVR4H9g&t=2928s) Pull from trusted sources
- [52:21](https://www.youtube.com/watch?v=D9tORVR4H9g&t=3141s) Pin by digest
- [54:28](https://www.youtube.com/watch?v=D9tORVR4H9g&t=3268s) Use short lived tokens (ban PATs)
- [55:32](https://www.youtube.com/watch?v=D9tORVR4H9g&t=3332s) Use Chainguard Actions
- [58:55](https://www.youtube.com/watch?v=D9tORVR4H9g&t=3535s) Closing notes

## Resources

- [Slide deck](/downloads/learning-lab-securing-cicd-202604.pdf)
- [Chainguard Containers](/chainguard/containers/overview/)
- [Chainguard Libraries](/chainguard/libraries/introduction/overview/)
- [Chainguard Actions](https://www.chainguard.dev/actions)
- [Digestabot](https://github.com/marketplace/actions/update-the-image-digest)
- [Octo-STS](https://github.com/apps/octo-sts)

---

### Software supply chain attacks and Chainguard Libraries
_Path: software-security/learning-labs/ll202603.md_

The March 2026 Learning Lab with Manfred Moser focuses on the history, trends,
and future developments around software supply chain attacks. Manfred talks
about the role libraries for application developers and demonstrates numerous
new features and use cases for Chainguard Libraries.

{{< youtube MPKP8YSoheE >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=MPKP8YSoheE) Introduction and agenda
- [1:45](https://www.youtube.com/watch?v=MPKP8YSoheE&t=105s) Software supply chain overview
- [7:25](https://www.youtube.com/watch?v=MPKP8YSoheE&t=445s) History of attacks and overview of different methods
- [17:59](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1079s) Future threads and trends
- [21:37](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1297s) Statistics about intensifying attacks
- [22:54](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1374s) Incidents and fire drills
- [25:05](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1505s) Impact from Minecraft and log4j on Maven Central
- [26:42](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1602s) Chainguard Libraries overview
- [32:21](https://www.youtube.com/watch?v=MPKP8YSoheE&t=1941s) Chainguard Libraries for Python, Java, and JavaScript
- [35:17](https://www.youtube.com/watch?v=MPKP8YSoheE&t=2117s) Demo - Browsing libraries in the console UI
- [40:38](https://www.youtube.com/watch?v=MPKP8YSoheE&t=2438s) Demo - Pull token creation in console UI and with chainctl
- [42:13](https://www.youtube.com/watch?v=MPKP8YSoheE&t=2533s) Demo - Browsing Python simple index
- [45:50](https://www.youtube.com/watch?v=MPKP8YSoheE&t=2750s) Demo - Browsing Java repository
- [49:25](https://www.youtube.com/watch?v=MPKP8YSoheE&t=2965s) Demo - Example projects for JavaScript and Python
- [56:35](https://www.youtube.com/watch?v=MPKP8YSoheE&t=3395s) Demo - Verification with chainctl
- [58:47](https://www.youtube.com/watch?v=MPKP8YSoheE&t=3527s) Chainguard Repository
- [1:01:16](https://www.youtube.com/watch?v=MPKP8YSoheE&t=3676s) Upcoming events

## Resources

- [Slide deck](/downloads/learning-lab-chainguard-libraries-202603.pdf)
- [Chainguard Libraries documentation](/chainguard/libraries/introduction/overview/)

---

### Build safely with AI
_Path: software-security/learning-labs/ll202605.md_

The May 2026 Learning Lab with Erika Heidi explores AI-native threat models and how to mitigate risks involved with AI-assisted coding, leveraging Cursor and Chainguard for a secure AI SLDC.

{{< youtube EDbPhANkMsU >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=EDbPhANkMsU) Introduction and agenda
- [3:35](https://www.youtube.com/watch?v=EDbPhANkMsU&t=215s) "This Changes Everything"
- [4:19](https://www.youtube.com/watch?v=EDbPhANkMsU&t=259s) How the threat model changed with AI
- [8:17](https://www.youtube.com/watch?v=EDbPhANkMsU&t=497s) Your local dev environment at risk
- [9:49](https://www.youtube.com/watch?v=EDbPhANkMsU&t=589s) AI-native attack vectors
- [12:30](https://www.youtube.com/watch?v=EDbPhANkMsU&t=750s) Closing the trust gap
- [14:14](https://www.youtube.com/watch?v=EDbPhANkMsU&t=854s) Two principles for a safe SLDC with AI assistance
- [23:06](https://www.youtube.com/watch?v=EDbPhANkMsU&t=1386s) Vibecoding with trusted sources
- [27:26](https://www.youtube.com/watch?v=EDbPhANkMsU&t=1646s) The Chainguard plugin for Cursor
- [29:03](https://www.youtube.com/watch?v=EDbPhANkMsU&t=1743s) Demo - building an SBOM visualizer
- [31:27](https://www.youtube.com/watch?v=EDbPhANkMsU&t=1887s) The initial prompt
- [33:50](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2030s) The resulting vibecoded app
- [34:20](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2060s) Migrating to Chainguard Libraries
- [36:43](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2203s) Verifying coverage
- [38:26](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2306s) Recap of what we neutralized
- [40:15](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2415s) Other Chainguard skills to try out on Cursor
- [48:45](https://www.youtube.com/watch?v=EDbPhANkMsU&t=2925s) Wrapping Up

## Resources

- [Slide deck](/downloads/learning-lab-202605.pdf)
- [Chainguard plugin for Cursor](https://cursor.com/marketplace/chainguard)
- [Chainguard Containers](/chainguard/containers/overview/)
- [Chainguard Libraries](/chainguard/libraries/introduction/overview/)

---

### Shipping safer container runtimes in 2026
_Path: software-security/learning-labs/ll202512.md_

The December 2025 Learning Lab with Erika Heidi focuses on strategies to improve the security of your software supply chain and ship safer container runtimes in 2026.

{{< youtube z5SNwBC4T-Q >}}

## Sections

- [00:00](https://www.youtube.com/watch?v=z5SNwBC4T-Q) Intro
- [02:52](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=172s) Why Devs need to care
- [04:48](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=288s) XZ Utils incident
- [09:43](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=583s) tj-actions/changed-files incident
- [12:42](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=762s) Sha1-Hulud Second Coming
- [17:11](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=1031s) Trending threat models
- [32:42](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=1962s) Mitigating risks
- [45:02](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=2702s) Concrete Dev actions this sprint
- [50:47](https://www.youtube.com/watch?v=z5SNwBC4T-Q&t=3047s) Chainguard Containers: CVE Comparisons

## Resources

- [Slide deck](/downloads/learning-lab-202512.pdf)
- [Chainguard Containers overview](https://edu.chainguard.dev/chainguard/containers/overview/)
- [Chainguard Libraries overview](https://edu.chainguard.dev/chainguard/libraries/introduction/overview/)
- [Migrating to Chainguard Containers](https://edu.chainguard.dev/chainguard/containers/migration/migrations-overview/)
- [Inspecting Chainguard Containers](https://edu.chainguard.dev/chainguard/containers/troubleshooting/inspecting-containers/)
- [Using Digestabot with Chainguard Containers](https://edu.chainguard.dev/chainguard/containers/security-and-compliance/updating-containers/digestabot/)
- [Using Renovate with Chainguard Containers](https://edu.chainguard.dev/chainguard/containers/security-and-compliance/updating-containers/renovate/)
- [Images Directory](https://images.chainguard.dev/)

---

### AI with hardened container images
_Path: software-security/learning-labs/ll202507.md_

The July 2025 Learning Lab with Patrick Smyth covers AI with Hardened Container Images. In this session, learn how to secure AI workloads by reducing vulnerabilities in container images by over 90%. Patrick demonstrates hands-on techniques for training an animal detection model using PyTorch with hardened container images, creating minimal and secure deployments, and running AI frameworks with zero CVEs.

{{< youtube JGSc6BwjbRI >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=JGSc6BwjbRI) Introduction and updates
- [2:02](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=122s) Preparation: Docker pull instructions for demo
- [3:39](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=219s) Chainguard! Who are we?
- [4:34](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=274s) CVE system fundamentals
- [6:48](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=408s) "Boss assigned me to fix Ubuntu" problem
- [7:41](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=461s) Introduction to Chainguard Containers
- [8:54](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=534s) Zero CVE containers: Real results and comparisons
- [11:10](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=670s) How we achieve zero CVEs: Minimal, Fresh, Advisory, Patch
- [13:24](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=804s) AI container challenges: Size and complexity
- [14:59](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=899s) PyTorch container analysis: CVEs, packages, and executables
- [16:21](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=981s) Demo introduction: Image classification with PyTorch
- [17:59](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1079s) Demo walkthrough and repository overview
- [19:28](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1168s) Demo: Running the training command
- [22:01](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1321s) Demo: Downloading test image and running inference
- [23:20](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1400s) Recent developments in Chainguard AI containers
- [25:09](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1509s) Other AI containers: TensorFlow, KServe, Triton backends
- [26:46](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=1606s) Q&A
- [35:18](https://www.youtube.com/watch?v=JGSc6BwjbRI&t=2118s) Chainguard AI course and additional resources

## Demo

In the demo, Patrick trains and runs inference on an image classification model using PyTorch and Chainguard's hardened container image. The model classifies images of octopuses, whales, and penguins, demonstrating how to work with AI workloads securely.

[Demo repository: PyTorch getting started](https://github.com/chainguard-dev/pytorch-getting-started/blob/main/learning-lab.md)

### Training the model

First, create a directory for the project and download the necessary files:

```bash
mkdir -p ~/image_classification && cd ~/image_classification && \
curl https://codeload.github.com/chainguard-dev/pytorch-getting-started/tar.gz/main | \
tar -xz --strip=1 pytorch-getting-started-main/
```

Then run the training script inside a Chainguard PyTorch container:

```bash
docker run --user root --rm -it \
  --platform linux/amd64 \
  -v "$PWD/:/home/nonroot/octopus-detector" \
  cgr.dev/chainguard/pytorch:latest \
  "/home/nonroot/octopus-detector/image_classification.py"
```

This command generates a model file named `octopus_whale_penguin_model.pt`.

### Running inference

To test the trained model, first download a test image:

```bash
curl https://raw.githubusercontent.com/chainguard-dev/pytorch-getting-started/main/inference-images/octopus.jpg > ~/image_classification/octopus.jpg
```

Then run the classification:

```bash
cd ~/image_classification && \
docker run --user root --rm -it \
  --platform linux/amd64 \
  -v "$PWD:/home/nonroot/octopus-detector" \
  cgr.dev/chainguard/pytorch:latest \
  "/home/nonroot/octopus-detector/image_classification.py" \
  "/home/nonroot/octopus-detector/octopus.jpg"
```

The demo showcases how Chainguard's hardened PyTorch image provides the same functionality as traditional images while eliminating vulnerabilities and reducing the attack surface.

## Resources

- [Slide deck](/downloads/learning-lab-ai-images.pdf)
- [Demo repository](https://github.com/chainguard-dev/pytorch-getting-started)
- [Chainguard AI/ML Supply Chain Security Course](https://courses.chainguard.dev/securing-ai)
- [Getting started with the PyTorch Chainguard Container](https://edu.chainguard.dev/chainguard/containers/getting-started/ai-and-data/pytorch/)
- [PyTorch container overview](https://images.chainguard.dev/directory/image/pytorch/overview)
- [Beyond Zero: Eliminating Vulnerabilities in PyTorch Container Images (PyTorch 2024)](https://www.youtube.com/watch?v=1klynk1dxYA)

---

### Chainguard Libraries for Java
_Path: software-security/learning-labs/ll202505.md_

The May 2025 Learning Lab with Manfred Moser covers Chainguard Libraries for
Java. It starts with an overview about libraries and the Java ecosystem and
progresses to a demo with Apache Maven and Sonatype Nexus.

{{< youtube z42b2_lePNI >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=z42b2_lePNI) Introduction and agenda
- [2:38](https://www.youtube.com/watch?v=z42b2_lePNI&t=158s) Chainguard and containers
- [3:47](https://www.youtube.com/watch?v=z42b2_lePNI&t=227s) Chainguard Factory
- [4:57](https://www.youtube.com/watch?v=z42b2_lePNI&t=297s) Concepts - from containers to libraries
- [9:00](https://www.youtube.com/watch?v=z42b2_lePNI&t=540s) Java and Java libraries
- [12:45](https://www.youtube.com/watch?v=z42b2_lePNI&t=765s) Software supply chain of libraries and attacks
- [19:27](https://www.youtube.com/watch?v=z42b2_lePNI&t=1167s) Dependency supply in Java
- [20:30](https://www.youtube.com/watch?v=z42b2_lePNI&t=1230s) Repository concept and Maven Central
- [24:32](https://www.youtube.com/watch?v=z42b2_lePNI&t=1472s) Chainguard Libraries for Java and repository manager intro
- [28:17](https://www.youtube.com/watch?v=z42b2_lePNI&t=1697s) Developer tools
- [29:21](https://www.youtube.com/watch?v=z42b2_lePNI&t=1761s) Demo start and setup with chainctl
- [32:55](https://www.youtube.com/watch?v=z42b2_lePNI&t=1975s) Sonatype Nexus configuration
- [37:30](https://www.youtube.com/watch?v=z42b2_lePNI&t=2250s) Maven configuration
- [40:41](https://www.youtube.com/watch?v=z42b2_lePNI&t=2441s) Example project setup, build, and results
- [44:57](https://www.youtube.com/watch?v=z42b2_lePNI&t=2697s) Dependency list and tree
- [47:00](https://www.youtube.com/watch?v=z42b2_lePNI&t=2820s) Results and verification
- [49:37](https://www.youtube.com/watch?v=z42b2_lePNI&t=2977s) Summary
- [50:43](https://www.youtube.com/watch?v=z42b2_lePNI&t=3043s) Up next
- [52:55](https://www.youtube.com/watch?v=z42b2_lePNI&t=3175s) Questions

## Demo

Following are some of the commands used in the demo. More information can be
found in the slide deck, the linked resources, and the video.

Creating a pull token:

```shell
chainctl auth login

chainctl libraries entitlements list

chainctl auth pull-token --repository=java --ttl=1h
```

Cleaning up the local Maven repository cache:

```shell
rm -rf ~/.m2/repository
```

Building [Trino Gateway](https://github.com/trinodb/trino-gateway) from source
and looking at dependencies:

```shell
cd trino-gateway

./mvnw clean install -DskipTests=true

./mvnw dependency:list

./mvnw dependency:tree
```

## Resource links

- [Chainguard Libraries](https://www.chainguard.dev/libraries)
- [Chainguard Libraries documentation](/chainguard/libraries/introduction/overview/)
- [Chainguard Libraries for Java documentation](/chainguard/libraries/java/overview/)
- [Slide deck](/downloads/learning-lab-chainguard-libraries-java.pdf)
- [Apache Maven](https://maven.apache.org/)
- [Sonatype Nexus Repository](https://www.sonatype.com/products/sonatype-nexus-repository)
- [Apache Maven dependency plugin](https://maven.apache.org/plugins/maven-dependency-plugin/)

---

### Getting started with Chainguard's Dockerfile Converter
_Path: software-security/learning-labs/ll202508.md_

The August 2025 Learning Lab with Erika Heidi covers [DFC](/chainguard/containers/migration/migration-tools/dockerfile-conversion/), or Dockerfile Converter, an open source tool created by the Chainguard team to facilitate migration to Chainguard Containers. In this session, learn how to install and use DFC to effectively convert your Dockerfiles to use minimal container images from Chainguard. Erika demonstrates how to use various flags to customize DFC's output and also how to connect the DFC MCP server to your AI assistant to have DFC functionality integrated within your current AI workflow.

{{< youtube HzZRFpnKKIU >}}

## Sections

- [0:00](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=0s) Introduction
- [1:28](https://youtu.be/HzZRFpnKKIU?t=88) What is DFC?
- [3:42](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=222s) Why Convert to Chainguard  Containers
- [5:26](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=326s) How DFC works
- [9:22](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=562s) Tag Mappings
- [12:54](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=774s) Installation
- [15:45](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=945s) Demo 1: Basic Usage
- [21:50](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=1310s) Customizing DFC's Output
- [23:45](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=1425s) Demo 2: Customizing with Flags
- [28:55](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=1735s) Using DFC as a Go library
- [30:05](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=1805s) Using the DFC MCP server with an AI code assistant
- [32:19](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=1939s) Demo 3: Multi-stage Dockerfile conversion
- [36:29](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=2189s) Demo 4: Using DFC's MCP server with Claude Code
- [41:00](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=2460s) Q&A starts
- [52:54](https://www.youtube.com/watch?v=HzZRFpnKKIU&t=3174s) Closing Notes

## Demo 1

In the first demo, Erika demonstrates DFC's basic usage with a few inline conversions:

Converting a single `FROM` line:

```shell
echo "FROM node" | dfc -
```

Converting a single `RUN` line:

```shell
echo "RUN apt-get update && apt-get install -y nano" | dfc -
```

Erika also demonstrates how to run DFC to convert a whole Dockerfile. You can use this Python Dockerfile as a reference:

```Dockerfile
FROM python:3.9

ADD main.py .

RUN pip install requests beautifulsoup4 python-dotenv

CMD ["python", "./main.py"]
```

To convert this Dockerfile, run:

```shell
dfc Dockerfile
```

## Demo 2

In the second demo, Erika shows how to use various flags to customize output produced by DFC.

### Specifying the org

To specify the org and overwrite the `ORG` placeholder, you can use the `--org` flag:

```shell
dfc Dockerfile --org chainguard
```

### Using a custom mappings file

Sometimes, it might be useful to overwrite default mappings for images and packages. For example, let's consider the following Dockerfile for a `php-fpm` environment:

```Dockerfile
FROM php:fpm

RUN apt-get update && apt-get install -y \
    git \
    curl \
    libxml2-dev \
    zip \
    unzip

# Install Composer and set up application
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN mkdir /application
COPY . /application/
RUN cd /application && composer install
```

With default settings, DFC will use Chainguard's `php:latest-dev` image for this environment, but we'd like it to use `php:latest-fpm-dev` instead. Create a mappings file such as this:

```custom-mappings.yaml
images:
    php:fpm: php:latest-fpm-dev
```

Then you can provide it alongside the `--mappings` flag when running DFC:

```shell
dfc --mappings="custom-mappings.yaml" Dockerfile
```

## Demo 3

The third demo shows how to convert multi-stage builds and how to connect the DFC MCP server to your AI assistant, using Claude Code as example.

### Converting multi-stage Dockerfiles

Consider the following Dockerfile as example:

```shell
FROM python:3.9 as builder
WORKDIR /app

RUN apt update && apt install -y curl git

ENV PATH="/venv/bin:$PATH"
RUN python -m venv /app/venv

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-slim
WORKDIR /app

ENV PATH="/venv/bin:$PATH"

COPY main.py /app
COPY --from=builder /app/venv /venv

CMD ["python", "/app/main.py"]
```

This example builds a runtime in two stages. To convert, run DFC as usual:

```shell
dfc Dockerfile --org chainguard
```

The expected result:

```shell
FROM cgr.dev/chainguard/python:3.9-dev AS builder
USER root
WORKDIR /app

RUN apk add --no-cache curl git

ENV PATH="/venv/bin:$PATH"
RUN python -m venv /app/venv

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

FROM cgr.dev/chainguard/python:3.9-dev
USER root
WORKDIR /app

RUN apk add --no-cache curl git

ENV PATH="/venv/bin:$PATH"

COPY main.py /app
COPY --from=builder /app/venv /venv

CMD ["python", "/app/main.py"]
```

### DFC MCP server (Claude Code)

To build the MCP server that is included with DFC, access the project directory, then enter the `mcp-server` folder and run:

```shell
go build -o mcp-server .
```

To add the DFC MCP server to Claude Code **per project**, run:

```shell
claude mcp add dfc -- ~/dfc/mcp-server/mcp-server
```

To add the DFC MCP server to Claude Code **system-wide** for your user, run:

```shell
claude mcp add dfc -s user -- ~/dfc/mcp-server/mcp-server
```

After that, you'll be able to ask Claude to convert your Dockerfiles to use Chainguard Images, and the task should be proxied through the DFC MCP server.

## Resources

- [Slide deck](/downloads/learning-lab-dfc-202508.pdf)
- [Getting Started with DFC Course](https://courses.chainguard.dev/getting-started-with-chainguards-dockerfile-converter)
- [DFC documentation](https://edu.chainguard.dev/chainguard/containers/migration/migration-tools/dockerfile-conversion/)
- [DFC on GitHub](https://github.com/chainguard-dev/dfc)

---

### Minimum attestation references
_Path: software-security/secure-software-development/minimum-attestation-references.md_

The minimum requirements within the Secure Software Attestation Form address requirements
put forth in EO 14028 subsection (4)(e) and specific SSDF practices and tasks. For reference,
please review the chart below.

| Attestation Requirements | Related EO 14028 Subsection | Related SSDF Practices and Tasks |
| -- | -- | -- |
| 1) The software was developed and built in secure environments. Those environments were secured by the following actions, at a minimum: | 4e(i) | [See rows below]|
| a) Separating and protecting each environment involved in developing and building software; | 4e(i)(A) | [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1) |
| b) Regularly logging, monitoring, and auditing trust relationships used for authorization and access: i) to any software development and build environments; and ii) among components within each environment; | 4e(i)(B) | [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1) |
| c) Enforcing multi-factor authentication and conditional access across the environments relevant to developing and building software in a manner that minimizes security risk; | 4e(i)(C) | [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1), [PO.5.2](/software-security/secure-software-development/ssdf/#PO.5.2) |
| d) Taking consistent and reasonable steps to document, as well as minimize use or inclusion of software products that create undue risk, within the environments used to develop and build software; | 4e(i)(D) | [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1) |
| e) Encrypting sensitive data, such as credentials, to the extent practicable and based on risk; | 4e(i)(E) | [PO.5.2](/software-security/secure-software-development/ssdf/#PO.5.2)
| f) Implementing defensive cyber security practices, including continuous monitoring of operations and alerts and, as necessary, responding to suspected and confirmed cyber incidents; | 4e(i)(F) | [PO.3.2](/software-security/secure-software-development/ssdf/#PO.3.2), [PO.3.3](/software-security/secure-software-development/ssdf/#PO.3.3), [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1), [PO.5.2](/software-security/secure-software-development/ssdf/#PO.5.2)
| 2) The software producer has made a good-faith effort to maintain trusted source code supply chains by: | | |
| a) Employing automated tools or comparable processes; and b) Establishing a process that includes reasonable steps to address the security of third-party components and manage related vulnerabilities; | 4e(iii) | PO 1.1, [PO.3.1](/software-security/secure-software-development/ssdf/#PO.3.1), [PO.3.2](/software-security/secure-software-development/ssdf/#PO.3.2), [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1), [PO.5.2](/software-security/secure-software-development/ssdf/#PO.5.2), [PS.1.1](/software-security/secure-software-development/ssdf/#PS.1.1), [PS.2.1](/software-security/secure-software-development/ssdf/#PS.2.1), [PS.3.1](/software-security/secure-software-development/ssdf/#PS.3.1), [PW.4.1](/software-security/secure-software-development/ssdf/#PW.4.1), [PW.4.4](/software-security/secure-software-development/ssdf/#PW.4.4), PW 7.1, PW 8.1, RV 1.1 |
| 3) The software producer maintains provenance data for internal and third-party code incorporated into the software; | 4e(vi) | [PO.1.3](/software-security/secure-software-development/ssdf/#PO.1.3), [PO.3.2](/software-security/secure-software-development/ssdf/#PO.3.2), [PO.5.1](/software-security/secure-software-development/ssdf/#PO.5.1), [PO.5.2](/software-security/secure-software-development/ssdf/#PO.5.2), [PS.3.1](/software-security/secure-software-development/ssdf/#PS.3.1), [PS.3.2](/software-security/secure-software-development/ssdf/#PS.3.2), [PW.4.1](/software-security/secure-software-development/ssdf/#PW.4.1), [PW.4.4](/software-security/secure-software-development/ssdf/#PW.4.4), [RV.1.1](/software-security/secure-software-development/ssdf/#RV.1.1), [RV.1.2](/software-security/secure-software-development/ssdf/#RV.1.2) |
| 4) The software producer employed automated tools or comparable processes that check for security vulnerabilities. In addition: a) The software producer ensured these processes operate on an ongoing basis and, at a minimum, prior to product, version, or update releases and b) The software producer has a policy or process to address discovered security vulnerabilities prior to product release; and c) The software producer operates a vulnerability disclosure program and accepts, reviews, and addresses disclosed software vulnerabilities in a timely fashion. | 4e(iv) | [PO.4.1](/software-security/secure-software-development/ssdf/#PO.4.1), [PO.4.2](/software-security/secure-software-development/ssdf/#PO.4.2), [PS.1.1](/software-security/secure-software-development/ssdf/#PS.1.1), [PW.2.1](/software-security/secure-software-development/ssdf/#PW.2.1), [PW.4.4](/software-security/secure-software-development/ssdf/#PW.4.4), [PW.5.1](/software-security/secure-software-development/ssdf/#PW.5.1), [PW.6.1](/software-security/secure-software-development/ssdf/#PW.6.1), [PW.6.2](/software-security/secure-software-development/ssdf/#PW.6.2), [PW.7.1](/software-security/secure-software-development/ssdf/#PW.7.1), [PW.7.2](/software-security/secure-software-development/ssdf/#PW.7.2), [PW.8.2](/software-security/secure-software-development/ssdf/#PW.8.2), [PW.9.1](/software-security/secure-software-development/ssdf/#PW.9.1), [PW.9.2](/software-security/secure-software-development/ssdf/#PW.9.2).

## References

Table of the references comes from the top of the [original RFC PDF](https://www.cisa.gov/secure-software-attestation-form).

_Reprinted courtesy of the National Institute of Standards and Technology, U.S. Department of Commerce. Not copyrightable in the United States._

---

### CISA Secure Software Development Attestation Form (Draft)
_Path: software-security/secure-software-development/ssd-attestation-form.md_

## Attestation and signature

On behalf of the above-specified company, I attest that [software producer] presently makes consistent use of the following practices, drawn from the secure software development
framework (SSDF), in developing the software identified in Section I:

1. The software is developed and built in secure environments. Those environments are secured by the following actions, at a minimum:
    1. Separating and protecting each environment involved in developing and building Software;
    1. Regularly logging, monitoring, and auditing trust relationships used for authorization and access:
        1. to any software development and build environments; and
        1. among components within each environment;
    1. Enforcing multi-factor authentication and conditional access across the environments relevant to developing and building software in a manner that minimizes security risk;
    1. Taking consistent and reasonable steps to document as well as minimize use or inclusion of software products that create undue risk within the environments used to develop and build software;
    1. Encrypting sensitive data, such as credentials, to the extent practicable and based on risk;
    1. Implementing defensive cyber security practices, including continuous monitoring of operations and alerts and, as necessary, responding to suspected and confirmed cyber incidents;
1. The software producer has made a good-faith effort to maintain trusted source code supply chains by:
    1. Employing automated tools or comparable processes; and
    1. Establishing a process that includes reasonable steps to address the security of third-party components and manage related vulnerabilities;
1. The software producer employs automated tools or comparable processes in a good-faith effort to maintain trusted source code supply chains;
1. The software producer maintains provenance data for internal and third-party code incorporated into the software;
1. The software producer employs automated tools or comparable processes that check for security vulnerabilities. In addition:
    1. The software producer ensures these processes operate on an ongoing basis and, at a minimum, prior to product, version, or update releases; and
    1. The software producer has a policy or process to address discovered security vulnerabilities prior to product release; and
    1. The software producer operates a vulnerability disclosure program and accepts, reviews, and addresses disclosed software vulnerabilities in a timely fashion.

I attest that all requirements outlined above are consistently maintained and satisfied.
I further attest the company will notify all impacted agencies if conformance to any element of this attestation is no longer valid.

Please check the appropriate boxes below, if applicable:

* [ ] There are addendums and/or artifacts attached to this self-attestation form, the title and contents of which are delineated below the signature line.
* [ ] I attest that the referenced software has been verified by a certified FedRAMP Third Party Assessor Organization (3PAO) or other 3PAO approved by an appropriate agency official, and the Assessor used relevant NIST Guidance, which includes all elements outlined in this form, as the assessment baseline. Relevant documentation is attached.

## References

The [Draft of the Secure Software Development Self Attestation Form](https://www.cisa.gov/secure-software-attestation-form) available on cisa.gov, was released as part of a [Request For Comments](https://www.cisa.gov/secure-software-attestation-form) on April 27, 2023. Comments are due on June 26, 2023.

_Reprinted courtesy of the National Institute of Standards and Technology, U.S. Department of Commerce. Not copyrightable in the United States._

---

### Secure Software Development Framework (SSDF) table, NIST SP 800-218
_Path: software-security/secure-software-development/ssdf.md_

## SSDF table

<table>
<thead>
<tr>
<th>Practices</th>
<th>Tasks</th>
<th>Notional Implementation Examples</th>
<th>References</th>
</tr>
</thead><colgroup><col width="314"/><col width="348"/><col width="518"/><col width="586"/></colgroup>
<tbody>
<tr>
<td colspan="1" rowspan="3"><div><span>Define Security Requirements for Software Development <a id="PO.1" href="#PO.1">(PO.1)</a></span><span>: Ensure that security requirements for software development are known at all times so that they can be taken into account throughout the SDLC and duplication of effort can be minimized because the requirements information can be collected once and shared. This includes requirements from internal sources (e.g., the organization’s policies, business objectives, and risk management strategy) and external sources (e.g., applicable laws and regulations).</span></div></td>
<td><span><a id="PO.1.1" href="#PO.1.1">PO.1.1</span><span>:</a> Identify and document all security requirements for the organization’s software development infrastructures and processes, and maintain the requirements over time.</span></td>
<td>Example 1: Define policies for securing software development infrastructures and their components, including development endpoints, throughout the SDLC and maintaining that security.<br/>Example 2: Define policies for securing software development processes throughout the SDLC and maintaining that security, including for open-source and other third-party software components utilized by software being developed.<br/>Example 3: Review and update security requirements at least annually, or sooner if there are new requirements from internal or external sources, or a major security incident targeting software development infrastructure has occurred.<br/>Example 4: Educate affected individuals on impending changes to requirements.</td>
<td><span>BSAFSS</span><span>: SM.3, DE.1, IA.1, IA.2<br/></span><span>BSIMM</span><span>: CP1.1, CP1.3, SR1.1, SR2.2, SE1.2, SE2.6<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SM-7, SM-9<br/></span><span>NISTCSF</span><span>: ID.GV-3<br/></span><span>OWASPASVS</span><span>: 1.1.1<br/></span><span>OWASPMASVS</span><span>: 1.10<br/></span><span>OWASPSAMM</span><span>: PC1-A, PC1-B, PC2-A<br/></span><span>PCISSLC</span><span>: 2.1, 2.2<br/></span><span>SCFPSSD</span><span>: Planning the Implementation and Deployment of Secure Development Practices<br/></span><span>SP80053</span><span>: SA-1, SA-8, SA-15, SR-3<br/></span><span>SP800160</span><span>: 3.1.2, 3.2.1, 3.2.2, 3.3.1, 3.4.2, 3.4.3<br/></span><span>SP800161</span><span>: SA-1, SA-8, SA-15, SR-3<br/></span><span>SP800181</span><span>: T0414; K0003, K0039, K0044, K0157, K0168, K0177, K0211, K0260, K0261, K0262, K0524; S0010, S0357, S0368; A0033, A0123, A0151</span></td>
</tr>
<tr>
<td><span><a id="PO.1.2" href="#PO.1.2">PO.1.2</span><span>:</a> Identify and document all security requirements for organization-developed software to meet, and maintain the requirements over time.</span></td>
<td>Example 1: Define policies that specify risk-based software architecture and design requirements, such as making code modular to facilitate code reuse and updates; isolating security components from other components during execution; avoiding undocumented commands and settings; and providing features that will aid software acquirers with the secure deployment, operation, and maintenance of the software.<br/>Example 2: Define policies that specify the security requirements for the organization’s software, and verify compliance at key points in the SDLC (e.g., classes of software flaws verified by gates, responses to vulnerabilities discovered in released software).<br/>Example 3: Analyze the risk of applicable technology stacks (e.g., languages, environments, deployment models), and recommend or require the use of stacks that will reduce risk compared to others.<br/>Example 4: Define policies that specify what needs to be archived for each software release (e.g., code, package files, third-party libraries, documentation, data inventory) and how long it needs to be retained based on the SDLC model, software end-of-life, and other factors.<br/>Example 5: Ensure that policies cover the entire software life cycle, including notifying users of the impending end of software support and the date of software end-of-life.<br/>Example 6: Review all security requirements at least annually, or sooner if there are new requirements from internal or external sources, a major vulnerability is discovered in released software, or a major security incident targeting organization-developed software has occurred.<br/>Example 7: Establish and follow processes for handling requirement exception requests, including periodic reviews of all approved exceptions.</td>
<td><span>BSAFSS</span><span>: SC.1-1, SC.2, PD.1-1, PD.1-2, PD.1-3, PD.2-2, SI, PA, CS, AA, LO, EE<br/></span><span>BSIMM</span><span>: SM1.1, SM1.4, SM2.2, CP1.1, CP1.2, CP1.3, CP2.1, CP2.3, AM1.2, SFD1.1, SFD2.1, SFD3.2, SR1.1, SR1.3, SR2.2, SR3.3, SR3.4<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SR-3, SR-4, SR-5, SD-4<br/></span><span>ISO27034</span><span>: 7.3.2<br/></span><span>MSSDL</span><span>: 2, 5<br/></span><span>NISTCSF</span><span>: ID.GV-3<br/></span><span>OWASPMASVS</span><span>: 1.12<br/></span><span>OWASPSAMM</span><span>: PC1-A, PC1-B, PC2-A, PC3-A, SR1-A, SR1-B, SR2-B, SA1-B, IR1-A<br/></span><span>PCISSLC</span><span>: 2.1, 2.2, 2.3, 3.3<br/></span><span>SCFPSSD</span><span>: Establish Coding Standards and Conventions<br/></span><span>SP80053</span><span>: SA-8, SA-8(3), SA-15, SR-3<br/></span><span>SP800160</span><span>: 3.1.2, 3.2.1, 3.3.1<br/></span><span>SP800161</span><span>: SA-8, SA-15, SR-3<br/></span><span>SP800181</span><span>: T0414; K0003, K0039, K0044, K0157, K0168, K0177, K0211, K0260, K0261, K0262, K0524; S0010, S0357, S0368; A0033, A0123, A0151</span></td>
</tr>
<tr>
<td><span><a id="PO.1.3" href="#PO.1.3">PO.1.3</span><span>:</a> Communicate requirements to all third parties who will provide commercial software components to the organization for reuse by the organization’s own software. [Formerly PW.3.1]</span></td>
<td>Example 1: Define a core set of security requirements for software components, and include it in acquisition documents, software contracts, and other agreements with third parties.<br/>Example 2: Define security-related criteria for selecting software; the criteria can include the third party’s vulnerability disclosure program and product security incident response capabilities or the third party’s adherence to organization-defined practices.<br/>Example 3: Require third parties to attest that their software complies with the organization’s security requirements.<br/>Example 4: Require third parties to provide provenance data and integrity verification mechanisms for all components of their software.<br/>Example 5: Establish and follow processes to address risk when there are security requirements that third-party software components to be acquired do not meet; this should include periodic reviews of all approved exceptions to requirements.</td>
<td><span>BSAFSS</span><span>: SM.1, SM.2, SM.2-1, SM.2-4<br/></span><span>BSIMM</span><span>: CP2.4, CP3.2, SR2.5, SR3.2<br/></span><span>EO14028</span><span>: 4e(vi), 4e(ix)<br/></span><span>IDASOAR</span><span>: 19, 21<br/></span><span>IEC62443</span><span>: SM-9, SM-10<br/></span><span>MSSDL</span><span>: 7<br/></span><span>NISTCSF</span><span>: ID.SC-3<br/></span><span>OWASPSAMM</span><span>: SR3-A<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 8<br/></span><span>SCFPSSD</span><span>: Manage Security Risk Inherent in the Use of Third-Party Components<br/></span><span>SCSIC</span><span>: Vendor Sourcing Integrity Controls<br/></span><span>SP80053</span><span>: SA-4, SA-9, SA-10, SA-10(1), SA-15, SR-3, SR-4, SR-5<br/></span><span>SP800160</span><span>: 3.1.1, 3.1.2<br/></span><span>SP800161</span><span>: SA-4, SA-9, SA-9(1), SA-9(3), SA-10, SA-10(1), SA-15, SR-3, SR-4, SR-5<br/></span><span>SP800181</span><span>: T0203, T0415; K0039; S0374; A0056, A0161</span></td>
</tr>
<tr>
<td colspan="1" rowspan="3"><div><span>Implement Roles and Responsibilities <a id="PO.2" href="#PO.2">(PO.2)</a></span><span>: Ensure that everyone inside and outside of the organization involved in the SDLC is prepared to perform their SDLC-related roles and responsibilities throughout the SDLC.</span></div></td>
<td><span><a id="PO.2.1" href="#PO.2.1">PO.2.1</span><span>:</a> Create new roles and alter responsibilities for existing roles as needed to encompass all parts of the SDLC. Periodically review and maintain the defined roles and responsibilities, updating them as needed.</span></td>
<td>Example 1: Define SDLC-related roles and responsibilities for all members of the software development team.<br/>Example 2: Integrate the security roles into the software development team.<br/>Example 3: Define roles and responsibilities for cybersecurity staff, security champions, project managers and leads, senior management, software developers, software testers, software assurance leads and staff, product owners, operations and platform engineers, and others involved in the SDLC.<br/>Example 4: Conduct an annual review of all roles and responsibilities.<br/>Example 5: Educate affected individuals on impending changes to roles and responsibilities, and confirm that the individuals understand the changes and agree to follow them.<br/>Example 6: Implement and use tools and processes to promote communication and engagement among individuals with SDLC-related roles and responsibilities, such as creating messaging channels for team discussions.<br/>Example 7: Designate a group of individuals or a team as the code owner for each project.</td>
<td><span>BSAFSS</span><span>: PD.2-1, PD.2-2<br/></span><span>BSIMM</span><span>: SM1.1, SM2.3, SM2.7, CR1.7<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SM-2, SM-13<br/></span><span>NISTCSF</span><span>: ID.AM-6, ID.GV-2<br/></span><span>PCISSLC</span><span>: 1.2<br/></span><span>SCSIC</span><span>: Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-3<br/></span><span>SP800160</span><span>: 3.2.1, 3.2.4, 3.3.1<br/></span><span>SP800161</span><span>: SA-3<br/></span><span>SP800181</span><span>: K0233</span></td>
</tr>
<tr>
<td><span><a id="PO.2.2" href="#PO.2.2">PO.2.2</span><span>:</a> Provide role-based training for all personnel with responsibilities that contribute to secure development. Periodically review personnel proficiency and role-based training, and update the training as needed.</span></td>
<td>Example 1: Document the desired outcomes of training for each role.<br/>Example 2: Define the type of training or curriculum required to achieve the desired outcome for each role.<br/>Example 3: Create a training plan for each role.<br/>Example 4: Acquire or create training for each role; acquired training may need to be customized for the organization.<br/>Example 5: Measure outcome performance to identify areas where changes to training may be beneficial.</td>
<td><span>BSAFSS</span><span>: PD.2-2<br/></span><span>BSIMM</span><span>: T1.1, T1.7, T1.8, T2.5, T2.8, T2.9, T3.1, T3.2, T3.4<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SM-4<br/></span><span>MSSDL</span><span>: 1<br/></span><span>NISTCSF</span><span>: PR.AT<br/></span><span>OWASPSAMM</span><span>: EG1-A, EG2-A<br/></span><span>PCISSLC</span><span>: 1.3<br/></span><span>SCAGILE</span><span>: Operational Security Tasks 14, 15; Tasks Requiring the Help of Security Experts 1<br/></span><span>SCFPSSD</span><span>: Planning the Implementation and Deployment of Secure Development Practices<br/></span><span>SCSIC</span><span>: Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-8<br/></span><span>SP800160</span><span>: 3.2.4, 3.2.6<br/></span><span>SP800161</span><span>: SA-8<br/></span><span>SP800181</span><span>: OV-TEA-001, OV-TEA-002; T0030, T0073, T0320; K0204, K0208, K0220, K0226, K0243, K0245, K0252; S0100, S0101; A0004, A0057</span></td>
</tr>
<tr>
<td><span><a id="PO.2.3" href="#PO.2.3">PO.2.3</span><span>:</a> Obtain upper management or authorizing official commitment to secure development, and convey that commitment to all with development-related roles and responsibilities.</span></td>
<td>Example 1: Appoint a single leader or leadership team to be responsible for the entire secure software development process, including being accountable for releasing software to production and delegating responsibilities as appropriate.<br/>Example 2: Increase authorizing officials’ awareness of the risks of developing software without integrating security throughout the development life cycle and the risk mitigation provided by secure development practices.<br/>Example 3: Assist upper management in incorporating secure development support into their communications with personnel with development-related roles and responsibilities.<br/>Example 4: Educate all personnel with development-related roles and responsibilities on upper management’s commitment to secure development and the importance of secure development to the organization.</td>
<td><span>BSIMM</span><span>: SM1.3, SM2.7, CP2.5<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>NISTCSF</span><span>: ID.RM-1, ID.SC-1<br/></span><span>OWASPSAMM</span><span>: SM1.A<br/></span><span>PCISSLC</span><span>: 1.1<br/></span><span>SP800181</span><span>: T0001, T0004</span></td>
</tr>
<tr>
<td colspan="1" rowspan="3"><div><span>Implement Supporting Toolchains <a id="PO.3" href="#PO.3">(PO.3)</a></span><span>: Use automation to reduce human effort and improve the accuracy, reproducibility, usability, and comprehensiveness of security practices throughout the SDLC, as well as provide a way to document and demonstrate the use of these practices. Toolchains and tools may be used at different levels of the organization, such as organization-wide or project-specific, and may address a particular part of the SDLC, like a build pipeline.</span></div></td>
<td><span><a id="PO.3.1" href="#PO.3.1">PO.3.1</span><span>:</a> Specify which tools or tool types must or should be included in each toolchain to mitigate identified risks, as well as how the toolchain components are to be integrated with each other.</span></td>
<td>Example 1: Define categories of toolchains, and specify the mandatory tools or tool types to be used for each category.<br/>Example 2: Identify security tools to integrate into the developer toolchain.<br/>Example 3: Define what information is to be passed between tools and what data formats are to be used.<br/>Example 4: Evaluate tools’ signing capabilities to create immutable records/logs for auditability within the toolchain.<br/>Example 5: Use automated technology for toolchain management and orchestration.</td>
<td><span>BSIMM</span><span>: CR1.4, ST1.4, ST2.5, SE2.7<br/></span><span>CNCFSSCP</span><span>: Securing Materials—Verification; Securing Build Pipelines—Verification, Automation, Secure Authentication/Access; Securing Artefacts—Verification; Securing Deployments—Verification<br/></span><span>EO14028</span><span>: 4e(iii), 4e(ix)<br/></span><span>MSSDL</span><span>: 8<br/></span><span>OWASPSAMM</span><span>: IR2-B, ST2-B<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 9<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15<br/></span><span>SP800181</span><span>: K0013, K0178</span></td>
</tr>
<tr>
<td><span><a id="PO.3.2" href="#PO.3.2">PO.3.2</span><span>:</a> Follow recommended security practices to deploy, operate, and maintain tools and toolchains.</span></td>
<td>Example 1: Evaluate, select, and acquire tools, and assess the security of each tool.<br/>Example 2: Integrate tools with other tools and existing software development processes and workflows.<br/>Example 3: Use code-based configuration for toolchains (e.g., pipelines-as-code, toolchains-as-code).<br/>Example 4: Implement the technologies and processes needed for reproducible builds.<br/>Example 5: Update, upgrade, or replace tools as needed to address tool vulnerabilities or add new tool capabilities.<br/>Example 6: Continuously monitor tools and tool logs for potential operational and security issues, including policy violations and anomalous behavior.<br/>Example 7: Regularly verify the integrity and check the provenance of each tool to identify potential problems.<br/>Example 8: See PW.6 regarding compiler, interpreter, and build tools.<br/>Example 9: See PO.5 regarding implementing and maintaining secure environments.</td>
<td><span>BSAFSS</span><span>: DE.2<br/></span><span>BSIMM</span><span>: SR1.1, SR1.3, SR3.4<br/></span><span>CNCFSSCP</span><span>: Securing Build Pipelines—Verification, Automation, Controlled Environments, Secure Authentication/Access; Securing Artefacts—Verification, Automation, Controlled Environments, Encryption; Securing Deployments—Verification, Automation<br/></span><span>EO14028</span><span>: 4e(i)(F), 4e(ii), 4e(iii), 4e(v), 4e(vi), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-7<br/></span><span>IR8397</span><span>: 2.2<br/></span><span>OWASPASVS</span><span>: 1.14.3, 1.14.4, 14.1, 14.2<br/></span><span>OWASPMASVS</span><span>: 7.9<br/></span><span>OWASPSCVS</span><span>: 3, 5<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 9<br/></span><span>SCFPSSD</span><span>: Use Current Compiler and Toolchain Versions and Secure Compiler Options<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15<br/></span><span>SP800181</span><span>: K0013, K0178</span></td>
</tr>
<tr>
<td><span><a id="PO.3.3" href="#PO.3.3">PO.3.3</span><span>:</a> Configure tools to generate artifacts of their support of secure software development practices as defined by the organization.</span></td>
<td>Example 1: Use existing tooling (e.g., workflow tracking, issue tracking, value stream mapping) to create an audit trail of the secure development-related actions that are performed for continuous improvement purposes.<br/>Example 2: Determine how often the collected information should be audited, and implement the necessary processes.<br/>Example 3: Establish and enforce security and retention policies for artifact data.<br/>Example 4: Assign responsibility for creating any needed artifacts that tools cannot generate.</td>
<td><span>BSAFSS</span><span>: PD.1-5<br/></span><span>BSIMM</span><span>: SM1.4, SM3.4, SR1.3<br/></span><span>CNCFSSCP</span><span>: Securing Build Pipelines—Verification, Automation, Controlled Environments; Securing Artefacts—Verification<br/></span><span>EO14028</span><span>: 4e(i)(F), 4e(ii), 4e(v), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-12, SI-2<br/></span><span>MSSDL</span><span>: 8<br/></span><span>OWASPSAMM</span><span>: PC3-B<br/></span><span>OWASPSCVS</span><span>: 3.13, 3.14<br/></span><span>PCISSLC</span><span>: 2.5<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 9<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15<br/></span><span>SP800181</span><span>: K0013; T0024</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Define and Use Criteria for Software Security Checks <a id="PO.4" href="#PO.4">(PO.4)</a></span><span>: Help ensure that the software resulting from the SDLC meets the organization’s expectations by defining and using criteria for checking the software’s security during development.</span></div></td>
<td><span><a id="PO.4.1" href="#PO.4.1">PO.4.1</span><span>:</a> Define criteria for software security checks and track throughout the SDLC.</span></td>
<td>Example 1: Ensure that the criteria adequately indicate how effectively security risk is being managed.<br/>Example 2: Define key performance indicators (KPIs), key risk indicators (KRIs), vulnerability severity scores, and other measures for software security.<br/>Example 3: Add software security criteria to existing checks (e.g., the Definition of Done in agile SDLC methodologies).<br/>Example 4: Review the artifacts generated as part of the software development workflow system to determine if they meet the criteria.<br/>Example 5: Record security check approvals, rejections, and exception requests as part of the workflow and tracking system.<br/>Example 6: Analyze collected data in the context of the security successes and failures of each development project, and use the results to improve the SDLC.</td>
<td><span>BSAFSS</span><span>: TV.2-1, TV.5-1<br/></span><span>BSIMM</span><span>: SM1.4, SM2.1, SM2.2, SM2.6, SM3.3, CP2.2<br/></span><span>EO14028</span><span>: 4e(iv), 4e(v), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-1, SI-2, SVV-3<br/></span><span>ISO27034</span><span>: 7.3.5<br/></span><span>MSSDL</span><span>: 3<br/></span><span>OWASPSAMM</span><span>: PC3-A, DR3-B, IR3-B, ST3-B<br/></span><span>PCISSLC</span><span>: 3.3<br/></span><span>SP80053</span><span>: SA-15, SA-15(1)<br/></span><span>SP800160</span><span>: 3.2.1, 3.2.5, 3.3.1<br/></span><span>SP800161</span><span>: SA-15, SA-15(1)<br/></span><span>SP800181</span><span>: K0153, K0165</span></td>
</tr>
<tr>
<td><span><a id="PO.4.2" href="#PO.4.2">PO.4.2</span><span>:</a> Implement processes, mechanisms, etc. to gather and safeguard the necessary information in support of the criteria.</span></td>
<td>Example 1: Use the toolchain to automatically gather information that informs security decision-making.<br/>Example 2: Deploy additional tools if needed to support the generation and collection of information supporting the criteria.<br/>Example 3: Automate decision-making processes utilizing the criteria, and periodically review these processes.<br/>Example 4: Only allow authorized personnel to access the gathered information, and prevent any alteration or deletion of the information.</td>
<td><span>BSAFSS</span><span>: PD.1-4, PD.1-5<br/></span><span>BSIMM</span><span>: SM1.4, SM2.1, SM2.2, SM3.4<br/></span><span>EO14028</span><span>: 4e(iv), 4e(v), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-1, SVV-1, SVV-2, SVV-3, SVV-4<br/></span><span>OWASPSAMM</span><span>: PC3-B<br/></span><span>PCISSLC</span><span>: 2.5<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-15, SA-15(1), SA-15(11)<br/></span><span>SP800160</span><span>: 3.2.5, 3.3.7<br/></span><span>SP800161</span><span>: SA-15, SA-15(1), SA-15(11)<br/></span><span>SP800181</span><span>: T0349; K0153</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Implement and Maintain Secure Environments for Software Development <a id="PO.5" href="#PO.5">(PO.5)</a></span><span>: Ensure that all components of the environments for software development are strongly protected from internal and external threats to prevent compromises of the environments or the software being developed or maintained within them. Examples of environments for software development include development, build, test, and distribution environments.</span></div></td>
<td><span><a id="PO.5.1" href="#PO.5.1">PO.5.1</span><span>:</a> Separate and protect each environment involved in software development.</span></td>
<td>Example 1: Use multi-factor, risk-based authentication and conditional access for each environment.<br/>Example 2: Use network segmentation and access controls to separate the environments from each other and from production environments, and to separate components from each other within each non-production environment, in order to reduce attack surfaces and attackers’ lateral movement and privilege/access escalation.<br/>Example 3: Enforce authentication and tightly restrict connections entering and exiting each software development environment, including minimizing access to the internet to only what is necessary.<br/>Example 4: Minimize direct human access to toolchain systems, such as build services. Continuously monitor and audit all access attempts and all use of privileged access.<br/>Example 5: Minimize the use of production-environment software and services from non-production environments.<br/>Example 6: Regularly log, monitor, and audit trust relationships for authorization and access between the environments and between the components within each environment.<br/>Example 7: Continuously log and monitor operations and alerts across all components of the development environment to detect, respond, and recover from attempted and actual cyber incidents.<br/>Example 8: Configure security controls and other tools involved in separating and protecting the environments to generate artifacts for their activities.<br/>Example 9: Continuously monitor all software deployed in each environment for new vulnerabilities, and respond to vulnerabilities appropriately following a risk-based approach.<br/>Example 10: Configure and implement measures to secure the environments’ hosting infrastructures following a zero trust architecture.</td>
<td><span>BSAFSS</span><span>: DE.1, IA.1, IA.2<br/></span><span>CNCFSSCP</span><span>: Securing Build Pipelines—Controlled Environments<br/></span><span>EO14028</span><span>: 4e(i)(A), 4e(i)(B), 4e(i)(C), 4e(i)(D), 4e(i)(F), 4e(ii), 4e(iii), 4e(v), 4e(vi), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-7<br/></span><span>NISTCSF</span><span>: PR.AC-5, PR.DS-7<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 11<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-3(1), SA-8, SA-15<br/></span><span>SP800161</span><span>: SA-3, SA-8, SA-15<br/></span><span>SP800181</span><span>: OM-NET-001, SP-SYS-001; T0019, T0023, T0144, T0160, T0262, T0438, T0484, T0485, T0553; K0001, K0005, K0007, K0033, K0049, K0056, K0061, K0071, K0104, K0112, K0179, K0326, K0487; S0007, S0084, S0121; A0048</span></td>
</tr>
<tr>
<td><span><a id="PO.5.2" href="#PO.5.2">PO.5.2</span><span>:</a> Secure and harden development endpoints (i.e., endpoints for software designers, developers, testers, builders, etc.) to perform development-related tasks using a risk-based approach.</span></td>
<td>Example 1: Configure each development endpoint based on approved hardening guides, checklists, etc.; for example, enable FIPS-compliant encryption of all sensitive data at rest and in transit.<br/>Example 2: Configure each development endpoint and the development resources to provide the least functionality needed by users and services and to enforce the principle of least privilege.<br/>Example 3: Continuously monitor the security posture of all development endpoints, including monitoring and auditing all use of privileged access.<br/>Example 4: Configure security controls and other tools involved in securing and hardening development endpoints to generate artifacts for their activities.<br/>Example 5: Require multi-factor authentication for all access to development endpoints and development resources.<br/>Example 6: Provide dedicated development endpoints on non-production networks for performing all development-related tasks. Provide separate endpoints on production networks for all other tasks.<br/>Example 7: Configure each development endpoint following a zero trust architecture.</td>
<td><span>BSAFSS</span><span>: DE.1-1, IA.1, IA.2<br/></span><span>EO14028</span><span>: 4e(i)(C), 4e(i)(E), 4e(i)(F), 4e(ii), 4e(iii), 4e(v), 4e(vi), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-7<br/></span><span>NISTCSF</span><span>: PR.AC-4, PR.AC-7, PR.IP-1, PR.IP-3, PR.IP-12, PR.PT-1, PR.PT-3, DE.CM<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 11<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15<br/></span><span>SP800181</span><span>: OM-ADM-001, SP-SYS-001; T0484, T0485, T0489, T0553; K0005, K0007, K0077, K0088, K0130, K0167, K0205, K0275; S0076, S0097, S0121, S0158; A0155</span></td>
</tr>
<tr>
<td><span>Protect All Forms of Code from Unauthorized Access and Tampering <a id="PS.1" href="#PS.1">(PS.1)</a></span><span>: Help prevent unauthorized changes to code, both inadvertent and intentional, which could circumvent or negate the intended security characteristics of the software. For code that is not intended to be publicly accessible, this helps prevent theft of the software and may make it more difficult or time-consuming for attackers to find vulnerabilities in the software.</span></td>
<td><span><a id="PS.1.1" href="#PS.1.1">PS.1.1</span><span>:</a> Store all forms of code – including source code, executable code, and configuration-as-code – based on the principle of least privilege so that only authorized personnel, tools, services, etc. have access.</span></td>
<td>Example 1: Store all source code and configuration-as-code in a code repository, and restrict access to it based on the nature of the code. For example, open-source code intended for public access may need its integrity and availability protected; other code may also need its confidentiality protected.<br/>Example 2: Use version control features of the repository to track all changes made to the code with accountability to the individual account.<br/>Example 3: Use commit signing for code repositories.<br/>Example 4: Have the code owner review and approve all changes made to the code by others.<br/>Example 5: Use code signing to help protect the integrity of executables.<br/>Example 6: Use cryptography (e.g., cryptographic hashes) to help protect file integrity.</td>
<td><span>BSAFSS</span><span>: IA.1, IA.2, SM.4-1, DE.1-2<br/></span><span>BSIMM</span><span>: SE2.4<br/></span><span>CNCFSSCP</span><span>: Securing the Source Code—Verification, Automation, Controlled Environments, Secure Authentication; Securing Materials—Automation<br/></span><span>EO14028</span><span>: 4e(iii), 4e(iv), 4e(ix)<br/></span><span>IDASOAR</span><span>: Fact Sheet 25<br/></span><span>IEC62443</span><span>: SM-6, SM-7, SM-8<br/></span><span>NISTCSF</span><span>: PR.AC-4, PR.DS-6, PR.IP-3<br/></span><span>OWASPASVS</span><span>: 1.10, 10.3.2<br/></span><span>OWASPMASVS</span><span>: 7.1<br/></span><span>OWASPSAMM</span><span>: OE3-B<br/></span><span>PCISSLC</span><span>: 5.1, 6.1<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls, Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-10<br/></span><span>SP800161</span><span>: SA-8, SA-10</span></td>
</tr>
<tr>
<td><span>Provide a Mechanism for Verifying Software Release Integrity <a id="PS.2" href="#PS.2">(PS.2)</a></span><span>: Help software acquirers ensure that the software they acquire is legitimate and has not been tampered with.</span></td>
<td><span><a id="PS.2.1" href="#PS.2.1">PS.2.1</span><span>:</a> Make software integrity verification information available to software acquirers.</span></td>
<td>Example 1: Post cryptographic hashes for release files on a well-secured website.<br/>Example 2: Use an established certificate authority for code signing so that consumers’ operating systems or other tools and services can confirm the validity of signatures before use.<br/>Example 3: Periodically review the code signing processes, including certificate renewal, rotation, revocation, and protection.</td>
<td><span>BSAFSS</span><span>: SM.4, SM.5, SM.6<br/></span><span>BSIMM</span><span>: SE2.4<br/></span><span>CNCFSSCP</span><span>: Securing Deployments—Verification<br/></span><span>EO14028</span><span>: 4e(iii), 4e(ix), 4e(x)<br/></span><span>IEC62443</span><span>: SM-6, SM-8, SUM-4<br/></span><span>NISTCSF</span><span>: PR.DS-6<br/></span><span>NISTLABEL</span><span>: 2.2.2.4<br/></span><span>OWASPSAMM</span><span>: OE3-B<br/></span><span>OWASPSCVS</span><span>: 4<br/></span><span>PCISSLC</span><span>: 6.1, 6.2<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-8<br/></span><span>SP800161</span><span>: SA-8<br/></span><span>SP800181</span><span>: K0178</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Archive and Protect Each Software Release <a id="PS.3" href="#PS.3">(PS.3)</a></span><span>: Preserve software releases in order to help identify, analyze, and eliminate vulnerabilities discovered in the software after release.</span></div></td>
<td><span><a id="PS.3.1" href="#PS.3.1">PS.3.1</span><span>:</a> Securely archive the necessary files and supporting data (e.g., integrity verification information, provenance data) to be retained for each software release.</span></td>
<td>Example 1: Store the release files, associated images, etc. in repositories following the organization’s established policy. Allow read-only access to them by necessary personnel and no access by anyone else.<br/>Example 2: Store and protect release integrity verification information and provenance data, such as by keeping it in a separate location from the release files or by signing the data.</td>
<td><span>BSAFSS</span><span>: PD.1-5, DE.1-2, IA.2<br/></span><span>CNCFSSCP</span><span>: Securing Artefacts—Automation, Controlled Environments, Encryption; Securing Deployments—Verification<br/></span><span>EO14028</span><span>: 4e(iii), 4e(vi), 4e(ix), 4e(x)<br/></span><span>IDASOAR</span><span>: 25<br/></span><span>IEC62443</span><span>: SM-6, SM-7<br/></span><span>NISTCSF</span><span>: PR.IP-4<br/></span><span>OWASPSCVS</span><span>: 1, 3.18, 3.19, 6.3<br/></span><span>PCISSLC</span><span>: 5.2, 6.1, 6.2<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SP80053</span><span>: SA-10, SA-15, SA-15(11), SR-4<br/></span><span>SP800161</span><span>: SA-8, SA-10, SA-15(11), SR-4</span></td>
</tr>
<tr>
<td><span><a id="PS.3.2" href="#PS.3.2">PS.3.2</span><span>:</a> Collect, safeguard, maintain, and share provenance data for all components of each software release (e.g., in a software bill of materials [SBOM]).</span></td>
<td>Example 1: Make the provenance data available to software acquirers in accordance with the organization’s policies, preferably using standards-based formats.<br/>Example 2: Make the provenance data available to the organization’s operations and response teams to aid them in mitigating software vulnerabilities.<br/>Example 3: Protect the integrity of provenance data, and provide a way for recipients to verify provenance data integrity.<br/>Example 4: Update the provenance data every time any of the software’s components are updated.</td>
<td><span>BSAFSS</span><span>: SM.2<br/></span><span>BSIMM</span><span>: SE3.6<br/></span><span>CNCFSSCP</span><span>: Securing Materials—Verification, Automation<br/></span><span>EO14028</span><span>: 4e(vi), 4e(vii), 4e(ix), 4e(x)<br/></span><span>NTIASBOM</span><span>: All<br/></span><span>OWASPSCVS</span><span>: 1.4, 2<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls<br/></span><span>SCTPC</span><span>: MAINTAIN3<br/></span><span>SP80053</span><span>: SA-8, SR-3, SR-4<br/></span><span>SP800161</span><span>: SA-8, SR-3, SR-4</span></td>
</tr>
<tr>
<td colspan="1" rowspan="3"><div><span>Design Software to Meet Security Requirements and Mitigate Security Risks <a id="PW.1" href="#PW.1">(PW.1)</a></span><span>: Identify and evaluate the security requirements for the software; determine what security risks the software is likely to face during operation and how the software’s design and architecture should mitigate those risks; and justify any cases where risk-based analysis indicates that security requirements should be relaxed or waived. Addressing security requirements and risks during software design (secure by design) is key for improving software security and also helps improve development efficiency.</span></div></td>
<td><span><a id="PW.1.1" href="#PW.1.1">PW.1.1</span><span>:</a> Use forms of risk modeling – such as threat modeling, attack modeling, or attack surface mapping – to help assess the security risk for the software.</span></td>
<td>Example 1: Train the development team (security champions, in particular) or collaborate with a risk modeling expert to create models and analyze how to use a risk-based approach to communicate the risks and determine how to address them, including implementing mitigations.<br/>Example 2: Perform more rigorous assessments for high-risk areas, such as protecting sensitive data and safeguarding identification, authentication, and access control, including credential management.<br/>Example 3: Review vulnerability reports and statistics for previous software to inform the security risk assessment.<br/>Example 4: Use data classification methods to identify and characterize each type of data that the software will interact with.</td>
<td><span>BSAFSS</span><span>: SC.1<br/></span><span>BSIMM</span><span>: AM1.2, AM1.3, AM1.5, AM2.1, AM2.2, AM2.5, AM2.6, AM2.7, SFD2.2, AA1.1, AA1.2, AA1.3, AA2.1<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IDASOAR</span><span>: 1<br/></span><span>IEC62443</span><span>: SM-4, SR-1, SR-2, SD-1<br/></span><span>IR8397</span><span>: 2.1<br/></span><span>ISO27034</span><span>: 7.3.3<br/></span><span>MSSDL</span><span>: 4<br/></span><span>NISTCSF</span><span>: ID.RA<br/></span><span>OWASPASVS</span><span>: 1.1.2, 1.2, 1.4, 1.6, 1.8, 1.9, 1.11, 2, 3, 4, 6, 8, 9, 11, 12, 13<br/></span><span>OWASPMASVS</span><span>: 1.6, 1.8, 2, 3, 4, 5, 6<br/></span><span>OWASPSAMM</span><span>: TA1-A, TA1-B, TA3-B, DR1-A<br/></span><span>PCISSLC</span><span>: 3.2, 3.3<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 3<br/></span><span>SCFPSSD</span><span>: Threat Modeling<br/></span><span>SCTTM</span><span>: Entire guide<br/></span><span>SP80053</span><span>: SA-8, SA-11(2), SA-11(6), SA-15(5)<br/></span><span>SP800160</span><span>: 3.3.4, 3.4.5<br/></span><span>SP800161</span><span>: SA-8, SA-11(2), SA-11(6), SA-15(5)<br/></span><span>SP800181</span><span>: T0038, T0062; K0005, K0009, K0038, K0039, K0070, K0080, K0119, K0147, K0149, K0151, K0152, K0160, K0161, K0162, K0165, K0297, K0310, K0344, K0362, K0487, K0624; S0006, S0009, S0022, S0078, S0171, S0229, S0248; A0092, A0093, A0107</span></td>
</tr>
<tr>
<td><span><a id="PW.1.2" href="#PW.1.2">PW.1.2</span><span>:</a> Track and maintain the software’s security requirements, risks, and design decisions.</span></td>
<td>Example 1: Record the response to each risk, including how mitigations are to be achieved and what the rationales are for any approved exceptions to the security requirements. Add any mitigations to the software’s security requirements.<br/>Example 2: Maintain records of design decisions, risk responses, and approved exceptions that can be used for auditing and maintenance purposes throughout the rest of the software life cycle.<br/>Example 3: Periodically re-evaluate all approved exceptions to the security requirements, and implement changes as needed.</td>
<td><span>BSAFSS</span><span>: SC.1-1, PD.1-1<br/></span><span>BSIMM</span><span>: SFD3.1, SFD3.3, AA2.2, AA3.2<br/></span><span>EO14028</span><span>: 4e(v), 4e(ix)<br/></span><span>IEC62443</span><span>: SD-1<br/></span><span>ISO27034</span><span>: 7.3.3<br/></span><span>MSSDL</span><span>: 4<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>OWASPASVS</span><span>: 1.1.3, 1.1.4<br/></span><span>OWASPMASVS</span><span>: 1.3, 1.6<br/></span><span>OWASPSAMM</span><span>: DR1-B<br/></span><span>PCISSLC</span><span>: 3.2, 3.3<br/></span><span>SP80053</span><span>: SA-8, SA-10, SA-17<br/></span><span>SP800161</span><span>: SA-8, SA-17<br/></span><span>SP800181</span><span>: T0256; K0005, K0038, K0039, K0147, K0149, K0160, K0161, K0162, K0165, K0344, K0362, K0487; S0006, S0009, S0078, S0171, S0229, S0248; A0092, A0107</span></td>
</tr>
<tr>
<td><span><a id="PW.1.3" href="#PW.1.3">PW.1.3</span><span>:</a> Where appropriate, build in support for using standardized security features and services (e.g., enabling software to integrate with existing log management, identity management, access control, and vulnerability management systems) instead of creating proprietary implementations of security features and services. [Formerly PW.4.3]</span></td>
<td>Example 1: Maintain one or more software repositories of modules for supporting standardized security features and services.<br/>Example 2: Determine secure configurations for modules for supporting standardized security features and services, and make these configurations available (e.g., as configuration-as-code) so developers can readily use them.<br/>Example 3: Define criteria for which security features and services must be supported by software to be developed.</td>
<td><span>BSAFSS</span><span>: SI.2-1, SI.2-2, LO.1<br/></span><span>BSIMM</span><span>: SFD1.1, SFD2.1, SFD3.2, SR1.1, SR3.4<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SD-1, SD-4<br/></span><span>MSSDL</span><span>: 5<br/></span><span>OWASPASVS</span><span>: 1.1.6<br/></span><span>OWASPSAMM</span><span>: SA2-A<br/></span><span>SCFPSSD</span><span>: Standardize Identity and Access Management; Establish Log Requirements and Audit Practices</span></td>
</tr>
<tr>
<td><span>Review the Software Design to Verify Compliance with Security Requirements and Risk Information <a id="PW.2" href="#PW.2">(PW.2)</a></span><span>: Help ensure that the software will meet the security requirements and satisfactorily address the identified risk information.</span></td>
<td><span><a id="PW.2.1" href="#PW.2.1">PW.2.1</span><span>:</a> Have 1) a qualified person (or people) who were not involved with the design and/or 2) automated processes instantiated in the toolchain review the software design to confirm and enforce that it meets all of the security requirements and satisfactorily addresses the identified risk information.</span></td>
<td>Example 1: Review the software design to confirm that it addresses applicable security requirements.<br/>Example 2: Review the risk models created during software design to determine if they appear to adequately identify the risks.<br/>Example 3: Review the software design to confirm that it satisfactorily addresses the risks identified by the risk models.<br/>Example 4: Have the software’s designer correct failures to meet the requirements.<br/>Example 5: Change the design and/or the risk response strategy if the security requirements cannot be met.<br/>Example 6: Record the findings of design reviews to serve as artifacts (e.g., in the software specification, in the issue tracking system, in the threat model).</td>
<td><span>BSAFSS</span><span>: TV.3<br/></span><span>BSIMM</span><span>: AA1.1, AA1.2, AA1.3, AA2.1, AA3.1<br/></span><span>EO14028</span><span>: 4e(iv), 4e(v), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-2, SR-2, SR-5, SD-3, SD-4, SI-2<br/></span><span>ISO27034</span><span>: 7.3.3<br/></span><span>OWASPASVS</span><span>: 1.1.5<br/></span><span>OWASPSAMM</span><span>: DR1-A, DR1-B<br/></span><span>PCISSLC</span><span>: 3.2<br/></span><span>SP800181</span><span>: T0328; K0038, K0039, K0070, K0080, K0119, K0152, K0153, K0161, K0165, K0172, K0297; S0006, S0009, S0022, S0036, S0141, S0171</span></td>
</tr>
<tr>
<td colspan="1" rowspan="3"><div><span>Reuse Existing, Well-Secured Software When Feasible Instead of Duplicating Functionality <a id="PW.4" href="#PW.4">(PW.4)</a></span><span>: Lower the costs of software development, expedite software development, and decrease the likelihood of introducing additional security vulnerabilities into the software by reusing software modules and services that have already had their security posture checked. This is particularly important for software that implements security functionality, such as cryptographic modules and protocols.</span></div></td>
<td><span><a id="PW.4.1" href="#PW.4.1">PW.4.1</span><span>:</a> Acquire and maintain well-secured software components (e.g., software libraries, modules, middleware, frameworks) from commercial, open-source, and other third-party developers for use by the organization’s software.</span></td>
<td>Example 1: Review and evaluate third-party software components in the context of their expected use. If a component is to be used in a substantially different way in the future, perform the review and evaluation again with that new context in mind.<br/>Example 2: Determine secure configurations for software components, and make these available (e.g., as configuration-as-code) so developers can readily use the configurations.<br/>Example 3: Obtain provenance information (e.g., SBOM, source composition analysis, binary software composition analysis) for each software component, and analyze that information to better assess the risk that the component may introduce.<br/>Example 4: Establish one or more software repositories to host sanctioned and vetted open-source components.<br/>Example 5: Maintain a list of organization-approved commercial software components and component versions along with their provenance data.<br/>Example 6: Designate which components must be included in software to be developed.<br/>Example 7: Implement processes to update deployed software components to newer versions, and retain older versions of software components until all transitions from those versions have been completed successfully.<br/>Example 8: If the integrity or provenance of acquired binaries cannot be confirmed, build binaries from source code after verifying the source code’s integrity and provenance.</td>
<td><span>BSAFSS</span><span>: SM.2<br/></span><span>BSIMM</span><span>: SFD2.1, SFD3.2, SR2.4, SR3.1, SE3.6<br/></span><span>CNCFSSCP</span><span>: Securing Materials—Verification<br/></span><span>EO14028</span><span>: 4e(iii), 4e(vi), 4e(ix), 4e(x)<br/></span><span>IDASOAR</span><span>: 19<br/></span><span>IEC62443</span><span>: SM-9, SM-10<br/></span><span>MSSDL</span><span>: 6<br/></span><span>NISTCSF</span><span>: ID.SC-2<br/></span><span>OWASPASVS</span><span>: 1.1.6<br/></span><span>OWASPSAMM</span><span>: SA1-A<br/></span><span>OWASPSCVS</span><span>: 4<br/></span><span>SCSIC</span><span>: Vendor Sourcing Integrity Controls<br/></span><span>SCTPC</span><span>: MAINTAIN<br/></span><span>SP80053</span><span>: SA-4, SA-5, SA-8(3), SA-10(6), SR-3, SR-4<br/></span><span>SP800161</span><span>: SA-4, SA-5, SA-8(3), SA-10(6), SR-3, SR-4<br/></span><span>SP800181</span><span>: K0039</span></td>
</tr>
<tr>
<td><span><a id="PW.4.2" href="#PW.4.2">PW.4.2</span><span>:</a> Create and maintain well-secured software components in-house following SDLC processes to meet common internal software development needs that cannot be better met by third-party software components.</span></td>
<td>Example 1: Follow organization-established security practices for secure software development when creating and maintaining the components.<br/>Example 2: Determine secure configurations for software components, and make these available (e.g., as configuration-as-code) so developers can readily use the configurations.<br/>Example 3: Maintain one or more software repositories for these components.<br/>Example 4: Designate which components must be included in software to be developed.<br/>Example 5: Implement processes to update deployed software components to newer versions, and maintain older versions of software components until all transitions from those versions have been completed successfully.</td>
<td><span>BSIMM</span><span>: SFD1.1, SFD2.1, SFD3.2, SR1.1<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IDASOAR</span><span>: 19<br/></span><span>OWASPASVS</span><span>: 1.1.6<br/></span><span>SCTPC</span><span>: MAINTAIN<br/></span><span>SP80053</span><span>: SA-8(3)<br/></span><span>SP800161</span><span>: SA-8(3)<br/></span><span>SP800181</span><span>: SP-DEV-001</span></td>
</tr>
<tr>
<td><span><a id="PW.4.4" href="#PW.4.4">PW.4.4</span><span>:</a> Verify that acquired commercial, open-source, and all other third-party software components comply with the requirements, as defined by the organization, throughout their life cycles.</span></td>
<td>Example 1: Regularly check whether there are publicly known vulnerabilities in the software modules and services that vendors have not yet fixed.<br/>Example 2: Build into the toolchain automatic detection of known vulnerabilities in software components.<br/>Example 3: Use existing results from commercial services for vetting the software modules and services.<br/>Example 4: Ensure that each software component is still actively maintained and has not reached end of life; this should include new vulnerabilities found in the software being remediated.<br/>Example 5: Determine a plan of action for each software component that is no longer being maintained or will not be available in the near future.<br/>Example 6: Confirm the integrity of software components through digital signatures or other mechanisms.<br/>Example 7: Review, analyze, and/or test code. See PW.7 and PW.8.</td>
<td><span>BSAFSS</span><span>: SC.3-1, SM.2-1, SM.2-2, SM.2-3, TV.2, TV.3<br/></span><span>BSIMM</span><span>: CP3.2, SR2.4, SR3.1, SR3.2, SE2.4, SE3.6<br/></span><span>CNCFSSCP</span><span>: Securing Materials—Verification, Automation<br/></span><span>EO14028</span><span>: 4e(iii), 4e(iv), 4e(vi), 4e(ix), 4e(x)<br/></span><span>IDASOAR</span><span>: 21<br/></span><span>IEC62443</span><span>: SI-1, SM-9, SM-10, DM-1<br/></span><span>IR8397</span><span>: 2.11<br/></span><span>MSSDL</span><span>: 7<br/></span><span>NISTCSF</span><span>: ID.SC-4, PR.DS-6<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>OWASPASVS</span><span>: 10, 14.2<br/></span><span>OWASPMASVS</span><span>: 7.5<br/></span><span>OWASPSAMM</span><span>: TA3-A, SR3-B<br/></span><span>OWASPSCVS</span><span>: 4, 5, 6<br/></span><span>PCISSLC</span><span>: 3.2, 3.4, 4.1<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 8<br/></span><span>SCFPSSD</span><span>: Manage Security Risk Inherent in the Use of Third-Party Components<br/></span><span>SCSIC</span><span>: Vendor Sourcing Integrity Controls, Peer Reviews and Security Testing<br/></span><span>SCTPC</span><span>: MAINTAIN, ASSESS<br/></span><span>SP80053</span><span>: SA-9, SR-3, SR-4, SR-4(3), SR-4(4)<br/></span><span>SP800160</span><span>: 3.1.2, 3.3.8<br/></span><span>SP800161</span><span>: SA-4, SA-8, SA-9, SA-9(3), SR-3, SR-4, SR-4(3), SR-4(4)<br/></span><span>SP800181</span><span>: SP-DEV-002; K0153, K0266; S0298</span></td>
</tr>
<tr>
<td><span>Create Source Code by Adhering to Secure Coding Practices <a id="PW.5" href="#PW.5">(PW.5)</a></span><span>: Decrease the number of security vulnerabilities in the software, and reduce costs by minimizing vulnerabilities introduced during source code creation that meet or exceed organization-defined vulnerability severity criteria.</span></td>
<td><span><a id="PW.5.1" href="#PW.5.1">PW.5.1</span><span>:</a> Follow all secure coding practices that are appropriate to the development languages and environment to meet the organization’s requirements.</span></td>
<td>Example 1: Validate all inputs, and validate and properly encode all outputs.<br/>Example 2: Avoid using unsafe functions and calls.<br/>Example 3: Detect errors, and handle them gracefully.<br/>Example 4: Provide logging and tracing capabilities.<br/>Example 5: Use development environments with automated features that encourage or require the use of secure coding practices with just-in-time training-in-place.<br/>Example 6: Follow procedures for manually ensuring compliance with secure coding practices when automated methods are insufficient or unavailable.<br/>Example 7: Use tools (e.g., linters, formatters) to standardize the style and formatting of the source code.<br/>Example 8: Check for other vulnerabilities that are common to the development languages and environment.<br/>Example 9: Have the developer review their own human-readable code to complement (not replace) code review performed by other people or tools. See PW.7.</td>
<td><span>BSAFSS</span><span>: SC.2, SC.3, LO.1, EE.1<br/></span><span>BSIMM</span><span>: SR3.3, CR1.4, CR3.5<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IDASOAR</span><span>: 2<br/></span><span>IEC62443</span><span>: SI-1, SI-2<br/></span><span>ISO27034</span><span>: 7.3.5<br/></span><span>MSSDL</span><span>: 9<br/></span><span>OWASPASVS</span><span>: 1.1.7, 1.5, 1.7, 5, 7<br/></span><span>OWASPMASVS</span><span>: 7.6<br/></span><span>SCFPSSD</span><span>: Establish Log Requirements and Audit Practices, Use Code Analysis Tools to Find Security Issues Early, Handle Data Safely, Handle Errors, Use Safe Functions Only<br/></span><span>SP800181</span><span>: SP-DEV-001; T0013, T0077, T0176; K0009, K0016, K0039, K0070, K0140, K0624; S0019, S0060, S0149, S0172, S0266; A0036, A0047</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Configure the Compilation, Interpreter, and Build Processes to Improve Executable Security <a id="PW.6" href="#PW.6">(PW.6)</a></span><span>: Decrease the number of security vulnerabilities in the software and reduce costs by eliminating vulnerabilities before testing occurs.</span></div></td>
<td><span><a id="PW.6.1" href="#PW.6.1">PW.6.1</span><span>:</a> Use compiler, interpreter, and build tools that offer features to improve executable security.</span></td>
<td>Example 1: Use up-to-date versions of compiler, interpreter, and build tools.<br/>Example 2: Follow change management processes when deploying or updating compiler, interpreter, and build tools, and audit all unexpected changes to tools.<br/>Example 3: Regularly validate the authenticity and integrity of compiler, interpreter, and build tools. See PO.3.</td>
<td><span>BSAFSS</span><span>: DE.2-1<br/></span><span>BSIMM</span><span>: SE2.4<br/></span><span>CNCFSSCP</span><span>: Securing Build Pipelines—Verification, Automation<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-2<br/></span><span>MSSDL</span><span>: 8<br/></span><span>SCAGILE</span><span>: Operational Security Task 3<br/></span><span>SCFPSSD</span><span>: Use Current Compiler and Toolchain Versions and Secure Compiler Options<br/></span><span>SCSIC</span><span>: Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15</span></td>
</tr>
<tr>
<td><span><a id="PW.6.2" href="#PW.6.2">PW.6.2</span><span>:</a> Determine which compiler, interpreter, and build tool features should be used and how each should be configured, then implement and use the approved configurations.</span></td>
<td>Example 1: Enable compiler features that produce warnings for poorly secured code during the compilation process.<br/>Example 2: Implement the “clean build” concept, where all compiler warnings are treated as errors and eliminated except those determined to be false positives or irrelevant.<br/>Example 3: Perform all builds in a dedicated, highly controlled build environment.<br/>Example 4: Enable compiler features that randomize or obfuscate execution characteristics, such as memory location usage, that would otherwise be predictable and thus potentially exploitable.<br/>Example 5: Test to ensure that the features are working as expected and are not inadvertently causing any operational issues or other problems.<br/>Example 6: Continuously verify that the approved configurations are being used.<br/>Example 7: Make the approved tool configurations available as configuration-as-code so developers can readily use them.</td>
<td><span>BSAFSS</span><span>: DE.2-3, DE.2-4, DE.2-5<br/></span><span>BSIMM</span><span>: SE2.4, SE3.2<br/></span><span>CNCFSSCP</span><span>: Securing Build Pipelines—Verification, Automation<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-2<br/></span><span>IR8397</span><span>: 2.5<br/></span><span>MSSDL</span><span>: 8<br/></span><span>OWASPASVS</span><span>: 14.1, 14.2.1<br/></span><span>OWASPMASVS</span><span>: 7.2<br/></span><span>PCISSLC</span><span>: 3.2<br/></span><span>SCAGILE</span><span>: Operational Security Task 8<br/></span><span>SCFPSSD</span><span>: Use Current Compiler and Toolchain Versions and Secure Compiler Options<br/></span><span>SCSIC</span><span>: Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-15, SR-9<br/></span><span>SP800161</span><span>: SA-15, SR-9<br/></span><span>SP800181</span><span>: K0039, K0070</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Review and/or Analyze Human-Readable Code to Identify Vulnerabilities and Verify Compliance with Security Requirements <a id="PW.7" href="#PW.7">(PW.7)</a></span><span>: Help identify vulnerabilities so that they can be corrected before the software is released to prevent exploitation. Using automated methods lowers the effort and resources needed to detect vulnerabilities. Human-readable code includes source code, scripts, and any other form of code that an organization deems human-readable.</span></div></td>
<td><span><a id="PW.7.1" href="#PW.7.1">PW.7.1</span><span>:</a> Determine whether code review (a person looks directly at the code to find issues) and/or code analysis (tools are used to find issues in code, either in a fully automated way or in conjunction with a person) should be used, as defined by the organization.</span></td>
<td>Example 1: Follow the organization’s policies or guidelines for when code review should be performed and how it should be conducted. This may include third-party code and reusable code modules written in-house.<br/>Example 2: Follow the organization’s policies or guidelines for when code analysis should be performed and how it should be conducted.<br/>Example 3: Choose code review and/or analysis methods based on the stage of the software.</td>
<td><span>BSIMM</span><span>: CR1.5<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IEC62443</span><span>: SM-5, SI-1, SVV-1<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>SCSIC</span><span>: Peer Reviews and Security Testing<br/></span><span>SP80053</span><span>: SA-11<br/></span><span>SP800161</span><span>: SA-11<br/></span><span>SP800181</span><span>: SP-DEV-002; K0013, K0039, K0070, K0153, K0165; S0174</span></td>
</tr>
<tr>
<td><span><a id="PW.7.2" href="#PW.7.2">PW.7.2</span><span>:</a> Perform the code review and/or code analysis based on the organization’s secure coding standards, and record and triage all discovered issues and recommended remediations in the development team’s workflow or issue tracking system.</span></td>
<td>Example 1: Perform peer review of code, and review any existing code review, analysis, or testing results as part of the peer review.<br/>Example 2: Use expert reviewers to check code for backdoors and other malicious content.<br/>Example 3: Use peer reviewing tools that facilitate the peer review process, and document all discussions and other feedback.<br/>Example 4: Use a static analysis tool to automatically check code for vulnerabilities and compliance with the organization’s secure coding standards with a human reviewing the issues reported by the tool and remediating them as necessary.<br/>Example 5: Use review checklists to verify that the code complies with the requirements.<br/>Example 6: Use automated tools to identify and remediate documented and verified unsafe software practices on a continuous basis as human-readable code is checked into the code repository.<br/>Example 7: Identify and document the root causes of discovered issues.<br/>Example 8: Document lessons learned from code review and analysis in a wiki that developers can access and search.</td>
<td><span>BSAFSS</span><span>: TV.2, PD.1-4<br/></span><span>BSIMM</span><span>: CR1.2, CR1.4, CR1.6, CR2.6, CR2.7, CR3.4, CR3.5<br/></span><span>EO14028</span><span>: 4e(iv), 4e(v), 4e(ix)<br/></span><span>IDASOAR</span><span>: 3, 4, 5, 14, 15, 48<br/></span><span>IEC62443</span><span>: SI-1, SVV-1, SVV-2<br/></span><span>IR8397</span><span>: 2.3, 2.4<br/></span><span>ISO27034</span><span>: 7.3.6<br/></span><span>MSSDL</span><span>: 9, 10<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>OWASPASVS</span><span>: 1.1.7, 10<br/></span><span>OWASPMASVS</span><span>: 7.5<br/></span><span>OWASPSAMM</span><span>: IR1-B, IR2-A, IR2-B, IR3-A<br/></span><span>PCISSLC</span><span>: 3.2, 4.1<br/></span><span>SCAGILE</span><span>: Operational Security Tasks 4, 7; Tasks Requiring the Help of Security Experts 10<br/></span><span>SCFPSSD</span><span>: Use Code Analysis Tools to Find Security Issues Early, Use Static Analysis Security Testing Tools, Perform Manual Verification of Security Features/Mitigations<br/></span><span>SCSIC</span><span>: Peer Reviews and Security Testing<br/></span><span>SP80053</span><span>: SA-11, SA-11(1), SA-11(4), SA-15(7)<br/></span><span>SP800161</span><span>: SA-11, SA-11(1), SA-11(4), SA-15(7)<br/></span><span>SP800181</span><span>: SP-DEV-001, SP-DEV-002; T0013, T0111, T0176, T0267, T0516; K0009, K0039, K0070, K0140, K0624; S0019, S0060, S0078, S0137, S0149, S0167, S0174, S0242, S0266; A0007, A0015, A0036, A0044, A0047</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Test Executable Code to Identify Vulnerabilities and Verify Compliance with Security Requirements <a id="PW.8" href="#PW.8">(PW.8)</a></span><span>: Help identify vulnerabilities so that they can be corrected before the software is released in order to prevent exploitation. Using automated methods lowers the effort and resources needed to detect vulnerabilities and improves traceability and repeatability. Executable code includes binaries, directly executed bytecode and source code, and any other form of code that an organization deems executable.</span></div></td>
<td><span><a id="PW.8.1" href="#PW.8.1">PW.8.1</span><span>:</a> Determine whether executable code testing should be performed to find vulnerabilities not identified by previous reviews, analysis, or testing and, if so, which types of testing should be used.</span></td>
<td>Example 1: Follow the organization’s policies or guidelines for when code testing should be performed and how it should be conducted (e.g., within a sandboxed environment). This may include third-party executable code and reusable executable code modules written in-house.<br/>Example 2: Choose testing methods based on the stage of the software.</td>
<td><span>BSAFSS</span><span>: TV.3<br/></span><span>BSIMM</span><span>: PT2.3<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: SVV-1, SVV-2, SVV-3, SVV-4, SVV-5<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>SCSIC</span><span>: Peer Reviews and Security Testing<br/></span><span>SP80053</span><span>: SA-11<br/></span><span>SP800161</span><span>: SA-11<br/></span><span>SP800181</span><span>: SP-DEV-001, SP-DEV-002; T0456; K0013, K0039, K0070, K0153, K0165, K0342, K0367, K0536, K0624; S0001, S0015, S0026, S0061, S0083, S0112, S0135</span></td>
</tr>
<tr>
<td><span><a id="PW.8.2" href="#PW.8.2">PW.8.2</span><span>:</a> Scope the testing, design the tests, perform the testing, and document the results, including recording and triaging all discovered issues and recommended remediations in the development team’s workflow or issue tracking system.</span></td>
<td>Example 1: Perform robust functional testing of security features.<br/>Example 2: Integrate dynamic vulnerability testing into the project’s automated test suite.<br/>Example 3: Incorporate tests for previously reported vulnerabilities into the project’s test suite to ensure that errors are not reintroduced.<br/>Example 4: Take into consideration the infrastructures and technology stacks that the software will be used with in production when developing test plans.<br/>Example 5: Use fuzz testing tools to find issues with input handling.<br/>Example 6: If resources are available, use penetration testing to simulate how an attacker might attempt to compromise the software in high-risk scenarios.<br/>Example 7: Identify and record the root causes of discovered issues.<br/>Example 8: Document lessons learned from code testing in a wiki that developers can access and search.<br/>Example 9: Use source code, design records, and other resources when developing test plans.</td>
<td><span>BSAFSS</span><span>: TV.3, TV.5, PD.1-4<br/></span><span>BSIMM</span><span>: ST1.1, ST1.3, ST1.4, ST2.4, ST2.5, ST2.6, ST3.3, ST3.4, ST3.5, ST3.6, PT1.1, PT1.2, PT1.3, PT3.1<br/></span><span>EO14028</span><span>: 4e(iv), 4e(v), 4e(ix)<br/></span><span>IDASOAR</span><span>: 7, 8, 10, 11, 38, 39, 43, 44, 48, 55, 56, 57<br/></span><span>IEC62443</span><span>: SM-5, SM-13, SI-1, SVV-1, SVV-2, SVV-3, SVV-4, SVV-5<br/></span><span>IR8397</span><span>: 2.6, 2.7, 2.8, 2.9, 2.10, 2.11<br/></span><span>ISO27034</span><span>: 7.3.6<br/></span><span>MSSDL</span><span>: 10, 11<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>OWASPMASVS</span><span>: 7.5<br/></span><span>OWASPSAMM</span><span>: ST1-A, ST1-B, ST2-A, ST2-B, ST3-A<br/></span><span>PCISSLC</span><span>: 4.1<br/></span><span>SCAGILE</span><span>: Operational Security Tasks 10, 11; Tasks Requiring the Help of Security Experts 4, 5, 6, 7<br/></span><span>SCFPSSD</span><span>: Perform Dynamic Analysis Security Testing, Fuzz Parsers, Network Vulnerability Scanning, Perform Automated Functional Testing of Security Features/Mitigations, Perform Penetration Testing<br/></span><span>SCSIC</span><span>: Peer Reviews and Security Testing<br/></span><span>SP80053</span><span>: SA-11, SA-11(5), SA-11(8), SA-15(7)<br/></span><span>SP800161</span><span>: SA-11, SA-11(5), SA-11(8), SA-15(7)<br/></span><span>SP800181</span><span>: SP-DEV-001, SP-DEV-002; T0013, T0028, T0169, T0176, T0253, T0266, T0456, T0516; K0009, K0039, K0070, K0272, K0339, K0342, K0362, K0536, K0624; S0001, S0015, S0046, S0051, S0078, S0081, S0083, S0135, S0137, S0167, S0242; A0015</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Configure Software to Have Secure Settings by Default <a id="PW.9" href="#PW.9">(PW.9)</a></span><span>: Help improve the security of the software at the time of installation to reduce the likelihood of the software being deployed with weak security settings, putting it at greater risk of compromise.</span></div></td>
<td><span><a id="PW.9.1" href="#PW.9.1">PW.9.1</span><span>:</a> Define a secure baseline by determining how to configure each setting that has an effect on security or a security-related setting so that the default settings are secure and do not weaken the security functions provided by the platform, network infrastructure, or services.</span></td>
<td>Example 1: Conduct testing to ensure that the settings, including the default settings, are working as expected and are not inadvertently causing any security weaknesses, operational issues, or other problems.</td>
<td><span>BSAFSS</span><span>: CF.1<br/></span><span>BSIMM</span><span>: SE2.2<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IDASOAR</span><span>: 23<br/></span><span>IEC62443</span><span>: SD-4, SVV-1, SG-1<br/></span><span>ISO27034</span><span>: 7.3.5<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 12<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls, Vendor Software Development Integrity Controls<br/></span><span>SP800181</span><span>: SP-DEV-002; K0009, K0039, K0073, K0153, K0165, K0275, K0531; S0167</span></td>
</tr>
<tr>
<td><span><a id="PW.9.2" href="#PW.9.2">PW.9.2</span><span>:</a> Implement the default settings (or groups of default settings, if applicable), and document each setting for software administrators.</span></td>
<td>Example 1: Verify that the approved configuration is in place for the software.<br/>Example 2: Document each setting’s purpose, options, default value, security relevance, potential operational impact, and relationships with other settings.<br/>Example 3: Use authoritative programmatic technical mechanisms to record how each setting can be implemented and assessed by software administrators.<br/>Example 4: Store the default configuration in a usable format and follow change control practices for modifying it (e.g., configuration-as-code).</td>
<td><span>BSAFSS</span><span>: CF.1<br/></span><span>BSIMM</span><span>: SE2.2<br/></span><span>EO14028</span><span>: 4e(iv), 4e(ix)<br/></span><span>IDASOAR</span><span>: 23<br/></span><span>IEC62443</span><span>: SG-3<br/></span><span>OWASPSAMM</span><span>: OE1-A<br/></span><span>PCISSLC</span><span>: 8.1, 8.2<br/></span><span>SCAGILE</span><span>: Tasks Requiring the Help of Security Experts 12<br/></span><span>SCFPSSD</span><span>: Verify Secure Configurations and Use of Platform Mitigation<br/></span><span>SCSIC</span><span>: Vendor Software Delivery Integrity Controls, Vendor Software Development Integrity Controls<br/></span><span>SP80053</span><span>: SA-5, SA-8(23)<br/></span><span>SP800161</span><span>: SA-5, SA-8(23)<br/></span><span>SP800181</span><span>: SP-DEV-001; K0009, K0039, K0073, K0153, K0165, K0275, K0531</span></td>
</tr>
<tr>
<td colspan="1" rowspan="3"><div><span>Identify and Confirm Vulnerabilities on an Ongoing Basis <a id="RV.1" href="#RV.1">(RV.1)</a></span><span>: Help ensure that vulnerabilities are identified more quickly so that they can be remediated more quickly in accordance with risk, reducing the window of opportunity for attackers.</span></div></td>
<td><span><a id="RV.1.1" href="#RV.1.1">RV.1.1</span><span>:</a> Gather information from software acquirers, users, and public sources on potential vulnerabilities in the software and third-party components that the software uses, and investigate all credible reports.</span></td>
<td>Example 1: Monitor vulnerability databases , security mailing lists, and other sources of vulnerability reports through manual or automated means.<br/>Example 2: Use threat intelligence sources to better understand how vulnerabilities in general are being exploited.<br/>Example 3: Automatically review provenance and software composition data for all software components to identify any new vulnerabilities they have.</td>
<td><span>BSAFSS</span><span>: VM.1-3, VM.3<br/></span><span>BSIMM</span><span>: AM1.5, CMVM1.2, CMVM2.1, CMVM3.4, CMVM3.7<br/></span><span>CNCFSSCP</span><span>: Securing Materials—Verification<br/></span><span>EO14028</span><span>: 4e(iv), 4e(vi), 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: DM-1, DM-2, DM-3<br/></span><span>ISO29147</span><span>: 6.2.1, 6.2.2, 6.2.4, 6.3, 6.5<br/></span><span>ISO30111</span><span>: 7.1.3<br/></span><span>OWASPSAMM</span><span>: IM1-A, IM2-B, EH1-B<br/></span><span>OWASPSCVS</span><span>: 4<br/></span><span>PCISSLC</span><span>: 3.4, 4.1, 9.1<br/></span><span>SCAGILE</span><span>: Operational Security Task 5<br/></span><span>SCFPSSD</span><span>: Vulnerability Response and Disclosure<br/></span><span>SCTPC</span><span>: MONITOR1<br/></span><span>SP80053</span><span>: SA-10, SR-3, SR-4<br/></span><span>SP800161</span><span>: SA-10, SR-3, SR-4<br/></span><span>SP800181</span><span>: K0009, K0038, K0040, K0070, K0161, K0362; S0078</span></td>
</tr>
<tr>
<td><span><a id="RV.1.2" href="#RV.1.2">RV.1.2</span><span>:</a> Review, analyze, and/or test the software’s code to identify or confirm the presence of previously undetected vulnerabilities.</span></td>
<td>Example 1: Configure the toolchain to perform automated code analysis and testing on a regular or continuous basis for all supported releases.<br/>Example 2: See PW.7 and PW.8.</td>
<td><span>BSAFSS</span><span>: VM.1-2, VM.2-1<br/></span><span>BSIMM</span><span>: CMVM3.1<br/></span><span>EO14028</span><span>: 4e(iv), 4e(vi), 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-1, SVV-2, SVV-3, SVV-4, DM-1, DM-2<br/></span><span>ISO27034</span><span>: 7.3.6<br/></span><span>ISO29147</span><span>: 6.4<br/></span><span>ISO30111</span><span>: 7.1.4<br/></span><span>PCISSLC</span><span>: 3.4, 4.1<br/></span><span>SCAGILE</span><span>: Operational Security Tasks 10, 11<br/></span><span>SP80053</span><span>: SA-11<br/></span><span>SP800161</span><span>: SA-11<br/></span><span>SP800181</span><span>: SP-DEV-002; K0009, K0039, K0153</span></td>
</tr>
<tr>
<td><span><a id="RV.1.3" href="#RV.1.3">RV.1.3</span><span>:</a> Have a policy that addresses vulnerability disclosure and remediation, and implement the roles, responsibilities, and processes needed to support that policy.</span></td>
<td>Example 1: Establish a vulnerability disclosure program, and make it easy for security researchers to learn about your program and report possible vulnerabilities.<br/>Example 2: Have a Product Security Incident Response Team (PSIRT) and processes in place to handle the responses to vulnerability reports and incidents, including communications plans for all stakeholders.<br/>Example 3: Have a security response playbook to handle a generic reported vulnerability, a report of zero-days, a vulnerability being exploited in the wild, and a major ongoing incident involving multiple parties and open-source software components.<br/>Example 4: Periodically conduct exercises of the product security incident response processes.</td>
<td><span>BSAFSS</span><span>: VM.1-1, VM.2<br/></span><span>BSIMM</span><span>: CMVM1.1, CMVM2.1, CMVM3.3, CMVM3.7<br/></span><span>EO14028</span><span>: 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: DM-1, DM-2, DM-3, DM-4, DM-5<br/></span><span>ISO29147</span><span>: All<br/></span><span>ISO30111</span><span>: All<br/></span><span>MSSDL</span><span>: 12<br/></span><span>NISTLABEL</span><span>: 2.2.2.3<br/></span><span>OWASPMASVS</span><span>: 1.11<br/></span><span>OWASPSAMM</span><span>: IM1-A, IM1-B, IM2-A, IM2-B<br/></span><span>PCISSLC</span><span>: 9.2, 9.3<br/></span><span>SCFPSSD</span><span>: Vulnerability Response and Disclosure<br/></span><span>SP80053</span><span>: SA-15(10)<br/></span><span>SP800160</span><span>: 3.3.8<br/></span><span>SP800161</span><span>: SA-15(10)<br/></span><span>SP800181</span><span>: K0041, K0042, K0151, K0292, K0317; S0054; A0025<br/></span><span>SP800216</span><span>: All</span></td>
</tr>
<tr>
<td colspan="1" rowspan="2"><div><span>Assess, Prioritize, and Remediate Vulnerabilities <a id="RV.2" href="#RV.2">(RV.2)</a></span><span>: Help ensure that vulnerabilities are remediated in accordance with risk to reduce the window of opportunity for attackers.</span></div></td>
<td><span><a id="RV.2.1" href="#RV.2.1">RV.2.1</span><span>:</a> Analyze each vulnerability to gather sufficient information about risk to plan its remediation or other risk response.</span></td>
<td>Example 1: Use existing issue tracking software to record each vulnerability.<br/>Example 2: Perform risk calculations for each vulnerability based on estimates of its exploitability, the potential impact if exploited, and any other relevant characteristics.</td>
<td><span>BSAFSS</span><span>: VM.2<br/></span><span>BSIMM</span><span>: CMVM1.2, CMVM2.2<br/></span><span>EO14028</span><span>: 4e(iv), 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: DM-2, DM-3<br/></span><span>ISO30111</span><span>: 7.1.4<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>PCISSLC</span><span>: 3.4, 4.2<br/></span><span>SCAGILE</span><span>: Operational Security Task 1, Tasks Requiring the Help of Security Experts 10<br/></span><span>SP80053</span><span>: SA-10, SA-15(7)<br/></span><span>SP800160</span><span>: 3.3.8<br/></span><span>SP800161</span><span>: SA-15(7)<br/></span><span>SP800181</span><span>: K0009, K0039, K0070, K0161, K0165; S0078</span></td>
</tr>
<tr>
<td><span><a id="RV.2.2" href="#RV.2.2">RV.2.2</span><span>:</a> Plan and implement risk responses for vulnerabilities.</span></td>
<td>Example 1: Make a risk-based decision as to whether each vulnerability will be remediated or if the risk will be addressed through other means (e.g., risk acceptance, risk transference), and prioritize any actions to be taken.<br/>Example 2: If a permanent mitigation for a vulnerability is not yet available, determine how the vulnerability can be temporarily mitigated until the permanent solution is available, and add that temporary remediation to the plan.<br/>Example 3: Develop and release security advisories that provide the necessary information to software acquirers, including descriptions of what the vulnerabilities are, how to find instances of the vulnerable software, and how to address them (e.g., where to get patches and what the patches change in the software; what configuration settings may need to be changed; how temporary workarounds could be implemented).<br/>Example 4: Deliver remediations to acquirers via an automated and trusted delivery mechanism. A single remediation could address multiple vulnerabilities.<br/>Example 5: Update records of design decisions, risk responses, and approved exceptions as needed. See PW.1.2.</td>
<td><span>BSAFSS</span><span>: VM.1-1, VM-2<br/></span><span>BSIMM</span><span>: CMVM2.1<br/></span><span>EO14028</span><span>: 4e(iv), 4e(vi), 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: DM-4<br/></span><span>ISO30111</span><span>: 7.1.4, 7.1.5<br/></span><span>NISTLABEL</span><span>: 2.2.2.2<br/></span><span>PCISSLC</span><span>: 4.1, 4.2, 10.1<br/></span><span>SCAGILE</span><span>: Operational Security Task 2<br/></span><span>SCFPSSD</span><span>: Fix the Vulnerability, Identify Mitigating Factors or Workarounds<br/></span><span>SCTPC</span><span>: MITIGATE<br/></span><span>SP80053</span><span>: SA-5, SA-10, SA-11, SA-15(7)<br/></span><span>SP800160</span><span>: 3.3.8<br/></span><span>SP800161</span><span>: SA-5, SA-8, SA-10, SA-11, SA-15(7)<br/></span><span>SP800181</span><span>: T0163, T0229, T0264; K0009, K0070</span></td>
</tr>
<tr>
<td colspan="1" rowspan="4"><div><span>Analyze Vulnerabilities to Identify Their Root Causes <a id="RV.3" href="#RV.3">(RV.3)</a></span><span>: Help reduce the frequency of vulnerabilities in the future.</span></div></td>
<td><span><a id="RV.3.1" href="#RV.3.1">RV.3.1</span><span>:</a> Analyze identified vulnerabilities to determine their root causes.</span></td>
<td>Example 1: Record the root cause of discovered issues.<br/>Example 2: Record lessons learned through root cause analysis in a wiki that developers can access and search.</td>
<td><span>BSAFSS</span><span>: VM.2-1<br/></span><span>BSIMM</span><span>: CMVM3.1, CMVM3.2<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: DM-3<br/></span><span>ISO30111</span><span>: 7.1.4<br/></span><span>OWASPSAMM</span><span>: IM3-A<br/></span><span>PCISSLC</span><span>: 4.2<br/></span><span>SCFPSSD</span><span>: Secure Development Lifecycle Feedback<br/></span><span>SP800181</span><span>: T0047, K0009, K0039, K0070, K0343</span></td>
</tr>
<tr>
<td><span><a id="RV.3.2" href="#RV.3.2">RV.3.2</span><span>:</a> Analyze the root causes over time to identify patterns, such as a particular secure coding practice not being followed consistently.</span></td>
<td>Example 1: Record lessons learned through root cause analysis in a wiki that developers can access and search.<br/>Example 2: Add mechanisms to the toolchain to automatically detect future instances of the root cause.<br/>Example 3: Update manual processes to detect future instances of the root cause.</td>
<td><span>BSAFSS</span><span>: VM.2-1, PD.1-3<br/></span><span>BSIMM</span><span>: CP3.3, CMVM3.2<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: DM-4<br/></span><span>ISO30111</span><span>: 7.1.7<br/></span><span>OWASPSAMM</span><span>: IM3-B<br/></span><span>PCISSLC</span><span>: 2.6, 4.2<br/></span><span>SCFPSSD</span><span>: Secure Development Lifecycle Feedback<br/></span><span>SP800160</span><span>: 3.3.8<br/></span><span>SP800181</span><span>: T0111, K0009, K0039, K0070, K0343</span></td>
</tr>
<tr>
<td><span><a id="RV.3.3" href="#RV.3.3">RV.3.3</span><span>:</a> Review the software for similar vulnerabilities to eradicate a class of vulnerabilities, and proactively fix them rather than waiting for external reports.</span></td>
<td>Example 1: See PW.7 and PW.8.</td>
<td><span>BSAFSS</span><span>: VM.2<br/></span><span>BSIMM</span><span>: CR3.3, CMVM3.1<br/></span><span>EO14028</span><span>: 4e(iv), 4e(viii), 4e(ix)<br/></span><span>IEC62443</span><span>: SI-1, DM-3, DM-4<br/></span><span>ISO30111</span><span>: 7.1.4<br/></span><span>PCISSLC</span><span>: 4.2<br/></span><span>SP80053</span><span>: SA-11<br/></span><span>SP800161</span><span>: SA-11<br/></span><span>SP800181</span><span>: SP-DEV-001, SP-DEV-002; K0009, K0039, K0070</span></td>
</tr>
<tr>
<td><span><a id="RV.3.4" href="#RV.3.4">RV.3.4</span><span>:</a> Review the SDLC process, and update it if appropriate to prevent (or reduce the likelihood of) the root cause recurring in updates to the software or in new software that is created.</span></td>
<td>Example 1: Record lessons learned through root cause analysis in a wiki that developers can access and search.<br/>Example 2: Plan and implement changes to the appropriate SDLC practices.</td>
<td><span>BSAFSS</span><span>: PD.1-3<br/></span><span>BSIMM</span><span>: CP3.3, CMVM3.2<br/></span><span>EO14028</span><span>: 4e(ix)<br/></span><span>IEC62443</span><span>: DM-6<br/></span><span>ISO30111</span><span>: 7.1.7<br/></span><span>MSSDL</span><span>: 2<br/></span><span>PCISSLC</span><span>: 2.6, 4.2<br/></span><span>SCFPSSD</span><span>: Secure Development Lifecycle Feedback<br/></span><span>SP80053</span><span>: SA-15<br/></span><span>SP800161</span><span>: SA-15<br/></span><span>SP800181</span><span>: K0009, K0039, K0070</span></td>
</tr>
</tbody>
</table>

## References

The SSDF Table was originally published at [NIST SP 800-218: Secure Software Development Framework (SSDF) Version 1.1: Recommendations for Mitigating the Risk of Software Vulnerabilities](https://csrc.nist.gov/publications/detail/sp/800-218/final).

_Reprinted courtesy of the National Institute of Standards and Technology, U.S. Department of Commerce. Not copyrightable in the United States._

---

### What are containers?
_Path: software-security/what-are-containers/index.md_

Maximizing the performance of computer hardware has been a critical undertaking for software engineers for decades. First developed in the 1960s, virtual machines (VMs) were an early answer to this challenge, allowing a single computer to host multiple, isolated operating systems. VMs enable different guest users or processes to share physical infrastructure while keeping their concurrent operations separated. However, as VMs are both slow to initialize and resource-intensive, a modern solution arrived in the early 2000s: containers.

*Containers* share a common *kernel* with each other, whereas multiple VMs each require their own virtual kernel. The kernel resides at the core of an operating system and facilitates activities between hardware and software. By sharing a kernel, containers run concurrently using the same infrastructure, providing the isolation benefits of VMs without added resource overhead. Containers have become increasingly popular for their ease of use, reproducibility, and portability in deploying applications across systems at a low resource cost. The [Open Container Initiative (OCI)](/open-source/oci/what-is-the-oci/) defines the open standards for image formats, runtimes, and distribution that make this portability possible.

This article explores the structure of *container images*, the foundational unit behind containers, including their key contents and how they're built. You'll learn how containers operate on top of a container engine and how to choose, build, and deploy container images for your applications.

## Structure of a container image

To build a container for your application, start with a *container image*. A container image is a static, immutable filesystem bundle that serves as a blueprint for building containers. Inside every container image is a curated collection of the files, dependencies, and code needed to run an application. At runtime, a container built from an image inherits all characteristics of that image.

![A container built from an image inherits all characteristics of the image it is built from.](image_to_container.png)

To create a container image, select a *base image*. A base image is a foundational image that you extend by adding image *layers*. Typically, base images include a Linux distribution, though minimal or distroless images omit the full userland to reduce size and attack surface. Each distribution differs in its size, dependencies, and functionality, making certain distributions better suited for certain images than others.

After selecting a base image, you add layers containing your application-specific code and dependencies. Tools such as [Docker](https://www.docker.com/) and [Podman](https://podman.io/) ingest a [*Dockerfile*](https://docs.docker.com/reference/dockerfile/), a configuration file that specifies the instructions to assemble a multi-layer image. You can also use tools such as [apko](/open-source/build-tools/apko/overview/) and [ko](https://github.com/ko-build/ko), which produce images using a single-layer construction method.

For example, say you want to build a container to run your Python application. You can start with a Python base image, such as a [Wolfi-based image](/open-source/wolfi/wolfi-with-dockerfiles/), then add your application and its dependencies through Dockerfile layers. The resulting image is ready to deploy with your application bundled inside.

## Instantiating containers

Once you have a container image, use it to start a running container. Doing so requires a *container engine*, software that hosts multiple containers on a shared machine. [Docker Engine](https://docs.docker.com/engine/), [Podman](https://podman.io/), and [containerd](https://containerd.io/) are common examples.

A container engine communicates with the host operating system's kernel. Within a container engine, multiple containers run independently of each other, each carrying the code, dependencies, and configuration of its parent image. The following diagram shows this hierarchical relationship.

![Containers run independently of each other on a container engine, the software that communicates with a host operating system kernel. Each container contains the application and dependencies it needs to run.](container_structure.png)

## Getting started with containers

Depending on your application, you may not need to build your own container images from scratch. Instead, you can pull a container image from a *container registry*, a centralized repository of images. [Docker Hub](https://hub.docker.com/) hosts hundreds of thousands of open source images. Other registries include the [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), the [Google Artifact Registry](https://cloud.google.com/artifact-registry/docs), and the [Chainguard registry](/chainguard/chainguard-registry/overview/), which offers a free public catalog of secure, minimal base images.

When choosing a container image, consider more than just core functionality. Your image must include the packages and components your application needs, but images with many unneeded packages increase your data egress and vulnerability counts. Prefer images that balance security and reliability with a minimal footprint.

To learn more, refer to [Selecting a base image](/software-security/selecting-a-base-image/).

## Learn more

To get started, refer to [Chainguard Containers](/chainguard/containers/), hardened minimal images for secure containerized applications. To build your own images, refer to [Wolfi](/open-source/wolfi/), a Linux undistro designed as a base for lightweight containers. To understand the standards that govern container image formats, runtimes, and distribution, refer to [What is the Open Container Initiative?](/open-source/oci/what-is-the-oci/).

---

### Chainguard products changelog
_Path: chainguard/changelog.md_

This page logs Chainguard product updates week by week, newest first: product announcements, breaking changes, container images that reached end-of-life or are no longer available, and images newly added to the catalog. Each event is listed once, in the week it first appeared.

Breaking changes and product announcements cover the entire Chainguard portfolio, while end-of-life, availability, and new-image entries relate specifically to Chainguard Containers. This page summarizes the changes most likely to affect your work rather than every change Chainguard ships. Routine updates, such as new tags for existing images, are not listed individually. For the current tags and versions of any container image, refer to its entry in the [Chainguard Directory](https://images.chainguard.dev/directory).

## Week of 2026-09-14

{{< changelog-label "Breaking Changes" >}}

### sonar-scanner-cli default user change

_Effective October 12, 2026._

Chainguard's `sonar-scanner-cli` image changes its default user from `root` (UID 0) to `nonroot` (UID 65532), aligning it with the upstream image and the principle of least privilege. The default working directory `/usr/src` is owned by `65532:0` with mode `0775`, and the scanner's scratch directory moves from `<project>/.scannerwork` to `/tmp/.scannerwork`.

- **Affected:** organizations running `sonar-scanner-cli` as root by default — including derived images that install packages or write to system paths as root, pipelines that read `report-task.txt` from the old `.scannerwork` location, and scans that write output files into the mounted project directory. Deployments that already override the container user, or that mount a project and run the image as-is, are unaffected.
- **Action:** derived images that need root for build steps should add `USER root` before those steps and switch back to `USER 65532` afterward. Pipelines reading `report-task.txt` from the workspace should read it from `/tmp/.scannerwork`, or set `-Dsonar.working.directory=<project>/.scannerwork` and ensure the workspace is writable by the container user. To restore the previous behavior temporarily, run with `--user 0` (Docker), `USER root` (Dockerfile), or `runAsUser: 0` (Kubernetes), or pin to a digest built before the effective date.

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/features/eol-gp-overview/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `kuma:2.12` | 2026-09-09 | 2027-03-09 |

{{< changelog-label "New Images" >}}

Chainguard built 26 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/clamav-prometheus-exporter/versions"><code>clamav-prometheus-exporter</code></a></td><td>application +fips</td><td>2026-09-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-marketplaceordering/versions"><code>crossplane-azure-marketplaceordering</code></a></td><td>application</td><td>2026-09-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-sklearnserver/versions"><code>kserve-sklearnserver</code></a></td><td>ai</td><td>2026-09-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/commercial-spilo-fips/versions"><code>commercial-spilo-fips</code></a></td><td>fips</td><td>2026-09-08</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/graphql-hive-gateway/versions"><code>graphql-hive-gateway</code></a></td><td>application</td><td>2026-09-08</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/jupyterhub-k8s-singleuser-sample/versions"><code>jupyterhub-k8s-singleuser-sample</code></a></td><td>application +fips</td><td>2026-09-08</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/nuxeo-2025/versions"><code>nuxeo-2025</code></a></td><td>application</td><td>2026-09-08</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/chainguard-server-hypervisor-aws/versions"><code>chainguard-server-hypervisor-aws</code></a></td><td>base</td><td>2026-09-09</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mongodb-kubernetes/versions"><code>mongodb-kubernetes</code></a></td><td>application +fips</td><td>2026-09-09</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/opentelemetry-python-instrumentation-fips/versions"><code>opentelemetry-python-instrumentation-fips</code></a></td><td>fips</td><td>2026-09-09</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/strimzi-kafka-fips/versions"><code>strimzi-kafka-fips</code></a></td><td>fips</td><td>2026-09-09</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-aws-emrcontainers/versions"><code>crossplane-aws-emrcontainers</code></a></td><td>application +fips</td><td>2026-09-11</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kro/versions"><code>kro</code></a></td><td>application +fips</td><td>2026-09-11</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/pyrra/versions"><code>pyrra</code></a></td><td>application +fips</td><td>2026-09-11</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/starboard-exporter/versions"><code>starboard-exporter</code></a></td><td>application +fips</td><td>2026-09-11</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/krakend/versions"><code>krakend</code></a></td><td>application +fips</td><td>2026-09-14</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mongodb-search/versions"><code>mongodb-search</code></a></td><td>application +fips</td><td>2026-09-14</td></tr>
</tbody>
</table>

## Week of 2026-09-07

{{< changelog-label "Product Announcements" >}}

### Chainguard Containers for Go 1.27

_Launched August 31, 2026._

Chainguard now ships Go 1.27 in three images: `go`, `go-fips`, and `go-openssl-fips`. The new `go-openssl-fips` image selects its FIPS-validated cryptographic module at deployment rather than at build time.

Choosing a FIPS module for Go previously meant choosing a toolchain at compile time. Teams compiled against either the host's OpenSSL FIPS provider (`go-msft-fips`) or the Go Cryptographic Module (`go-geomys-fips`), so supporting both required two pipelines producing two artifacts. The new Go FIPS toolchain ships one artifact that picks the validated module after the build, at the point of deployment. A single build cross-compiles from one command, runs wherever you deploy, keeps your validated module and FedRAMP authorization intact, and is ready for CNSA 2.0 — all without recompilation.

Go 1.26 and earlier behave as before and remain supported until end-of-life, so you can migrate on your own schedule.

For more information, refer to [Getting started with the Go Chainguard Container](/chainguard/containers/getting-started/go/).

### Chainguard Libraries in JFrog

_Launched September 2, 2026._

JFrog Catalog now recognizes Chainguard-built packages, so joint Chainguard and JFrog customers can pull Chainguard Libraries through JFrog without build errors. This is what underpins JFrog's Zero-Touch Remediation: when a scan finds a vulnerable artifact, teams can take the patched Chainguard package in place, without changing developer workflows or forcing a major version upgrade.

- Java support shipped with this announcement; JavaScript and Python are scheduled to follow by the end of September 2026.
- JFrog Xray scanning and Curation policies work as before.
- Nothing changes for Chainguard Libraries customers who don't use JFrog.

For more information, refer to [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/).

{{< changelog-label "New Images" >}}

Chainguard built 39 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td colspan="3">
<details>
<summary><strong><code>kubeflow-pipelines-*</code></strong> — 10 images</summary>
<table>
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-api-server-fips/versions"><code>kubeflow-pipelines-api-server-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-cache-deployer-fips/versions"><code>kubeflow-pipelines-cache-deployer-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-cache-server-fips/versions"><code>kubeflow-pipelines-cache-server-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-driver-fips/versions"><code>kubeflow-pipelines-driver-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-frontend-fips/versions"><code>kubeflow-pipelines-frontend-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-metadata-envoy-fips/versions"><code>kubeflow-pipelines-metadata-envoy-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-metadata-writer-fips/versions"><code>kubeflow-pipelines-metadata-writer-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-persistenceagent-fips/versions"><code>kubeflow-pipelines-persistenceagent-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-scheduledworkflow-fips/versions"><code>kubeflow-pipelines-scheduledworkflow-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubeflow-pipelines-viewer-crd-controller-fips/versions"><code>kubeflow-pipelines-viewer-crd-controller-fips</code></a></td><td>fips</td><td>2026-08-31</td></tr>
</tbody>
</table>
</details>
</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/dbmate/versions"><code>dbmate</code></a></td><td>application +fips</td><td>2026-08-31</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/go-openssl-fips/versions"><code>go-openssl-fips</code></a></td><td>fips</td><td>2026-09-01</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/hadolint/versions"><code>hadolint</code></a></td><td>application +fips</td><td>2026-09-01</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/jruby/versions"><code>jruby</code></a></td><td>base</td><td>2026-09-01</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-huggingfaceserver/versions"><code>kserve-huggingfaceserver</code></a></td><td>ai +fips</td><td>2026-09-01</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/gubernator/versions"><code>gubernator</code></a></td><td>application +fips</td><td>2026-09-02</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kates-tester/versions"><code>kates-tester</code></a></td><td>application +fips</td><td>2026-09-02</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/fortiotel/versions"><code>fortiotel</code></a></td><td>application +fips</td><td>2026-09-03</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/packer/versions"><code>packer</code></a></td><td>application +fips</td><td>2026-09-03</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/security-profiles-operator/versions"><code>security-profiles-operator</code></a></td><td>application</td><td>2026-09-03</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/aws-lambda-dotnet/versions"><code>aws-lambda-dotnet</code></a></td><td>application +fips</td><td>2026-09-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mongodb-kubernetes-readinessprobe/versions"><code>mongodb-kubernetes-readinessprobe</code></a></td><td>application +fips</td><td>2026-09-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/opentelemetry-go-instrumentation/versions"><code>opentelemetry-go-instrumentation</code></a></td><td>application +fips</td><td>2026-09-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/prom-label-proxy/versions"><code>prom-label-proxy</code></a></td><td>application +fips</td><td>2026-09-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-sklearnserver-fips/versions"><code>kserve-sklearnserver-fips</code></a></td><td>fips</td><td>2026-09-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/presidio-anonymizer/versions"><code>presidio-anonymizer</code></a></td><td>application +fips</td><td>2026-09-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/redpanda-console-fips/versions"><code>redpanda-console-fips</code></a></td><td>fips</td><td>2026-09-07</td></tr>
</tbody>
</table>

## Week of 2026-08-31

{{< changelog-label "Product Announcements" >}}

### chainctl fixes for standard Windows accounts

_Launched August 26, 2026._

Several `chainctl` workflows now work for standard, non-administrator Windows users:

- Configuring Docker credentials no longer requires symlinks or Developer Mode.
- Self-update replaces the running executable correctly and checks release attestations before installing.
- Library verification checks signatures in-process and cleans up its temporary directories reliably.
- Authentication failures report an error instead of a misleading 0.00% coverage result.

These are targeted fixes. Chainguard's official Windows support tier is unchanged.

### Custom container policies (open beta)

_Launched August 25, 2026._

Organizations enabled for the beta can now write their own container pull policies instead of relying only on Chainguard's system policies. Custom policies are [Rego](https://www.openpolicyagent.org/docs/policy-language) expressions submitted as YAML manifests and managed with `chainctl`, so you can keep them in git and validate them in CI.

- Policies can declare parameters, with values set per binding.
- `chainctl policies custom validate` reports the exact line and column of an error before the policy is stored.
- Evaluation runs in a sandbox with no network or filesystem access.
- A custom policy in `ENFORCE` mode blocks pulls, but cannot loosen a system policy.

For more information, refer to [Writing custom policies](/chainguard/chainguard-repository/container-policies/#writing-custom-policies).

### Build pinning for Chainguard Libraries

_Launched August 24, 2026._

Build pinning is now enabled for all organizations using Chainguard Libraries with upstream fallback, across JavaScript, Python, and Java. The first time your organization pulls a package version, Chainguard records which copy you received — the upstream mirror or the Chainguard rebuild — and keeps resolving that version to the same copy until you choose to move forward. This keeps your lockfiles and checksums valid as Chainguard's library coverage grows.

Organizations that do not use upstream fallback see no change. To review what your organization holds, or to opt out, refer to [`chainctl libraries cache`](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/).

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that are no longer available

The following container images reached the end of their grace period and are no longer available:

| Image | End-of-life | Grace period ended |
| --- | --- | --- |
| `kube-conformance:1.32` | 2026-02-28 | 2026-08-28 |
| `kubernetes:1.32` | 2026-02-28 | 2026-08-28 |
| `nextcloud-server:31` | 2026-02-28 | 2026-08-28 |
| `rke2-runtime:1.32` | 2026-02-28 | 2026-08-28 |
| `teleport:17` | 2026-02-28 | 2026-08-28 |

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `istio:1.29` | 2026-08-31 | 2027-02-28 |
| `istio-cni:1.29` | 2026-08-31 | 2027-02-28 |
| `istio-envoy:1.29` | 2026-08-31 | 2027-02-28 |
| `istio-operator:1.29` | 2026-08-31 | 2027-02-28 |
| `istio-pilot-agent:1.29` | 2026-08-31 | 2027-02-28 |
| `istio-pilot-discovery:1.29` | 2026-08-31 | 2027-02-28 |
| `teleport:18` | 2026-08-31 | 2027-02-28 |
| `ztunnel:1.29` | 2026-08-31 | 2027-02-28 |

{{< changelog-label "New Images" >}}

Chainguard built 21 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/dynatrace-operator/versions"><code>dynatrace-operator</code></a></td><td>application +fips</td><td>2026-08-24</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/netshoot/versions"><code>netshoot</code></a></td><td>application +fips</td><td>2026-08-24</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/strimzi-drain-cleaner/versions"><code>strimzi-drain-cleaner</code></a></td><td>application +fips</td><td>2026-08-24</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kube-logging-operator-fluentd-drain-watch/versions"><code>kube-logging-operator-fluentd-drain-watch</code></a></td><td>application +fips</td><td>2026-08-25</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mlrun-api-fips/versions"><code>mlrun-api-fips</code></a></td><td>fips</td><td>2026-08-25</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mlrun-fips/versions"><code>mlrun-fips</code></a></td><td>fips</td><td>2026-08-25</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/redpanda-console/versions"><code>redpanda-console</code></a></td><td>application</td><td>2026-08-26</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/apache-polaris/versions"><code>apache-polaris</code></a></td><td>application +fips</td><td>2026-08-28</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-pmmlserver/versions"><code>kserve-pmmlserver</code></a></td><td>ai +fips</td><td>2026-08-28</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-xgbserver/versions"><code>kserve-xgbserver</code></a></td><td>ai +fips</td><td>2026-08-28</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/nomad/versions"><code>nomad</code></a></td><td>application +fips</td><td>2026-08-28</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/victorialogs-vlagent/versions"><code>victorialogs-vlagent</code></a></td><td>application +fips</td><td>2026-08-28</td></tr>
</tbody>
</table>

## Week of 2026-08-24

{{< changelog-label "Product Announcements" >}}

### SCIM user provisioning (Early Access)

_Launched August 20, 2026._

Chainguard now supports SCIM user provisioning for Okta and Microsoft Entra ID in Early Access. Assigning a user to the provisioning application creates and updates their Chainguard provisioning record through the SCIM `/Users` resource; deactivating or unassigning them blocks the next login or token refresh once the current token expires, within about an hour. Roles stay under Chainguard's control through default roles, manual bindings, and group-based role mapping. SCIM group provisioning is not available, so leave your identity provider's SCIM group push turned off.

For more information, refer to [SCIM user provisioning](/platform/administration/custom-idps/scim-provisioning/).

### Chainguard API v2 is generally available

_Launched August 19, 2026._

Chainguard API v2 is now generally available at `/v2/`, replacing the `v2beta1` designation with a stable contract covering organization and access management, registry metadata, vulnerability and security advisories, event subscriptions, and library artifacts. It standardizes cursor-based pagination, server-side ordering, resource naming, dedicated resource lookups, partial updates, and typed error details, and ships an OpenAPI specification and v2 Go SDK clients. Existing `v2beta1` integrations keep their request and response shapes and need only update the path prefix. API v1 remains supported during the transition.

For more information, refer to [Migrating from API v1 to API v2](/platform/api/api-v2-migration/).

### Self-serve Helm chart provisioning

_Launched August 18, 2026._

Catalog customers can now provision Chainguard Helm charts from the Chainguard Console instead of filing a request ticket. When you select a chart, the Console identifies the required images your organization is missing, adds them in a single request, and starts provisioning the chart asynchronously; the chart appears in your registry once synchronization completes, without EOL tags. Dependency resolution does not detect renamed images.

For more information, refer to [Self-serve Helm charts](/get-started/self-serve/helm-charts/).

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that are no longer available

The following container images reached the end of their grace period and are no longer available:

| Image | End-of-life | Grace period ended |
| --- | --- | --- |
| `flux:2.5` | 2026-02-24 | 2026-08-24 |

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `grafana:12.3` | 2026-08-19 | 2027-02-19 |
| `py3-numpy:2.1` | 2026-08-19 | 2027-02-19 |

{{< changelog-label "New Images" >}}

Chainguard built 27 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td colspan="3">
<details>
<summary><strong><code>airbyte-*</code></strong> — 5 images (with FIPS variants)</summary>
<table>
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/airbyte-bootloader/versions"><code>airbyte-bootloader</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/airbyte-cron/versions"><code>airbyte-cron</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/airbyte-worker/versions"><code>airbyte-worker</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/airbyte-workload-api-server/versions"><code>airbyte-workload-api-server</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/airbyte-workload-launcher/versions"><code>airbyte-workload-launcher</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
</tbody>
</table>
</details>
</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/percona-server-mongodb-fips/versions"><code>percona-server-mongodb-fips</code></a></td><td>fips</td><td>2026-08-17</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/application-gateway-kubernetes-ingress/versions"><code>application-gateway-kubernetes-ingress</code></a></td><td>application +fips</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/falcosidekick-ui/versions"><code>falcosidekick-ui</code></a></td><td>application +fips</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubernetes-csi-external-health-monitor-fips/versions"><code>kubernetes-csi-external-health-monitor-fips</code></a></td><td>fips</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mlrun/versions"><code>mlrun</code></a></td><td>application</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/mlrun-api/versions"><code>mlrun-api</code></a></td><td>application</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/spiffe-csi-driver/versions"><code>spiffe-csi-driver</code></a></td><td>application +fips</td><td>2026-08-18</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/apache-activemq-artemis-fips/versions"><code>apache-activemq-artemis-fips</code></a></td><td>fips</td><td>2026-08-19</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/aws-iam-controller/versions"><code>aws-iam-controller</code></a></td><td>application +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/commercial-nginx-plus-fips/versions"><code>commercial-nginx-plus-fips</code></a></td><td>commercial</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-lgbserver/versions"><code>kserve-lgbserver</code></a></td><td>ai +fips</td><td>2026-08-21</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/ranger/versions"><code>ranger</code></a></td><td>application</td><td>2026-08-21</td></tr>
</tbody>
</table>

## Week of 2026-08-17

{{< changelog-label "Product Announcements" >}}

### Clearer npm errors for blocked packages

_Launched August 13, 2026._

When Chainguard Libraries withholds an npm package or version — because of detected malware or greyware, a pending malware scan, or a policy block such as a cooldown — npm now returns a `403` naming the specific reason, for example `MALWARE_DETECTED`, instead of the unexplained `404` it returned before. The other supported package managers (pnpm, yarn, uv, poetry, Maven, and Gradle) still report a blocked version as a generic not-found error, and a `409` when an entire package is blocked for malware.

For more information, refer to [Error messages](/chainguard/libraries/troubleshooting/errors/#package-manager-behavior).

### Guardener GitHub App (beta)

_Launched August 12, 2026._

Chainguard Guardener, the automated migration tool, now covers GitHub Actions as well as container images. The GitHub App inventories the Actions in use across your organization's repositories, maps them to hardened Chainguard equivalents, and opens pull requests to swap them in, pinned to a specific SHA rather than a mutable tag. It runs in two modes: an upfront pass that surfaces existing Actions usage and opens migration pull requests, and ongoing standardization that watches workflow files and suggests Chainguard equivalents as new upstream Actions appear.

For more information, refer to [Getting started with Chainguard Guardener](/chainguard/guardener/github/getting-started/).

{{< changelog-label "Breaking Changes" >}}

### Chainguard Libraries build pinning

_Effective August 24, 2026._

Chainguard Repository can serve two copies of the same package version: the upstream copy mirrored from the public registry, and Chainguard's copy rebuilt from source. The two have different checksums, and each request resolves independently, so when Chainguard publishes a rebuild of a version your organization already pulled, the next resolution moves you to the rebuild and its checksum no longer matches your lockfile — surfacing client-side as errors such as `EINTEGRITY` in npm. As of August 24, 2026, build pinning records which copy your organization received the first time it downloads a package version and keeps resolving that version to the same copy until you choose to move forward. Malware and policy blocks apply independently: a version that is later blocked stops being served rather than being replaced with a different copy.

- **Affected:** organizations using Chainguard Libraries with upstream fallback, across JavaScript, Python, and Java. Organizations without upstream fallback see no change.
- **Action:** none required. To keep the current behavior, run `chainctl libraries cache opt-out`. Both `opt-out` and `chainctl libraries cache opt-in` accept `--ecosystem`, and pinning state is tracked per organization and ecosystem. To see which copy each held version came from, run `chainctl libraries cache list`.

For more information, refer to [`chainctl libraries cache`](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/).

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that are no longer available

The following container images reached the end of their grace period and are no longer available:

| Image | End-of-life | Grace period ended |
| --- | --- | --- |
| `prometheus:3.9` | 2026-02-17 | 2026-08-17 |

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `mattermost:10.11` | 2026-08-15 | 2027-02-15 |

{{< changelog-label "New Images" >}}

Chainguard built 17 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/azurite/versions"><code>azurite</code></a></td><td>application</td><td>2026-08-10</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/k0s-cni-node/versions"><code>k0s-cni-node</code></a></td><td>application +fips</td><td>2026-08-10</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/peerdb-ui/versions"><code>peerdb-ui</code></a></td><td>application +fips</td><td>2026-08-10</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/scc/versions"><code>scc</code></a></td><td>application +fips</td><td>2026-08-10</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/zitadel-login/versions"><code>zitadel-login</code></a></td><td>application</td><td>2026-08-11</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/aws-lambda-nodejs/versions"><code>aws-lambda-nodejs</code></a></td><td>application +fips</td><td>2026-08-12</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/localstack/versions"><code>localstack</code></a></td><td>application</td><td>2026-08-12</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kserve-router-fips/versions"><code>kserve-router-fips</code></a></td><td>fips</td><td>2026-08-13</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/jdk-openssl-fips/versions"><code>jdk-openssl-fips</code></a></td><td>fips</td><td>2026-08-14</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/jre-openssl-fips/versions"><code>jre-openssl-fips</code></a></td><td>fips</td><td>2026-08-14</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kube-router/versions"><code>kube-router</code></a></td><td>application +fips</td><td>2026-08-14</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/commercial-nginx-ingress-plus/versions"><code>commercial-nginx-ingress-plus</code></a></td><td>commercial</td><td>2026-08-17</td></tr>
</tbody>
</table>

## Week of 2026-08-10

{{< changelog-label "Product Announcements" >}}

### Chainguard Libraries available through AWS Security Hub Extended

_Launched August 4, 2026._

AWS added a Supply Chain category to Security Hub Extended and named Chainguard one of its inaugural partners. You can now subscribe to Chainguard Libraries from the Security Hub console and pay through your existing AWS account. Libraries findings arrive normalized to the Open Cybersecurity Schema Framework (OCSF), so they appear alongside your AWS and other partner findings, and AWS Enterprise Support customers receive Level 1 support from AWS.

For more information about the catalog, refer to the [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/).

### Malware avoidance in the Console (beta)

_Launched August 4, 2026._

The Console now shows which malicious and suspicious packages Chainguard Libraries blocked before they reached your environment. A weekly chart tracks the malware and greyware stopped across the Python and JavaScript ecosystems, and a search tool reports why any given package was flagged unsafe. Find it under the **Malware** tab in the Libraries section of the Console sidebar; it is enabled by default for every organization entitled to Libraries.

For more information, refer to [View malware information](/chainguard/libraries/introduction/browse/#view-malware-information).

### PKCE support for custom identity providers

_Launched August 3, 2026._

Chainguard now supports Proof Key for Code Exchange (PKCE) on the OAuth token exchange with custom OIDC identity providers, in line with OAuth 2.1. Administrators can enable it with `chainctl` or the Chainguard API, either alongside an existing client secret or as a secret-free public client.

For more information, including setup steps, refer to [Enable PKCE for OAuth Token Exchange](/platform/administration/custom-idps/enabling-pkce/).

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `net-kourier:1.21` | 2026-08-04 | 2027-02-04 |
| `tekton-pipelines:1.3` | 2026-08-04 | 2027-02-04 |
| `ruby3.2-rails:7.2` | 2026-08-09 | 2027-02-09 |
| `ruby3.3-rails:7.2` | 2026-08-09 | 2027-02-09 |
| `ruby3.4-rails:7.2` | 2026-08-09 | 2027-02-09 |
| `ruby4.0-rails:7.2` | 2026-08-09 | 2027-02-09 |

{{< changelog-label "New Images" >}}

Chainguard built 23 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/prometheus-stackdriver-exporter/versions"><code>prometheus-stackdriver-exporter</code></a></td><td>application +fips</td><td>2026-08-03</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-keyvault/versions"><code>crossplane-azure-keyvault</code></a></td><td>application</td><td>2026-08-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-kusto/versions"><code>crossplane-azure-kusto</code></a></td><td>application</td><td>2026-08-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/influxdb-fips/versions"><code>influxdb-fips</code></a></td><td>fips</td><td>2026-08-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/moodle-iamguarded/versions"><code>moodle-iamguarded</code></a></td><td>application</td><td>2026-08-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/pypiserver-fips/versions"><code>pypiserver-fips</code></a></td><td>fips</td><td>2026-08-04</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kubevirt-cdi-cloner/versions"><code>kubevirt-cdi-cloner</code></a></td><td>application +fips</td><td>2026-08-05</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/yopass/versions"><code>yopass</code></a></td><td>application</td><td>2026-08-05</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/acm-controller/versions"><code>acm-controller</code></a></td><td>application +fips</td><td>2026-08-06</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/gremlin-server/versions"><code>gremlin-server</code></a></td><td>application</td><td>2026-08-06</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/rollouts-plugin-trafficrouter-gatewayapi/versions"><code>rollouts-plugin-trafficrouter-gatewayapi</code></a></td><td>application +fips</td><td>2026-08-06</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/claude/versions"><code>claude</code></a></td><td>application</td><td>2026-08-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/codex/versions"><code>codex</code></a></td><td>application</td><td>2026-08-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/cruise-control/versions"><code>cruise-control</code></a></td><td>application +fips</td><td>2026-08-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/dotstatsuite-supercore/versions"><code>dotstatsuite-supercore</code></a></td><td>application</td><td>2026-08-07</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/opencode/versions"><code>opencode</code></a></td><td>application</td><td>2026-08-08</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/zalando-pgbouncer/versions"><code>zalando-pgbouncer</code></a></td><td>application +fips</td><td>2026-08-10</td></tr>
</tbody>
</table>

## Week of 2026-08-03

{{< changelog-label "Breaking Changes" >}}

### ingress-nginx-controller entrypoint, command, and default user changes

_Effective July 15, 2026._

Chainguard aligned the entrypoint and command behavior of all supported `ingress-nginx-controller` images with the upstream image, correcting a startup configuration defect present since the image was first published in 2024. Non-`iamguarded` variants also changed their default runtime user from `root` (UID 0) to `www-data` (UID 101).

- **Affected:** all supported `ingress-nginx-controller` images, including FIPS and `-iamguarded` variants.
- **Action:** review any configuration that overrides `command`, `args`, `entrypoint`, or `runAsUser`, or that depends on admission policies or file ownership assumptions. Deployments using the upstream Helm chart defaults need no changes.

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that are no longer available

The following container images reached the end of their grace period and are no longer available:

| Image | End-of-life | Grace period ended |
| --- | --- | --- |
| `cilium:1.16` | 2026-02-03 | 2026-08-03 |
| `neo4j:2025.12` | 2026-02-03 | 2026-08-03 |

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `eks-distro:1.33` | 2026-07-29 | 2027-07-29 |
| `mongo:8.2` | 2026-07-31 | 2027-01-31 |
| `prometheus:3.5` | 2026-07-31 | 2027-01-31 |
| `cockroach:26.1` | 2026-08-02 | 2027-02-02 |
| `cockroach-openssl:26.1` | 2026-08-02 | 2027-02-02 |

{{< changelog-label "New Images" >}}

Chainguard built 18 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/atlas/versions"><code>atlas</code></a></td><td>application +fips</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/azure-metrics-exporter/versions"><code>azure-metrics-exporter</code></a></td><td>application +fips</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-solutions/versions"><code>crossplane-azure-solutions</code></a></td><td>application</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-streamanalytics/versions"><code>crossplane-azure-streamanalytics</code></a></td><td>application</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-web/versions"><code>crossplane-azure-web</code></a></td><td>application</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/dns-controller-manager/versions"><code>dns-controller-manager</code></a></td><td>application +fips</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/instrumentisto-haraka/versions"><code>instrumentisto-haraka</code></a></td><td>application +fips</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/openstack-kolla-toolbox/versions"><code>openstack-kolla-toolbox</code></a></td><td>application +fips</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/sftpgo/versions"><code>sftpgo</code></a></td><td>application</td><td>2026-07-29</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/flink-kubernetes-operator-fips/versions"><code>flink-kubernetes-operator-fips</code></a></td><td>fips</td><td>2026-07-30</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/traccar/versions"><code>traccar</code></a></td><td>application +fips</td><td>2026-07-30</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/metacontroller-fips/versions"><code>metacontroller-fips</code></a></td><td>fips</td><td>2026-07-31</td></tr>
</tbody>
</table>

## Week of 2026-07-28

{{< changelog-label "Product Announcements" >}}

### SUSE NeuVector now natively supports Chainguard Containers

_Launched July 24, 2026._

SUSE's NeuVector vulnerability scanner now natively supports Chainguard Containers and ingests Chainguard's OSV advisory feed, which includes recent data-quality improvements. Scans of Chainguard images suppress false positives and report more accurate results.

### Group-based role mapping is now generally available

_Launched July 22, 2026._

Administrators can map identity provider groups — Okta or Microsoft Entra ID, for example — directly to Chainguard roles, instead of assigning roles one user at a time. Anyone who authenticates with a mapped group in their token receives that role for the session.

For more information, including setup steps, refer to [Grant Chainguard roles from identity provider groups](/platform/administration/custom-idps/grant-roles-from-groups/).

{{< changelog-label "EOL" >}}

Chainguard offers [a grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for eligible end-of-life images: up to six months of continued rebuilds and security updates while you complete your upgrade.

### Images that are no longer available

The following container images reached the end of their grace period and are no longer available:

| Image | End-of-life | Grace period ended |
| --- | --- | --- |
| `knative-eventing:1.19` | 2026-01-28 | 2026-07-28 |
| `knative-serving:1.19` | 2026-01-28 | 2026-07-28 |
| `net-kourier:1.19` | 2026-01-28 | 2026-07-28 |

### Images that have reached end-of-life

The following container images reached end-of-life and entered their grace period:

| Image | End-of-life | Grace period ends |
| --- | --- | --- |
| `dnsdist:1.9` | 2026-07-21 | 2027-01-21 |
| `longhorn-backing-image-manager:1.8` | 2026-07-22 | 2027-01-22 |
| `longhorn-instance-manager:1.8` | 2026-07-22 | 2027-01-22 |
| `envoy:1.35` | 2026-07-23 | 2027-01-23 |

{{< changelog-label "New Images" >}}

Chainguard built 15 new container images this week, including both standard and FIPS variants.

<table class="cl-images">
<thead><tr><th>Image</th><th>Tier</th><th>Added</th></tr></thead>
<tbody>
<tr><td><a href="https://images.chainguard.dev/directory/image/coder/versions"><code>coder</code></a></td><td>application +fips</td><td>2026-07-22</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/flink-kubernetes-operator/versions"><code>flink-kubernetes-operator</code></a></td><td>application</td><td>2026-07-22</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/pghero/versions"><code>pghero</code></a></td><td>application +fips</td><td>2026-07-22</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/kargo/versions"><code>kargo</code></a></td><td>application</td><td>2026-07-23</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/nuclio-controller/versions"><code>nuclio-controller</code></a></td><td>application +fips</td><td>2026-07-23</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/phpmyadmin/versions"><code>phpmyadmin</code></a></td><td>application +fips</td><td>2026-07-23</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/apache-exporter-iamguarded/versions"><code>apache-exporter-iamguarded</code></a></td><td>application</td><td>2026-07-24</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/glab/versions"><code>glab</code></a></td><td>application +fips</td><td>2026-07-27</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/metabase/versions"><code>metabase</code></a></td><td>application</td><td>2026-07-27</td></tr>
<tr><td><a href="https://images.chainguard.dev/directory/image/crossplane-azure-relay/versions"><code>crossplane-azure-relay</code></a></td><td>application</td><td>2026-07-28</td></tr>
</tbody>
</table>

---

### Overview of Chainguard Repository
_Path: chainguard/chainguard-repository/overview.md_

The Chainguard Repository is a single, policy-managed experience for pulling artifacts that Chainguard either builds or distributes. It gives your organization one place to pull open source artifacts, configure security policies that govern how they are consumed, and monitor coverage and policy enforcement across your environment.

All artifacts served through the Chainguard Repository are either rebuilt by Chainguard from verifiable source in a SLSA L3-compliant build environment, or sourced from upstream public registries with configurable policy controls. As Chainguard builds more artifacts from source, your organization's risk shrinks automatically without any changes to your configuration or developer workflows.

## Artifact types

As of this writing, the Chainguard Repository contains the following artifact types:

| Artifact type | Description |
| ----- | ----- |
| [Chainguard Libraries for JavaScript](/chainguard/libraries/javascript/overview/) | Open source language dependencies rebuilt from source for JavaScript (npm). |
| [Chainguard Libraries for Java](/chainguard/libraries/java/overview/) | Open source language dependencies rebuilt from source for Java (Maven). |
| [Chainguard Libraries for Python](/chainguard/libraries/python/overview/) | Open source language dependencies rebuilt from source for Python (PyPI). |

## Endpoints

Each artifact type is accessible via its own endpoint:

| Artifact type | Endpoint |
| ----- | ----- |
| Libraries for [JavaScript](/chainguard/libraries/javascript/overview/) | `https://libraries.cgr.dev/javascript/` |
| Libraries for [Java](/chainguard/libraries/java/overview/) | `https://libraries.cgr.dev/java/` |
| Libraries for [Python](/chainguard/libraries/python/overview/) | `https://libraries.cgr.dev/python/` |

See each artifact type's documentation for authentication and configuration details.

## Policies for Chainguard Libraries

The Chainguard Repository includes a policy engine that lets you define rules governing which artifacts can be consumed and under what conditions. Policies can be configured in the Chainguard Console or with `chainctl`, and are enforced automatically across your environment.

For language dependencies, policies apply to both Chainguard-built packages and upstream packages served via the optional fallback to public registries. Available policies include:

* **Upstream fallback**: Control whether packages not yet built by Chainguard can be sourced from the upstream public registry.
* **Cooldown**: When upstream fallback is enabled, block newly published package versions for a defined period before they can be pulled, giving the security community time to detect threats. The cooldown is configurable (0 to 3650 days) with a default of 7 days. It is applied globally across all packages to prevent dependency resolution errors.

All upstream packages are checked against public malware identifier feeds, and any package with a known malware idenitifier is blocked before being served.

> **Note**: With fallback enabled, Chainguard's malware and greyware scanning covers upstream packages, which addresses the primary risk a cooldown period is meant to mitigate. A cooldown period can still add a small buffer against issues the broader community surfaces after publication and is applied globally across your organization, but it also adds operational complexity and can introduce breakage. Choose a cooldown policy based on your own risk tolerance and priorities.

Refer to [Libraries policies](/chainguard/chainguard-repository/library-policies/) for more information.

## Policies for Chainguard Containers

As with Libraries, you can also set policies for Chainguard Containers to define rules governing which container images can be consumed and under what conditions. Policies can be configured in the Chainguard Console or with `chainctl`, and are enforced automatically across your environment.

Available policies include:

* **cooldown**: Block newly published container image versions for a defined period before they can be pulled, giving the security community time to detect threats. The cooldown is configurable (0 to 3650 days) with a default of 7 days. It is applied globally across all packages to prevent dependency resolution errors.
* **no-eol**: Prevent end-of-life container images from being used.
* **support-window**: Requires an image's primary package to have a minimum remaining support period, measured as the span between the package's release date and its EOL date. An image is allowed when that span is greater than or equal to the configured number of months, or when the package has no recorded EOL date.

> **Note**: Chainguard recommends a 7-day cooldown when enabling upstream fallback, to block a large share of malicious packages identified shortly after publication. Shorter cooldown periods increase the risk of pulling malicious or compromised upstream packages before the broader ecosystem can detect and report them.

The packages that make up Chainguard Images are checked against public malware identifier feeds, and any package with a known malware idenitifier is remediated before being used in any image.

Refer to [Container pull policies](/chainguard/chainguard-repository/container-policies/) for more information.

## Management

The Chainguard Console and `chainctl` can be used for configuring and managing policies across your organization. Learn more in [Using the Chainguard Console](/platform/console/images-directory/) and [Get started with chainctl](/get-started/getting-started-with-chainctl/).

Access the Console at [console.chainguard.dev](https://console.chainguard.dev).

## Learn more

* [Chainguard Libraries for JavaScript](/chainguard/libraries/javascript/overview/)
* [Chainguard Libraries for Java](/chainguard/libraries/java/overview/)
* [Chainguard Libraries for Python](/chainguard/libraries/python/overview/)

---

### Chainguard container image pull policies
_Path: chainguard/chainguard-repository/container-policies.md_

Policies enable you to filter and restrict Chainguard artifact updates. You do this by defining policies that control and restrict versions that will be pulled from Chainguard.

{{< beta feature="Policies" >}}

## Definitions

This page uses the following terms:

* **Policy**: A reusable rule that determines whether an image is allowed. Each policy has a name, a description, and the resource type it applies to. The system policies on this page apply to registry repositories.
* **Binding**: A link between a policy and an organization. While a binding exists, the policy is active for image pulls under that organization. Without a binding, the policy has no effect.
* **Mode**: A binding's mode controls what happens when the policy denies an image:
    * `ENFORCE`: Block the pull.
    * `DRY_RUN`: Allow the pull but record the violation.
* **Parameter**: A configurable value declared by a policy's schema (for example, `days` on the `cooldown` policy). Supply values when you enable a policy with `--param=KEY=VALUE` (repeatable). Omitted parameters fall back to the schema's declared default. Use `chainctl policies describe --policy=$POLICY` to see which parameters a policy accepts and what defaults apply.
* **Policy type**: Whether a policy is authored by Chainguard or by you. Refer to [Policy types](#policy-types).

The `--mode` flag is required when you enable a policy. Chainguard recommends starting with `DRY_RUN` so you can review a policy's impact before promoting it to `ENFORCE`.

Multiple policies can be active at the same time, and they compose: an image is allowed only when *every* active policy allows it. A single policy in `ENFORCE` mode returning `DENIED` is enough to block the pull.

## Policy types

Every policy belongs to one of two types.

**System policies** are authored and maintained by Chainguard and are available to every organization. You cannot create, edit, or delete one. You choose whether to activate it and, where the policy declares parameters, what values to give it. The `no-eol`, `cooldown`, and `support-window` policies documented on this page are all system policies.

**Custom policies** are authored by you. A custom policy is a [Rego](https://www.openpolicyagent.org/docs/policy-language) expression paired with a single supported resource type and an optional parameter schema, submitted as a YAML manifest. Custom policies are visible only to the organization that owns them.

Both types are the same kind of object. They are evaluated by the same engine, activated through the same bindings, produce the same decisions, and can be waived by the same overrides. The difference is who owns the definition, and therefore what you are allowed to do to it.

Reach for a system policy when it already expresses the guardrail you want. Write a custom policy when no system policy expresses the rule you require.

Because policies compose this way, a custom policy cannot loosen a system policy. To let one specific image through, use an [override](#granting-an-exception-with-an-override) instead.

Both types appear together in `chainctl policies list`, distinguished by a type column.

To author and manage your own policies, see:

* [Writing custom policies](#writing-custom-policies) — the `allow` rule convention, the input fields a policy can read, and the Rego subset available to it.
* [Managing custom policies with chainctl](#managing-custom-policies-with-chainctl) — the manifest format and the `validate`, `create`, `update`, and `delete` subcommands.
* [Custom policies FAQ](#custom-policies-faq) — debugging denials, write-time rejections, and testing a policy before you enforce it.

## Available policies

Chainguard ships a set of system policies that are available to every organization. The list below describes each one and its configurable parameters. To confirm which policies are available to you and see their full definitions, use `chainctl policies list` and `chainctl policies describe` as shown under [Usage](#usage).

When a policy denies a pull, it emits a reason describing what fired. Each policy has its own reason format. All reasons are visible in the REASON column of `chainctl policies decision list` and expand to every reason line under `--show-decision-details` (see [Policy decisions](#policy-decisions)).

### no-eol

The `no-eol` policy denies any image whose primary package has reached its end-of-life (EOL) date. An image is allowed when it has no recorded EOL date, or when that date is still in the future. This policy takes no parameters.

```shell
chainctl policies enable --policy=no-eol --mode=DRY_RUN
```

### cooldown

The `cooldown` policy denies images that are newer than a minimum age, measured from the image's build timestamp. Use it to hold off on adopting a version until it has been published long enough to shake out early regressions. An image is allowed once its age is greater than or equal to the configured number of days.

It accepts one parameter, `days`, an integer number of days an image must exist before it is allowed. The default is `7`, and accepted values range from `1` to `365`.

```shell
chainctl policies enable --policy=cooldown --mode=DRY_RUN --param=days=14
```

### support-window

The `support-window` policy requires an image's primary package to have a minimum remaining support period, measured as the span between the package's release date and its EOL date. An image is allowed when that span is greater than or equal to the configured number of months, or when the package has no recorded EOL date.

It accepts one parameter, `months`, an integer minimum number of months of support. The default is `6`, and accepted values range from `1` to `24`.

```shell
chainctl policies enable --policy=support-window --mode=DRY_RUN --param=months=12
```

## Usage

Policies are managed using `chainctl`. System policies are shipped with the platform; to author your own, refer to [Managing custom policies with chainctl](#managing-custom-policies-with-chainctl).

See which policies are available to your organization:

```shell
chainctl policies list
```

Inspect a policy to see its full definition and configurable parameters before enabling it:

```shell
chainctl policies describe --policy=$POLICY
```

See which policies are currently active:

```shell
chainctl policies binding list
```

Activate a policy in `DRY_RUN` mode. This example activates the "no end-of-life" artifacts policy. Chainguard recommends that you roll out policies using `DRY_RUN` mode first and track for a time to be certain it has the impact you intend before moving to `ENFORCE`.

```shell
chainctl policies enable --policy=no-eol --mode=DRY_RUN
```

Some policies accept parameters. Use `--param=KEY=VALUE` to supply them:

```shell
chainctl policies enable --policy=cooldown --mode=DRY_RUN --param=days=7
```

Promote a policy to `ENFORCE`:

```shell
chainctl policies enable --policy=no-eol --mode=ENFORCE
```

Disable a policy:

```shell
chainctl policies disable --policy=no-eol
```

## Checking whether an image is allowed

Before you depend on a specific image (pinning it in a deployment, promoting it through an environment, or adding it to a base image), you often want to know whether your active policies will let it through. `chainctl policies check` answers that for one image on demand, without waiting for a pull to happen.

Pass a full image reference, by tag or by digest:

```shell
chainctl policies check cgr.dev/$ORGANIZATION/python:latest
```

The reference identifies the organization and repository; a tag is resolved to its current digest, and a digest is used as-is. The image is then evaluated against every policy active for that organization, and each result is printed:

```output
  POLICY  |  MODE   | PARAMETERS | RESULT
----------|---------|------------|---------
 cooldown | DRY_RUN | days=7     | DENIED
 no-eol   | ENFORCE |            | ALLOWED
```

Read the table per policy. The image is blocked at pull time only when a policy in `ENFORCE` mode returns `DENIED`. A `DENIED` from a `DRY_RUN` policy is reported here but would not block a real pull; it is a preview of what enforcing that policy would do. If no policies apply to the image, the command says so rather than printing a table.

Because the check evaluates against the policies you have enabled right now, it reflects your current configuration, not a historical record. To review outcomes from pulls that already happened, use [policy decisions](#policy-decisions) instead.

`check` is also built for automation. Its exit status is non-zero whenever any policy returns `DENIED` or `ERROR`, regardless of that policy's mode, so you can gate a CI pipeline on it:

```shell
chainctl policies check cgr.dev/$ORGANIZATION/python@sha256:abc... || echo "image violates a policy"
```

Note that a `DRY_RUN` denial also produces a non-zero exit, so a passing `check` is stricter than what enforcement alone would block, which is useful as an early warning while you stage policies.

## Policy decisions

Every time an image is pulled and evaluated against an active policy, the platform records the outcome as a *decision*. A decision is the result of evaluating a single image digest against a single policy at pull time. It captures the policy, the artifact, the mode the policy ran under (`ENFORCE` or `DRY_RUN`), the outcome (`ALLOWED`, `DENIED`, or `ERROR`), the reason the policy produced for that outcome, and the day the pull happened.

Decisions are recorded for all evaluations, regardless of mode or outcome. Together they form an audit log of what your policies did against real pull traffic. Use them to answer questions like "why was this image blocked?", "what has this policy decided over the past month?", and "what would this policy block if I enforced it?".

This is distinct from `chainctl policies check`, which evaluates one image against your active policies on demand. Decisions are the historical record of evaluations that already happened during real pulls.

List the decisions recorded for your organization:

```shell
chainctl policies decision list
```

```output
 REPOSITORY |  ARTIFACT ID   |  POLICY  |   MODE   | RESULT  |                REASON                 | PULLED ON
------------|----------------|----------|----------|---------|---------------------------------------|------------
 nginx      | sha256:1a2b3c… | cooldown | DRY_RUN  | DENIED  | denied: image built within the 7-…, + | 2026-06-28
 nginx      | sha256:4d5e6f… | no-eol   | ENFORCED | DENIED  | denied: main package reached end o…   | 2026-06-28
 bash       | sha256:7a8b9c… | no-eol   | ENFORCED | ALLOWED | -                                     | 2026-06-27
```

The ARTIFACT ID column shows a short form of the image digest, use `-o json` to see the full value or `chainctl policies decision list --show-artifact-ids` to list all artifact ids (see [List the unique artifacts in the current result set](#list-the-unique-artifacts-in-the-current-result-set)). The REASON column shows the first line of the policy's own denial reason, with `+ N more` appended when a decision has additional lines.

### Filter decisions

Narrow the results with filters. To see only the pulls a policy denied, filter by outcome:

```shell
chainctl policies decision list --result=DENIED
```

You can also restrict to a single policy, a single mode (`ENFORCE` or `DRY_RUN`), a time window, a single image, or a single artifact. The `--since` flag takes a number of days with a `d` suffix (for example `7d`); `--repo` accepts an image as `REPO` or `REPO:TAG`; and `--artifact-id` accepts a full image digest (`sha256:…`) or a PURL and returns every decision recorded for that specific artifact:

```shell
chainctl policies decision list --policy=no-eol --mode=ENFORCE --since=30d -o json
chainctl policies decision list --repo=nginx:latest
chainctl policies decision list --artifact-id=sha256:1a2b3c4d5e6f...
```

### Inspect full denial reasons with --show-decision-details

The compact table only shows the first reason line. To see every reason a policy produced for a decision, use `--show-decision-details`. This replaces the table with a per-artifact expanded block: every policy that evaluated the artifact is listed, and every reason it produced is printed under a `Reasons:` sub-section. `ALLOWED` verdicts print `- None.` as a positive summary; `DENIED` verdicts without a reasons rule and `ERROR` verdicts drop the `Reasons:` sub-section entirely.

```shell
chainctl policies decision list --show-decision-details
```

```output
Repository:  nginx
Artifact ID: sha256:1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809
Pulled on:   2026-06-28

Policy: cooldown (DRY_RUN)  →  DENIED
  Reasons:
    - denied: image built within the 7-day cooldown window (built 2026-06-24, pulled 2026-06-28)
```

Combine `--show-decision-details` with `--artifact-id` to focus on a single image and see the full picture across every policy that evaluated it:

```shell
chainctl policies decision list --artifact-id=sha256:1a2b3c4d5e6f... --show-decision-details
```

### List the unique artifacts in the current result set

`--show-artifact-ids` prints the unique full artifact IDs in the current result set, one per line, deduplicated across policies (an image evaluated by four policies still shows once). Useful for scripting a follow-up query per artifact:

```shell
chainctl policies decision list --result=DENIED --show-artifact-ids
```

```output
sha256:1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809
sha256:4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c
```

Decisions are deduplicated per day, so repeated pulls of the same digest under the same policy and outcome appear once for that day rather than once per pull.

Decisions are listed newest first. The command returns at most 20 decisions by default; use `--limit` to change the page size, which accepts a value from `1` to `100`:

```shell
chainctl policies decision list --limit=50
```

JSON output is not affected by `--show-decision-details` or `--show-artifact-ids`, those flags are display-only. `-o json` always returns the full artifact ID and every reason line unchanged.

## Example: staging a policy with dry run

`DRY_RUN` decisions let you measure a policy's impact before it can block anything. Because a `DRY_RUN` binding records outcomes without blocking pulls, you can enable a policy, watch what it would have denied against your real traffic, and only promote it to `ENFORCE` once the results match your expectations.

First, enable the policy in `DRY_RUN` mode:

```shell
chainctl policies enable --policy=no-eol --mode=DRY_RUN
```

Let your normal pull traffic flow for a representative period. Then review what the policy denied while in dry run. Use `--since` to limit the review to a recent window, here the last seven days:

```shell
chainctl policies decision list --policy=no-eol --mode=DRY_RUN --result=DENIED --since=7d
```

Each `DENIED` row is a pull that would have been blocked under `ENFORCE`. Inspect the digests to confirm the policy is catching what you intend and nothing critical to your workloads. If the results look wrong, adjust the policy's parameters or disable it; if they look right, promote the binding to enforcement:

```shell
chainctl policies enable --policy=no-eol --mode=ENFORCE
```

After promoting, keep reviewing decisions to confirm enforcement behaves as expected. The same command now returns `ENFORCE`-mode rows for the pulls the policy is actively blocking.

## Granting an exception with an override

Once a policy is enforcing, it blocks every image that violates it. Sometimes you need to let one specific image through anyway: a known-good build that trips a policy, an artifact approved through a separate review, or an urgent fix that cannot wait for the policy itself to change. An override is an admin-granted waiver that flips a `DENIED` result to `ALLOWED` for one policy and one image, without disabling the policy or changing its binding. Every other image stays subject to the policy.

An override is deliberate and attributable. It applies to exactly one policy and one image digest, requires a reason, and records who created it and when. The engine applies it after evaluation, so the recorded decision still reflects the policy's verdict while the override is what ultimately allows the pull.

Creating an override requires the `policies.override.create` capability, which is typically held by organization owners.

Waive a policy for a specific image, identified by digest, with a reason:

```shell
chainctl policies override create \
  --policy=no-eol \
  --artifact_id=sha256:abc123... \
  --reason="approved exception, ticket OPS-42"
```

The `--artifact_id` value must be a manifest digest rather than a tag, so the waiver targets one exact artifact. A given policy and image can carry at most one override; to change an existing one, delete it and create it again. For `chainctl` versions 0.2.337 and earlier, use the `--digest` tag instead of `--artifact_id`.

Review the active overrides for an organization to see what has been waived, by whom, and why:

```shell
chainctl policies override list
```

```output
 OVERRIDE ID  | POLICY |       TARGET        |           REASON           |    CREATED BY     |       CREATED AT
--------------|--------|---------------------|----------------------------|-------------------|-------------------------
 <id>         | no-eol | image sha256:abc12… | approved exception, OPS-42 | alice@example.com | 2026-06-28 14:30:00 UTC
```

When the exception is no longer needed, delete the override to restore the policy's result for that image. Use `chainctl policies override list` to find the ID:

```shell
chainctl policies override delete <override-id>
```

Once deleted, the image is again subject to whatever the policy decides.

## Writing custom policies

A [custom policy](#policy-types) is driven by a [Rego](https://www.openpolicyagent.org/docs/policy-language) expression that Chainguard evaluates against one artifact at a time. This section covers what that expression must look like, what data it can read, and which parts of the Rego language are available to it.

### Anatomy of a policy expression

Every custom policy expression follows the same shape:

```rego
package chainguard.policies

import rego.v1

default allow := false

allow if {
    input.main_package_version.lts
}
```

Three rules are non-negotiable, and Chainguard rejects the policy at write time if any is missing:

* **The package must be `chainguard.policies`.** Any other package name is an error.
* **The expression must define a rule named `allow`.** This is the only rule Chainguard reads. Its value decides the outcome: `true` allows the artifact, anything else denies it.
* **The expression must compile**, using only the builtins listed under [The available Rego subset](#the-available-rego-subset).

Beyond that, the module is ordinary Rego. You can define helper rules, comprehensions, and functions freely, as long as `allow` ends up defined.

#### Always declare a default

`default allow := false` is a convention worth following in every policy. Without it, an expression whose body is undefined leaves `allow` undefined rather than `false`. An undefined `allow` denies the artifact, so the outcome is the same either way, but the explicit default makes that fail-closed behavior obvious to whoever reads the policy next.

#### Multiple allow rules are ORed

Rego evaluates every `allow` rule and the artifact is allowed if any one of them succeeds. This is the idiomatic way to express alternatives. The `no-eol` system policy uses it to allow both "no end-of-life date recorded" and "end-of-life date is still in the future":

```rego
package chainguard.policies

import rego.v1

default allow := false

allow if {
    not input.main_package_version.eolDate
}

allow if {
    eol_ns := time.parse_ns("2006-01-02", input.main_package_version.eolDate)
    eol_ns > time.now_ns()
}
```

To express "all of these conditions must hold" instead, put the conditions in a single rule body — the statements inside one `allow if { … }` block are ANDed.

### The input document

Your expression reads the artifact under evaluation from the `input` document. At launch this surface is deliberately narrow: it carries lifecycle data about the artifact's main package and nothing else.

The fields below are what is available for policies whose resource type is `registry.chainguard.dev/Repo@v1` (the `Repo` shorthand).

| Field | Type | Description |
|---|---|---|
| `input.main_package` | string | Name of the image's main package. |
| `input.main_package_version` | object | Version metadata for the main package. Refer to the details below. |
| `input.create_time` | string | When the image was created, as an RFC 3339 timestamp. Derived from the image's `org.opencontainers.image.created` annotation. |
| `input.parameters` | object | Values for the parameters your policy declares. Refer to [Parameters](#parameters-in-custom-policies). |
| `input.main_package_license` | string | Effective-license expression for the image's main package (SPDX identifiers, `AND`-composed over the effective-license closure). **Not yet populated at runtime — see the warning below.** |
| `input.packages` | array | Every APK in the image, each carrying a `purl` and `license`. **Not yet populated at runtime — see the warning below.** |

> **Warning:** `input.main_package_license` and `input.packages` are not yet populated at runtime, a custom policy referencing them today evaluates against empty values on every pull.

`input.main_package_version` carries these fields:

| Field | Type | Description |
|---|---|---|
| `version` | string | The version stream identifier. |
| `latestVersion` | string | The latest version within this version stream. |
| `eolDate` | string | The date this version reaches end-of-life, as `YYYY-MM-DD`. |
| `releaseDate` | string | The date this version was released, as `YYYY-MM-DD`. |
| `exists` | boolean | Whether the package exists in an apk repository. |
| `fips` | boolean | Whether a FIPS-enabled build of the package exists. |
| `lts` | boolean | Whether upstream considers this a long-term support version. |
| `eolBroken` | boolean | Whether an end-of-life version can no longer be supported. |
| `versionSource` | object | Source reference for the version, with `ref` and `sha` fields. |

### Parameters in custom policies

A parameter is a value your policy declares but does not hardcode. Whoever enables the policy supplies the value on the binding with `--param=KEY=VALUE`, so one policy definition can serve several thresholds without being edited.

Declare parameters in the `parameters` block of the policy manifest, then read them at `input.parameters.<name>`. The `cooldown` system policy is a good template:

```yaml
name: cooldown
description: Denies images with a build timestamp less than the specified number of days old.
supported_resource_type: registry.chainguard.dev/Repo@v1
parameters:
  - name: days
    type: PARAMETER_TYPE_INTEGER
    description: Minimum age in days before access is allowed.
    default: 7
    minimum: 1
    maximum: 365
expression: |
  package chainguard.policies

  import rego.v1

  default cooldown_days := 7

  cooldown_days := input.parameters.days if {
    is_number(input.parameters.days)
  }

  default allow := false

  allow if {
    create_ns := time.parse_rfc3339_ns(input.create_time)
    age_days := (time.now_ns() - create_ns) / (24 * 60 * 60 * 1000000000)
    age_days >= cooldown_days
  }
```

Available parameter types are `PARAMETER_TYPE_STRING`, `PARAMETER_TYPE_INTEGER`, `PARAMETER_TYPE_STRING_LIST`, and `PARAMETER_TYPE_BOOLEAN`. The `minimum` and `maximum` constraints apply to integer parameters.

#### Undeclared parameters are rejected at write time

Chainguard type-checks your expression against the parameters your manifest declares. Referencing `input.parameters.days` when the manifest does not declare a `days` parameter is an error at create, update, and validate time, rather than a policy that silently denies everything once it is live.

### The available Rego subset

Custom policies may use most of the OPA standard library. Referencing a blocked builtin is a compile error, reported at validate, create, and update time rather than at evaluation.

The blocked builtins are:

* `http.send`
* Everything under `net.`, including `net.lookup_ip_addr`
* Everything under `opa.`, including `opa.runtime`
* Everything under `rego.`, for example `rego.metadata.chain`
* `trace` and `print`
* The certificate and key parsers: `crypto.x509.parse_certificates`, `crypto.x509.parse_and_verify_certificates`, `crypto.x509.parse_certificate_request`, `crypto.x509.parse_keypair`, `crypto.x509.parse_rsa_private_key`, and `crypto.parse_private_keys`

The `import rego.v1` statement is not affected by the `rego.` entry above — that entry covers builtin functions, not language imports. Use `import rego.v1` as shown in the examples on this page.

Everything else in the OPA standard library is available, including the namespaces most policies need:

* String handling: `strings.*`, `sprintf`, `format_int`, `concat`, `contains`, `startswith`, `endswith`, `upper`, `lower`, `split`, `trim`
* Numbers and aggregates: `numbers.*`, `count`, `sum`, `min`, `max`, `product`, `sort`, `all`, `any`, `round`, `abs`
* Collections: `arrays.*`, `objects.*`, `sets.*`
* Time: `time.*`, including `time.now_ns`, `time.parse_ns`, `time.parse_rfc3339_ns`, and `time.add_date`
* Pattern matching: `regex.*`, `glob.*`
* Encoding: `json.*`, `yaml.*`, `base64.*`, `hex.*`
* Versions: `semver.*`, useful for comparing `input.main_package_version.version` against a floor
* Hashing: the non-parsing parts of `crypto.*`, and `units.*`

## Managing custom policies with chainctl

Custom policies are managed with the `chainctl policies custom` command group, which provides four subcommands: `validate`, `create`, `update`, and `delete`.

Creating, updating, and deleting custom policies requires that the feature be enabled for your organization. If it is not, these commands return:

```output
You are not entitled to use Policies.

To enable this feature, contact your Customer Success Team.
```

### The policy manifest

A custom policy is defined by a YAML manifest. Because the manifest is a single file, it can be checked into git, reviewed on a pull request, and validated in CI alongside the rest of your infrastructure.

```yaml
name: lts-only
description: Allow only images whose main package is a long-term support version.
supported_resource_type: registry.chainguard.dev/Repo@v1
expression_type: EXPRESSION_TYPE_REGO
parameters:
  - name: allow_non_lts
    type: PARAMETER_TYPE_BOOLEAN
    description: When true, also allow images whose main package is not an LTS version.
    default: false
expression: |
  package chainguard.policies

  import rego.v1

  default allow := false

  allow if {
    input.main_package_version.lts
  }

  allow if {
    input.parameters.allow_non_lts
  }
```

#### Manifest fields

| Field | Required | Description |
|---|---|---|
| `name` | Yes | The policy name. Must be unique within the organization for the given resource type. |
| `expression` | Yes | The Rego expression. Refer to [Writing custom policies](#writing-custom-policies). |
| `supported_resource_type` | Yes | The single resource type this policy applies to. |
| `description` | No | A human-readable description, shown in `chainctl policies list` and `describe`. |
| `expression_type` | No | Defaults to `EXPRESSION_TYPE_REGO`, which is the only accepted value. |
| `parameters` | No | The parameters the policy declares. Omit entirely for a parameterless policy. |

Each entry under `parameters` accepts `name`, `type`, `description`, `default`, `minimum`, `maximum`, `allowed_values`, `required`, and `deprecated`.

#### Resource types

Every custom policy declares exactly one supported resource type. Where a command takes a `--resource-type` flag, it accepts either a shorthand or the fully-qualified type:

| Shorthand | Fully-qualified type |
|---|---|
| `Repo` | `registry.chainguard.dev/Repo@v1` |
| `Python` | `libraries.chainguard.dev/PythonPackage@v1` |
| `Java` | `libraries.chainguard.dev/JavaPackage@v1` |
| `Javascript` | `libraries.chainguard.dev/NPMPackage@v1` |

The resource type is fixed at creation and cannot be changed afterwards. To move a policy to a different resource type, create a new policy and delete the old one.

Within an organization, a policy is identified by the combination of its name and its resource type. The same name may be reused across different resource types — you can have both a `Repo` and a `Python` policy called `minimum-version`. Where that ambiguity exists, `update` and `delete` accept `--resource-type` to disambiguate.

### Validating a policy

`chainctl policies custom validate` checks a policy without persisting anything. It is the fastest way to iterate while authoring, and it is what you should run in CI on any repository that holds policy manifests.

Validate a full manifest, checking both the expression and the parameter schemas:

```shell
chainctl policies custom validate --file policy.yaml
```

```output
Policy is valid.
```

Validate just a Rego expression, for a quick parse-and-compile check while writing:

```shell
chainctl policies custom validate --expression policy.rego
```

```output
Expression is valid.
```

The two flags are mutually exclusive, and exactly one is required.

On failure, the command prints one diagnostic per problem and exits non-zero. Expression errors carry the line and column in the Rego source; parameter schema errors identify the offending field:

```output
line 7:3: rego_type_error: undefined ref: input.mian_package
line 12:5: rego_type_error: undefined ref: input.parameters.day
```

### Creating a policy

`chainctl policies custom create` creates a policy in your organization. It supports two modes.

**From a manifest.** This is the primary path, and the only one that supports parameters:

```shell
chainctl policies custom create --file policy.yaml
```

**From a raw Rego file.** A shortcut for parameterless policies, where writing a manifest for two fields is more ceremony than it is worth. `--name` and `--resource-type` are both required in this mode; `--description` is optional:

```shell
chainctl policies custom create \
  --expression lts-only.rego \
  --name lts-only \
  --resource-type Repo \
  --description "Allow only LTS versions of the main package"
```

If a policy declares parameters, it must be created from a manifest — there is no flag equivalent for a parameter schema. In `--file` mode the manifest is authoritative.

Creation validates the policy before storing it. A rejected policy reports one diagnostic per problem, covering both the name and the expression at once.

#### Policy names

Names are validated on create and update. A name must:

* Be at most 255 characters
* Start and end with an alphanumeric character, which rejects leading and trailing whitespace
* Contain no control characters
* Be unique within the organization for its resource type

### Updating a policy

`chainctl policies custom update` modifies an existing policy, identified by `--policy` with either its name or its UIDP. Only custom policies can be updated; system policies are managed by Chainguard and are rejected with an error. It supports two modes.

**Full replacement from a manifest.** The manifest supplants the entire definition — the resulting policy is exactly what the manifest declares, and any field the manifest omits is cleared:

```shell
chainctl policies custom update --policy lts-only --file policy.yaml
```

**Partial update from flags.** Only the fields you pass are changed; everything else is preserved:

```shell
# Rename
chainctl policies custom update --policy lts-only --name lts-strict

# Change just the description
chainctl policies custom update --policy lts-only --description "Allow only LTS main packages"

# Replace the expression from a new .rego file
chainctl policies custom update --policy lts-only --expression new-lts-only.rego
```

Flag mode is restricted to policies that do **not** declare parameter schemas. For a parameterized policy, use `--file`.

#### Constraints on update

The supported resource type is immutable. A `--file` update whose manifest declares a resource type different from the current policy's is rejected.

Where a policy name is shared across resource types, pass `--resource-type` to disambiguate. It is ignored when `--policy` is given as a UIDP, which is already unambiguous:

```shell
chainctl policies custom update --policy minimum-version --resource-type Python --description "python-only variant"
```

#### Parameter changes and existing bindings

Because a `--file` update is a full replacement, a policy can gain, lose, or change parameters between versions. Existing bindings are **not** re-validated against the new schema — a binding created against the old parameter shape stays as it was.

When an update changes the parameter schema, `chainctl` warns you:

```output
Note: parameter_schemas changed. Existing bindings were not re-validated against the new schema; run `chainctl policies binding list` to check for stale bindings.
```

### Deleting a policy

`chainctl policies custom delete` permanently removes a custom policy:

```shell
chainctl policies custom delete --policy lts-only
```

Only custom policies can be deleted; system policies are managed by Chainguard and are rejected with an error.

Deletion is permanent — a deleted policy cannot be recovered.

Deletion also cascades. Every binding that referenced the policy is removed, and every override waiving it is removed as well. Before deleting, `chainctl` reports how many of each will go and asks you to confirm:

```output
Will delete custom policy "lts-only" (720a...c81).
This also removes 2 binding(s) and 1 override(s) that reference this policy.
```

Pass `--force` to skip the confirmation prompt:

```shell
chainctl policies custom delete --policy 720a...c81 --force
```

As with `update`, pass `--resource-type` when a name is shared across resource types:

```shell
chainctl policies custom delete --policy minimum-version --resource-type Python
```

### A full custom policy lifecycle

The following walks a policy from authoring to enforcement and back out again.

Write the manifest and validate it locally:

```shell
chainctl policies custom validate --file lts-only.yaml
```

Create the policy. This defines it but does not activate it — a policy with no binding has no effect:

```shell
chainctl policies custom create --file lts-only.yaml
```

Confirm it is there. Custom policies appear alongside system policies, distinguished by the type column:

```shell
chainctl policies list
```

Activate it in `DRY_RUN` mode, which records outcomes without blocking any pulls:

```shell
chainctl policies enable --policy=lts-only --mode=DRY_RUN
```

Check a specific image against your active policies without waiting for a pull:

```shell
chainctl policies check cgr.dev/$ORGANIZATION/python:latest
```

Let your normal pull traffic run for a representative period, then review what the policy would have denied:

```shell
chainctl policies decision list --policy=lts-only --result=DENIED --since=7d
```

Each `DENIED` row is a pull that would have been blocked under `ENFORCE`. If the results are as
expected, promote the binding:

```shell
chainctl policies enable --policy=lts-only --mode=ENFORCE
```

To stop enforcing without deleting the policy, disable the binding. The definition stays in place and can be re-enabled later:

```shell
chainctl policies disable --policy=lts-only
```

To remove the policy entirely, along with its bindings and overrides:

```shell
chainctl policies custom delete --policy lts-only
```

## Custom policies FAQ

Common questions that come up when authoring and operating custom policies.

### Why was my image denied, and how do I debug it?

Start by confirming *which* policy denied it. An image is allowed only when every active policy allows it, so a denial you attribute to your new custom policy may be coming from an entirely different one.

```shell
chainctl policies check cgr.dev/$ORGANIZATION/python:latest
```

```output
  POLICY  |  MODE   | PARAMETERS | RESULT
----------|---------|------------|---------
 cooldown | DRY_RUN | days=7     | DENIED
 lts-only | ENFORCE |            | DENIED
 no-eol   | ENFORCE |            | ALLOWED
```

Read the table per row. The pull is blocked only when a policy in `ENFORCE` mode returns `DENIED`. A `DENIED` from a `DRY_RUN` policy is a preview of what enforcing it would do, not a block.

Once you know which policy is responsible, work through the usual causes in this order:

**1. A field you referenced is absent.** This is by far the most common cause. Fields with no value are omitted from the input document entirely, so a reference to an absent field makes the surrounding rule body undefined, `allow` falls through to its default of `false`, and everything is denied. Refer to [The input document](#the-input-document) for the fields a policy can read.

**2. A nested field name is misspelled.** Write-time validation catches typos in the top-level fields (`input.crete_time` fails), but it does **not** check inside `input.main_package_version`. A misspelled `input.main_package_version.eolDte` compiles cleanly and never matches. Watch the casing in particular: top-level fields are snake_case (`main_package`, `create_time`) while the fields under `main_package_version` are camelCase (`eolDate`, `releaseDate`, `latestVersion`).

**3. The rule logic is inverted.** Remember that `allow` decides what is *permitted*. A policy meant to block end-of-life images allows everything that is *not* end-of-life, rather than matching the images you want to stop.

To see what a policy has actually decided against real pull traffic, use the decision log rather than `check`:

```shell
chainctl policies decision list --policy=lts-only --result=DENIED --since=7d
```

Note that `check` evaluates against your current configuration on demand, while decisions are the historical record of evaluations that already happened during real pulls.

Finally, if you need to let one specific image through while you sort the policy out, an [override](#granting-an-exception-with-an-override) waives a single policy for a single digest without disabling the policy for everything else.

### What input fields are available to a policy?

At launch, the input document carries lifecycle data about the artifact's main package and nothing else:

* `input.main_package` — the main package name
* `input.main_package_version` — version metadata, including `version`, `latestVersion`, `eolDate`, `releaseDate`, `exists`, `fips`, `lts`, `eolBroken`, and `versionSource`
* `input.create_time` — the image creation timestamp, as RFC 3339
* `input.parameters.<name>` — values for the parameters your policy declares
* `input.main_package_license` — main-package effective-license expression (not yet populated)
* `input.packages` — every APK's `purl` and `license` (not yet populated)

The [input document reference](#the-input-document) has the full table with types and descriptions.

To see the shape of the input against a real policy, inspect a system policy, which reads the same document:

```shell
chainctl policies describe --policy=no-eol -o json
```

### Why was my Rego rejected at write time?

Chainguard validates every expression before storing it, so a policy that would have been broken at pull time is rejected at authoring time instead. Errors come back with the line and column in your Rego source. The causes, in rough order of frequency:

**Wrong package name.** The expression must declare `package chainguard.policies`. Any other package is rejected.

**No `allow` rule.** The expression must define a rule named `allow`. It is the only rule Chainguard reads.

**A reference to an undeclared parameter.** Referencing `input.parameters.days` when your manifest does not declare a `days` parameter is an error. This is strict in both directions: a parameterless policy may not reference `input.parameters` at all. Add the declaration to the manifest in the same change as the reference.

**A typo in a top-level input field.** `input.crete_time` and `input.mian_package` both fail validation. Only the top level is checked this way — misspellings inside `input.main_package_version` are not caught.

**A blocked builtin.** Some OPA builtins cannot be used in a custom policy. Refer to [The available Rego subset](#the-available-rego-subset) for the full list and what remains available.

**An ordinary syntax or type error.** Standard Rego compile errors surface the same way, with line and column.

A manifest can also be rejected before the expression is ever compiled, if the YAML itself is wrong. The manifest is parsed strictly, so an unrecognized key is an error naming the offending field rather than being silently ignored.

If you passed a raw `.rego` file to `--file`, the error suggests the fix: `--file` expects a full YAML manifest, and `--expression` is the flag for a bare Rego file.

Validation errors are aggregated, so the command reports every problem it found across both the name and the expression rather than making you fix them one at a time.

### How do I test a policy before committing to it?

There are two levels of checking, from fastest to most realistic.

#### Validate the manifest

`chainctl policies custom validate` runs the same checks that `create` and `update` apply, without persisting anything:

```shell
chainctl policies custom validate --file policy.yaml
```

While iterating on just the Rego, skip the manifest:

```shell
chainctl policies custom validate --expression policy.rego
```

This is the authoritative check. A manifest that validates cleanly will not be rejected on create for expression reasons.

#### Stage it in DRY_RUN against real traffic

The most realistic check is the platform itself. Create the policy and enable it in `DRY_RUN` mode, which records outcomes without blocking any pulls:

```shell
chainctl policies custom create --file policy.yaml
chainctl policies enable --policy=lts-only --mode=DRY_RUN
```

Check a specific image immediately:

```shell
chainctl policies check cgr.dev/$ORGANIZATION/python:latest
```

Then let normal pull traffic run for a representative period and review what the policy would have blocked:

```shell
chainctl policies decision list --policy=lts-only --result=DENIED --since=7d
```

Every `DENIED` row is a pull that would have failed under `ENFORCE`. Promote the binding only once those results match your expectations.

### Can a custom policy allow something a system policy denies?

No. Every active policy is evaluated independently, and an image is allowed only when all of them allow it. A single `ENFORCE` denial blocks the pull regardless of what other policies decided, so a custom policy cannot loosen a system policy.

To let a specific image through a policy that denies it, use an [override](#granting-an-exception-with-an-override), which waives one policy for one digest. To stop a system policy from applying at all, disable its binding.

### Can I change a policy's resource type?

No. The supported resource type is fixed when the policy is created. A `--file` update whose manifest declares a different resource type is rejected.

To move a rule to a different resource type, create a new policy with the new type and delete the old one. Note that deleting cascades — the old policy's bindings and overrides go with it, so recreate those against the new policy.

### Why do I have two policies with the same name?

Policy names are unique per resource type, not per organization, so a `Repo` policy and a `Python` policy can both be called `minimum-version`.

When a name is ambiguous, `chainctl policies custom update` and `delete` accept `--resource-type` to disambiguate:

```shell
chainctl policies custom delete --policy minimum-version --resource-type Python
```

The flag is ignored when `--policy` is given as a UIDP, which already identifies a single policy.

### I changed a policy's parameters and its bindings stopped working

Updating a policy from a manifest is a full replacement, so a policy can gain, lose, or change parameters between versions. Existing bindings are **not** re-validated against the new schema — a binding created against the old parameter shape stays exactly as it was.

`chainctl` warns you when an update changes the parameter schema. Review your bindings afterwards:

```shell
chainctl policies binding list
```

Re-enable any binding whose parameters no longer match the policy's schema, supplying the current parameters with `--param=KEY=VALUE`.

## Known issues

Policies are in open beta, and we are continuously working to improve the experience. The items below are current limitations you may run into when working with overrides, along with the workaround for each.

### An override/binding mutation is not effective immediately

After you create an override, it does not take effect right away. The platform caches policy decisions, and it takes a short while for that cache to refresh before the override is applied. If a pull is still blocked immediately after you create an override, wait a moment and try again.

The same delay applies to binding mutations, such as updating a policy's parameters. After you change a binding (for example, adjusting the `days` parameter on a `cooldown` policy), wait a moment before the new configuration takes effect.

### A single image can require two overrides

Pulling an image with a client such as Docker involves two separate requests: a manifest pull followed by an image pull. Both requests are now evaluated against your policies, and they resolve to different digests, so a single `docker pull` can produce two `DENIED` decisions. An override targets one digest, so waiving only the first digest still leaves the second one blocked.

To work around this, create an override for each denied digest. First attempt the pull so both decisions are recorded, then use [policy decisions](#policy-decisions) to find the digests that were blocked:

```shell
chainctl policies decision list --result=DENIED
```

```output
 REPOSITORY |  ARTIFACT ID   |  POLICY  |   MODE   | RESULT |                REASON                 | PULLED ON
------------|----------------|----------|----------|--------|---------------------------------------|------------
 curl       | sha256:609aeb… | cooldown | ENFORCED | DENIED | denied: image built within the 7-…, + | 2026-07-02
 curl       | sha256:db532b… | cooldown | ENFORCED | DENIED | denied: image built within the 7-…, + | 2026-07-02
```

Create an override for each of the denied digests:

```shell
chainctl policies override create \
  --policy=cooldown \
  --artifact_id=sha256:609aeb... \
  --reason="approved exception, ticket OPS-42"

chainctl policies override create \
  --policy=cooldown \
  --artifact_id=sha256:db532b... \
  --reason="approved exception, ticket OPS-42"
```

With both digests waived, the pull is allowed. Remember that the override is subject to the cache refresh described above, so allow a short delay before retrying the pull.

Refer to `chainctl policies --help` or the [chainctl reference pages](/platform/chainctl/) for more information.

---

### Chainguard Libraries policies
_Path: chainguard/chainguard-repository/library-policies.md_

Chainguard Libraries policies enable you to filter and restrict package versions pulled through Chainguard Repository.

Policies can delay newly published upstream packages, block specific packages or versions, and allow deliberate exceptions to an otherwise denied package. Policies apply to an ecosystem and are evaluated when packages are pulled. Users with the Owner role can create, enable, disable, and list library policies. These policies apply to all packages pulled through Chainguard Repository. The [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) must be enabled for an ecosystem in order to use policies.

One custom policy per ecosystem can be enabled at a time. This policy should include all the rules you need, which may include a cooldown period, package block rules, and any overrides.

> **Note**: [Upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) must be enabled for an ecosystem before you can use library policies. Library policies require `chainctl` v0.2.313 or newer; refer to the [`chainctl` documentation](/get-started/getting-started-with-chainctl/#update-chainctl-to-the-latest-release) for instructions on updating.

## Policy types and definitions

This page uses the following terms:

* **Policy**: A reusable set of rules that determines whether a package or version is allowed.
* **Ecosystem**: The package ecosystem to which a policy applies: Java, JavaScript, or Python.
* **Preview mode**: Records what a policy would block without preventing package installs.
* **Enforce mode**: Blocks packages that violate the policy.

Chainguard Libraries supports the following types of policies:

* **Cooldown**: Delays upstream newly published package versions for a set number of days after the upstream registry publish date.
* **Block**: Deny a package or version outright. Use a block rule when your organization never wants to allow a package or version.
* **Override**: Permit a package or version that would otherwise be denied by a cooldown policy or malware and greyware blocking. Use an override when you need a specific, deliberate exception.
    * An override policy takes precedence over a block policy.

## Identify packages with a purl

Library policies use [package URLs](https://spdx.github.io/spdx-spec/v3.0.1/annexes/pkg-url-specification/), or purls, to identify packages across ecosystems:

* Python: `pkg:pypi/<name>`
    * Example: `pkg:pypi/requests`
* JavaScript: `pkg:npm/<name>` or `pkg:npm/%40<scope>/<name>` for scoped packages
    * Example: `pkg:npm/lodash` or `pkg:npm/%40angular/core`
* Java: `pkg:maven/<group>/<artifact>`
    * Example: `pkg:maven/com.fasterxml.jackson.core/jackson-databind`

Omit the version to match all versions of the package.

Append `@<version>` to target one version. For example:

* `pkg:pypi/requests@2.31.0`
* `pkg:npm/lodash@4.17.20`, `pkg:npm/%40angular/core@17.0.0`
* `pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.15.0`

## Manage policies

### Preview a policy

To understand the impact before enforcing a policy, use `--mode=PREVIEW` with the `chainctl libraries policy enable` command. In preview mode, installs continue to succeed, but Chainguard records *what would have been blocked* over the last 30 days if the policy had been enforced.

In the following example, a policy called `3day-cooldown` has already been created. To preview what would have been blocked if that policy had been enforced, run this command:

```bash
chainctl libraries policy enable 3day-cooldown --ecosystem=JAVASCRIPT --mode=PREVIEW
```

This returns a list of successful installs that would have been blocked by this policy over the last 30 days.

### Enable a policy

After creating a policy, use `--mode=ENFORCE` to enable it for the ecosystem where you want to apply it. For example:

```bash
chainctl libraries policy create --name=disable-cooldown --cooldown-days=0
chainctl libraries policy enable disable-cooldown --ecosystem=JAVASCRIPT --mode=ENFORCE
```

### Describe a policy

To see a policy in detail, use `describe`. For example, to see the details of a policy named `disable-cooldown`:

```bash
chainctl libraries policy describe disable-cooldown
```

This command returns a list of what is included in the policy, such as [blocked packages](#block-a-package-or-version), [packages on your allowlist](#override-a-blocked-package), and the [cooldown policy](#create-and-enable-a-cooldown-policy).

### List policies and verify bindings

To verify which policy is active and its cooldown settings, run the following:

```bash
chainctl libraries policy binding list
```

To list all available policies, including policies that are not active, run the following:

```bash
chainctl libraries policy list
```

Prior to `chainctl` version 0.2.291, cooldown policies were enabled via the `chainctl entitlements command`. Cooldown policies configured prior to this version of `chainctl` are migrated under the new `chainctl libraries policies` system.

## Cooldown policies

The default cooldown period is 7 days. You cannot change the default policy, but you can create and enable a new policy to replace the default.

### Create and enable a cooldown policy

When upstream fallback is enabled, users with the Owner role can create and enable a cooldown policy with `chainctl`. The cooldown period provides an additional layer of defense on top of malware and greyware scanning, giving the broader security community time to surface threats that may not be immediately detectable.

In the following example, a 10-day cooldown policy is created, then it is enforced on the JavaScript ecosystem:

```bash
chainctl libraries policy create --name=js-cooldown --cooldown-days=10
chainctl libraries policy enable js-cooldown --ecosystem=JAVASCRIPT --mode=ENFORCE
```

#### Preview a cooldown policy

To understand the impact before enforcing a policy, use `--mode=PREVIEW`. In preview mode, installs continue to succeed, but Chainguard records what *would have been blocked* if the policy were enforced.

### Disable cooldown

To disable the cooldown, set it to 0. In the example below, the policy is created, then it is enforced on the Java ecosystem:

```bash
chainctl libraries policy create --name=no-cooldown --cooldown-days=0
chainctl libraries policy enable no-cooldown --ecosystem=JAVA --mode=ENFORCE
```

## Block policies

### Block a package or version

Create a custom policy with one or more `--block` entries to deny packages explicitly. Block rules are helpful if your organization has deliberately decided not to allow certain packages. To understand the impact before enforcing a block, [use `--mode=PREVIEW`](#preview-a-policy).

For example, if your organization standardizes on React and wants to prevent teams from pulling in Angular, you can add a `--block` entry for each Angular package you want to deny. In the following example, a policy called `team-policy` has previously been created, and this command is run to update the policy to add blocks of specific Angular packages:

```bash
chainctl libraries policy update team-policy \
  --block=purl=pkg:npm/%40angular/core \
  --block=purl=pkg:npm/%40angular/common \
  --block=purl=pkg:npm/%40angular/router
chainctl libraries policy enable team-policy --ecosystem=JAVASCRIPT --mode=ENFORCE
```

To block one specific version, include the version in the purl. For example, if a particular release is flagged with a known vulnerability that you want to block within your organization, you can block just the affected version while allowing the other versions. Use a command like the following:

```bash
chainctl libraries policy update team-policy \
  --block=purl=pkg:npm/ua-parser-js@0.7.29
chainctl libraries policy enable team-policy --ecosystem=JAVASCRIPT --mode=ENFORCE
```

To block all versions of a package, omit the version. For example, the following command updates the existing `team-policy` to add a block of all versions of a package:

```bash
chainctl libraries policy update team-policy \
  --block=purl=pkg:pypi/<name>
chainctl libraries policy enable team-policy --ecosystem=PYTHON --mode=ENFORCE
```

You can also combine `block` rules with a custom cooldown in the same policy. The following example creates a policy that blocks `colourama`, a typosquat of the `colorama` package. In addition, a cooldown is included:

```bash
chainctl libraries policy create --name=team-policy \
  --cooldown-days=2 \
  --block=purl=pkg:pypi/colourama
chainctl libraries policy enable team-policy --ecosystem=PYTHON --mode=ENFORCE
```

### Check blocked packages

Use `chainctl libraries packages blocked` to review what has been blocked by your organization's policy. By default, this shows pull events that were blocked under any enforced policies. For example:

```bash
chainctl libraries packages blocked --ecosystem=JAVASCRIPT
```

If you have policies enabled in Preview mode, you can check successful pulls that *would have been blocked* in the last 30 days if the policy were to be enforced. For example:

```bash
chainctl libraries policy enable example-policy --ecosystem=JAVASCRIPT --mode=PREVIEW
chainctl libraries packages blocked --mode=PREVIEW --ecosystem=JAVASCRIPT
```

Replace `example-policy` with the name of the policy you want to preview.

To check packages that have been blocked by [Chainguard's global malware/greyware blocklist](/chainguard/libraries/introduction/overview/#malware-and-greyware-detection), use [`chainctl libraries packages malware list`](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware_list/).

## Override policies

### Override a blocked package

Use `--allow` to permit a package that has been blocked by a policy or by malware and greyware scanning.

Override policies takes precedence over block policies.

### Override cooldown for a package version

A cooldown override is useful when a newly published version includes an urgent fix and you need it before the cooldown window expires. For example:

```bash
chainctl libraries policy update team-policy \
    --allow='purl=pkg:npm/undici@8.4.1,override-cooldown=true,justification="urgent patch"'
```

If the new version pulls in transitive dependencies that are also blocked under a cooldown policy, those transitive packages must be overridden too.

### Override malware or greyware blocking

A malware override should be used sparingly and only after your security team has explicitly reviewed the package. A justification is required when you set `override-malware=true`.

```bash
chainctl libraries policy update team-policy \
  --allow='purl=pkg:npm/node-ipc@10.1.3,override-malware=true,justification="approved in SEC-1234"'
```

## Troubleshooting and FAQ

### Why does `chainctl` return "Invalid argument: enable takes no arguments"?

Prior to `chainctl` v0.2.313, when enabling a policy, you needed to include the `--policy` flag to pass in the policy name. In v.0.2.313 and later, you do not need to include a flag. For example, to enable a policy called `3day-cooldown`, run the following command: `chainctl libraries policy enable 3day-cooldown`. [Update `chainctl` to the latest version](/get-started/getting-started-with-chainctl/#update-chainctl-to-the-latest-release) to use this functionality.

---

### Configure Java build tools
_Path: chainguard/libraries/java/build-configuration.md_

Chainguard Libraries for Java works with your existing build tools — Maven,
Gradle, and Bazel — through a repository configuration change. This page is a
reference for configuring each supported build tool. It covers repository
access, authentication, cache clearing, and minimal example projects.

Apply these changes on every workstation and build server that builds your
applications or downloads libraries, including CI/CD infrastructure such as
Jenkins, TeamCity, or GitHub Actions.

The `https://libraries.cgr.dev/java/` endpoint is also the [Chainguard Repository](/chainguard/chainguard-repository/overview/) endpoint for Java. By default, it serves only Chainguard-built artifacts. When [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) is enabled for your organization, the same endpoint can also serve requested versions from Maven Central under Chainguard security controls.

This guide outlines how to configure your build tool. If you are looking for something else, refer to the following guides depending on your goals:

| If you want to... | Use this page |
| --- | --- |
| Understand what Chainguard Libraries for Java is and how it works | [Java overview](/chainguard/libraries/java/overview/) |
| Set up organization-wide access through a repository manager | [Global configuration](/chainguard/libraries/java/global-configuration/) |
| Migrate an existing project step by step | [Java migration guide](/chainguard/libraries/java/migration/) |
| Install inside a container build without leaking credentials into the image | [Container builds](/chainguard/libraries/policies-and-security/build-containers/) |

If a package or version is blocked by a policy or malware scan, your build tool returns an error. Refer to the [Error messages documentation](/chainguard/libraries/troubleshooting/errors/) for more details.

## Library access approaches

### Repo manager

#### Cloudsmith

Build configuration to retrieve artifacts from Cloudsmith requires you to
authenticate. Use your username and password for Cloudsmith in your build tool
configuration.

Follow the steps from the [global
configuration](/chainguard/libraries/java/global-configuration/#cloudsmith) to
determine URL and authentication details.

#### JFrog Artifactory

Build configuration to retrieve artifacts from Artifactory typically requires
you to authenticate and use the identity token in the configuration of your
build tool.

Follow the steps from the [global
configuration](/chainguard/libraries/java/global-configuration/#jfrog-artifactory)
to determine URL and authentication details.

#### Sonatype Nexus Repository

Build configuration to retrieve artifacts from Nexus may require authentication.
Use your username and password for Nexus in your build tool configuration.

Follow the steps from the [global
configuration](/chainguard/libraries/java/global-configuration/#sonatype-nexus-repository)
to determine URL and authentication details.

### Direct access

Build configuration to retrieve artifacts **directly** from the Chainguard
Libraries
for Java repository requires authentication
with username and password from a pull token as detailed in
[access documentation](/chainguard/libraries/introduction/access/#pull-token).

If using Chainguard's [CVE remediation](/chainguard/libraries/policies-and-security/cve-remediation/) for Java libraries (available in beta), set it as the top repository. The recommended ordering for repositories is:

1. `https://libraries.cgr.dev/java-remediated/` for remediated Spring Boot libraries; this is available in beta as part of the [CVE remediation](/chainguard/libraries/policies-and-security/cve-remediation/) feature.
1. `https://libraries.cgr.dev/java/`
1. `https://repo1.maven.org/maven2/` or your Maven Central proxy

## Selecting remediated library versions

When using the [CVE remediation feature](/chainguard/libraries/policies-and-security/cve-remediation/), available in beta to Chainguard Libraries for Java, your build will not receive a remediated Java artifact automatically with the overlay repository configured. To use the remediated build, you must opt in to the suffixed version directly, or route resolution to it through dependency management, Gradle constraints, or version ranges.

### Update dependency version directly

For Maven, you can set the suffixed version as a dependency in your `pom.xml`. For example:

```xml
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.18.0-0.cgr.1</version>
</dependency>
```

For Gradle, you can set the suffixed version in the dependencies block in `build.gradle`:

```build.gradle
implementation 'org.apache.commons:commons-lang3:3.18.0-0.cgr.1'
```

### Override the version centrally

When you use this option, the remediated version will apply to both direct and transitive dependencies.

For Maven, update the `dependencyManagement` in a parent POM or the project POM:

```xml
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.18.0-0.cgr.1</version>
    </dependency>
  </dependencies>
</dependencyManagement>
```

For Gradle, update the `constraints` block in `build.gradle`:

```build.gradle
dependencies {
  constraints {
    implementation('org.apache.commons:commons-lang3:3.18.0-0.cgr.1') {
      because 'CVE remediation via Chainguard Libraries overlay'
    }
  }
}
```

## Apache Maven

[Apache Maven](https://maven.apache.org/) is the most widely used build tool in
the Java ecosystem. Dependencies are declared in a `pom.xml` file and resolved from remote repositories.

### Step 1: Remove Maven caches

Maven caches downloaded artifacts in a local repository. When adopting Chainguard Libraries
for Java you must delete that local cache so that libraries are re-downloaded
from Chainguard. By default the cache is located in a
hidden `.m2/repository` directory in your user's home directory. Use the
following command to delete it:

```shell
rm -rf ~/.m2/repository
```

### Step 2: Configure access

Before running a new build you must configure access to the Chainguard Libraries
for Java. There are two options for configuring Maven to use Chainguard
Libraries:

* Repository manager — routes all artifact requests through your organization's
  Artifactory, Nexus, or Cloudsmith instance
* Direct access — configures Chainguard Libraries directly in
  `~/.m2/settings.xml`, without a repository manager

<a name="repo-manager-maven"></a>

#### Configure access with a repository manager

Before running a new build you must configure access to Chainguard Libraries
for Java. If your organization uses a repository manager, configure a global mirror in `~/.m2/settings.xml` that routes all artifact requests through it.

A typical setup defines a global mirror (id `repo-example` in the following example) for all artifacts and
configures the URL of the repository group or virtual repository from your
repository manager `https://repo.example.com/group/`. Since the group or virtual
repository combines release and snapshot artifacts you must override the
built-in `central` repository and its configuration in an automatically
activated profile.

```xml
<settings>

  <mirrors>
    <mirror>
      
      <id>repo-example</id>
      
      <mirrorOf>*</mirrorOf>
      <url>https://repo.example.com/repository/group</url>

    </mirror>
  </mirrors>

  <activeProfiles>
    <activeProfile>repo-manager</activeProfile>
  </activeProfiles>
  <profiles>
    <profile>
      <id>repo-manager</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

</settings>
```

**Setting credentials for the server**

If your repository manager requires authentication, you must specify credentials
for the server. The `id` value in the server element must match the `id` value
in the mirror configuration - `repo-example` in the example. The username
and password values vary depending on the repository manager and the configured
authentication; contact the administrator and refer to the [global configuration
documentation](/chainguard/libraries/java/global-configuration/).

```xml
<settings>
...
  <servers>
    <server>
      <id>repo-example</id>
      <username>YOUR_USERNAME_FOR_REPOSITORY_MANAGER</username>
      <password>YOUR_PASSWORD</password>
    </server>
  </servers>
</settings>
```

Note that you can use a secret manager application to populate the credentials
for each user on their workstation as well as for service applications in your
CI/CD pipelines into environment variables, for example `CHAINGUARD_JAVA_IDENTITY_ID`
and `CHAINGUARD_JAVA_TOKEN`. You can then use an identical server configuration, and
therefore settings file, for all users:

```xml
<settings>
...
  <servers>
    <server>
      <id>repo-example</id>
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>
    </server>
  </servers>
</settings>
```

Refer to the [official documentation for the Maven settings
file](https://maven.apache.org/settings.html) for more details.

If the administrator only re-configured the existing repository group or virtual
repository, you can trigger a build to initiate use of Chainguard Libraries for
Java.

#### Configure direct access

If you are not using a repository manager at your organization, you can
configure access to the Chainguard Libraries for Java repository directly. If [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) is enabled for your organization, the `https://libraries.cgr.dev/java/` repository can serve both Chainguard-built artifacts and eligible upstream Maven Central artifacts through the same endpoint. If upstream fallback is not enabled, continue to configure Maven Central or your Maven Central proxy after the Chainguard repository, as shown in the following example.

If you are participating in the beta for CVE remediation, include the `https://libraries.cgr.dev/java-remediated/` repository first.

If you are using direct access with the Chainguard Repository and you want Chainguard policy controls to apply consistently, configure Chainguard as a global Maven mirror. Without a global mirror, Maven can fall back to its built-in Maven Central definition when Chainguard reports a dependency as unavailable, bypassing the policy and malware scanning controls provided by Chainguard.

The following `~/.m2/settings.xml` configures direct access with Chainguard's remediated Java repository as
the primary repository, falling back to the standard Chainguard Libraries repository when a remediated version is not available. If a library is not yet built by Chainguard and you have enabled upstream fallback, then upstream packages will be subject to malware scanning and any cooldown policies you have configured. This settings file uses [environment
variables](/chainguard/libraries/introduction/access/#env) for the pull token detailed in
[Chainguard Libraries access](/chainguard/libraries/introduction/access/).

```xml
<settings>
  <activeProfiles>
    <activeProfile>chainguard</activeProfile>
  </activeProfiles>

  <profiles>
    <profile>
      <id>chainguard</id>

      <repositories>
        <repository>
          <id>chainguard-remediated</id>
          <url>https://libraries.cgr.dev/java-remediated/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
          <id>chainguard-java</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>central</id>
          <url>invalid</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>chainguard-java-remediated</id>
          <url>https://libraries.cgr.dev/java-remediated/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>
        <pluginRepository>
          <id>chainguard-java</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>
        <pluginRepository>
          <id>central</id>
          <url>invalid</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>

      </pluginRepositories>
    </profile>
  </profiles>

    <mirrors>
    <mirror>
      <id>chainguard</id>
      <name>Chainguard Mirror</name>
      <url>https://libraries.cgr.dev/java/</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>

  <servers>
    <server>
      <id>chainguard-remediated</id>
      
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>

    </server>
      <id>chainguard-java</id>
      
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>

    </server>
  </servers>
</settings>
```

The preceding settings affects all projects built on the machine where the file
is configured. Alternatively you can add the `repositories` and
`pluginRepositories` to individual project `pom.xml` files. Authentication
details must remain within the settings file.

If your `settings.xml` is using credentials set as environment variables, ensure the variables are exported.

>Note: Upstream fallback includes a 7-day cooldown by default. If you have a cooldown policy configured, your build will fail if a package falls within the cooldown window. Refer to [the FAQ](#build-fails-with-unknown-host-invalid-or-nodename-nor-servname-provided) on this page for more information.

### Minimal example project

Use the following steps to create a minimal example project for Maven with Chainguard Libraries for Java. For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).

**1. Remove the Maven cache**

Remove the Maven cache as described in the [Remove Maven
caches](#step-1-remove-maven-caches) section.

**2. Create a new Maven project**

This command generates a new Maven project from the `archetype` template, sets
the group ID and artifact ID, creates a full project structure, and then moves
into the generated project directory:

```bash
mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=maven-example \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DarchetypeVersion=1.5 \
  -DinteractiveMode=false
cd maven-example
```

**3. Add a dependency to pom.xml**

Add a dependency on `com.google.guava:guava` to the `<dependencies>` section of
`pom.xml`. Open the file and insert the following before the closing
`dependencies` tag:

```xml
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>33.4.0-jre</version>
</dependency>
```

**4. Configure credentials**

Once the environment variables are set, configure credentials in `~/.m2/settings.xml`:

```bash
mkdir -p ~/.m2
cat > ~/.m2/settings.xml << EOF
<settings>
  <activeProfiles>
    <activeProfile>no-repo-manager</activeProfile>
  </activeProfiles>
  <profiles>
    <profile>
      <id>no-repo-manager</id>
      <repositories>
        <repository>
          <id>chainguard</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>central</id>
          <url>https://repo1.maven.org/maven2/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>chainguard</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
        <pluginRepository>
          <id>central</id>
          <url>https://repo1.maven.org/maven2/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <servers>
    <server>
      <id>chainguard</id>
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>
    </server>
  </servers>
</settings>
EOF
```

If you are using Chainguard's remediated repository for Java libraries, make sure to add `https://libraries.cgr.dev/java-remediated/` first, as shown in the [direct access example](#direct-access) earlier on this page.

**5. Build the project**

Then build the project:

```bash
mvn install
```

During the build, Maven logs each artifact download with the source repository.
Lines beginning with `Downloaded from chainguard:` confirm the artifact was
served by Chainguard Libraries. Lines beginning with `Downloaded from central:`
indicate that a dependency is not present in Chainguard and the download fell
back to Maven Central; this is expected behavior.

#### Verify the project works as expected

Following the build, the dependencies declared in `pom.xml` are downloaded to
the local Maven repository at ~/.m2/repository. For example, the `guava`
dependency added in the example project can be found at:

```
~/.m2/repository/com/google/guava/guava/33.4.0-jre/guava-33.4.0-jre.jar
```

To verify the artifact was built by Chainguard, use `chainctl`:

```bash
chainctl libraries verify \
  ~/.m2/repository/com/google/guava/guava/33.4.0-jre/guava-33.4.0-jre.jar
```

> **Note**: Running `chainctl libraries verify` requires the `libraries.java.pull` permission or the Owner role.

A successfully verified artifact produces output similar to the following:

```bash
Artifact: /Users/example/.m2/repository/com/google/guava/guava/33.4.0-jre/guava-33.4.0-jre.jar
Verification Coverage: 100.00%
```

Adjust the repository URL to use your repository manager and add any other
desired packages for further testing.

## Gradle

[Gradle](https://gradle.org/) is a commonly used build tool in the Java
ecosystem.

### Step 1: Remove Gradle caches

Gradle uses a local cache of libraries. When adopting Chainguard Libraries for
Java you must delete that local cache so that libraries
are downloaded again. By default the cache is located in a hidden
`~/.gradle/caches` directory in your user's home directory.

Use the following command to delete it:

```bash
rm -rf ~/.gradle/caches/
```

Gradle can also be configured to use a local Maven repository with a repository
configuration in the global `init.gradle` or a project specific `build.gradle`
file:

```groovy
repositories {
   ...
    mavenLocal()  
}
```

If this configuration is used, ensure you [delete the local Maven repository as
well](#step-1-remove-maven-caches).

### Step 2: Change Gradle configuration

Before running a new build you must configure access to the Chainguard Libraries
for Java. There are three options for configuring Gradle to use Chainguard
Libraries:

* Repository manager — routes all artifact requests through your organization's
  Artifactory, Nexus, or Cloudsmith instance
* Direct access — configures Chainguard Libraries as a repository in your build
  file, without a repository manager
* An [`init`
script](https://docs.gradle.org/current/userguide/init_scripts.html#sec:using_an_init_script)
— applies the repository configuration globally to all Gradle projects on a
machine

If the administrator for your organization’s repository manager created a new
repository or virtual repository or group repository, you must update your
Gradle configuration. Artifact download in Gradle can be configured in an
[`init`
script](https://docs.gradle.org/current/userguide/init_scripts.html#sec:using_an_init_script)
using the repositories definition. Each project can also [declare
repositories](https://docs.gradle.org/current/userguide/declaring_repositories_basics.html)
separately.

<a name="repo-manager-gradle"></a>

#### Using a repository manager

A typical setup removes the direct reference to Maven Central `mavenCentral()`
and any other repositories, and adds a replacement definition with the URL of the
repository group or virtual repository from your repository manager
`https://repo.example.com/group/` and any applicable authentication details.

Open `app/build.gradle` and update the `repositories` block to include the
following repository. Ensure it is located above the `mavenCentral` repository
and any other repositories:

```groovy
repositories {
    maven {
        url = uri("https://repo.example.com/group/")
        credentials {
            username = "YOUR_USERNAME_FOR_REPOSITORY_MANAGER"
            password = "YOUR_PASSWORD"
        }
    }
}
```

> **Note**: Do not store credentials directly in build files; use environment
>variables or local Gradle properties instead.

Example URLs for repository managers:

* Cloudsmith: `https://dl.cloudsmith.io/basic/exampleorg/java-all/maven/`
* JFrog Artifactory: `https://example.jfrog.io/artifactory/java-all/`
* Sonatype Nexus: `https://repo.example.com:8443/repository/java-all/`

#### Direct access to Chainguard Libraries

If your organization does not use a repository manager you can configure the
Chainguard Libraries for Java repository with the credentials from [Chainguard
Libraries access](/chainguard/libraries/introduction/access/). The following `repositories` block demonstrates
the recommended method of using [environment
variables](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials)
for your pull token credentials.

Open `app/build.gradle` and update the `repositories` block to include the
Chainguard repository. Ensure it is located above the `mavenCentral` repository
and any other repositories. If you are using Chainguard's [remediated library repository](/chainguard/libraries/policies-and-security/cve-remediation/), set it as the top repository:

```groovy
repositories {
      maven {
    url = uri("https://libraries.cgr.dev/java-remediated/")
    credentials {
      username = providers.environmentVariable("CHAINGUARD_JAVA_IDENTITY_ID").orNull
      password = providers.environmentVariable("CHAINGUARD_JAVA_TOKEN").orNull
    }
  }

    maven {
        url = uri("https://libraries.cgr.dev/java/")
        credentials {
            username = providers.environmentVariable("CHAINGUARD_JAVA_IDENTITY_ID").orNull
            password = providers.environmentVariable("CHAINGUARD_JAVA_TOKEN").orNull
        }
    }
    mavenCentral()
}
```

#### Using an init script

The following listing shows a valid `init.gradle` file that applies the repository configuration globally using `~/.gradle/init.gradle`. It wraps the
`repositories` element with `allprojects` so that the scope of the file affects
all projects built locally with Gradle. It also allows for downloads for plugins
and build scripts from the remote URL using `buildscript`. Lastly the example
shows use of an internal repository manager that only serves artifacts without
authentication using HTTP only. Since this is not advisable unless other
networking setups allow a secure use with HTTP, the override with the property
`allowInsecureProtocol` is required:

```groovy
allprojects {
  buildscript {
    repositories {
      maven {
        url = "http://repo.example.com:8081/repository/java-all/"
        allowInsecureProtocol = true
      }
    }
  }
  repositories {
    maven {
        url = "http://repo.example.com:8081/repository/java-all/"
        allowInsecureProtocol = true
    }
  }
}
```

### Minimal example project

Use the following steps to create a minimal example project for Gradle with Chainguard Libraries for Java. For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).

**1. Clear the cache**

Clear the Gradle cache as described in the [Remove Gradle caches](#step-1-remove-gradle-caches) section.

**2. Create the example project**

Create a project directory and navigate to it:

```bash
mkdir gradle-example && cd $_
gradle init --type java-application --dsl groovy \
  --project-name gradle-example \
  --package com.example \
  --no-incubating \
  --no-split-project
```

**3. Edit app/build.gradle**

Open `app/build.gradle` in a text editor. For example, to open it in `nano`:

```bash
nano app/build.gradle
```

Edit the `repositories` block in `app/build.gradle` to point to Chainguard and use the environment variables for your pull token credentials:

```app/build.gradle
repositories {
    maven {
        url = 'https://libraries.cgr.dev/java/'
        credentials {
            username = providers.environmentVariable("CHAINGUARD_JAVA_IDENTITY_ID").orNull
            password = providers.environmentVariable("CHAINGUARD_JAVA_TOKEN").orNull
        }
    }
    mavenCentral()
}
```

If you are using Chainguard's remediated repository for Java libraries, make sure to add `https://libraries.cgr.dev/java-remediated/` first, as shown in the [direct access example](#direct-access-to-chainguard-libraries) earlier in the Gradle section on this page.

**4. Build the project**

Run the following command:

```bash
./gradlew app:assemble
```

The project generated in this example includes `com.google.guava:guava` as a dependency via the
version catalog in `gradle/libs.versions.toml`, so guava is downloaded from
Chainguard Libraries as part of the build.

Following the build, you can find the guava jar declared in the version catalog at:

```
~/.gradle/caches/modules-2/files-2.1/com.google.guava
```

#### Verify the project works as expected

To verify the artifact was built by Chainguard, use `chainctl`. In this example,
we first use `find` to locate the jar:

```bash
find ~/.gradle/caches/modules-2/files-2.1/com.google.guava/guava -name "*.jar" | sort
```

Then copy the exact path to the jar and verify it with `chainctl`:

```bash
chainctl libraries verify /full/path/to/guava-<version>.jar
```

> **Note**: Running `chainctl libraries verify` requires the `libraries.java.pull` permission or the Owner role.

A successfully verified artifact produces output similar to the following:

```bash
Artifact: ~/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/33.5.0-jre/.../guava-33.5.0-jre.jar
Verification Coverage: 100.00%
```

Adjust the repository URL to use your repository manager and add any other
desired packages for further testing.

<a id="bazel"></a>

## Bazel

[Bazel](https://bazel.build/) is a fast, scalable, and extensible build tool
commonly used in large-scale projects.

### Step 1: Remove Bazel caches

Bazel uses a cache to store downloaded artifacts. When adopting Chainguard
Libraries for Java, you must delete this cache to ensure that libraries are
downloaded again. By default, the cache is located in the `.cache/bazel` on
Linux or `/private/var/tmp/_bazel_$USER` on MacOS directory in your user's home
directory. Use the following command to delete it:

```shell
bazel clean --expunge
```

The [Bazel documentation on output
directories](https://bazel.build/remote/output-directories) contains further
details.

### Step 2: Change Bazel configuration

<a name="repo-manager-bazel"></a>

#### Using a repository manager

Before running a new build, you must configure access to Chainguard Libraries
for Java. If the administrator for your organization’s repository manager
created a new repository or virtual repository, you must update your Bazel
configuration to use the repository manager.

Bazel uses `MODULE.bazel` files to define external dependencies as `artifacts`.
You can configure a Maven repository for artifact retrieval using `repositories`
from the
[`rules_jvm_external`](https://github.com/bazel-contrib/rules_jvm_external) rule:

Following is an example configuration for a repository manager:

```MODULE.bazel
bazel_dep(name = "rules_jvm_external", version = "6.3")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")

maven.install(
    name = "maven",
    # Example dependencies to retrieve
    artifacts = [
        "com.google.guava:guava:32.0.1-jre",
        "org.slf4j:slf4j-api:2.0.5",
        "ch.qos.logback:logback-classic:1.4.7",
    ],
    repositories = [
        # To use Chainguard Libraries for Java via a repository manager:
        "https://repo.example.com/repository/java-all/",
    ],
    # Uncomment and configure authentication if needed:
    # auth = {
    #     "https://repo.example.com/repository/java-all/": {
    #         "type": "basic",
    #         "username": "YOUR_USERNAME_FOR_REPOSITORY_MANAGER",
    #         "password": "YOUR_PASSWORD",
    #     },
    # },
)

use_repo(maven, "maven")
```

Example URLs for repository managers:

* Cloudsmith: https://dl.cloudsmith.io/basic/exampleorg/java-all/maven/
* JFrog Artifactory: https://example.jfrog.io/artifactory/java-all/
* Sonatype Nexus: https://repo.example.com:8443/repository/java-all/

#### Using direct access

If your organization does not use a repository manager, you can configure the
Chainguard Libraries for Java repository directly, and include the Maven Central
repository as fallback. Replace the placeholders `CHAINGUARD_JAVA_IDENTITY_ID`
and `CHAINGUARD_JAVA_TOKEN` with the credentials provided by Chainguard:

```MODULE.bazel
maven.install(
    name = "maven",
    # Example dependencies to retrieve
    artifacts = [
        "com.google.guava:guava:32.0.1-jre",
        "org.slf4j:slf4j-api:2.0.5",
        "ch.qos.logback:logback-classic:1.4.7",
    ],

    repositories = [
        # To use Chainguard Libraries directly (requires credentials):
        "https://libraries.cgr.dev/java/",

        # Use Maven Central as fallback
        "https://repo1.maven.org/maven2/",
    ],
    auth = {
         "https://libraries.cgr.dev/java/": {
             "type": "basic",
             "username": "CHAINGUARD_JAVA_IDENTITY_ID",
             "password": "CHAINGUARD_JAVA_TOKEN",
         },
    },
)
```

Ensure that the Chainguard repository is listed before any other repositories to
prioritize it for artifact retrieval.

For more complex Bazel setups, you can use [.netrc for
authentication](/chainguard/libraries/introduction/access/#netrc).

Refer to the [official Bazel documentation for
`rules_jvm_external`](https://github.com/bazel-contrib/rules_jvm_external) for
more detailed configuration options.

## Other build tools

Other build tools such as [Apache Ant](https://ant.apache.org/) with the [Maven
Artifact Resolver Ant Tasks](https://maven.apache.org/resolver-ant-tasks/),
[sbt](https://www.scala-sbt.org/), [Leiningen](https://leiningen.org/) and
others use Maven or Gradle caches or similar approaches. Refer to the
documentation of your specific tool and the preceding sections to determine how
to remove any used caches.

These tools also include their own mechanisms to configure repositories for
binary artifact retrieval. Consult the specific documentation and adjust your
configuration to use your repository manager and newly created repository group
or virtual repository.

Example URLs for repository managers:

* Cloudsmith: `https://dl.cloudsmith.io/basic/exampleorg/java-all/maven/`
* JFrog Artifactory: `https://example.jfrog.io/artifactory/java-all/`
* Sonatype Nexus: `https://repo.example.com:8443/repository/java-all/`

## Troubleshooting

### Build fails with "Unknown host invalid" or "nodename nor servname provided"

If your build fails with an error similar to the following, a dependency has been blocked by Chainguard's cooldown policy:

```
Non-resolvable import POM: Could not transfer artifact io.airlift:bom:pom:436
from/to central (https://invalid): invalid: nodename nor servname provided,
or not known
```

The `https://invalid` URL in the error indicates that Chainguard blocked the artifact rather than serving it, and the fallback to Central was also blocked. This happens when a recently published package falls within the cooldown window — a security feature that holds newly published artifacts for a configurable period before serving them, to allow time for malware scanning.

To avoid build failures, you can [disable the cooldown or decrease its length](/chainguard/chainguard-repository/library-policies/#cooldown-policies).

---

### Global configuration
_Path: chainguard/libraries/java/global-configuration.md_

Java and JVM library consumption in a large organization is typically managed by
a repository manager. Commonly used repository manager applications are
[Cloudsmith](https://cloudsmith.com/), [Google Artifact Registry](https://cloud.google.com/artifact-registry/docs), [JFrog
Artifactory](https://jfrog.com/artifactory/), and [Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository). The
repository manager acts as a single point of access for developers and
development tools to retrieve the required libraries.

The recommended approach is to use the [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls)
feature of Chainguard Repository, which allows you to configure your repository
manager with a single upstream pointed at `https://libraries.cgr.dev/java/` without a separate fallback to Maven Central. The
Chainguard Repository handles fallback and policy enforcement; your repository
manager handles local caching and access control. Chainguard retrieves
packages from the public Maven Central repository on your behalf when upstream
fallback is enabled. This includes protections such as malware scanning and a
cooldown period for newly published packages.

At a high level, adopting the use of Chainguard Libraries consists of the following steps:

* Configure your environment to use `https://libraries.cgr.dev/java/`
  as the single upstream source for Java package retrieval. This can be done
  either:
    * As a remote repository in your repository manager, or
    * Directly in your Java build configuration (for example, Maven or Gradle).
* Additional steps depend on your specific environment and preferences, and can include the following
optional measures:
    * Remove all cached artifacts for Maven Central. This step ensures that any libraries you pull are from Chainguard Libraries, and not existing cached artifacts from upstream.
    * Remove any repositories that are no longer desired or necessary, depending on your organization's preferences.

This page explains how to use Chainguard Libraries for Java with a repository
manager. If your organization does not use a repository manager, you can pull
directly from Chainguard. Refer to the [direct access documentation for build
tools](/chainguard/libraries/java/build-configuration/#direct-access) for more
information.

## Configure access with a repository manager

Refer to the Build configuration docs for instructions on configuring repository manager access for [Maven](/chainguard/libraries/java/build-configuration/#repo-manager-maven), [Gradle](/chainguard/libraries/java/build-configuration/#repo-manager-gradle), and [Bazel](/chainguard/libraries/java/build-configuration/#repo-manager-bazel).

## Manually managing fallback

Chainguard recommends using the Chainguard Repository's built-in [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) rather
than configuring a fallback to the public Maven Central registry in your repo manager. Configuring
your own fallback bypasses the protection that the Chainguard Repository
provides.

However, if you intentionally want to manage fallback ordering yourself, you can
configure `https://libraries.cgr.dev/java/` as a remote repository alongside
your Maven upstream, and combine them in a virtual or group repository with
Chainguard as the first priority. If you configure a fallback to Maven Central,
packages sourced from that registry are not covered by Chainguard's
malware-resistance guarantees.

The per-tool instructions on this page vary by repository manager. The JFrog
Artifactory and Sonatype Nexus Repository sections use the recommended
upstream fallback approach, which Chainguard has tested with those tools. The
Cloudsmith and Google Artifact Registry sections use the manual Maven Central
fallback pattern; Chainguard has not yet tested the upstream fallback
with those tools.

<a name="cloudsmith"></a>

## Cloudsmith

[Cloudsmith](https://cloudsmith.com/) supports Maven repositories for proxying
and hosting. Refer to the [Maven Repository
documentation](https://help.cloudsmith.io/docs/maven-repository) and the [Maven
Upstream
documentation](https://help.cloudsmith.io/docs/upstream-proxying-caching#create-a-maven-upstream)
for Cloudsmith for more information. Cloudsmith supports combining repositories
by defining multiple upstream repositories.

> **Note:** Chainguard has not yet tested the recommended [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) approach — a single upstream pointed at `https://libraries.cgr.dev/java/` — with Cloudsmith. The following steps instead configure Maven Central as an upstream fallback in your repository manager. Packages sourced from Maven Central are not covered by Chainguard's malware-resistance guarantees.

### Initial configuration

Use the following steps to add a repository with the Maven Central Repository
and the Chainguard Libraries for Java repository as Maven upstream repositories.

Configure a `java-all` repository:

1. Log in as a user with administrator privileges.
1. Select the **Repositories** tab near the top of the screen.
1. On the **Repositories** page, click the **+ New repository** button.
1. Enter the name `java-all` for your new repository. The name should
   include `java` to identify the ecosystem. This convention helps
   avoid confusion since repositories in Cloudsmith are multi-format.
1. Select a storage region that is appropriate for your organization and
   infrastructure.
1. Click **+Create Repository**.

Configure an upstream proxy for the Maven Central Repository:

1. Click the name of the new `java-public` repository on the repositories
   page to configure it.
1. Click the **Upstreams** tab, then click **+Add Upstream Proxy**.
1. Configure an upstream proxy with the format **Maven**.
1. Configure another upstream proxy with the following:
    * **Name**: `java-public`
    * **Priority**: `2`
    * **Upstream URL**: `https://repo1.maven.org/maven2/`
    * **Mode**: Cache and Proxy
1. Click **Create Upstream Proxy**.

Configure an upstream proxy for the Chainguard Libraries for Java repository:

1. Click the name of the new `java-chainguard` repository on the repositories
   page to configure it.
1. Click the **Upstreams** tab, then click **+Add Upstream Proxy**.
1. Configure an upstream proxy with the format **Maven** and the following details:
    * **Name**: `java-chainguard`
    * **Priority**: `1`
    * **Proxy URL**: `https://libraries.cgr.dev/java/`
    * **Mode**: Cache and Proxy
    * **Authentication Settings**: Enter the **Username** and **Password** value from [Chainguard Libraries
      access](/chainguard/libraries/introduction/access/).
1. Click **Create Upstream Proxy**.
1. If you are using the separate repository with remediated Java libraries, repeat the preceding steps to create remote repository named `java-chainguard-remediated` with a URL set to `https://libraries.cgr.dev/java-remediated/`. Use the same authentication details.

Use this setup for initial testing with Chainguard Libraries for Java. For
production usage, add the `java-chainguard` upstream proxy to your production
repository.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Select the **Packages** tab.
1. Click **Push/Pull Packages**.
1. Choose the format **Maven**.
1. Copy the value in the `<url>` tag from the XML snippet with the
   `<repositories>` entry. For example,
   `https://dl.cloudsmith.io/basic/exampleorg/java-all/maven/` with `exampleorg`
   replaced with the name of your organization. Note that the name of the
   repository `java-all` as well as `maven` as identifier for the format are
   part of the URL.
1. Copy the username and password values block from the second code snippet for
   authentication after choosing the desired authentication of **Default** or
   **API Key**.

Choose a different format and the equivalent sections if you are using another
build tools such as Gradle.

Use the URL of the repository, the username, and the password for the server
authentication block in the [build
configuration](/chainguard/libraries/java/build-configuration/) and build a
first test project. In a working setup, all libraries retrieved from Chainguard
are tagged with the name of the upstream proxy.

<a name="gar"></a>

## Google Artifact Registry

[Google Artifact Registry](https://cloud.google.com/artifact-registry) supports
the Maven format for hosting artifacts in **Standard** repositories and proxying
artifacts from public repositories in **Remote** repositories. Use **Virtual**
repositories to combine them for consumption with Maven and other build tools.
Use the [Java package documentation for Google Artifact
Registry](https://cloud.google.com/artifact-registry/docs/java) as the starting
point for more details.

> **Note:** Chainguard has not yet tested the recommended [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) approach — a single upstream pointed at `https://libraries.cgr.dev/java/` — with Google Artifact Registry. The following steps instead configure Maven Central as an upstream fallback in your repository manager. Packages sourced from Maven Central are not covered by Chainguard's malware-resistance guarantees.

### Initial configuration

Use the following steps to add the Maven Central Repository and the Chainguard
Libraries for Java repository as remote repositories and combine them as a
virtual repository:

1. Log in to the Google Cloud console as a user with administrator privileges.
1. Navigate to your project and find the **Artifact Registry** with the search.
1. Activate Artifact Registry if necessary.
1. Navigate to your project and find the **Secret Manager** with the search.
1. Activate **Secret Manager** if necessary.

Before configuring the repositories, you must create a secret with the [password
value as retrieved with chainctl](/chainguard/libraries/introduction/access/):

1. Navigate to the **Secret Manager**
1. Click **Create secret**.
1. Set the **Name** to `chainguard-libraries-java`.
1. Set the **Secret** value to the password from your `chainctl` output.
1. Click **Create secret**.

Navigate to Artifact Registry and select **Repositories** in the left hand
navigation under the **Artifact Registry** label to configure a remote
repository for the Maven Central Repository:

1. Click **Create a Repository** (or the **+** button).
1. Configure the repository:
    * **Name**: `java-public`
    * **Format**: Maven
    * **Mode**: Remote
    * **Remote repository source**: Maven Central
    * **Location type > Region**: Select a region.
1. Click **Create**.

Configure a remote repository for the Chainguard Libraries for Java repository:

1. Click **+** to add another repository.
1. Configure the repository:
    * **Name**: `java-chainguard`
    * **Format**: `Maven`
    * **Mode**: Remote
    * **Remote repository source**: Custom
    * **Custom repository URL**: `https://libraries.cgr.dev/java/`
    * **Remote repository authentication mode**: Authenticated
    * **Username for the upstream repository**: Set this to the [value as retrieved
   with chainctl](/chainguard/libraries/introduction/access/).
    * **Secret**: Select the `chainguard-libraries-java` secret in the list.
    * **Location type > Region**: Select the same region configured for your `java-public` repository.
1. Click **Create**.
1. If you are using the separate repository with remediated Java libraries, repeat the preceding steps to create remote repository named `java-chainguard-remediated` with a URL set to `https://libraries.cgr.dev/java-remediated/`. Use the same authentication details.

Combine the repositories in a new virtual repository:

1. Click the **+** button to add another repository.
1. Configure the repository:
    * **Name**: `java-all`
    * **Format**: Maven
    * **Mode**: Virtual
1. Under **Virtual upstream repositories**, click **Add upstream repository**.
1. Use the **Browse** button to locate and select the `java-chainguard`
   repository as **Repository 1** and set the **Policy name 1** to
   `java-chainguard`.
1. Use the **Browse** button to locate and select the `java-public` repository
   as **Repository 1** and set the **Policy name 1** to `java-public`.
1. Under **Virtual upstream repositories**, click **Add upstream repository**.
1. Set the **Priority** value for the `java-chainguard` policy name to a higher
   value than the `java-public` priority value.
    * If you are using the remediated repository, add the `java-chainguard-remediated` repository and ensure it is the first in the displayed list. If not, ensure the `java-chainguard` repository is first.
1. Under **Location type**, choose the same suitable **Region** for your development as configured for the `java-public` repository.
1. Click **Create**.

### Build tool access

The following steps allow you to configure your build tool for accessing the
repository:

1. Navigate to Artifact Registry and select **Repositories** in the left hand
   navigation under the **Artifact Registry** label.
1. Click the `java-all` repository name in the list of repositories.
1. Click **Setup instructions** and follow the documentation. Note
   that you must add the extension
   `com.google.cloud.artifactregistry:artifactregistry-maven-wagon` to each
   project.

In a working setup, the `chainguard` remote repository contains all artifacts
retrieved from Chainguard.

<a name="artifactory"></a>

## JFrog Artifactory

[JFrog Artifactory](https://jfrog.com/artifactory/) supports Maven repositories
for proxying and hosting, and virtual repositories to combine them. Refer to the
[Maven Repository documentation for
Artifactory](https://docs.jfrog.com/artifactory/docs/maven-repositories)
for more information.

If you follow the recommended approach to rely on Chainguard Repository's
upstream fallback, disable or remove any existing Artifactory remote repository
that points at Maven Central, and remove it from the virtual repository your
builds resolve against. A remote pointing directly at Maven Central bypasses
those protections. Since Artifactory resolves through the virtual repository in
order, a misconfiguration can result in Artifactory serving an unprotected
package.

### Initial configuration

Use the following steps to add Chainguard Libraries for Java as a remote repository:

1. Log in as a user with administrator privileges.
1. Click **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.

Configure a remote repository for the Chainguard Libraries for Java repository:

1. Click **Create a Repository** and choose the **Remote** option.
1. Configure the repository:
    * **Package type**: Maven
    * **Repository Key**: `java-chainguard`
    * **URL**: `https://libraries.cgr.dev/java/`
    * **User Name** and **Password / Access Token**: Set to the [values as retrieved with chainctl](/chainguard/libraries/introduction/access/).
    * Deactivate **Maven Settings - Handle Snapshots**.
1. Note: The **Test** button is not a reliable indicator; to verify your setup, refer to the [validation steps](#validate-the-remote-repository) later on this page.
1. Click the **Advanced** configuration tab, then configure the following settings:
    * In the **Network** section:
        * Confirm **Lenient Host Authentication** is unchecked, so that your credentials are not forwarded across the redirect.
        * Optionally check **Enable Cookie Management**. JFrog recommends this for remote repositories that involve redirects.
    * In the **Others** section:
        * Check **Bypass HEAD Requests**, so that Artifactory retrieves each artifact with a GET request instead of probing with a HEAD request first.
        * Uncheck **Block Mismatching Mime Types**.
        * Check **Disable URL Normalization**, so that Artifactory does not rewrite the pre-signed redirect URL.
1. Click **Create Remote Repository**.

These settings are required because Chainguard Libraries stores artifacts in
Cloudflare R2. An artifact download from `libraries.cgr.dev` returns a 302
redirect to a pre-signed URL on a different host, and the redirect response itself
is an HTML document. Without these settings, Artifactory may rewrite the
pre-signed URL, forward your credentials across the redirect, or cache the
redirect response in place of the POM, JAR, or checksum file. A cached redirect
response fails checksum verification at build time.

If you are manually managing fallback, you can configure an additional remote
repository for Maven Central with lower priority. Make sure to deactivate
**Maven Settings - Handle Snapshots** in the remote repository.

Create a virtual repository to give your build tools a single access point:

1. Click **Create a Repository** and choose the **Virtual** option.
1. Configure the repository:
    * **Package type**: Maven
    * **Repository Key**: `java-all`
1. Scroll down to the **Repositories** section.
1. Add the `java-chainguard` repository.
1. Click **Create Virtual Repository**.

### Add remediated libraries

This section applies only if you use the separate repository of [remediated
Java libraries](/chainguard/libraries/policies-and-security/cve-remediation/). It requires a second
remote repository, added to the virtual repository ahead of `java-chainguard` so
that remediated versions resolve first.

1. Repeat the [remote repository steps](#initial-configuration-2) to create a
   second remote repository, named `java-chainguard-remediated`, with the **URL**
   set to `https://libraries.cgr.dev/java-remediated/`. Use the same
   authentication details and the same Advanced settings.
1. Open the `java-all` virtual repository and scroll down to the **Repositories**
   section.
1. Add the `java-chainguard-remediated` repository, then drag it above
   `java-chainguard` so that it is first in the displayed list. Use the icon to
   the right of the repository name to reorder the list.
1. Click **Save**.

### Validate the remote repository

After creating the `java-chainguard` remote repository, validate that Artifactory is successfully proxying through to Chainguard before proceeding. A misconfigured remote repository fails silently; if any remote pointing at Maven Central is still present, Artifactory resolves through it instead and the build succeeds with no visible error. This can result in pulling an unprotected package.

Common sources of misconfiguration include invalid or expired credentials, or an incorrect or incomplete repository URL. The Artifactory **Test** button on the repository configuration screen is not a reliable indicator; it may fail for a correctly configured repository, and may pass for an incorrectly configured one. Instead, use the following steps to verify that fetching an artifact through Artifactory produces the same checksum as fetching it directly from `libraries.cgr.dev`.

#### 1. Compute the artifact's checksum

Fetch the artifact directly from Chainguard and compute its checksum. This example uses `junit-4.13.2.jar`. You can substitute any artifact you know to be available.

```bash
curl -sSf -L \
  -u "${CHAINGUARD_JAVA_IDENTITY_ID}:${CHAINGUARD_JAVA_TOKEN}" \
  https://libraries.cgr.dev/java/junit/junit/4.13.2/junit-4.13.2.jar \
  | sha256sum
```

#### 2. Compute the same artifact's checksum from Artifactory

Fetch the same artifact through the Artifactory remote repository and compute its checksum:

```bash
curl -sSf -L \
  -u "${ARTIFACTORY_USER}:${ARTIFACTORY_TOKEN}" \
  https://<artifactory-host>/artifactory/java-chainguard/junit/junit/4.13.2/junit-4.13.2.jar \
  | sha256sum
```

Replace `artifactory-host` with your Artifactory instance hostname.

The checksums returned by the commands must match.

If the checksum from the Artifactory remote repository differs from the direct fetch, or if the Artifactory fetch fails entirely, review the following before proceeding:

* URL: The remote repository URL must be set to `https://libraries.cgr.dev/java/`.
* Credentials: You may need to regenerate your pull token with `chainctl auth pull-token --repository=java` and update the Artifactory repository credentials. Expired tokens fail silently.
* Advanced configuration: Ensure all recommended Advanced settings from the [remote repository configuration steps](#initial-configuration-2) have been applied.
* Corrupted cached artifacts: if the repository previously ran without these settings, Artifactory may still be serving a cached redirect response. In Artifactory, browse the `java-chainguard` remote cache and locate the affected files. Right-click each artifact, select **Delete content**, then re-run your build.

Do not proceed to virtual repository setup or build configuration until the checksums match.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Click **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.
1. Select the **Virtual** tab in the repositories view.
1. Locate the `chainguard-maven` repository.
1. Hover over the row and click the **...** in the last column on the right.
1. Select **Set Me Up** in the dialog.
1. Click **Generate Token & Create Instructions**.
1. Copy the generated token value to use as the password for authentication.
1. Click **Generate Settings**.
1. Copy the value from a **url** field. They are all identical. For example,
   `https://exampleorg.jfrog.io/artifactory/java-all/` with `exampleorg`
   replaced with the name of your organization.

Use the URL of the virtual repository in the [build
configuration](/chainguard/libraries/java/build-configuration/) and build a
first test project. In a working setup the chainguard remote repository contains
all libraries retrieved from Chainguard.

<a name="nexus"></a>

## Sonatype Nexus Repository

[Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository)
includes a `maven-public` repository group out of the box. It groups access to
the Maven Central Repository from the `maven-central` repository with the
internal `maven-releases` and `maven-snapshot` repositories. Refer to the [Maven
Repositories documentation for
Nexus](https://help.sonatype.com/en/maven-repositories.html) for more
information.

If you are using this group, you can add a proxy repository for Chainguard
Libraries for Java repository for production use.

The recommended approach is to rely on Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
configuring a single proxy repository pointed at
`https://libraries.cgr.dev/java/` rather than adding a separate Maven Central
proxy. Refer to [Manually managing fallback](#manually-managing-fallback) if you need
to control fallback ordering yourself.

### Initial configuration

Use the following steps to add Chainguard Libraries for Java as a proxy repository.

If you are configuring your own fallback rather than using upstream fallback,
for initial testing create a separate proxy repository for the Maven Central
Repository, a separate proxy repository for Chainguard Libraries for Java, and a
separate repository group.

1. Log in as a user with administrator privileges.
1. Click the gear icon in the top navigation bar to access **Server administration**.

Configure a remote repository for the Chainguard Libraries for Java repository:

1. Select **Repository - Repositories** in the left hand navigation.
1. Click **Create repository**, then select the `maven2 (proxy)` recipe.
1. Configure the repository:
    * **Name**: `java-chainguard`
    * **Maven 2 - Version policy**: `Release`.
    * **Proxy - Remote storage**: Add the URL `https://libraries.cgr.dev/java/`
    * **HTTP - Authentication** Select the `username` **Authentication type**, and
   provide the [username and password values as retrieved with
   chainctl](/chainguard/libraries/introduction/access/).
1. Click **Create repository**.
1. If you are using the separate repository with remediated Java libraries, repeat the preceding steps to create remote repository named `java-chainguard-remediated` with a URL set to `https://libraries.cgr.dev/java-remediated/`. Use the same authentication details.

If you are manually managing fallback, you can configure an additional `java-public` remote repository for Maven Central with lower priority.

### Combine a new repository group

Combine a new repository group and add the repositories:

1. Select **Repository - Repositories** in the left hand navigation.
1. Click **Create repository**, then select the `maven2 (group)` recipe.
1. Configure the repository:
    * **Name**: `java-all`
    * Under **Group - Member repositories**, move the new repository `java-chainguard` to the right. If you are using the remediated repository, move the `java-chainguard-remediated` repository to the right, above the `java-chainguard` repository.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Click **Browse** in the **Welcome** view or the browse icon (cube) in the top
   navigation bar.
1. Locate the **URL** column for the `java-all` repository group and click
   **Copy**.
     * For example, `https://repo.example.com/repository/java-all/` (with
   `repo.example.com` replaced with the hostname of your repository manager).
1. Use your configured username and password, unless **Security > Anonymous
   Access > Access > Allow anonymous users to access the server** is
   activated. Details vary based on your configured authentication system.

Use the URL of the repository group, such as
`https://repo.example.com/repository/java-all/` or
`https://repo.example.com/repository/maven-public/` in the [build
configuration](/chainguard/libraries/java/build-configuration/) and build a
first test project. In a working setup the `java-chainguard` proxy repository contains
all libraries retrieved from Chainguard.

---

### Migrating a Java project to Chainguard Libraries
_Path: chainguard/libraries/java/migration.md_

Chainguard Libraries for Java provides a curated repository of packages rebuilt from upstream sources and [scanned for malware](/chainguard/libraries/introduction/overview/#malware-and-greyware-detection). Because Chainguard Libraries uses the standard Maven repository format, switching an existing project requires only a repository configuration change — no changes to your application code or dependency versions.

This guide walks through migrating an existing Java project to Chainguard Libraries, covering the two most common setups:

- Direct access — your build tool connects directly to libraries.cgr.dev. This option is faster for initial evaluation and smaller-scale setups.
- Repository manager — your build tool connects to a repository manager ([Cloudsmith](/chainguard/libraries/java/global-configuration/#cloudsmith), [Google Artifact Registry](/chainguard/libraries/java/global-configuration/#google-artifact-registry), [JFrog Artifactory](/chainguard/libraries/java/global-configuration/#jfrog-artifactory), or [Sonatype Nexus](/chainguard/libraries/java/global-configuration/#sonatype-nexus-repository)), which proxies requests to Chainguard Libraries.

To follow along with a ready-made project instead of your own, use the [Chainguard Libraries for Java demo repository](https://github.com/chainguard-demo/chainguard-libraries-java). It provides Maven and Gradle example projects, including a minimal Spring Boot application and CVE remediation demos.

For a reference of the configuration options for each supported build tool, check out [Configure Java build tools](/chainguard/libraries/java/build-configuration/).

## Prerequisites

Before you begin, you need:

- An existing Java project
- [`chainctl` installed and authenticated](/platform/chainctl-usage/how-to-install-chainctl/)

### Create an entitlement

You must have an [entitlement to Chainguard Libraries](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/) for Java with [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) enabled.

To create an entitlement to Chainguard Libraries for Java and enable upstream fallback, which includes a default 7-day cooldown, run the following command:

```shell
chainctl libraries entitlements create --ecosystems=JAVA --policy=CHAINGUARD_AND_UPSTREAM
```

Alternatively, you can create an entitlement in the Chainguard Console: while viewing the Java ecosystem page, follow the prompts to create an access token.

You can also configure cooldown policies after you create the entitlement. For example, to create and enforce a policy that disables the cooldown:

```shell
chainctl libraries policy create --name=java-disable-cooldown --cooldown-days=0
chainctl libraries policy enable java-disable-cooldown --ecosystem=JAVA --mode=ENFORCE
```

It can take up to 30 minutes for the fallback and cooldown policies to take effect. Learn more about cooldown and other policies in the [Libraries policies documentation](/chainguard/chainguard-repository/library-policies/).

> **Note**: If you choose to manage your own fallback to upstream repositories, refer to the following docs pages for more information: [Build configuration](/chainguard/libraries/java/build-configuration/) for direct access instructions or [Global configuration](/chainguard/libraries/java/global-configuration/) for repo manager instructions. Note that configuring a public fallback bypasses the protections provided by Chainguard.

## Step 1: Confirm your baseline build

Before making any changes, confirm your project builds cleanly against Maven Central.

{{< tabs label="Build tool for confirming your baseline build" >}}

{{% tab title="Maven" %}}

```shell
cd your-project
./mvnw install
```

{{% /tab %}}

{{% tab title="Gradle" %}}

```shell
cd your-project
./gradlew build
```

{{% /tab %}}

{{% tab title="Bazel" %}}

```shell
cd your-project
bazel build //...
```

{{% /tab %}}

{{< /tabs >}}

All dependencies should download from Central and tests should pass. This gives you a baseline to compare against after migration.

## Step 2: Generate a pull token

You must be an Owner or have the `libraries.java.pull_token_creator` permission to create a pull token.
You can [create a pull token in the Chainguard Console](/chainguard/libraries/introduction/access/#creating-pull-tokens-with-the-chainguard-console), or via `chainctl`.

The following command creates the token and populates environment variables directly. If you have access to more than one Chainguard organization, add `--parent=<organization>` to choose which one the token belongs to:

```shell
eval $(chainctl auth pull-token --repository=java --name=my-java-token --output=env)
```

This results in values for the `CHAINGUARD_JAVA_IDENTITY_ID` and `CHAINGUARD_JAVA_TOKEN` variables. The token is named `my-java-token`, with a default expiration of 30 days. To configure the expiration, use the `--ttl` flag.

Learn more about command options in the [chainctl documentation](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/).

When configuring direct access, note that environment variables do not persist between terminal sessions. You must re-export them each time you open a new terminal, or add them to your shell profile. Learn more about pull tokens in the [Access documentation](https://edu.chainguard.dev/chainguard/libraries/introduction/access/).

### Do not commit credentials to version control

The Gradle `build.gradle` file and the Maven `pom.xml` are typically committed to a repository — always use environment variables for credentials rather than hardcoding token values directly in the file. Maven credentials live in `~/.m2/settings.xml`, which is outside the project directory and not committed by default, but take care not to add it to your repository. Store tokens as CI secrets referenced via environment variables instead. If you accidentally commit credentials, [delete the exposed token](/chainguard/libraries/introduction/access/#pull-token-management).

For more secure credential management, consider using a secrets manager such as 1Password CLI or Bitwarden, which can dynamically inject environment variables at runtime without storing token values in shell profiles or env files.

### Verify your setup

Run the following command for a connectivity and authentication check:

```bash
curl -u "$CHAINGUARD_JAVA_IDENTITY_ID:$CHAINGUARD_JAVA_TOKEN" \
  https://libraries.cgr.dev/java/
```

The command returns an HTML page listing repository directories. If credentials are invalid or expired, the command returns a 403 error instead of the directory listing.

## Step 3: Configure repository access

The `https://libraries.cgr.dev/java/` endpoint is also the [Chainguard Repository](/chainguard/chainguard-repository/overview/) endpoint for Java. By default, it serves only Chainguard-built artifacts. When upstream fallback is enabled for your organization, the same endpoint can also serve requested versions from Maven Central under Chainguard security controls.

### Direct access

{{< tabs label="Build tool for direct access configuration" >}}

{{% tab title="Maven" %}}

Maven repository and credentials configuration lives in a `settings.xml` file. For a project-local setup, place this file in the `.mvn` folder of your project and pass `-s .mvn/settings.xml` when running Maven commands.

First, create a `.mvn` directory if it doesn't already exist:

```bash
mkdir -p .mvn
```

Next, create a `.mvn/settings.xml` file with the following content. This configuration sets the Chainguard [remediated repository](/chainguard/libraries/policies-and-security/cve-remediation/) as the first source, followed by the standard Chainguard repository, with Maven Central set as `invalid` to avoid accidental unintended fallback to the public repository:

```xml
<settings>
  <servers>
    <server>
      <id>chainguard-remediated</id>
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>
    </server>
    <server>
      <id>chainguard</id>
      <username>${env.CHAINGUARD_JAVA_IDENTITY_ID}</username>
      <password>${env.CHAINGUARD_JAVA_TOKEN}</password>
    </server>
  </servers>

  <profiles>
    <profile>
      <id>chainguard</id>
      <repositories>
        <repository>
          <id>chainguard-remediated</id>
          <url>https://libraries.cgr.dev/java-remediated/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
          <id>chainguard</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
          <id>central</id>
          <url>https://invalid</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>chainguard-remediated</id>
          <url>https://libraries.cgr.dev/java-remediated/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>
        <pluginRepository>
          <id>chainguard</id>
          <url>https://libraries.cgr.dev/java/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>
        <pluginRepository>
          <id>central</id>
          <url>https://invalid</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>false</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>

    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>chainguard</activeProfile>
  </activeProfiles>
</settings>
```

{{% /tab %}}

{{% tab title="Gradle" %}}

Update the repositories block in `app/build.gradle` to point to Chainguard Libraries. If you are using the remediated repository, set it first.

> **Note**: If your project manages repositories in `settings.gradle`, add the Chainguard repositories there instead.

```build.gradle
repositories {
    maven {
        url = uri("https://libraries.cgr.dev/java-remediated/")
        credentials {
            username = providers.environmentVariable("CHAINGUARD_JAVA_IDENTITY_ID").orNull
            password = providers.environmentVariable("CHAINGUARD_JAVA_TOKEN").orNull
        }
    }
    maven {
        url = uri("https://libraries.cgr.dev/java/")
        credentials {
            username = providers.environmentVariable("CHAINGUARD_JAVA_IDENTITY_ID").orNull
            password = providers.environmentVariable("CHAINGUARD_JAVA_TOKEN").orNull
        }
    }
    mavenCentral()
}
```

If a dependency's pom file is found in Chainguard but the JAR is not, Gradle fails rather than falling back to Central automatically. If this happens, check whether a newer version of the dependency is available in Chainguard's catalog and update the version in your `build.gradle`.

{{% /tab %}}

{{% tab title="Bazel" %}}

Bazel uses `MODULE.bazel` to configure repositories via `rules_jvm_external`. The configuration described on this page uses `~/.netrc`, but note that `.netrc` only supports one set of credentials per hostname. Since all Chainguard Libraries are served from `libraries.cgr.dev`, configuring `.netrc` for Java will override credentials for any other ecosystem.

First, set up `~/.netrc` with your Chainguard credentials:

```bash
printf 'machine libraries.cgr.dev\nlogin %s\npassword %s\n' "$CHAINGUARD_JAVA_IDENTITY_ID" "$CHAINGUARD_JAVA_TOKEN" > ~/.netrc
chmod 600 ~/.netrc
```

> **Note**: `~/.netrc` stores credentials in plaintext on disk. Be careful not to copy `.netrc` into a project directory where it could be accidentally committed to version control. Use short-lived tokens and rotate them regularly. In CI environments, prefer writing credentials to a temporary `.netrc` file that is cleaned up after the build, or use your CI platform's secrets management to inject credentials as environment variables instead. If you accidentally expose credentials, [delete the exposed token](/chainguard/libraries/introduction/access/#pull-token-management).

Next, update the `MODULE.bazel` to point to Chainguard Libraries. If you are using the remediated repository, add `https://libraries.cgr.dev/java-remediated/` first:

```module.bazel
maven.install(
    artifacts = [
        # your artifacts here
    ],
    repositories = [
        "https://libraries.cgr.dev/java-remediated/",
        "https://libraries.cgr.dev/java/",
    ],
    use_credentials_from_home_netrc_file = True,
)
```

The `use_credentials_from_home_netrc_file = True` attribute tells the dependency resolver to read credentials from `~/.netrc` when authenticating with repositories. Without this flag, the `~/.netrc` is ignored, and requests to Chainguard fail authentication silently.

{{% /tab %}}

{{< /tabs >}}

### Repository manager

If your organization uses a repository manager, configure it to use Chainguard Libraries as an upstream source first. Follow the [global configuration documentation](/chainguard/libraries/java/global-configuration/) for your repository manager.

Once configured, point your build tool at your repository manager URL. In this setup, the credentials your build tool uses are your repository manager credentials — not a Chainguard pull token.

{{< tabs label="Build tool for repository manager configuration" >}}

{{% tab title="Maven" %}}

Create or update `~/.m2/settings.xml` to point Maven at your repository manager and override Central with invalid URLs. Refer to example settings files in [Chainguard's demo repository on GitHub](https://github.com/chainguard-demo/chainguard-libraries-java/tree/main/tools) for different repository managers.

Use a configuration similar to the following. Make sure to update the credentials in the `server` section to use your repository manager account credentials, using environment variables when possible. This example uses environment variables for Artifactory credentials:

```xml
<settings>

  <mirrors>
    <mirror>
      
      <id>example</id>
      
      <mirrorOf>*</mirrorOf>

      <url>http://localhost:8081/repository/java-all/</url>
    </mirror>
  </mirrors>

  <activeProfiles>
    <activeProfile>repo-manager</activeProfile>
  </activeProfiles>
  <profiles>
    <profile>
      <id>repo-manager</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <servers>
    <server>
      <id>repo-manager</id>
      <username>${env.ARTIFACTORY_USERNAME}</username>
      <password>{env.ARTIFACTORY_PASSWORD}</password>
    </server>
  </servers>
</settings>
```

{{% /tab %}}

{{% tab title="Gradle" %}}

Update the `repositories` block in `app/build.gradle` to point to your repository manager, removing any direct references to `mavenCentral()` or other repositories if your repository manager already proxies them:

```groovy
repositories {
    maven {
        url = uri("https://repo.example.com/java-all/")
        credentials {
            username = providers.environmentVariable("REPO_MANAGER_USERNAME").orNull
            password = providers.environmentVariable("REPO_MANAGER_PASSWORD").orNull
        }
    }
}

```

{{% /tab %}}

{{% tab title="Bazel" %}}

First, configure your repo manager authentication in `~/.netrc`:

```netrc
machine repo.example.com
login YOUR_REPO_MANAGER_USERNAME
password YOUR_REPO_MANAGER_PASSWORD
```

Then update MODULE.bazel to point to your repo manager:

```module.bazel
maven.install(
    artifacts = [
        # your artifacts here
    ],
    repositories = [
        "https://repo.example.com/java-all/",
    ],
    use_credentials_from_home_netrc_file = True,
)
```

{{% /tab %}}

{{< /tabs >}}

Replace `https://repo.example.com/java-all/` with your repo manager's virtual repository URL, and update the username and password.

## Step 4: Refresh dependencies

To force re-resolution from Chainguard, you can clear local caches or clear only relevant artifacts.

{{< tabs label="Build tool for refreshing dependencies" >}}

{{% tab title="Maven" %}}

Remove local cache:

```bash
rm -rf ~/.m2/repository
```

Remove specific artifact:

```bash
rm -rf ~/.m2/repository/<group>/<artifact>
```

{{% /tab %}}

{{% tab title="Gradle" %}}

Remove local caches and stop any running daemons:

```bash
rm -rf ~/.gradle/caches
./gradlew --stop
```

> **Note**: Run `./gradlew --stop` after clearing the Gradle cache to stop any running daemons. Skipping this step can cause build errors on the next run.

{{% /tab %}}

{{% tab title="Bazel" %}}

Remove the Bazel cache, including all downloaded artifacts and build outputs:

```shell
bazel clean --expunge
```

{{% /tab %}}

{{< /tabs >}}

## Step 5: Build the project

Run a full build and capture the output.

{{< tabs label="Build tool for building the project" >}}

{{% tab title="Maven" %}}

```bash
cd your-project
./mvnw install 2>&1 | tee /tmp/mvn-output.txt
```

To check which repositories served completed downloads:

```bash
grep "Downloaded from" /tmp/mvn-output.txt
```

All downloads should come from `chainguard` or `chainguard-remediated`.

{{% /tab %}}

{{% tab title="Gradle" %}}

```bash
cd your-project
./gradlew build --info 2>&1 | tee /tmp/gradle-output.txt
```

{{% /tab %}}

{{% tab title="Bazel" %}}

```bash
bazel build //... 2>&1 | tee /tmp/bazel-output.txt
```

Bazel embeds the source repository URL in the cache path for each downloaded artifact.

{{% /tab %}}

{{< /tabs >}}

Look for lines beginning with `Downloaded from chainguard:` or `Downloaded from chainguard-remediated:` to confirm artifacts are being served by Chainguard.

If all artifacts download from Central, your credentials may be invalid or expired. Regenerate your pull token, re-export the pull token credentials as environment variables, then clear the cache and rebuild.

## Step 6: Verify artifacts

To check whether a specific artifact was built by Chainguard, use `chainctl libraries verify /full/path/to/artifact.jar`. Verify artifacts immediately after a clean build, before any repackaging.

When upstream fallback is enabled, [packages that aren't built by Chainguard] are subject to Chainguard's security controls.

{{< tabs label="Build tool for verifying artifacts" >}}

{{% tab title="Maven" %}}

To list all downloaded JARs:

```bash
find ~/.m2/repository -name "*.jar"
```

Pick any JAR from the output to verify. For example:

```bash
chainctl libraries verify \
  ~/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar
```

A checksum mismatch means the artifact came from Central rather than Chainguard. This can happen if the artifact was cached from a previous build. To resolve, delete the specific artifact and re-download it:

```bash
rm ~/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar
./mvnw dependency:get -Dartifact=org.apache.commons:commons-lang3:3.13.0
```

Then run `chainctl libraries verify` again.

{{% /tab %}}

{{% tab title="Gradle" %}}

Gradle stores JARs in a content-addressed cache. To list all downloaded JARs:

```bash
find ~/.gradle/caches/ -name "*.jar"
```

This command returns the full paths of your project dependencies. Choose one of the JARs, and verify it using the full path. For example:

```bash
chainctl libraries verify ~/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/20.0/c2ea0b73679bc223a7ab119afd0ece31636173bc/guava-20.0.jar
```

A checksum mismatch means the artifact came from Central rather than Chainguard. This can happen if the artifact was cached from a previous build. To resolve, delete the specific artifact and re-download it. For example:

```bash
rm -rf ~/.gradle/caches/modules-2/files-2.1/commons-collections
./gradlew dependencies
```

Then run `chainctl libraries verify` again.

{{% /tab %}}

{{% tab title="Bazel" %}}

Bazel embeds the source repository URL in the cache path, making it easy to identify which JARs came from Chainguard. Use `find` to locate a JAR. For example:

Linux:

```bash
find ~/.cache/bazel -path "*cgr.dev*" -name "jackson-databind*.jar" 2>/dev/null
```

MacOS:

```bash
find ~/Library/Caches/bazel -path "*cgr.dev*" -name "jackson-databind*.jar" 2>/dev/null
```

Then verify using the full path. For example:

```bash
chainctl libraries verify ~/Library/Caches/bazel/_bazel_example/c22a55500...f4231148aeda823%40libraries.cgr.dev/java/com/fasterxml/jackson/core/jackson-databind/2.9.10/jackson-databind-2.9.10.jar
```

{{% /tab %}}

{{< /tabs >}}

> **Note**: Running `chainctl libraries verify` requires the `libraries.java.pull` permission or the Owner role.

A successful result shows what percentage of your project's dependencies were built by Chainguard:

```bash
Artifact: /path/to/artifact.jar
Verification Coverage: 100.00%
```

## Packages not available in Chainguard Libraries

Chainguard Libraries covers a large and growing collection of Java packages, but not every package or version is available. If a package is missing, your install will fail with a 404 unless you have configured [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

With upstream fallback enabled, packages not yet available from Chainguard are proxied from Maven Central, subject to Chainguard's security controls. Confirm your current policy with:

```shell
chainctl libraries entitlements list
```

For repository manager setups, Chainguard recommends using the configurable fallback rather than configuring a separate public registry fallback in your repository manager, to preserve Chainguard’s security controls.

Learn more about upstream fallback configurations in the [Libraries overview](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

When the upstream fallback is enabled, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a version you pulled from Maven Central stable after Chainguard publishes its own build. This prevents unexpected checksum mismatches across rebuilds.

---

### Chainguard Libraries for Java overview
_Path: chainguard/libraries/java/overview.md_

Chainguard Libraries for Java provides enhanced security for the Java ecosystem by rebuilding dependencies from Maven Central and other common repositories with the latest patches and comprehensive supply chain protection. This service addresses critical vulnerabilities in the vast Java/JVM ecosystem that spans hundreds of projects from organizations like the Apache Software Foundation, Eclipse Foundation, and numerous independent maintainers.

Chainguard Libraries for Java provides access to all open source libraries
commonly used. New releases of common libraries or artifacts requested by
customers are added to the growing index by an automated system. The number of
included libraries continues to grow. These artifacts are accessible through the
[Chainguard Repository](https://edu.chainguard.dev/chainguard/libraries/chainguard-repository/),
a single endpoint for package retrieval that supports configurable security
policies for both Chainguard-built and upstream packages.

The main public repository for binary artifacts is the [Maven Central
Repository](https://central.sonatype.com/). In operation for over
20 years, it hosts artifacts for most open source projects in the
Java community. It is the default repository in all commonly used build tools
from the Java community including [Apache Maven](https://maven.apache.org/),
[Gradle](https://gradle.org/), and others, and uses the Maven repository format.
Chainguard Libraries for Java covers a broad and growing set of artifacts from
Maven Central.

While Maven Central is the primary reference repository, Chainguard Libraries
for Java also builds binaries for open source projects available in other
repositories like the Google or Confluent repositories. This covers libraries
not found on Maven Central, sourced from
[Google](https://maven.google.com/web/index.html),
[Oracle](https://www.oracle.com/webfolder/application/maven/index.html),
[JetBrains](https://www.jetbrains.com/intellij-repository/releases),
CERN,
[Confluent](https://packages.confluent.io/maven/), [Gradle](https://plugins.gradle.org/m2/), and other public artifact repositories.
Note that coverage is not exhaustive for any single repository; the index
continues to grow, and any request for a missing library or version
automatically triggers a process to provision the artifacts from relevant
sources if available.

## Runtime requirements

The runtime requirements for Java artifacts available from Chainguard Libraries
for Java are identical to the requirements of the original upstream project. For
example, if a JAR retrieved from Maven Central requires Java 17 or higher, the
same Java 17 runtime requirement applies to the binary artifact from Chainguard
Libraries for Java.

## Technical details

You must use the [username and password retrieved with
chainctl](/chainguard/libraries/introduction/access/) to access the Chainguard
Libraries for Java repository.

The URL for the repository is:

```
https://libraries.cgr.dev/java/
```

This site provides a directory browsing and file listing capability similar to the Maven Central repository, allowing you to find available libraries, library versions, and available files. Learn more under [Manual access](#manual).

This Chainguard Libraries for Java repository uses the Maven repository format
and only includes release artifacts of the libraries built by Chainguard from
source. It does not include all artifacts from Maven Central or other repositories. Snapshot versions are not available.

The following components can be required by your application
builds, but are not included:

* Binary versions of closed-source libraries. The Maven Central Repository and
  other repositories often include such libraries. They enable interoperability
  with open source applications and development of internal applications as a
  combination of these libraries and other open source libraries. Examples include
  JDBC drivers for proprietary databases such as Oracle
* Other artifacts that are found in the Maven Central Repository with incomplete
  information about the location of the source code or a pointer to a location
  with access restrictions or an incomplete source, that prevents creation of a
  binary by Chainguard.

Some types of artifacts are included if the source build produces them, but are
often not available:

* JAR artifacts containing the source code
* JAR artifacts containing JavaDoc HTML files
* Distributable versions of artifacts such JARs with dependencies or tar.gz archives
* Other package formats sometimes found such as RPMs, SO files, Android AARs,
  and similar, rarely used artifacts

As a result, **you must configure the repository as the first point of contact and
request for any retrieval of a library**. This ensures that any library that is
available from Chainguard is also used. In addition, any failed requests are
flagged at Chainguard and backfill processes are run where possible.

At the same time, you must continue to use the Maven Central Repository, and any
other repository that fills the needs for libraries that are not available from
the Chainguard Libraries repository.

Typically the access is [configured globally on a repository manager for your
organization](/chainguard/libraries/java/global-configuration/). This approach
is strongly recommended.

Alternatively, you can use the token for direct access from a build tool as
discussed in [Build
configuration](/chainguard/libraries/java/build-configuration/).

For a step-by-step walkthrough of moving an existing Maven or Gradle project to
Chainguard Libraries, check out the [Java migration
guide](/chainguard/libraries/java/migration/).

## CVE remediation

Chainguard Libraries for Java includes the [CVE
Remediation](/chainguard/libraries/policies-and-security/cve-remediation/) feature, available in beta for Spring Boot. Remediated
libraries include an appended local version identifier of `-0.cgr.N`.

For example, if `org.apache.commons:commons-lang3:3.18.0` has a remediated build, that build is published as `org.apache.commons:commons-lang3:3.18.0-0.cgr.1`. If Chainguard publishes another remediated iteration for the same base version, the trailing number increases, such as `-0.cgr.2` or `-0.cgr.3`.

Maven and Gradle treat the `-0` as part of the version ordering. In practice, `3.18.0-0.cgr.1` sorts higher than `3.18.0`. This means version ranges or dependency management rules can resolve to the remediated build when the overlay repository is available.

Learn how to opt in to remediated versions in the [Java build configuration docs](/chainguard/libraries/java/build-configuration/#selecting-remediated-library-versions).

### Troubleshooting resolution issues

Enabling the remediated repository does not typically require clearing caches. However, clearing the cache may help when troubleshooting resolution issues.

Maven:

```bash
rm -rf ~/.m2/repository
```

Gradle:

```bash
rm -rf ~/.gradle/caches/
```

Bazel:

```bash
bazel clean --expunge
```

<a id="manual"></a>

## Manual access

To manually access artifacts in the Chainguard Libraries for Java repository, use the URL [`https://libraries.cgr.dev/java/`](https://libraries.cgr.dev/java/)
with your [username and password retrieved with
chainctl](/chainguard/libraries/introduction/access/).

This site provides a directory browsing and file listing capability similar to
the Maven Central repository at
[`https://repo1.maven.org/maven2/`](https://repo1.maven.org/maven2/). The
structure follows the [Maven repository
format](https://maven.apache.org/repository/layout.html). The `groupId` and
`artifactId` of a library is used to create a nested directory structure,
similar to the package structure within Java projects.

For example, the Maven coordinates for [Apache Commons
Lang](https://commons.apache.org/proper/commons-lang/) are the following:

```xml
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
<version>3.13.0</version>
```

**Find available versions**

List the versions that Chainguard has built for a library by requesting its
`maven-metadata.xml` file at the `groupId`/`artifactId` path. The `groupId`
`org.apache.commons` becomes the nested directories `org/apache/commons`, and the
`artifactId` adds the `commons-lang3` directory:

```
https://libraries.cgr.dev/java/org/apache/commons/commons-lang3/maven-metadata.xml
```

The repository only includes release artifacts that Chainguard builds from source,
so the versions listed may differ from those available on Maven Central.

**List the files for a version**

Each version has its own leaf directory, formed by appending the `version` to the
`groupId`/`artifactId` path. This version directory is browsable and lists all
files for that specific library version:

```
https://libraries.cgr.dev/java/org/apache/commons/commons-lang3/3.13.0/
```

For the `org.apache.commons:commons-lang3:3.13.0` library, this directory includes
the main Maven metadata file `commons-lang3-3.13.0.pom`, the main JAR file
`commons-lang3-3.13.0.jar`, related checksum files, and the SBOM and attestation
files described below. Specific files vary between libraries.
**Find available versions**

List the versions that Chainguard has built for a library by requesting its
`maven-metadata.xml` file at the `groupId`/`artifactId` path. The `groupId`
`org.apache.commons` becomes the nested directories `org/apache/commons`, and the
`artifactId` adds the `commons-lang3` directory:

```
https://libraries.cgr.dev/java/org/apache/commons/commons-lang3/maven-metadata.xml
```

The repository only includes release artifacts that Chainguard builds from source,
so the versions listed may differ from those available on Maven Central.

**List the files for a version**

Each version has its own leaf directory, formed by appending the `version` to the
`groupId`/`artifactId` path. This version directory is browsable and lists all
files for that specific library version:

```
https://libraries.cgr.dev/java/org/apache/commons/commons-lang3/3.13.0/
```

For the `org.apache.commons:commons-lang3:3.13.0` library, this directory includes
the main Maven metadata file `commons-lang3-3.13.0.pom`, the main JAR file
`commons-lang3-3.13.0.jar`, related checksum files, and the SBOM and attestation
files described below. Specific files vary between libraries.

All filenames can be used to download individual files.

Use `curl`, specify the username and password retrieved with [chainctl for basic
user authentication](/chainguard/libraries/introduction/access/) and use the URL of the file to
download and save the file with the original name.

With [.netrc authentication](/chainguard/libraries/introduction/access/#netrc):

```shell
curl -n -L \
  -O https://libraries.cgr.dev/java/commons-io/commons-io/2.13.0/commons-io-2.13.0.pom
  -O https://libraries.cgr.dev/java/commons-io/commons-io/2.13.0/commons-io-2.13.0.pom
```

With [environment variables](/chainguard/libraries/introduction/access/#env):

```shell
curl -L --user "$CHAINGUARD_JAVA_IDENTITY_ID:$CHAINGUARD_JAVA_TOKEN" \
  -O https://libraries.cgr.dev/java/commons-io/commons-io/2.13.0/commons-io-2.13.0.pom
  -O https://libraries.cgr.dev/java/commons-io/commons-io/2.13.0/commons-io-2.13.0.pom
```

The option `-L` is required to follow redirects for the actual file locations.

[Use checksums of any file to
verify](/chainguard/libraries/java/management/#java-verification) if it
originates from the Chainguard repository.

## SBOM and attestation files

Chainguard Libraries for Java include files that contain software bill of
material (SBOM) information. Additional files attest details about build
infrastructure with  the [Supply-chain Levels for Software Artifacts
(SLSA)](https://slsa.dev/) provenance information.

The related files for Chainguard Libraries for Java are located in the same
location as the `.pom`, `.jar`, and other artifacts for a specific library
version and uses the same `artifactId-version` naming convention with the
following extensions:

* `.slsa-attestation.json` for the SLSA provenance attestation
* `.spdx.json` for the SBOM information
* `.spdx.json` for the SBOM information

For example, the files for artifactId `commons-compress` and version
`1.23.0` are located in the version directory
[https://libraries.cgr.dev/java/org/apache/commons/commons-compress/1.23.0/](https://libraries.cgr.dev/java/org/apache/commons/commons-compress/1.28.0/).
It includes the following files:

* `commons-compress-1.23.0.pom`
* `commons-compress-1.23.0.jar`
* `commons-compress-1.23.0.slsa-attestation.json`
* `commons-compress-1.23.0.spdx.json`

## Upstream fallback policy and controls

Chainguard Libraries for Java supports an optional built-in fallback to
the upstream Maven Central repository, managed through the [Chainguard
Repository](/chainguard/chainguard-repository/overview/). By default, the endpoint serves
only Chainguard-built packages. When the upstream fallback is enabled, upstream packages are
subject to additional security controls before being served, including source code and maintainer behavior scanning and a configurable cooldown period.

For Java, Chainguard's scanning inspects compiled `.class` files, package metadata, and extracted `.jar`, `.war`, and `.ear` archive contents for suspicious patterns and malicious signals.

When the upstream fallback is enabled, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a version you pulled from Maven Central stable after Chainguard publishes its own build. This prevents unexpected checksum mismatches across rebuilds.

Learn more in the [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/).

---

### Manage and update dependencies
_Path: chainguard/libraries/java/management.md_

Chainguard Libraries for Java operates transparently after configuring your [repository manager](/chainguard/libraries/java/global-configuration/) or [your build tool](/chainguard/libraries/java/build-configuration/), automatically providing security-enhanced versions of your Maven dependencies. After you configure Chainguard Libraries for Java, use this page for recurring maintenance tasks.

Chainguard Libraries serves Chainguard-built artifacts when they are available. When [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls/) is enabled, an artifact that Chainguard has not yet built may first be served through Chainguard’s upstream tier. With [build pinning](/chainguard/libraries/policies-and-security/build-pinning/), the exact package version remains pinned to the artifact tier your organization first received, so a previously downloaded upstream artifact is not immediately replaced when Chainguard publishes a built equivalent.

Existing artifacts may already be present in a developer’s local Maven cache or in a repository manager cache, so a previously downloaded upstream artifact is not automatically replaced just because a Chainguard-built equivalent becomes available.

The following sections detail optional management, maintenance, and auditing
steps on the repository manager and the build tool.

<a id="java-verification"></a>

## Verify dependencies

Use `chainctl libraries verify` to check whether an artifact comes from Chainguard Libraries:

```bash
chainctl libraries verify path/to/artifact.jar
```

For Java, run verification against the individual JAR files in the local Maven repository cache before assembling a fat JAR or other bundled artifact. The verifier identifies artifacts using their checksums and provenance information; it cannot reliably trace merged classes in a fat JAR back to their source JARs.

For command options, permissions, and supported artifact types, refer to the [Verification documentation](/chainguard/libraries/policies-and-security/verification/).

### Inspect artifacts in a repository manager

If your organization uses a repository manager, you can inspect the Chainguard proxy or remote repository to audit which artifacts were retrieved through Chainguard Libraries. Use the repository manager’s package or browsing view to locate an artifact and compare its coordinates, file name, size, checksum, and available metadata.

Refer to the [Verification page](/chainguard/libraries/policies-and-security/verification/) for more information on verifying artifacts in a repository manager.

## Refresh cached artifacts

The number of available artifacts in Chainguard Libraries for Java increases
over time. If an artifact was already retrieved from the Maven Central
Repository and is available in your repository manager or local repository it is
not automatically replaced with the equivalent Chainguard Library version.

To adopt a newer Chainguard-built artifact, refer to the [build pinning documentation](/chainguard/libraries/build-pinning/#adopt-a-chainguard-build-after-removing-a-pin) for instructions on removing existing pinned versions.

Refreshing cached artifacts may also be necessary to solve other issues, such as stale or corrupted artifacts or metadata, repository configuration changes, and resolution troubleshooting. To refresh the same artifact your organization is already using:

1. Remove the affected artifact from the developer’s local Maven cache.
1. If applicable, remove the affected artifact from the repository manager’s proxy cache, following your organization’s cache-management procedure.
1. Run the build again so Maven requests the artifact from the configured Chainguard Libraries repository.
1. Verify the resulting JARs with `chainctl libraries verify`.

If an exact package version is pinned, Chainguard continues to serve the pinned artifact after the cache is refreshed.

Prefer removing only the affected artifact or dependency subtree. Avoid broadly deleting production or shared caches unless you understand the operational impact and have a recovery plan.

### Prepare for checksum changes

A checksum identifies the exact bytes of a library artifact. Chainguard-built artifacts have different checksums from upstream artifacts with the same Maven coordinates and version because they are rebuilt in a secured environment.

During initial migration, if your project records checksums or integrity values, update those values as part of the migration or cache refresh, then run your normal tests and verification checks. For a full migration sequence, including cache and project-configuration handling, refer to the [migration guide for Chainguard Libraries for Java](/chainguard/libraries/java/migration/).

For organizations that use Chainguard's [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls/), build pinning keeps the exact artifact previously served for that package version. This prevents a later Chainguard rebuild from unexpectedly changing the checksum. You must remove the pin to adopt a newer Chainguard build. Refer to [Build pinning](/chainguard/libraries/policies-and-security/build-pinning/) for more information.

## Security and policy guidance

Refer to the following pages for topics broader than routine dependency maintenance:

- [CVE remediation for Chainguard Libraries](/chainguard/libraries/policies-and-security/cve-remediation/) for remediated library versions and upgrade guidance.
- [Chainguard Libraries policies](/chainguard/chainguard-repository/library-policies/) for upstream fallback, cooldown, and package-serving policy.
- [Error messages](/chainguard/libraries/troubleshooting/errors/) and the [Chainguard Libraries FAQ](/chainguard/libraries/troubleshooting/faq/) for troubleshooting and edge cases.

---

### Chainguard Libraries access
_Path: chainguard/libraries/introduction/access.md_

Chainguard Libraries provide controlled access to security-enhanced Java and
Python dependencies through the unified Chainguard platform authentication
system. This guide explains how to access (download) Chainguard library artifacts for your organization.

## Getting started

### Prerequisites

- Ensure you have access to Chainguard Libraries.
    - If you are not a Chainguard user yet, a new Chainguard account must be
created and you must [add an entitlement to Chainguard Libraries](/chainguard/libraries/introduction/access/#manage-library-entitlements).
- If you have access to more than one Chainguard organization, confirm the name
of the one you want to use. You can then pass it to `chainctl` commands with the
`--parent` parameter.

### Direct access vs. artifact manager

There are two approaches to access: Using an artifact manager or
direct access.

#### Artifact manager

If your organization uses an artifact manager such as Cloudsmith, JFrog Artifactory, or Sonatype Nexus, you can set up and configure credentials once per language ecosystem. Then, all projects and developers automatically inherit
the configuration. This option is recommended for organizations with multiple
teams, and provides centralized access controls and consistent uptime.

#### Direct access

Set up authentication directly in each project's build
configuration. This option allows for faster initial setup, but it does not
allow for global configuration. It requires configuration per project and
workstation, which creates more overhead as you scale across teams and projects.

Both approaches require pull tokens for authentication; refer to [Pull token
characteristics and use](#pull-token-characteristics-and-use) for more information.

> NOTE: For Python users, the [Chainguard keyring
provider](#python-keyring-provider) uses short-lived credentials and is the
preferred method where your environment supports it.

### Initial authentication

Once your user account is created and access is confirmed, [install the
Chainguard Control `chainctl` command line
tool](/platform/chainctl-usage/how-to-install-chainctl/) and log in to your
account:

```shell
chainctl auth login
```

{{< blurb/chainctl-auth >}}

After authentication in a browser window, a successful login displays a message
and a token:

```output
Successfully exchanged token.
Valid! Id: 8a4141a........7d9904d98c
```

<a id="pull-token"></a>

## Creating pull tokens for libraries

Pull tokens authenticate requests to download library artifacts from Chainguard. You can create the pull tokens:

- With [the chainctl command](#creating-pull-tokens-with-chainctl), or
- [Using the Chainguard
  console](#creating-pull-tokens-with-the-chainguard-console).

For environments where short-lived credentials are not suitable, such as some
CI/CD platforms, you can generate a pull token, which provides longer-lived
access to Chainguard Libraries.

To create a pull token you must have the relevant [entitlement](#entitlement)
for the ecosystem and the `libraries.java.pull_token_creator`,
`libraries.javascript.pull_token_creator`, or
`libraries.python.pull_token_creator` role.

### Creating pull tokens with chainctl

Create a new pull token for the Chainguard Libraries for Java with the [chainctl
auth pull-token](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/)
command:

```shell
chainctl auth pull-token --repository=java --ttl=8670h
```

- `--repository=java`: retrieve the token for use with [Chainguard Libraries for
  Java](/chainguard/libraries/java/overview/). Use `python` for a token to use
  [Chainguard Libraries for Python](/chainguard/libraries/python/overview/) and
  `javascript` for a token to use [Chainguard Libraries for
  JavaScript](/chainguard/libraries/javascript/overview/).
- `--ttl=8670h`: set the duration for the validity of the token, defaults to
  `720h` (equivalent to 30 days), maximum valid value is `8760h` (equivalent to
  365 days), valid unit strings range from nanoseconds to hours and are `ns`,
  `us`, `ms`, `s`, `m`, and `h`.

Use the optional `--name` flag to supply a meaningful and short name for the
token, to be able to locate it easier at a later stage.

If you belong to a single organization, `chainctl` selects it automatically. If
you have access to more than one, it asks “With which location is the pull token
associated?” Use the arrow keys to select the organization that has the
entitlement to access Chainguard Libraries for Java, and press `/` to filter the
list. Pass `--parent=<organization>` to skip the prompt.

`chainctl` returns a username and password suitable for basic authentication in
the response:

```output
Username: <identity-id>

Password: <pull-token>
```

### Creating pull tokens with the Chainguard Console

Follow these steps to create a pull token for Chainguard Libraries in the
Chainguard console:

1. Use your authentication details to access the console at
  [https://console.chainguard.dev/](https://console.chainguard.dev/).
2. In the left-hand navigation, click **Overview**.
3. Click the **Manage pull tokens** tab, then click **Create access token**.
    - Alternatively, select **Access Tokens** from the menu at the top of the
      **Settings** page.
4. Configure the access token:
    - **Name**: Provide a name. The name can later be used to locate the token
  in the list.
    - **Description**: Optionally provide a description of the token.
    - **Access**: Choose the library that this token should access.
    - **Expiration**: Set an expiration date for the token. The default is 30
      days.
5. Click **Create token**.
6. When the username and password values are displayed, note these values in a
   secure location, as you will need them for pull token use. These values will
   not be displayed again.

## Pull token characteristics and use

The username is the identity ID of the pull token identity that `chainctl` just
created, and the password is the token itself. `chainctl` labels the same two
values `identity_id` and `token` with `--output=json`, and
`CHAINGUARD_JAVA_IDENTITY_ID` and `CHAINGUARD_JAVA_TOKEN` with `--output=env`.
Refer to [pull token output formats and credential
names](/platform/chainctl-usage/pull-token-output/) for the full mapping.

The returned username and password combination is a new credential set in the
organization that is independent of the account used to create and retrieve the
credential set. It is therefore suitable for use in any service application,
such as a repository manager or a build tool that is not tied to a specific
user. You can also use the token as an individual for your development with
direct access to Chainguard Libraries.

To use the pull token in another environment, supply the username and password
for basic authentication. Note that the actual returned values are much longer.

> **Note**: Chainguard does not offer an SLA for uptime availability of the
> Chainguard Libraries repositories at `libraries.cgr.dev`. To reduce production
> risk and ensure reliability, we recommend proxying the repositories through
> your own artifact repository whenever possible.

For artifact manager setup, see the global configuration guides:

- [Java](/chainguard/libraries/java/global-configuration/)
- [JavaScript](/chainguard/libraries/javascript/global-configuration/)
- [Python](/chainguard/libraries/python/global-configuration/)

For direct access, see the build configuration guides:

- [Java](/chainguard/libraries/java/build-configuration/)
- [JavaScript](/chainguard/libraries/javascript/build-configuration/)
- [Python](/chainguard/libraries/python/build-configuration/)

<a name="env"></a>

### Use environment variables for pull token credentials

Using environment variables for username and password is more secure than hard
coding the values in configuration files. In addition, you can use the same
configuration and files for all users to simplify setup and reduce errors.

Use the `env` environment output option to create a snippet for a new token
suitable for integration in a script.

```shell
$ chainctl auth pull-token --output env --repository=java
export CHAINGUARD_JAVA_IDENTITY_ID=<identity-id>
export CHAINGUARD_JAVA_TOKEN=<pull-token>
```

Combine the call with `eval` to populate the environment variables directly by
calling `chainctl`:

```shell
eval $(chainctl auth pull-token --output env --repository=java)
```

Equivalent commands for Python and JavaScript are supported and result in values
for the `CHAINGUARD_PYTHON_IDENTITY_ID`/`CHAINGUARD_PYTHON_TOKEN` and
`CHAINGUARD_JAVASCRIPT_IDENTITY_ID`/`CHAINGUARD_JAVASCRIPT_TOKEN` variables.

Use the export commands in a `~/.env` or similar file or use your preferred
secrets management application to reuse the token in multiple sessions. Source
the file or load the secrets from the app to have access to the tokens in your
shell session, including build configurations file that can load from
environment variables, for example a Maven `settings.xml` file.

Running this command as part of a login script or some other automation allows
your organization to replace actual username and password values in your build
tool configuration with environment variable placeholders:

- [Java build tool
  configuration](/chainguard/libraries/java/build-configuration/)
- [JavaScript build tool
  configuration](/chainguard/libraries/javascript/build-configuration/)
- [Python build tool
  configuration](/chainguard/libraries/python/build-configuration/)

#### uv index-scoped environment variables

When using `uv` for Python, you can supply credentials through index-scoped
environment variables instead of a shared secrets file or `.netrc`. For a named
index, uv reads `UV_INDEX_<NAME>_USERNAME` and `UV_INDEX_<NAME>_PASSWORD`, where
`<NAME>` is the index name uppercased with hyphens replaced by underscores.

For an index named `chainguard`, set:

```shell
export UV_INDEX_CHAINGUARD_USERNAME="${CHAINGUARD_PYTHON_IDENTITY_ID}"
export UV_INDEX_CHAINGUARD_PASSWORD="${CHAINGUARD_PYTHON_TOKEN}"
```

This pairs well with the `eval` approach above: generate the
`CHAINGUARD_PYTHON_IDENTITY_ID` and `CHAINGUARD_PYTHON_TOKEN` variables, then
map them to uv's index-scoped names. Refer to the [uv build
configuration](/chainguard/libraries/python/build-configuration/#uv) for index
setup details.

<a id="netrc"></a>

### .netrc for authentication

[curl](https://curl.se/) and a number of other tools support configuration of
username and password authentication details for a specific domain in the
[`.netrc`
file](https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html),
typically located in the user's home directory.

Use this approach for authentication to a repository manager in your
organization or to Chainguard Libraries directly, for example with [pip and
others for Chainguard Libraries for
Python](/chainguard/libraries/python/build-configuration/#pip), with [bazel for
Chainguard Libraries for
Java](/chainguard/libraries/java/build-configuration/#bazel) or for manual
testing with curl.

The following example shows a suitable setup for a repo manager available at
`repo.example.com`:

```bash
machine repo.example.com
login YOUR_USERNAME_FOR_REPOSITORY_MANAGER
password YOUR_PASSWORD
```

For a direct connection to Chainguard Libraries, for example for testing with
curl, use the following example with the username
`CHAINGUARD_PYTHON_IDENTITY_ID` and password `CHAINGUARD_PYTHON_TOKEN` value for
the pull token for the desired language ecosystem:

```bash
machine libraries.cgr.dev
login CHAINGUARD_PYTHON_IDENTITY_ID
password CHAINGUARD_PYTHON_TOKEN
```

Note that the long string for the password value must use only one line.

When you use this `.netrc` file in a container build, mount it as a build secret rather than copying it into an image layer. See [Container builds](/chainguard/libraries/policies-and-security/build-containers/).

### Verification

Use the credentials for manual testing in a browser or with a script and curl if
you know the URL for a specific library artifact. Refer to the following
sections for more details:

- [Technical details and manual testing for Java
  libraries](/chainguard/libraries/java/overview/#technical-details)
- [Technical details and manual testing for JavaScript
  libraries](/chainguard/libraries/javascript/overview/#technical-details)
- [Technical details and manual testing for Python
  libraries](/chainguard/libraries/python/overview/#technical-details)
- [Use environment variables](#env)
- [.netrc for authentication](#netrc)

<a id="python-keyring"></a>

## Python keyring provider

Python users can leverage an alternative to pull tokens. The [Chainguard keyring
implementation](https://github.com/chainguard-dev/keyrings-chainguard-libraries)
provides short-lived credentials from supported environments, such as local
development and CI/CD platforms that can use [assumable
identities](/platform/administration/assumable-ids/assumable-ids/).

Where possible, Chainguard recommends using short-lived credentials to access
Chainguard Libraries.

To set up the keyring, install the `keyrings-chainguard-libraries` package:

```shell
pip install keyrings-chainguard-libraries
```

*Note:* If you haven't set up access to Chainguard Libraries for Python, the
above command installs the package from PyPI. After installing and configuring
Chainguard Libraries for Python, you can get the private package again, to get
the package built by Chainguard. To re-install the package:

```bash
pip install keyrings-chainguard-libraries --ignore-installed --no-cache-dir
```

Once the keyring package is installed, when you request to install packages from
Chainguard Libraries for Python, the keyring automatically retrieves short-lived
credentials for you, using `chainctl`.

To use the keyring with a project `uv`, install the keyring:

```shell
uv pip install keyrings-chainguard-libraries
```

*Note:* If you haven't set up access to Chainguard Libraries for Python, the
above command installs the package from PyPI. After installing and configuring
Chainguard Libraries for Python, you can get the private package again, to get
the package built by Chainguard. To re-install the package:

```shell
uv pip install keyrings-chainguard-libraries --reinstall --no-cache
```

By default, [uv disables keyring
auth](https://docs.astral.sh/uv/reference/settings/#keyring-provider).

To enable it in the global uv.toml:

```toml
keyring-provider = "subprocess"
```

To enable it in a project-specific pyproject.toml:

```toml
[tool.uv]
keyring-provider = "subprocess"
```

<a id="pull-token-management"></a>

## Pull token management

Pull tokens are separate identities with username and password that are used for
access to Chainguard Libraries. The tokens have a limited Time to Live (TTL)
with a default of 30 days and a maximum TTL of 365 days.

As a result, pull tokens become invalid after the TTL and are flagged as
expired. For your use of Chainguard Libraries you must replace the token with a
new one.

Expired tokens can no longer be used for access to Chainguard Libraries, but
otherwise do not cause any issues and continue to exist until you delete them.

Inspect all pull tokens for your organization in the Chainguard console:

- Use your authentication details to access the console at
  [https://console.chainguard.dev/](https://console.chainguard.dev/).
- Select **Overview** in the left-hand navigation.
- Select the **Manage pull tokens** tab.
    - Alternatively, select **Settings** in the left-hand navigation, and select
    **Pull Tokens** in the menu on the settings page.

The list includes the following columns:

- **Name** - the name of the pull token, expired pull token are identified by a
  red **Expired** warning.
- **Description** - the description of the pull token
- **Created** - the date when the pull token was created
- **Expiration** - string description of the expiration status of the token,
  such as *in 8 months* or *4 days ago*.
- **Actions** - menu button to perform actions on the pull token, only a Delete
  action is available.

Use the action to remove a pull token:

- Locate the row of the desired pull token, typically an expired token.
- Use the menu button in the **Actions** column of the same row and select
  **Delete**.
- Confirm the deletion in the dialog by pressing **Delete pull token**.

Alternatively use chainctl with the [auth
pull-token](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/) and
[iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)
commands for various inspection and management tasks.

List all pull tokens with the `list` command:

```shell
chainctl auth pull-token list
```

The displayed list includes the following columns:

- **ID** - the identifying username of the pull token
- **NAME** - the name of the pull token
- **DESCRIPTION** - the description of the pull token
- **ROLES** - the assigned organization and role for the pull token. The value
  shows the name of the organization separate from the role with a colon. Valid
  roles are all pull authorization from for apk packages `apk.pull`, container
  images `registry.pull`, Python libraries `libraries.python.pull`, Java
  libraries `libraries.java.pull`, and JavaScript libraries
  `libraries.javascript.pull` .
- **EXPIRES** - the number of days until the end of the TTL period. Negative
  values indicate expired tokens.

List all pull tokens for Chainguard Libraries for Java that are not yet expired:

```shell
chainctl auth pull-token list --repository=java
```

List all expired pull tokens for Chainguard Libraries for Python:

```shell
chainctl auth pull-token list --repository=python --expired=true
```

Use the [delete command for IAM
identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities_delete/)
to delete a specific pull token using its ID `45a0c61ea6fd97...`:

```shell
chainctl iam identities delete 45a0c61ea6fd97...
```

Use the identifier or name of your organization `example` and the `--expired`
flag to remove all expired pull tokens:

```shell
chainctl iam ids rm --expired
```

<a id="entitlement"></a>

## Manage library entitlements

You can create, list, and remove entitlements using [`chainctl libraries entitlements`](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/).

### Create entitlements

As administrator you can use [`chainctl libraries entitlements create`](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/) for one or more ecosystems:

```shell
chainctl libraries entitlements create --ecosystems=JAVASCRIPT,JAVA,PYTHON
```

To enable upstream fallback for JavaScript, use the `--policy` flag:

```bash
chainctl libraries entitlements create --ecosystems=JAVASCRIPT --policy=CHAINGUARD_AND_UPSTREAM
```

To update the upstream fallback policy on an existing entitlement, rerun the `create` command with the new `--policy` value.

### Remove entitlements

You can delete an ecosystem library entitlement for a specific ecosystem from your organization with [`chainctl libraries entitlements delete`](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/):

```shell
chainctl libraries entitlements delete --ecosystem=JAVASCRIPT
```

### List entitlements

You can verify entitlements for your organization `example.com` to verify which ecosystems are enabled:

```shell
chainctl libraries entitlements list
```

The output includes the ecosystem and configured policy in the table:

```output
Ecosystem Library Entitlements for example (45a0...p7q)

                            ID                             | ECOSYSTEM  |             POLICY
-----------------------------------------------------------|------------|--------------------------------
 45a0c61a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q/12345abc67890 | JAVASCRIPT | POLICY_CHAINGUARD_AND_UPSTREAM
 45a0c61a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q/45678abc67890 | JAVA       | POLICY_CHAINGUARD
 45a0c61a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q/56789abc67890 | PYTHON     | POLICY_CHAINGUARD
```

<a id="policy"></a>

## Manage library policies

Users with the Owner role can create, enable, disable, and list library policies using [`chainctl libraries policy`](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/) commands. These policies apply to all packages pulled through Chainguard Repository. The [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) must be enabled for an ecosystem in order to use policies.

Learn about how to manage policies in the [Libraries policies page](/chainguard/chainguard-repository/library-policies/).

---

### Quickstart for Chainguard Libraries
_Path: chainguard/libraries/introduction/quickstart.md_

Most supply chain attacks succeed the same way: malicious code is injected into
a package after the source is written — either as a backdoored binary with no
verifiable source, or as a malicious install-time script that runs the moment a
dependency is pulled. Recent attacks on LiteLLM, Telnyx, and Axios all followed
this pattern.

Chainguard Libraries for Java, JavaScript, and Python are rebuilt from verified
source in an isolated build environment, making them malware-resistant by
design. When a package is available as a Chainguard-built library, that rebuilt
package is served first. When you use the [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
the same ecosystem endpoint can also serve eligible upstream packages that
Chainguard has not yet built, subject to configurable policy controls such as
cooldown and malware scanning. This gives your engineers drop-in replacements
for the packages they already use, with no breaking changes.

This guide covers the high-level steps to get up and running with Chainguard
Libraries. For full reference documentation on any step, follow the links
provided throughout this page. For ecosystem-specific guides, refer to the following
pages:

* [Java migration guide](/chainguard/libraries/java/migration/)
* [JavaScript migration guide](/chainguard/libraries/javascript/migration/)
* [Python migration guide](/chainguard/libraries/python/migration/)

## Prerequisites

Before getting started:

* If you're not yet a Chainguard user, you must [create an
      account](https://console.chainguard.dev/auth/login).
* [Install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) and
  log in:

   ```bash
   chainctl auth login
   ```

   {{< blurb/chainctl-auth >}}

* Entitle access for yourself to Chainguard Libraries.
    * Chainguard Libraries are available to Catalog Starter and Free tier users,
      and trial users.
    * Run the following [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/) command to create an entitlement for libraries:

```bash
chainctl libraries entitlements create --ecosystems=JAVASCRIPT
```

The available `ecosystems` are `JAVA`, `JAVASCRIPT`, and `PYTHON`.

Alternatively, you can create an entitlement and pull token in the Chainguard Console: while viewing a library ecosystem page, follow the prompts to create an access token.

## Step 1: Choose your access method

There are two ways to access Chainguard Libraries: using an [artifact manager](#artifact-manager) or [direct access](#direct-access).

### Artifact manager

Configure credentials once in a tool like JFrog Artifactory, Sonatype Nexus, or
Cloudsmith. This centralizes policy, logging, and fallback behavior, and is the
safest approach for organizations with multiple teams and applications.

Learn how to configure a repository manager in the global configuration
documentation for [Java](/chainguard/libraries/java/global-configuration/),
[JavaScript](/chainguard/libraries/javascript/global-configuration/), and
[Python](/chainguard/libraries/python/global-configuration/).

### Direct access

Configure authentication directly in each project's build configuration.

This option is faster to set up initially, but requires per-project and
per-workstation configuration. This increases the risk of credentials being
committed to source control or going stale.

Learn how to set up direct access in the build configuration documentation for
[Java](/chainguard/libraries/java/build-configuration/),
[JavaScript](/chainguard/libraries/javascript/build-configuration/), and
[Python](/chainguard/libraries/python/build-configuration/).

## Step 2: Create a pull token

[Pull tokens](/chainguard/libraries/introduction/access/#creating-pull-tokens-for-libraries)
are required for authentication. You can [create one using `chainctl`](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token_create/):

{{< tabs label="Language ecosystem for creating a pull token" >}}

{{% tab title="Java" %}}

```bash
chainctl auth pull-token create --repository=java --ttl=720h
```

{{% /tab %}}

{{% tab title="JavaScript" %}}

```bash
chainctl auth pull-token create --repository=javascript --ttl=720h
```

{{% /tab %}}

{{% tab title="Python" %}}

```bash
chainctl auth pull-token create --repository=python --ttl=720h
```

{{% /tab %}}

{{< /tabs >}}

> The default TTL is `720h` (30 days); the maximum is `8760h` (365 days).

The command returns a username and password for basic authentication. Store
these securely, as they won't be shown again.

You can also [create pull tokens via the Chainguard
Console](/chainguard/libraries/introduction/access/#creating-pull-tokens-with-the-chainguard-console)
under **Overview > Manage pull tokens > Create access token**.

Learn more about pull tokens, and using environment variables for pull token credentials, in the [Libraries access documentation](/chainguard/libraries/introduction/access/).

## Step 3: Configure your build tools

Once you have a pull token, you can configure your build tool. Configuration
steps vary by build tool and ecosystem. Refer to the ecosystem-specific documentation
pages for instructions.

If you [configure upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), the same ecosystem endpoint can serve both:

* Libraries rebuilt from source by Chainguard, and
* Eligible packages from the upstream public registry when Chainguard has not built that package or version yet

Upstream packages served through the Chainguard Repository are subject to configurable policy controls such as cooldown and malware protection. It is strongly recommended that you follow this approach.

{{< tabs label="Language ecosystem for build tool configuration" >}}

{{% tab title="Java" %}}

### Java

* [Repository manager](/chainguard/libraries/java/global-configuration/): Configure your repository manager or build tool to use
  `https://libraries.cgr.dev/java/` as the first repository for artifact
  resolution.
* [Direct access](/chainguard/libraries/java/build-configuration/): Configure
  your tool to retrieve artifacts directly from the Chainguard Libraries for
  Java repository at `https://libraries.cgr.dev/java/`. Use direct access for
  small teams or evaluations, or when you have an existing repository
  configuration you can't change yet.

In addition to malware-resistance, Chainguard Libraries for Java includes
CVE remediation for select libraries. These patched versions help reduce known
risk while you plan your next major version upgrade. You can view which
libraries have CVE remediation available in the Chainguard Console.

Check out minimal example projects for
[Maven](/chainguard/libraries/java/build-configuration/#minimal-example-project)
and
[Gradle](/chainguard/libraries/java/build-configuration/#minimal-example-project-1) to understand how to use these repositories.

{{% /tab %}}

{{% tab title="JavaScript" %}}

### JavaScript

* [Repository
  manager](/chainguard/libraries/javascript/global-configuration/): Add the Chainguard Libraries registry as a remote repository
  and configure it as the first choice for package resolution, with npm as a
  fallback only where necessary.
* [Direct access](/chainguard/libraries/javascript/build-configuration/): Configure your `.npmrc` to use `https://libraries.cgr.dev/javascript/` as the registry.

Check out minimal example projects for
[npm](/chainguard/libraries/javascript/build-configuration/#minimal-example-project),
[pnpm](/chainguard/libraries/javascript/build-configuration/#minimal-example-project-1),
[Yarn](/chainguard/libraries/javascript/build-configuration/#minimal-example-project-2),
[Yarn
Classic](/chainguard/libraries/javascript/build-configuration/#minimal-example-project-3),
and
[Bun](/chainguard/libraries/javascript/build-configuration/#minimal-example-project-4) to understand how to use these repositories.

> **Migrating an existing JavaScript project?** If you have an
> existing lockfile with upstream hashes, use `chainctl libraries update-hashes`
> to update checksums to Chainguard's automatically, without regenerating your
> lockfile from scratch. The command authenticates to Chainguard Libraries; see
> the authentication options in the
> [JavaScript](/chainguard/libraries/javascript/build-configuration/#update-hashes-auth)
> build configuration page.

{{% /tab %}}

{{% tab title="Python" %}}

### Python

* [Repository manager](/chainguard/libraries/python/global-configuration/): Add Chainguard Libraries as a remote repository in your
  repository manager.
* [Direct access](/chainguard/libraries/python/build-configuration/): Configure
  your tool to retrieve artifacts directly from the Chainguard Libraries for
  Python.

Note that there are multiple repositories:

* `https://libraries.cgr.dev/python/` with the simple index at
  `https://libraries.cgr.dev/python/simple`
* `https://libraries.cgr.dev/python-remediated` with the simple index at
  `https://libraries.cgr.dev/python-remediated/simple` for libraries with [CVE
  remediation](/chainguard/libraries/policies-and-security/cve-remediation/)

In addition to malware-resistance, Chainguard Libraries for Python includes
CVE remediation for select libraries. These patched versions help reduce known
risk while you plan your next major version upgrade. You can view which
libraries have CVE remediation available in the Chainguard Console.

Check out minimal example projects for
[uv](/chainguard/libraries/python/build-configuration/#uv-minimal) and [pip](/chainguard/libraries/python/build-configuration/#pip-minimal) to understand how to use these repositories.

> **Migrating an existing Python project?** If you have an
> existing lockfile with upstream hashes, use `chainctl libraries update-hashes`
> to update checksums to Chainguard's automatically, without regenerating your
> lockfile from scratch. The command authenticates to Chainguard Libraries; see
> the authentication options in the
> [Python build configuration page](/chainguard/libraries/python/build-configuration/#update-hashes-auth).

{{% /tab %}}

{{< /tabs >}}

<a id="upstream-note"></a>

> **Note on upstream fallback**: The upstream fallback is
> available as an opt-in setting for both repository manager or direct access
> approaches, and is turned off by default. Learn more about upstream
> fallback policy and controls in the [Libraries
> overview](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

## Step 4: Verify your libraries

After setup, you can verify which dependencies were built from source by Chainguard:

```bash
chainctl libraries verify /path/to/artifact
```

> **Note**: Running `chainctl libraries verify` requires one of the `libraries.java.pull`, `libraries.javascript.pull`, or `libraries.python.pull` permissions, or the Owner role.

Learn more in [Chainguard Libraries verification](/chainguard/libraries/policies-and-security/verification/).

## FAQs

Refer to the [Chainguard Libraries FAQ page](/chainguard/libraries/troubleshooting/faq/) for common questions and issues.

---

### Chainguard Libraries overview
_Path: chainguard/libraries/introduction/overview.md_

[Chainguard Libraries](https://www.chainguard.dev/libraries) is a secure catalog
of language dependencies that replaces your team’s reliance on
[npm](https://www.npmjs.com/), [PyPI](https://pypi.org/), and [Maven
Central](https://central.sonatype.com/). Every package pulled by your team or AI
agents passes through multiple layers of defense, including malicious behavior
scanning, building from source, and cooldowns that help prevent malware from
entering your environment.

As frontier coding models advance, attackers are creating more sophisticated
social engineering campaigns and malware injections to exfiltrate enterprise
secrets. Chainguard Libraries prevents malware instead of making developers
pause work, triage incidents, and respond after compromise.

## Background

Open source libraries distributed through public repositories face several
security challenges: maintainers may not promptly address vulnerabilities,
binary artifacts can be compromised, and the sheer volume of transitive
dependencies makes manual security management impractical. While these
repositories enable rapid development, they also introduce supply chain risks
that traditional security approaches struggle to address.

While convenient, these services remove the direct link from your application to
the source code of a specific project, and create a potential risk for quality
issues with the artifacts, man-in-the-middle attacks, removal or override of
libraries with vulnerable or malicious versions, and other issues. The
[Supply-chain Levels for Software Artifacts (SLSA)](https://slsa.dev/)
specification describes these risks and how to protect your software against
them.

Although this is a common way of accessing open source binaries, it requires you
to put tremendous trust into the following aspects for the dozen or even
hundreds of open source libraries you typically use for each application:

* Maintainers and especially release managers of the projects
* Local workstation or CI setup used for the release build
* Release process mechanisms to create the binaries
* Transport of the binaries from the build system to the public repositories
* Management of access to the repositories
* Monitoring of repositories for attacks as well as harmful or malicious
  binaries
* Traffic to public repositories and attacks on the transport to your
  infrastructure

There are no real guarantees as to the actual provenance of the software code.
Repositories also vary greatly in quality and there is no guarantee that the
upstream source of a project is available in a repository. In addition, these
repositories also hold non-open source binaries of libraries.

All these factors create uncertainty. Using these public repositories can feel
as opaque as picking up a USB drive off of the sidewalk and plugging it into
your laptop.

## Introduction

Chainguard Libraries rebuilds supported language dependencies from verified
upstream source in the Chainguard Factory and distributes the resulting
artifacts through Chainguard’s secure repositories. The Chainguard Factory is
Chainguard’s dedicated build infrastructure for producing software from source
in a hardened, SLSA-certified environment, with verifiable provenance and other
metadata for customers.

Chainguard Libraries can also serve eligible upstream packages through the
[Chainguard Repository](/chainguard/chainguard-repository/overview/), where
security controls such as malicious behavior scanning and cooldowns help prevent
unsafe packages from reaching your environment.

Chainguard Libraries and the use of the Chainguard Factory reduce software
supply chain risk by combining trusted source rebuilds with security controls
for upstream packages:

* Chainguard-built libraries are rebuilt from verified upstream source in the
  Chainguard Factory and distributed with verifiable provenance and SBOMs. For
  CVE-remediated libraries, the fix is applied to the artifact itself and
  accompanied by this metadata, giving auditors evidence they can verify
  directly rather than requiring them to correlate a separate patch file with a
  dashboard. See the [vulnerability scanning
  documentation](/chainguard/libraries/policies-and-security/scanners/) for scanner support details.
* When a requested package is not yet available as a Chainguard build, the
  Chainguard Repository can serve eligible upstream packages through configured
  fallback policies, subject to malicious behavior scanning and cooldowns before
  they are served.
* If there is no open source code available, no binaries are made available by
  Chainguard. This eliminates any license-related risks from commercial
  libraries. The policy and process to have no binaries without source also
  removes the danger from malicious artifacts, since these artifacts do not
  provide source code in public code repositories.

Chainguard Libraries is available for the following library ecosystems:

* Java and the larger Java Virtual Machine (JVM) ecosystem with
  [Chainguard Libraries for Java](/chainguard/libraries/java/overview/)
* JavaScript and the larger ecosystem around JavaScript, TypeScript, npm, React,
  and others with
  [Chainguard Libraries for JavaScript](/chainguard/libraries/javascript/overview/)
* Python and the larger ecosystem with
  [Chainguard Libraries for Python](/chainguard/libraries/python/overview/)

To move an existing project over, follow the migration guide for
[Java](/chainguard/libraries/java/migration/),
[JavaScript](/chainguard/libraries/javascript/migration/), or
[Python](/chainguard/libraries/python/migration/).

## Chainguard criteria for building a library

Chainguard Libraries includes thousands of Java, JavaScript, and Python libraries, and coverage is continuously growing as we add more packages and versions over time. Chainguard aims to build libraries that are relevant to our customers and that support broader software supply chain security goals. However, it is not always feasible or safe to rebuild and redistribute every package from public registries such as Maven Central, npm, or PyPI.

### Licensing and source availability

Chainguard Libraries provides a trusted source for Java, JavaScript, and Python dependencies. Our goal is to prevent malware exposure and reduce the security work developers must do after packages enter their environments.

For a library to be built and distributed by Chainguard:

* Source code must be available and verifiable
    * The project’s source must be available in a source code manager (such as GitHub or GitLab). Packages that do not provide a valid or verifiable source URL cannot be rebuilt in the Chainguard Factory and are out of scope.
* Licensing must allow rebuild and redistribution
    * The project must be licensed in a way that allows Chainguard to rebuild and redistribute it to customers.

### Library version support

Chainguard builds libraries using supported language toolchains in our hardened build environment. We do not aim to replicate all historical runtime environments exactly, but we do attempt to preserve runtime compatibility where it is safe to do so. For older or EOL projects, our ability to build and remediate issues is constrained by runtime compatibility and by upstream maintenance practices.

Our current minimum supported toolchains are:

* **Python**: Python 3.10 and higher.
* **Java**: Java 8 and higher.
* **JavaScript**: Any supported, non-EOL version of Node.js.

We will attempt to rebuild any libraries that meet the [licensing and source availability criteria](#licensing-and-source-availability) using the supported toolchains.

### EOL version support

When a library version reaches end of life (EOL) upstream, Chainguard Libraries continues to build packages and provide security fixes for that version for six months beyond the upstream EOL date.

After that six-month window closes, Chainguard Libraries will:

* No longer build new packages that require the EOL version
* No longer provide security fixes for packages built against the EOL version
* Continue to serve previously built packages

## Upstream fallback and controls

Chainguard Libraries support an optional protected upstream fallback, managed through the [Chainguard
Repository](/chainguard/chainguard-repository/overview/).

By default, the Chainguard library endpoints serve
only Chainguard-built packages. When the upstream fallback is enabled, upstream packages are
subject to additional security controls before being served.

> Note: When using `chainctl` to configure upstream fallback or cooldown duration, it can take up to 30 minutes for the repository changes to take effect.

### Enable the upstream repository

To enable or change upstream fallback configuration, use the [`chainctl
libraries entitlements`
command](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/).

For example, the following command creates or updates an entitlement to Chainguard Libraries
for JavaScript, and adds the npm upstream fallback policy. Enabling upstream fallback includes a 7-day cooldown by default, which can also be configured:

```bash
chainctl libraries entitlements create --ecosystems=JAVASCRIPT --policy=CHAINGUARD_AND_UPSTREAM
```

For JavaScript, you can also enable upstream fallback in the Chainguard Console. For Java and Python, you cannot currently enable fallback or view upstream vs. Chainguard-built packages via the Chainguard Console; you must use `chainctl` to enable fallback for Java and Python.

### Fallback options

The following options are available:

* **No upstream fallback (default)**: Only Chainguard-built packages are served.
* **Upstream fallback enabled with default 7-day cooldown**: Upstream packages are available after passing a configurable cooldown period and malware scan. The same cooldown period is enforced across Chainguard-built packages and upstream packages, so that dependency trees resolve consistently across both sources.

When the upstream fallback is enabled, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a package version you pulled from upstream stable even after Chainguard publishes its own build of that version. This prevents unexpected checksum changes across rebuilds.

### Malware and greyware detection

Chainguard's [source code and maintainer behavior
scanning](https://www.chainguard.dev/unchained/the-expanding-threat-landscape-chainguard-now-scans-source-code-for-traditional-malware-and-greyware/)
identifies and blocks malicious and greyware packages in Chainguard Libraries
via the Chainguard Repository. This includes packages that are publicly reported
as malicious (including packages associated with OSV malware IDs) and packages
that Chainguard determines are unsafe through its own malware source code
scanning, even when no public malware advisory exists yet.

Malware detection is continuous. If a version that was previously cached is
later identified as malicious, it is added to the block list and will be blocked
on subsequent requests.

Chainguard's scanning evaluates multiple signal types, including:

* **Credential and data theft**: The package harvests secrets (for example, GitHub tokens or SSH keys) and sends sensitive data out of the environment.
* **Backdoors and malicious behavior**: The package obfuscates malicious behavior, including backdoor setup, remote access, staged payloads, and more. The code may contact known malicious infrastructure to fetch or run additional payloads.
* **Install-time script execution**: The package automatically executes malicious behavior through pre-install and post-install lifecycle scripts.
* **Typosquatting and impersonation**: The package is named or brand-engineered to deceive users into downloading the wrong package.
* **Compromised or untrusted releases**: The package exhibits signs that a release cannot be trusted.

#### View blocked packages

You can view blocked packages [in the Chainguard Console](/chainguard/libraries/introduction/browse/#view-malware-information), [using `chainctl` commands](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware_list/), or [via the API](#malware-api).

For more details on the errors a blocked package surfaces across ecosystems, see the [Error messages documentation](/chainguard/libraries/troubleshooting/errors/).

#### Malware API

Chainguard's malware API endpoint provides access to Chainguard's malware blocklist. You can use it to retrieve a list of packages that have been identified as malicious and blocked by Chainguard. Learn more about it in the [API documentation](/platform/api/spec-api-v1/#tag/malware).

Expand the following section to see examples:

{{< details "Malware API examples" >}}

First, get an access token:

```bash
TOKEN=$(chainctl auth token --audience=https://console-api.enforce.dev)
```

Then, use the API to query malware details.

List blocked packages for an ecosystem. For example, to see the 10 most recent JavaScript packages blocked:

```bash
curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "https://console-api.enforce.dev/libraries/v1/malware/blocklist?ecosystem=NPM&page_size=10" \
  | jq .
```

List packages blocked since a specified date. For example, to see PyPI packages blocked since July 1, 2026:

```bash
curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "https://console-api.enforce.dev/libraries/v1/malware/blocklist?ecosystem=PYPI&since=2026-07-01T00:00:00Z&page_size=10" \
  | jq .
```

Check whether a specific package is blocked. For example, to check for blocked `axios` packages:

```bash
curl -s \
  -H "Authorization: Bearer $TOKEN" \
  "https://console-api.enforce.dev/libraries/v1/malware/blocklist?ecosystem=NPM&packageName=axios" \
  | jq .
```

{{< /details >}}

### Cooldown period

When fallback is enabled, upstream packages are subject to a cooldown period from their publication date before the Chainguard Repository will serve them. The cooldown is an additional layer of security that provides a window for the security community to identify and report malicious packages before your builds can pull them.

The cooldown applies globally across Chainguard-built packages and upstream packages served through the fallback. This prevents installs from failing when a Chainguard-built package depends on an upstream dependency that is still under the cooldown window.

If a requested package version falls within the cooldown period, the package manager will output a 404 error. The package becomes available once it has passed the cooldown period and cleared malware scanning.

Learn how to create, enforce, disable, and list policies in the [Libraries policies documentation](/chainguard/chainguard-repository/library-policies/) page.

### How package resolution works

When you request a package from the Chainguard Repository, the following logic applies:

* **Chainguard-built package available**: The package is served directly from Chainguard's rebuilt artifact store, complete with SBOM, provenance, and signatures, subject to the configured cooldown.
* **Package not yet built by Chainguard**: If upstream fallback is enabled, the repository checks whether the package has passed the cooldown period and malware scan.
    * **Within the cooldown period**: The request returns an error. This prevents newly published packages — which carry higher malware risk — from being served immediately.
    * **After the cooldown period**: If upstream fallback is enabled and the version is outside the cooldown window and passes malware scanning, the repository pulls the version through from the upstream registry, serves it to the client, and caches it in the upstream mirror for future requests.
* **Malware or greyware detected**: Any package version that is detected for malware or greyware is blocked, whether it originates from Chainguard's builds or the upstream fallback.
    * Malware scanning checks all packages against the Open Source Vulnerabilities (OSV) database, which includes the OpenSSF Malicious Packages feed among other sources. Any package version flagged with a malware identifier is blocked. This covers reported malicious packages across the npm ecosystem.

> **Note**: Chainguard Repository is not a full mirror of upstream repositories. Packages are screened for malware before being made available. Some packages may be delayed by the cooldown period or permanently blocked if flagged as malicious.

## Other resources

* [Chainguard Libraries product page](https://www.chainguard.dev/libraries)
* [{{< icon "play-circle-fill" >}} Learning Lab for October 2025 on Chainguard Libraries for JavaScript and CVE remediation for Python libraries](/software-security/learning-labs/ll202510/)
* [{{< icon "play-circle-fill" >}} Learning Lab for June 2025 on Chainguard Libraries for Python](/software-security/learning-labs/ll202506/)
* [{{< icon "play-circle-fill" >}} Learning Lab for May 2025 about Chainguard Libraries for Java](/software-security/learning-labs/ll202505/)

Blog posts

* [Mitigating Malware in the npm Ecosystem with Chainguard Libraries](https://www.chainguard.dev/unchained/mitigating-malware-in-the-npm-ecosystem-with-chainguard-libraries
)
* [Announcing Chainguard Libraries for JavaScript: Malware-Resistant Dependencies Built Securely from Source](https://www.chainguard.dev/unchained/announcing-chainguard-libraries-for-javascript-malware-resistant-dependencies-built-securely-from-source)
* [Registries and the npm Breach: Securing the Weakest Link in the Software Supply Chain](https://www.chainguard.dev/unchained/registries-and-the-npm-breach-securing-the-weakest-link-in-the-software-supply-chain)
* [Malware-Resistant Python without the Guesswork](https://www.chainguard.dev/unchained/malware-resistant-python-without-the-guesswork)
* [This Shit is Hard: Java Archeology at a Massive Scale](https://www.chainguard.dev/unchained/this-shit-is-hard-java-archeology-at-a-massive-scale)
* [Mitigating Malware in the Python Ecosystem with Chainguard Libraries](https://www.chainguard.dev/unchained/mitigating-malware-in-the-python-ecosystem-with-chainguard-libraries)
* [Announcing Chainguard Libraries for Python: Malware-Resistant Dependencies Built Securely from Source](https://www.chainguard.dev/unchained/announcing-chainguard-libraries-for-python-malware-resistant-dependencies-built-securely-from-source)
* [Announcing Chainguard Libraries: Guarded Java Language Dependencies Built from Source](https://www.chainguard.dev/unchained/announcing-chainguard-libraries-guarded-java-language-dependencies-built-from-source)

---

### Chainguard Libraries network requirements
_Path: chainguard/libraries/introduction/network-requirements.md_

[Chainguard Libraries](/chainguard/libraries/introduction/overview/) require specific network access to ensure secure delivery of hardened dependencies to your development environment. This guide details the domains and ports needed for authentication, package downloads, and verification tools.

## Access for chainctl and other tools

For initial configuration with chainctl and for in-process verification of
downloaded libraries, you must allow HTTPS access to the following domains:

* `dl.enforce.dev` for download and update of chainctl
* `issuer.enforce.dev` for authentication with the Chainguard Console and with chainctl
* `console-api.enforce.dev` for Chainguard Console and chainctl to administrate and use
  your Chainguard accounts.
* `console.chainguard.dev` for the Chainguard Console to administrate and use your
  Chainguard accounts.
* `tuf-repo-cdn.sigstore.dev` for the Sigstore trust root that `chainctl libraries verify`
  uses to verify library signatures.

## Access for repository managers

When using a repository manager, ensure your network allows outbound HTTPS access
to the following domains from your repository manager. Your workstations and build
infrastructure typically require no additional network access, as libraries are
served through your repository manager.

* `libraries.cgr.dev` and `9236a389bd48b984df91adc1bc924620.r2.cloudflarestorage.com` for library access

## Access for development tools

If accessing Chainguard Libraries directly — for example, testing with curl or running builds without a repository manager — ensure your network allows outbound HTTPS access to the following domains from your workstation:

* `libraries.cgr.dev` and `9236a389bd48b984df91adc1bc924620.r2.cloudflarestorage.com` for library access

If you're also using `chainctl` to verify downloaded libraries in this workflow, see [Access for chainctl and other tools](#access-for-chainctl-and-other-tools) for the additional domains required.

> Note that the `9236a389bd48b984df91adc1bc924620.r2.cloudflarestorage.com` host is used to serve files via `libraries.cgr.dev`. The same host is also used to serve Chainguard Container images.

---

### Browsing Chainguard Libraries
_Path: chainguard/libraries/introduction/browse.md_

Chainguard Libraries is a malware-free catalog of Java, JavaScript, and Python
artifacts that have passed through multiple layers of security controls,
including malware and greyware scanning, building from source, cooldowns, and
additional policies.

In the Chainguard Console, you can browse available
libraries and versions, inspect package details, and evaluate dependencies
before pulling them into your environment.

## Access libraries in the Chainguard Console

Log in to the Chainguard Console at
[https://console.chainguard.dev/](https://console.chainguard.dev/).

In the left-hand navigation under **Libraries**, expand **Ecosystems** to find
links for browsing Chainguard's [**Java**](/chainguard/libraries/java/overview/), [**JavaScript**](/chainguard/libraries/javascript/overview/), and [**Python**](/chainguard/libraries/python/overview/) libraries.

<a id="initial-display"></a>

### Browse the libraries list

When you open a specific ecosystem, you'll see a search input box and a list of
libraries. Click any row to open the [library detail page](#library-page).

The list includes the following columns:

* **Name**: The full library name, excluding any version identifiers.
    * Python library names are simple strings, such as `setuptools` or
  `Flask-Admin`.
    * Java library names are the concatenation of the Maven
  coordinate values `groupId` and `artifactId`, separated by `:`. Examples are
  `org.springframework:spring-core` or `org.eclipse.jetty:jetty-http`.
* **Latest version**: The latest released and available version of the library
  and the total number of available versions.
* **Updated**: The most recent date when any version of this library was built
and published by Chainguard, or cached from the upstream fallback (when upstream fallback is enabled).

At the bottom of the page, see a total count of available libraries.

#### Upstream fallback details

The upstream fallback is available for JavaScript, Python, and Java Libraries. The upstream fallback can be enabled or disabled using the `chainctl libraries entitlements` commands, per ecosystem. Currently, the Chainguard Console can be used to enable, disable, and view the status of the upstream fallback for JavaScript only. At the top of the JavaScript page in the Console, you can see whether [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) is enabled.

Learn more in the [Libraries overview documentation](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

When fallback is configured for your organization, you will see all JavaScript packages -- including those built by Chainguard and those that are mirrored from upstream npm -- in the Console. For a given package, you can see whether it is being served from Chainguard's rebuilt artifacts or proxied from upstream npm. For Java and Python, you cannot currently view upstream vs. Chainguard-built packages via the Chainguard Console.

<a id="search"></a>

### Search the libraries list

Use the **Search** text input at the top of the libraries list to
narrow down the list and to locate a specific library.

Click into a row to view a [specific library page](#library-page).

<a id="library-page"></a>

### View remediated libraries

[CVE remediation](/chainguard/libraries/policies-and-security/cve-remediation/) is available for a
subset of Chainguard Libraries for Java (available in beta) and Python. You can view remediated libraries in
the Chainguard Console.

In the Java and Python libraries directories, click the **Remediated** tab to view a list
of remediated libraries. Click into a library to see which versions have
remediated CVEs.

While viewing the list of remediated versions for a library, click into a
version to view more details: which CVEs were remediated, the date that the
version was patched, and links to additional resources.

Learn more about browsing remediations in [CVE remediation for Chainguard
Libraries](/chainguard/libraries/policies-and-security/cve-remediation/#about-cve-remediation).

### View malware information

For the JavaScript and Python ecosystems, click the **Malware** tab to learn how many packages have been blocked by Chainguard due to [malware or greyware detection](/chainguard/libraries/introduction/overview/#malware-and-greyware-detection).

The list at the bottom of the page displays automatically blocked packages, including the package name, blocked version(s), the date it was blocked on, its MAL ID if available, and signals detected.

#### Malware and greyware signals detected

Some signals describe confirmed malicious behavior, while others describe greyware or supply-chain risk indicators that may justify blocking even when there is no public malware advisory. Next to each blocked package, Chainguard provides the reason it was blocked when there is no public malware advisory. The detected signals fall under the following categories:

* **Credential and data theft**: The package harvests secrets (for example, GitHub tokens or SSH keys) and sends sensitive data out of the environment.
    * Signals: Accesses credentials, Data exfiltration, Contains an exposed secret
* **Backdoors and malicious behavior**: The package obfuscates malicious behavior, including backdoor setup, remote access, staged payloads, and more. The code may contact known malicious infrastructure to fetch or run additional payloads.
    * Signals: Suspicious execution technique, Obfuscated or hidden payload, Cryptomining, Spreads to other packages (worm), Embedded binary in source, AI/LLM attack content, Suspicious network activity, Contacts known-malicious infrastructure, Linked to known malware
* **Install-time script execution**: The package automatically executes malicious behavior through pre-install and post-install lifecycle scripts.
    * Signals: Malicious install script, Declares install scripts
* **Typosquatting and impersonation**: The package is named or brand-engineered to deceive users into downloading the wrong package.
    * Signals: Typosquatting or impersonation, Dependency confusion
* **Compromised or untrusted releases**: The package exhibits signs that a release cannot be trusted.
    * Signals: Signs of maintainer account compromise, No trusted provenance or signed release, Published with a legacy token (not OIDC), Release integrity anomaly, Anomalous release change, Anomalous package contents, Weak build-pipeline security, Untrusted dependency source

## Library page

To access a library page, click on the row for a specific library in the search
results or the [initial library list](#initial-display).

On a library's page, use the search bar at the top to search for specific
versions.

The list of library versions includes the following columns:

* **Version** - the version of the library. Library versions are strings.
  Depending on the ecosystem and library they can follow naming patterns and
  other restrictions that allow ordering by version.
* **Size** - the size of the library.
    * The displayed size reflects the primary file(s) only: `.jar`/`.pom` for
      Java, and `.whl`/`.tar.gz` for Python. It is not an aggregation of all
      files under a given version.
* **Built** - The date when this version was built and published by Chainguard.

Click on the column titles to change the **sort** order of the list.

## View repository configuration in the Chainguard Console

The Chainguard Console provides visibility into your repository configuration and the packages being served. When the upstream fallback is configured for your organization, you will see all packages including those built by Chainguard and those that are mirrored from upstream npm.

## Other resources

* [Chainguard Console](/platform/console/): Learn about using the Chainguard Console to browse container images.
* [Libraries overview](/chainguard/libraries/introduction/overview/): Learn about criteria for building a library, upstream fallback and policy controls, and more.

---

### Configure JavaScript build tools
_Path: chainguard/libraries/javascript/build-configuration.md_

Chainguard Libraries for JavaScript works with your existing build tools — npm,
pnpm, Yarn, and Bun — through a registry configuration change. This page is a
reference for configuring each supported build tool. It covers registry
configuration, authentication, cache clearing, and minimal example projects.

Apply these changes on every workstation and build server that builds your
applications or downloads libraries, including CI/CD infrastructure such as
Jenkins, TeamCity, or GitHub Actions.

The `https://libraries.cgr.dev/javascript` endpoint is also the [Chainguard
Repository](/chainguard/chainguard-repository/overview/) endpoint for JavaScript. By
default, it serves only Chainguard-built artifacts. When [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) is
enabled for your organization, the same endpoint can also serve requested
versions from upstream, under Chainguard security controls.

This guide outlines how to configure your build tool. If you are looking for something else, refer to the following guides depending on your goals:

| If you want to... | Use this page |
| --- | --- |
| Understand what Chainguard Libraries for JavaScript is and how it works | [JavaScript overview](/chainguard/libraries/javascript/overview/) |
| Set up organization-wide access through a repository manager | [Global configuration](/chainguard/libraries/javascript/global-configuration/) |
| Look up how to configure a specific build tool (npm, pnpm, Yarn, Bun) | This page |
| Migrate an existing project step by step | [JavaScript migration guide](/chainguard/libraries/javascript/migration/) |
| Install inside a container build without leaking credentials into the image | [Container builds](/chainguard/libraries/policies-and-security/build-containers/) |

If a package or version is blocked by a policy or malware scan, your build tool returns an error. Refer to the [Error messages documentation](/chainguard/libraries/troubleshooting/errors/) for more details.

## JFrog Artifactory

Build configuration to retrieve artifacts from Artifactory typically requires
you to authenticate and use the identity token in the configuration of your
build tool.

Follow the steps from the [global
configuration](/chainguard/libraries/javascript/global-configuration/#jfrog-artifactory)
to determine URL and authentication details.

## Sonatype Nexus Repository

Build configuration to retrieve artifacts from Nexus may require authentication.
Use your username and password for Nexus in your build tool configuration.

Follow the steps from the [global
configuration](/chainguard/libraries/javascript/global-configuration/#sonatype-nexus-repository)
to determine URL and authentication details.

<a id="direct-access"></a>

## Direct access

Build configuration to retrieve artifacts **directly** from the Chainguard
Libraries for JavaScript repository at `https://libraries.cgr.dev/javascript/`
requires authentication with username and password from a pull token as detailed
in [access documentation](/chainguard/libraries/introduction/access/#pull-token).

Refer to the minimal example projects on this page for demonstrations using direct access for each build tool.

> Note: Direct access requires per-project and per-workstation configuration.
For organizations with multiple teams, proxying through an artifact manager is
recommended. Refer to the [global
configuration](/chainguard/libraries/javascript/global-configuration/) for setup
guides.

## Updating lockfile hashes

When migrating an existing JavaScript project to Chainguard Libraries, your
lockfile contains integrity hashes generated against packages previously
downloaded from the npm registry or through your repository manager. Because
Chainguard rebuilds packages in a secured build environment rather than
distributing upstream artifacts directly, the resulting checksums differ even
for identical package versions. These hashes must be updated before your package
manager will accept packages from Chainguard.

Learn more in the [JavaScript migration guide](/chainguard/libraries/javascript/migration/#step-3-update-your-lockfile) and in the [`chainctl libraries update-hashes` command docs](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/).

<a id="update-hashes-auth"></a>

### Authentication

`update-hashes` fetches checksums from Chainguard Libraries,
which requires authentication. Where it fetches from depends on your environment: some setups authenticate directly to `libraries.cgr.dev`, but if your build routes through a repository manager configured as a pull-through proxy for Chainguard Libraries, point `update-hashes` there instead with `--registry-url` so it validates against the same source your build used.

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.javascript.pull` permission or the Owner role.

Authenticating to `libraries.cgr.dev` directly:

- **Logged in locally**: Run the command while authenticated; if you have no
  other credential it authenticates with a
  [pull token](/chainguard/libraries/introduction/access/#pull-token) for your
  organization, prompting for one only if you have access to more than one. Pass
  `--parent <organization>` to skip that prompt. To avoid it entirely,
  scope your login to the libraries registry once with
  `chainctl auth login --audience=libraries.cgr.dev` — that session is then used
  automatically. (`chainctl auth configure-npm` also sets up this
  libraries-scoped session as part of configuring npm.)
- **CI or non-interactive**:
    - For a session token, pass `--token <token>` or set `CHAINCTL_AUTH_TOKEN`. The
    token must be scoped to the libraries registry; mint one with
    `chainctl auth token --audience=libraries.cgr.dev`.
    - For a [pull token](/chainguard/libraries/introduction/access/#pull-token) (an identity and
    secret), pass it as basic auth: `--username <identity> --password <secret>`,
    or set `CHAINCTL_REGISTRY_USERNAME` / `CHAINCTL_REGISTRY_PASSWORD`.
- **From `~/.netrc`**: Credentials for the registry host are read from `~/.netrc`
  (or `$NETRC`); refer to [.netrc for authentication](/chainguard/libraries/introduction/access/#netrc).
  Pass `--ignore-netrc` to skip an unrelated entry.

Authenticating to a repository manager:

When you target a repository manager with `--registry-url`, authenticate with **that** registry's credentials —
`--username`/`--password`, the `CHAINCTL_REGISTRY_USERNAME` /
`CHAINCTL_REGISTRY_PASSWORD` environment variables, or a matching `~/.netrc`
entry. Chainguard-scoped tokens are never sent to third-party hosts.

Learn more about using a repository manager in the [global configuration documentation](/chainguard/libraries/javascript/global-configuration/).

<a id="npm"></a>

## npm

[npm](https://www.npmjs.com/) is the default package manager for Node.js, widely
used for managing JavaScript dependencies and scripts. It allows developers to
install, share, and manage packages for their projects. For more details, see
the [npm documentation](https://docs.npmjs.com/).

**Declare dependencies in package.json**

With npm, you declare JavaScript package dependencies in a `package.json` file
and separated into development and runtime dependencies. The following snippet
shows a minimal example with a couple of dependencies each:

```json
{
  "dependencies": {
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.0",
    "@fontsource/roboto": "^5.1.1",
    "node": "^22.18.0",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-router-dom": "^7.1.5",
  },
  "devDependencies": {
    "@eslint/js": "^9.14.0",
    "@types/react": "^18.3.18",
    "@types/react-dom": "^18.3.5"
  }
}
```

By default, npm retrieves packages from the npm Registry at
`https://registry.npmjs.org` and stores them locally in the `node_modules`
directory of the project after running `npm install`. This operation also
creates the `package-lock.json` file.

Note that dependency versions are typically declared with the `^` before the
version string. This indicates higher, compatible versions, following the
semantic versioning scheme of the package are used automatically. For example,
the declaration of version `^22.18.0` for `node`, actually results in the use of
version `22.20.0` or even a higher version once available and `npm install` is
run.  

Any dependency or dependency version changes require another install and
therefore an update to the lock file. The lock file also encodes the checksum
values in the `integrity` field and the download URL in the `resolved` field for
each module.

**Direct access: Point registry to Chainguard**

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to Chainguard in your user `.npmrc` file:

```bash
npm config set registry https://libraries.cgr.dev/javascript/
```

### Using a repository manager

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to your repository manager in your user `.npmrc` file:

```shell
npm config set registry https://repo.example.com:8443/repository/javascript-all/
```

The command results in the following line in the `.npmrc` file:

```properties
registry=https://repo.example.com:8443/repository/javascript-all/
```

Refer to the [`npmrc`
documentation](https://docs.npmjs.com/cli/v11/configuring-npm/npmrc) for
alternative configurations, for example per project or globally, and details for
configuring authentication.

Example URLs:

- JFrog Artifactory: `https://example.jfrog.io/artifactory/javascript-all/`
- Sonatype Nexus: `https://repo.example.com:8443/repository/javascript-all/`
- Direct access: `https://libraries.cgr.dev/javascript/`

### Apply registry changes

To apply the registry changes, remove the `node_modules` directory, [update the artifact hashes](#update-lockfile-hashes), then run the `npm install` command again. This re-fetches all
packages from Chainguard and updates the lockfile in place with updated hashes:

```bash
rm -rf node_modules
chainctl libraries update-hashes
npm install
```

As an alternative, you can remove the `node_modules` directory _and_ the `package-lock.json` file, then reinstall. This regenerates the lockfile and updates the hashes. Regenerating re-resolves your dependencies, so it can change your pinned versions, and any new versions published within your configured cooldown window will return an error. See [Update your lockfile](/chainguard/libraries/javascript/migration/#step-3-update-your-lockfile).

**Clear caches**

If you encounter stale or corrupted package data, clear the cache with:

```bash
npm cache clean --force
```

To verify the cache is empty:

```bash
npm cache verify
```

### Using private npm packages alongside Chainguard Repository

If your organization publishes its own packages to the public npm Registry under
a scoped prefix (for example, `@your-org/package-name`), you may want those
packages to be fetched directly from npm rather than going through the
[Chainguard Repository](/chainguard/libraries/chainguard-repository/); for
example, to bypass the cooldown period for packages you own and trust.

npm supports per-scope registry configuration, which lets you route packages
with a specific prefix to a different registry:

```
# .npmrc
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth=${token}

@your-org:registry=https://registry.npmjs.org/
```

However, npm has a behavior where, when it fetches package metadata from a
scoped registry, it may rewrite the resolved tarball URL in the lockfile to use
the primary registry host (in this case, Chainguard Repository) instead of the
scoped registry. This causes subsequent `npm install` runs to attempt to fetch
your scoped packages from Chainguard Repository, resulting in a 404 or
authentication error.

To prevent this, add the following line to your `.npmrc`:

```
replace-registry-host=never
```

This tells npm never to rewrite the registry host in resolved URLs, so scoped
packages remain associated with their correct upstream registry in the lockfile.

After adding this line, verify your lockfile reflects the
correct resolved URLs: scoped packages should resolve to `registry.npmjs.org`
and all other packages should resolve to `libraries.cgr.dev/javascript`.

<a id="npm-minimal"></a>

### Minimal example project

For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).

**1. Create a JavaScript project**

Use the following steps to create a minimal example project for npm with
Chainguard Libraries for JavaScript.

```shell
mkdir npm-example
cd npm-example
npm init -y
```

**2. Configure the .npmrc file**

Once the environment variables are set, configure the `.npmrc` file.

Run the following command to configure registry
access and authentication in the `.npmrc` file in the current project
directory:

```shell
chainctl auth configure-npm
```

[This command](/platform/chainctl/chainctl-docs/chainctl_auth_configure-npm/) writes a project-level `.npmrc` with the registry URL and base64-encoded credentials. It also prints the equivalent `npm config set` commands for use in CI or other environments where you need to configure `.npmrc` manually. If this command returns an error, ensure that you are using the [latest version of `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/#updating-chainctl).

Alternatively, you can configure the `.npmrc` file manually:

{{< details "Configure .npmrc manually" >}}
The following steps configure registry
access with authentication in the `.npmrc` file in the current project
directory:

```shell
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)

npm config set registry https://libraries.cgr.dev/javascript/ --location=project
npm config set //libraries.cgr.dev/javascript/:_auth "${token}" --location=project
```

Note that the trailing slash in the registry URL is required, and that setting
`username` and `_password` instead of `auth` with a token does not work with
npm. The `-w 0` option for `base64` is required and supported by the GNU
coreutils versions included in most operating systems.
{{< /details >}}

**Example .npmrc file**

```
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth=aWRlbnRpdHktaWQ6dG9rZW4=
```

The value of `auth` is the base64 encoding of `identity-id:token`, including the `/` character in the username.

**3. Verify authentication with npm ping**

Before installing packages, you can verify that authentication is configured correctly by running:

```bash
npm ping --userconfig .npmrc
```

A successful response looks like:

```bash
npm notice PING https://libraries.cgr.dev/javascript/
npm notice PONG 1065ms
```

The PONG response confirms that your credentials are valid and the registry is reachable. If the command fails, check that the .npmrc file exists in the current directory and that your token has not expired.

**4. Add dependencies and build the project**

Add dependencies for your project into the `package.json` file to test retrieval
from Chainguard Libraries, build the project, and list the dependencies:

```shell
npm add commander@4.1.1
npm install
npm list
```

Following this, find the downloaded package in `node_modules/commander`. The
commands also result in the creation of the lock file `package-lock.json`, which
contains the source URL for each package in the `resolved` field.

Adjust the registry configuration to use your repository manager and add any
other desired packages for further testing.

<a id="pnpm"></a>

## pnpm

[pnpm](https://pnpm.io/) is a fast, disk space-efficient package manager for
JavaScript, designed as an alternative to npm and Yarn. For
more information, refer to the [pnpm documentation](https://pnpm.io/motivation).

**Limitations**

Before getting started, note the following limitations:

- The Chainguard Repository [upstream fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls) has been tested with pnpm v11. We recommend using pnpm v11 or newer.
- pnpm v11 re-verifies lockfile entries during install, including when you run `pnpm install --frozen-lockfile`. With Chainguard Repository for JavaScript, this can cause errors even when the lockfile is up to date. If this issue occurs, set `trustLockfile: true` in the `pnpm-workspace.yaml` to configure pnpm to trust the existing lockfile.
- Setting `lockfileIncludeTarballUrl: true` in the `pnpm-workspace.yaml` ensures pnpm continues to fetch the upstream tarball URL recorded in the lockfile. Without this setting, you can encounter integrity errors when Chainguard builds a package version that had previously been mirrored from upstream. This helps avoid integrity errors until the lockfile is updated.
- If you use Chainguard Libraries with pnpm `trustPolicy: no-downgrade`, pnpm may fail installation. Because Chainguard Libraries serves rebuilt packages, pnpm may treat those packages as a trust downgrade. To work around this, disable it in your pnpm configuration: `trustPolicy: off`

**Declare dependencies in package.json**

With pnpm, you declare JavaScript package dependencies in a `package.json` file
and separated into development and runtime dependencies. The following snippet
shows a minimal example with a couple of dependencies each:

```json
{
  "dependencies": {
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.0",
    "@fontsource/roboto": "^5.1.1",
    "node": "^22.18.0",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-router-dom": "^7.1.5",
  },
  "devDependencies": {
    "@eslint/js": "^9.14.0",
    "@types/react": "^18.3.18",
    "@types/react-dom": "^18.3.5"
  }
}
```

By default, pnpm retrieves the packages the npm Registry at
`https://registry.npmjs.org` and stores them locally in the `node_modules`
directory of the project after running `pnpm install`. This operation also
creates the `pnpm-lock.yaml` file.

Note that dependency versions are typically declared with the `^` before the
version string. This indicates higher, compatible versions, following the
semantic versioning scheme of the package, are used automatically. For example,
the declaration of version `^22.18.0` for `node`, actually results in the use of
version `22.20.0` or even a higher version once available and pnpm install is
run.  

Any dependency or dependency version changes require another install and
therefore an update to the lock file. The lock file also encodes the checksum
values in the `integrity` field and other information for each module.

**Direct access: Point registry to Chainguard**

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to Chainguard and set auth credentials. The following command writes to the project-level configuration:

```bash
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)

pnpm config set registry https://libraries.cgr.dev/javascript/ --location=project
pnpm config set //libraries.cgr.dev/:_auth "${token}" --location=project
```

To set the registry at the user level instead of project-level, omit the `--location=project` flag.

The configuration should look like the following:

```properties
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/:_auth=<base64-encoded-token>
```

The registry URL always points to the `/javascript/` repository; you do not point
it at `/javascript-upstream/`. The authentication entry, however, is keyed to the
whole `libraries.cgr.dev` host (`//libraries.cgr.dev/`) rather than to the
`/javascript/` path alone. This matters because packages that Chainguard has not
yet rebuilt are served through the [upstream
fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls)
at `https://libraries.cgr.dev/javascript-upstream/`, and pnpm authenticates against
whatever tarball URL the registry returns for each package. A credential keyed to
the host covers both the `/javascript/` and `/javascript-upstream/` paths.

If you prefer to scope credentials per path, you must configure **both** paths.
Otherwise, installs that resolve upstream-fallback packages fail with an HTTP 401
error:

```properties
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth=<base64-encoded-token>
//libraries.cgr.dev/javascript-upstream/:_auth=<base64-encoded-token>
```

### Using a repository manager

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to your repository manager in your user `.npmrc` file:

```shell
pnpm config set registry https://repo.example.com:8443/repository/javascript-all/
```

The command results in the following line in the `.npmrc` file:

```properties
registry=https://repo.example.com:8443/repository/javascript-all/
```

Refer to the [pnpm registry
documentation](https://pnpm.io/settings#registry--authentication-settings) for
alternative configurations, for example per project or globally, and details for
configuring authentication.

Example URLs:

- JFrog Artifactory: `https://example.jfrog.io/artifactory/javascript-all/`
- Sonatype Nexus: `https://repo.example.com:8443/repository/javascript-all/`
- Direct access: `https://libraries.cgr.dev/javascript/`

### Apply registry changes

To apply the registry changes, remove the `node_modules` directory, [update the artifact hashes](#update-lockfile-hashes), then run the `pnpm install` command again. This re-fetches all
packages from Chainguard and updates the lockfile in place with updated hashes:

```bash
rm -rf node_modules
chainctl libraries update-hashes
pnpm install
```

As an alternative, you can remove the `node_modules` directory _and_ the `pnpm-lock.yaml` file, then reinstall. This regenerates the lockfile and updates the hashes. Regenerating re-resolves your dependencies, so it can change your pinned versions, and any new versions published within your configured cooldown window will return an error. See [Update your lockfile](/chainguard/libraries/javascript/migration/#step-3-update-your-lockfile).

**Clear pnpm caches**

pnpm has three separate layers of cached data. If you encounter stale or corrupted package data, you can clear all of these caches:

{{< details "Clear pnpm caches" >}}

**Metadata (packuments)**

There is an [experimental command](https://pnpm.io/cli/cache-delete) to delete the metadata cache:

```bash
pnpm cache delete
```

**HTTP cache**

pnpm maintains a separate HTTP cache at `~/.cache/pnpm` (or `$XDG_CACHE_HOME/pnpm` if that variable is set). Delete it with:

```bash
rm -rf "${XDG_CACHE_HOME:-$HOME/.cache}/pnpm"
```

**Content-addressable store (tarballs)**

To find and manually remove the full store:

```bash
pnpm store path
```

Then delete the directory that command outputs:

On macOS/Linux -

```bash
rm -rf "$(pnpm store path)"
```

On Windows -

Use the path returned by `pnpm store path` and delete it via File Explorer or `rmdir`.

> Note: pnpm prune removes unused tarballs but does not remove packument metadata. If you are seeing 404 errors after switching to or updating the Chainguard registry endpoint, use the commands above rather than pnpm prune.

{{< /details >}}

### Update lockfile hashes

If you are migrating an existing project and want to preserve your current
lockfile, use [`chainctl libraries update-hashes`](#updating-lockfile-hashes)
to update only the integrity hashes in place instead.

Now you can proceed with your development and testing.

<a id="pnpm-minimal"></a>

### Minimal example project

Use the following steps to create a minimal example project for pnpm with
Chainguard Libraries for JavaScript.

```shell
mkdir pnpm-example
cd pnpm-example
pnpm init
```

For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).

To create pull token credentials and set them as environment variables, run:

```bash
eval $(chainctl auth pull-token --output env --repository=javascript)
```

Once
the environment variables are set, the following steps configure registry
access and authentication in the `.npmrc` file in the current project
directory:

```bash
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)

pnpm config set registry https://libraries.cgr.dev/javascript/ --location=project
pnpm config set //libraries.cgr.dev/:_auth "${token}" --location=project
```

The trailing slash in the registry URL is required. The authentication entry is
keyed to the whole `libraries.cgr.dev` host (`//libraries.cgr.dev/`) so that it
also covers packages served through the [upstream
fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls)
path. Note that the `-w 0` option for `base64` is required and supported by the GNU
coreutils versions included in most operating systems.

Alternatively, you can set `username` and `_password` instead of `_auth`. Note
that the `_password` value must still be base64-encoded; pnpm does not accept a
raw token here:

```bash
pnpm config set //libraries.cgr.dev/:username "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}" --location=project
pnpm config set //libraries.cgr.dev/:_password "$(echo -n "${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)" --location=project
```

Add dependencies for your project into the `package.json` file to test retrieval
from Chainguard Libraries, build the project, and list the dependencies:

```shell
pnpm add commander@4.1.1
pnpm install
pnpm list
```

Following this, find the downloaded package in
`node_modules/.pnpm/commander@4.1.1` and `node_modules/commander`. The commands
also result in the creation of the lock file `pnpm-lock.yaml`, which contains
the source URL for each package in the `tarball` field.

Adjust the registry configuration to use your repository manager and add any
other desired packages for further testing.

<a id="yarn"></a>

## Yarn

[Yarn](https://yarnpkg.com/) is a popular package manager for JavaScript
projects, offering fast, reliable, and secure dependency management as an
alternative to npm. It is widely used for managing
project dependencies, scripts, and workflows in Node.js and other JavaScript
development environments. For more details, refer to the [Yarn
documentation](https://yarnpkg.com/getting-started).

This section applies to modern versions of Yarn, also known as Yarn Berry, with
versions 2.x and higher. If you are using Yarn 1.x refer to the [Yarn Classic
section](#yarn-classic).

**Declare dependencies in package.json**

With Yarn, you declare JavaScript package dependencies in a `package.json` file
and separated into different scoped dependencies such as development and runtime
dependencies. The following block shows a minimal example with `react` and
`node` as main runtime dependencies and `eslint` as development dependency:

```json
{
  "name": "yarn-berry-example",
  "packageManager": "yarn@4.10.3",
  "dependencies": {
    "node": "^22.20.0",
    "react": "^19.1.1"
  },
  "devDependencies": {
    "eslint": "^9.36.0"
  }
}
```

By default, Yarn retrieves the packages from the registry at
`https://registry.yarnpkg.com` and stores them locally in the `.yarn` folder in the user's
home directory after running `yarn`. Specific packages are linked into the
project. This operation also creates the `yarn.lock` file.

Note that dependency versions are typically declared with the `^` before the
version string. This indicates higher, compatible versions, following the
semantic versioning scheme of the package, are used automatically. For example,
the declaration of version `^22.18.0` for `node`, actually results in the use of
version `22.20.0` or even a higher version once available and `yarn` is run.  

Any dependency or dependency version changes require another install and
therefore an update to the lock file. The lock file also encodes the checksum
values in the `checksum` field.

**Direct access: Point registry to Chainguard**

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to Chainguard in your user `.yarnrc` file:

```bash
yarn config set npmRegistryServer https://libraries.cgr.dev/javascript/
```

### Using a repository manager

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to your repository manager in your project `.yarnrc.yml` file:

```shell
yarn config set npmRegistryServer https://repo.example.com:8443/repository/javascript-all
```

The command results in the following line in the `.yarnrc.yml` file:

```
npmRegistryServer: "https://repo.example.com:8443/repository/javascript-all"
```

Refer to the [`config set` documentation](https://yarnpkg.com/cli/config/set) for
more details such as authentication support.

Example URLs:

- JFrog Artifactory: `https://example.jfrog.io/artifactory/javascript-all`
- Sonatype Nexus: `https://repo.example.com:8443/repository/javascript-all`
- Direct access: `https://libraries.cgr.dev/javascript`

### Apply registry changes

To apply the registry change, run the `yarn` command again. This forces an update of
all packages from the new registry and regeneration of the lock file.

If you encounter stale or corrupted package data, clear the cache with:

```bash
yarn cache clean --all
```

If you're seeing checksum mismatch errors rather than stale data, you can control Yarn's behavior via the [`checksumBehavior` setting](https://yarnpkg.com/configuration/yarnrc#checksumBehavior) in `.yarnrc.yml`. Setting it to `reset` causes Yarn to purge and re-fetch any cache entry whose checksum doesn't match, without clearing the entire cache:

```yaml
checksumBehavior: reset
```

### Update lockfile hashes

If you are migrating an existing project and want to preserve your current
lockfile, use [`chainctl libraries update-hashes`](#updating-lockfile-hashes)
to update only the integrity hashes in place instead.

#### Using Chainguard Libraries with `yarn install --immutable`

Yarn Berry's `--immutable` flag prevents changes to `yarn.lock` during installation. Migrating to Chainguard Libraries requires a lockfile preparation step before your normal `--immutable` workflow can resume.

Yarn Berry's lockfile stores both resolved `__archiveUrl` entries and Yarn-specific checksums (used by `--immutable` to detect tampering). Run the following command to update both:

```bash
chainctl auth configure-npm
TOKEN=$(grep '_authToken=' .npmrc | sed 's/.*_authToken=//')
chainctl libraries update-hashes --token "$TOKEN" yarn.lock
yarn install --mode=update-lockfile
```

After running these commands, verify that your lockfile is stable under `--immutable`:

```bash
yarn install --immutable
```

If this command exits without error and without modifying `yarn.lock`, your lockfile is ready to commit.

Expand the following section to learn about recommended workflows.

{{< details "Workflows when using the --immutable flag" >}}

**Recommended workflow for dependency updates**

When updating dependencies, repeat the lockfile preparation steps before committing:

```bash
chainctl auth configure-npm
TOKEN=$(grep '_authToken=' .npmrc | sed 's/.*_authToken=//')
chainctl libraries update-hashes --token "$TOKEN" yarn.lock
yarn install --mode=update-lockfile
yarn install --immutable
yarn build
yarn test
```

Review the `yarn.lock` diff before committing. Expected changes are updated `__archiveUrl` resolutions pointing to Chainguard, updated Yarn checksum entries, and any intentional dependency version changes. Unexpected changes to package versions should be investigated before committing.

**Recommended CI workflow**

After the updated lockfile is committed, your CI configuration does not need to change. Use your standard immutable install:

```bash
yarn install --immutable
yarn build
yarn test
```

For stricter checksum and cache validation, you can also add `--check-cache`:

```bash
yarn install --immutable --check-cache
```

Do not commit `.npmrc` credentials to version control. Use environment variables or CI secrets to supply credentials at build time.

{{< /details >}}

<a id="yarn-berry-minimal"></a>

### Minimal example project

Use the following steps to create a minimal example project for yarn with
Chainguard Libraries for JavaScript. The script sets the policy to use the
latest stable release of Yarn.

```shell
mkdir yarn-berry-example
cd yarn-berry-example
yarn policies set-version stable
yarn init
```

For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials). Once
the environment variables are set, the following steps configure registry
access with authentication in the `.yarnrc.yml` file in the current project
directory:

```shell
export authInfo="${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}"

yarn config set npmRegistryServer https://libraries.cgr.dev/javascript
yarn config set 'npmRegistries["//libraries.cgr.dev/javascript"].npmAuthIdent' "${authInfo}"
yarn config set 'npmRegistries["//libraries.cgr.dev/javascript"].npmAlwaysAuth' "true"
```

Note the following details:

- The `authInfo` token is passed as authentication identity `npmAuthIdent` and only uses
  the username and password values from the pull token separated by colon without any further encoding.
- Setting `npmAlwaysAuth` is required.

Add dependencies for your project into the `package.json` file to test retrieval
from Chainguard Libraries, build the project, and list the dependencies:

```shell
yarn add commander@4.1.1
yarn install
yarn info
```

Following this, find the downloaded package in the local shared cache. The
commands also result in the creation of the lock file `yarn.lock`, which
contains the source URL for each package in the `archiveUrl` parameter of the
`resolution` field.

Adjust the registry configuration to use your repository manager and add any
other desired packages for further testing.

<a id="yarn-classic"></a>

## Yarn Classic

[Yarn Classic](https://classic.yarnpkg.com/) is the legacy 1.x release of
[Yarn](#yarn).

With Yarn, you declare JavaScript package dependencies in a `package.json` file
and separated into different scoped dependencies such as development and runtime
dependencies. The following block shows a minimal example with `react` and
`node` as main runtime dependencies and `eslint` as development dependency:

```json
{
  "name": "yarn-classic-example",
  "version": "1.0.0",
  "description": "A minimal example project for using yarn classic",
  "main": "index.js",
  "author": "Chainguard",
  "license": "MIT",
  "private": false,
  "dependencies": {
    "node": "^22.18.0",
    "react": "^19.1.1"
  },
  "devDependencies": {
    "eslint": "^9.36.0"
  }
}
```

By default, Yarn retrieves the packages from the registry at
`https://registry.yarnpkg.com` and stores them locally in the `node_modules`
directory of the project after running `yarn`. This operation also creates the
`yarn.lock` file.

Note that dependency versions are typically declared with the `^` before the
version string. This indicates higher, compatible versions, following the
semantic versioning scheme of the package, are used automatically. For example,
the declaration of version `^22.18.0` for `node`, actually results in the use of
version `22.20.0` or even a higher version once available and `yarn` is run.  

Any dependency or dependency version changes require another install and
therefore an update to the lock file. The lock file also encodes the checksum
values in the `integrity` field and the download URL in the `resolved` field for
each module.

**Direct access: Point registry to Chainguard**

To change a project to use Chainguard Libraries for JavaScript, first export your pull token as base64-encoded environment variables:

```bash
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)
```

Then, set auth and set the registry URL to point to Chainguard in your user `.npmrc` file:

```bash
cat > .npmrc << 'EOF'
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth="$token"
//libraries.cgr.dev/javascript/:always-auth=true
//libraries.cgr.dev/javascript-upstream/:_auth="$token"
//libraries.cgr.dev/javascript-upstream/:always-auth=true
EOF
```

### Using a repo manager

To change a project to use Chainguard Libraries for JavaScript, set the registry
URL to point to your repository manager in your `.npmrc` file:

```
cat > .npmrc << EOF
registry=https://repo.example.com:8443/repository/javascript-all
EOF
```

Example URLs:

- JFrog Artifactory: `https://example.jfrog.io/artifactory/javascript-all`
- Sonatype Nexus: `https://repo.example.com:8443/repository/javascript-all`
- Direct access: `https://libraries.cgr.dev/javascript`

### Apply registry changes

Note that you can also use the `yarn config set registry` command to set the
registry in the `.yarnrc` file, however this approach does not support
authentication as typically required for repository managers as well as for
direct access to Chainguard Libraries for JavaScript.

Refer to the [`.yarnrc`
documentation](https://classic.yarnpkg.com/lang/en/docs/yarnrc/) for more
details.

To apply the registry changes, remove the `node_modules` directory, [update the artifact hashes](#update-lockfile-hashes), then run the `yarn install` command again. This re-fetches all
packages from Chainguard and updates the lockfile in place with updated hashes:

```bash
rm -rf node_modules
chainctl libraries update-hashes
yarn install
```

As an alternative, you can remove the `node_modules` directory _and_ the `yarn-lock.json` file, then reinstall. This regenerates the lockfile and updates the hashes. Regenerating re-resolves your dependencies, so it can change your pinned versions, and a release still inside your configured cooldown window returns a 404 error. See [Update your lockfile](/chainguard/libraries/javascript/migration/#step-3-update-your-lockfile).

Another option, after deleting `node_modules` and `yarn-lock.json`, is to run `yarn upgrade`. This updates all dependencies to their latest allowed
versions and regenerates the lock file with updated hashes.

If you encounter stale or corrupted package data, clear the cache with:

```bash
yarn cache clean
```

<a id="yarn-classic-minimal"></a>

### Minimal example project

Use the following steps to create a minimal example project for yarn with
Chainguard Libraries for JavaScript.

```shell
mkdir yarn-classic-example
cd yarn-classic-example
yarn init -y
```

For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials). Once
the environment variables are set, the following steps configure registry access
with authentication in the `.npmrc` file directory:

```shell
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)
cat > .npmrc << EOF
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth="$token"
//libraries.cgr.dev/javascript/:always-auth=true
EOF
```

Note the following details:

- Using yarn configuration files such as `.yarnrc` and commands like `yarn
  config set registry` does not work with authentication details, and the
  proposed approach with `.npmrc` file is preferable.
- The `token` token is passed as authentication token `_auth` and uses the
  username and password values from the pull token separated by colon in
  `base64` encoding. Note that the `-w 0` option for `base64` is required and
  supported by the GNU coreutils versions included in most operating systems.
- Setting `always-auth` is required.
- The trailing slash in the registry URL and authentication references to it is required.

Add dependencies for your project into the `package.json` file to test retrieval
from Chainguard Libraries, build the project, and list the dependencies:

```shell
yarn add commander@4.1.1
yarn install
yarn list
```

Following this, find the downloaded package in the `node_modules` directory.
The commands also result in the creation of the lock file `yarn.lock`, which
contains the source URL for each package in the `resolved` field.

Adjust the registry configuration to use your repository manager and add any
other desired packages for further testing.

<a id="bun"></a>

## Bun

[Bun](https://bun.com/) is a fast, all-in-one JavaScript runtime, bundler, and
package manager designed as an alternative to Node.js tooling. It provides an
integrated package manager that is compatible with the npm ecosystem.

**Declare dependencies in package.json**

With Bun you declare dependencies in a `package.json` file just like
[npm](#npm). The following snippet shows a minimal example:

```json
{
  "dependencies": {
    "@emotion/react": "^11.14.0",
    "@emotion/styled": "^11.14.0",
    "@fontsource/roboto": "^5.1.1",
    "node": "^22.18.0",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-router-dom": "^7.1.5"
  },
  "devDependencies": {
    "@eslint/js": "^9.14.0",
    "@types/react": "^18.3.18",
    "@types/react-dom": "^18.3.5"
  }
}
```

By default Bun installs packages from the npm Registry at
`https://registry.npmjs.org` and stores them locally in the `node_modules`
directory after running `bun install`. Bun creates a binary lockfile named
`bun.lock` to record resolved versions and checksums.

Note that dependency versions are typically declared with `^` to allow
compatible newer releases under semantic versioning. For example, `^22.18.0` for
`node` can result in `22.20.0` or higher when `bun install` runs.

Any dependency or version changes require running `bun install` again, which
updates the lockfile.

### Using a repository manager

To switch a project to use Chainguard Libraries for JavaScript, point Bun at
your repository manager. Add the [registry
configuration](https://bun.com/docs/runtime/bunfig#install-registry) to the
`bunfig.toml` file of your project: `

```toml
[install]
# set default registry as a string
registry = "https://repo.example.com:8443/repository/javascript-all/"
```

Alternatively you can use an [`.npmrc` file](#npm).

You can also temporarily override for install:

```shell
bun install --registry=https://repo.example.com:8443/repository/javascript-all/
```

Refer to [Bun documentation](https://bun.com/docs) for additional registry and authentication options.

Example registry URLs:

- JFrog Artifactory: https://example.jfrog.io/artifactory/javascript-all/
- Sonatype Nexus: https://repo.example.com:8443/repository/javascript-all/
- Direct access: https://libraries.cgr.dev/javascript/

### Apply registry changes

To apply the registry changes, remove the `node_modules` directory, [update the artifact hashes](#update-lockfile-hashes), then run the `bun install` command again. This re-fetches all
packages from Chainguard and updates the lockfile in place with updated hashes:

```bash
rm -rf node_modules
chainctl libraries update-hashes
bun install
```

As an alternative, you can remove the `node_modules` directory _and_ the `bun-lock.json` file, then reinstall. This regenerates the lockfile and updates the hashes. Regenerating re-resolves your dependencies, so it can change your pinned versions, and a release still inside your configured cooldown window returns a 404 error. See [Update your lockfile](/chainguard/libraries/javascript/migration/#step-3-update-your-lockfile).

<a id="bun-minimal"></a>

### Minimal example project

Use the following steps to create a minimal example project for bun with
Chainguard Libraries for JavaScript.

```shell
mkdir bun-example
cd bun-example
bun init -y
```

For testing purposes, you can use direct access and environment variables as
detailed in the [access documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials). Once
the environment variables are set, the following steps configure registry
access with authentication in the `bunfig.toml` file in the current project
directory:

```shell
cat > bunfig.toml << EOF
[install.registry]
url = "https://libraries.cgr.dev/javascript/"
username = "$CHAINGUARD_JAVASCRIPT_IDENTITY_ID"
password = "$CHAINGUARD_JAVASCRIPT_TOKEN"
EOF
```

Note that the trailing slash in the registry URL is required.

Add dependencies for your project into the `package.json` file to test retrieval
from Chainguard Libraries, build the project, and list the dependencies:

```shell
bun add commander@4.1.1
bun install
bun pm ls
```

Following this, find the downloaded package in `node_modules/commander`. The
 commands also result in the creation of the lock file `bun.lock`, which
contains the source URL for each package in the `packages` section.

Adjust the registry configuration to use your repository manager and add any
other desired packages for further testing.

---

### Global configuration
_Path: chainguard/libraries/javascript/global-configuration.md_

JavaScript and npm package consumption in a large organization is typically
managed by a repository manager. Commonly used repository manager applications
are [JFrog Artifactory](https://jfrog.com/artifactory/), [Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository), and
others. The repository manager acts as a single point of access for developers
and development tools to retrieve the required libraries.

If your organization uses the [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls)
feature of Chainguard Repository, you can configure your repository manager
with a single upstream pointed at `https://libraries.cgr.dev/javascript/`. This
is the recommended setup. The Chainguard Repository handles fallback and policy
enforcement; your repository manager handles local caching and access control.
Chainguard also retrieves packages from the public npm Registry on your
behalf when upstream fallback is enabled. This includes protections such as
malware detection and a cooldown period for newly published
packages.

At a high level, adopting the use of Chainguard Libraries consists of the following steps:

* Configure your environment to use `https://libraries.cgr.dev/javascript/`
  as the single upstream source for JavaScript package retrieval. This can be done
  either:
    * As a remote repository in your repository manager, or
    * Directly in your JavaScript build configuration (for example, npm,
      pnpm, or yarn).
* Additional steps depend on your visibility and validation goals and can include the following optional measures:
    * Remove all cached libraries in existing proxy repositories. This step
      allows you to validate which libraries are not available from
      Chainguard Libraries and ensures they are retrieved through
      Chainguard for evaluation.
    * Remove any repositories that are no longer desired or necessary.
      Depending on your library requirements, this step can result in
      removal of some proxy repositories or simplification of your
      repository configuration.

Adopting the use of a repository manager is the recommended approach to minimize complexity. If your organization does not use a repository manager, refer to the [direct access documentation](/chainguard/libraries/javascript/build-configuration/) for build tools.

## Manually managing fallback

Chainguard recommends using the Chainguard Repository's built-in [upstream
fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls)
rather than configuring a public registry fallback in your repo manager.
Configuring your own fallback bypasses the protection that the Chainguard
Repository provides.

However, if upstream fallback is not enabled or you prefer to manage your own fallback
ordering, you can configure `https://libraries.cgr.dev/javascript/` as a remote
repository alongside your npm upstream, and combine them in a virtual or group
repository with Chainguard as the first priority. The per-tool instructions on
this page follow this pattern.

### Updating lockfile hashes

If you are migrating an existing JavaScript project to Chainguard Libraries through a repository manager, your lockfile likely contains integrity hashes generated against packages previously downloaded from npm or through your repository manager. The [`chainctl libraries update-hashes` command](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/) automates lockfile hash updates
for all supported JavaScript lockfile formats.

When you are using a repository manager, pass the full repository manager URL with `--registry-url` and authenticate with one of the supported methods: `--username` and `--password`, `--token`, or a `.netrc` entry for the registry host. For example:

```bash
chainctl libraries update-hashes \
  --registry-url https://repo.example.com:8443/repository/javascript-all/ \
  --token "$REPO_TOKEN"
```

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.javascript.pull` permission or the Owner role.

After updating the lockfile, keep your repository manager configuration in place and reinstall through the same repository manager endpoint to apply the updated hashes.

Learn more in the [Build configuration page](/chainguard/libraries/javascript/build-configuration/#updating-lockfile-hashes) and in the [chainctl docs](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/).

<a name="cloudsmith"></a>

## Cloudsmith

[Cloudsmith](https://cloudsmith.com/) supports npm registries for
proxying and hosting. Refer to the [npm registry
documentation](https://help.cloudsmith.io/docs/npm-registry) and the [npm
Upstream
documentation](https://help.cloudsmith.io/docs/upstream-proxying-caching#create-a-npm-upstream)
for Cloudsmith for more information. Cloudsmith supports combining repositories
by defining multiple upstream repositories.

The recommended approach is to rely on Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
configuring a single upstream proxy pointed at `https://libraries.cgr.dev/javascript/`
rather than adding a separate public npm proxy. Refer to [Manually managing
fallback](#manually-managing-fallback) if you need to control fallback ordering
yourself.

### Initial configuration

Use the following steps to configure a repository with the Chainguard Libraries for
JavaScript repository as an upstream.

Configure a *javascript-all* repository. This repository acts as a single access point
for JavaScript packages and may also include private packages or additional upstream
sources, depending on your configuration.

1. Log in as a user with administrator privileges.
1. Select the **Repositories** tab near the top of the screen.
1. On the **Repositories** page, click **+ New repository**.
1. Enter the name *javascript-all* for your new repository. The name should
   include *javascript* to identify the ecosystem. This convention helps
   avoid confusion since repositories in Cloudsmith are multi-format.
1. Select a storage region that is appropriate for your organization and
   infrastructure.
1. Click **+ Create Repository**.

Configure an upstream proxy for the Chainguard Libraries for JavaScript
repository:

1. Click the name of the new *javascript-all* repository on the
   repositories page to configure it.
1. Access the **Upstreams** tab and click **+ Add Upstream Proxy**.
1. Configure an upstream proxy with the format **npm** and the following details:
    * **Name** *javascript-chainguard*
    * **Priority** *1*
    * **Proxy URL** `https://libraries.cgr.dev/javascript/`
    * **Mode** *Cache and Proxy*
    * Add the **Username** and **Password** value from [Chainguard Libraries
      access](/chainguard/libraries/introduction/access/) in **Authentication Settings**
1. Click **Create Upstream Proxy**.

If you are manually managing fallback, you can add an additional upstream
proxy for the public npm registry with a lower priority than
`javascript-chainguard`.

Use this setup for initial testing with Chainguard Libraries for JavaScript. For
production usage, add the `javascript-chainguard` upstream proxy to your production
repository.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Select the **Packages** tab.
1. Click **Push/Pull Packages**.
1. Choose the format **NPM**.
1. Refer to the **Pull Package** tab.
1. Note the registry URL and syntax from the code snippets for npm. For example,
   the URL for the registry in the `example` organization is
   `https://npm.cloudsmith.io/example/javascript-all/`.
1. Note that authentication is using an authentication token and the syntax for
   npm in the `example` organization is
   `//npm.cloudsmith.io/example/javascript-all/:_authToken=YOUR-API-KEY`

Use the provided code snippets directly for your use with npm, or adjust as
necessary for other JavaScript build and packaging tools. Find relevant details
in the [Build
Configuration](/chainguard/libraries/javascript/build-configuration/) and
specific packaging tool documentation.

Use the following steps to retrieve the necessary API key as an authentication
token for the registry access:

1. Click on your user name at the top right corner.
1. Select **Personal API keys**.
1. Authenticate again in the **Confirm access** dialog.
1. Create a new token or refresh the existing one in case you lost the token
   value.

<a name="artifactory"></a>

## JFrog Artifactory

[JFrog Artifactory](https://jfrog.com/artifactory/) supports npm repositories
for proxying and hosting, and virtual repositories to combine them. Refer to the
[npm Repository documentation for
Artifactory](https://docs.jfrog.com/artifactory/docs/npm-repositories)
for more information.

If you follow the recommended approach to rely on Chainguard Repository's
[upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), disable or remove any existing Artifactory remote repository
that points at the public npm registry, and remove it from the virtual repository your
builds resolve against. A remote pointing directly at the public upstream bypasses
those protections. Since Artifactory resolves through the virtual repository in
order, a misconfiguration can result in Artifactory serving an unprotected
package.

### Initial configuration

Use the following steps to add Chainguard Libraries for
JavaScript as a remote repository:

1. Log in as a user with administrator privileges.
1. Click **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.

Configure a remote repository for the Chainguard Libraries for JavaScript
repository:

1. Click **Create a Repository** and choose the **Remote** option.
1. Select *Npm* as the **Package type**.
1. Set the **Repository Key** to `javascript-chainguard`.
1. Set the **URL** to `https://libraries.cgr.dev/javascript/`.
1. Set **User Name** and **Password / Access Token** to the [values as retrieved
   with chainctl](/chainguard/libraries/introduction/access/).
    * Note: The **Test** button is not a reliable indicator; to verify your setup, refer to the [validation steps](#validate-the-remote-repository) later on this page.
1. Click the **Advanced** configuration tab, then configure the following settings:
    * In the **Network** section:
        * Confirm **Lenient Host Authentication** is unchecked, so that your credentials are not forwarded across the redirect.
        * Optionally check **Enable Cookie Management**. JFrog recommends this for remote repositories that involve redirects.
    * In the **Others** section:
        * Check **Bypass HEAD Requests**, so that Artifactory retrieves each tarball with a GET request instead of probing with a HEAD request first.
        * Uncheck **Block Mismatching Mime Types**.
        * Check **Disable URL Normalization**, so that Artifactory does not rewrite the pre-signed redirect URL.
1. Click **Create Remote Repository**.

These settings are required because Chainguard Libraries stores artifacts in
Cloudflare R2. A tarball download from `libraries.cgr.dev` returns a 302 redirect
to a pre-signed URL on a different host, and the redirect response itself is an
HTML document. Without these settings, Artifactory may rewrite the pre-signed
URL, forward your credentials across the redirect, or cache the redirect response
in place of the tarball. A cached redirect response fails npm's integrity
checksum check at install time.

Create a virtual repository, or add the remote repository to an existing virtual
repository used for npm packages, to give your build tools a single access point.
A virtual repository may also include your own private npm packages.

1. Click **Create a Repository** → **Virtual**.
1. Select **Npm**.
1. Set key to *javascript-all*.
1. Add `javascript-chainguard`.
1. Click **Create Virtual Repository**.

If you are manually managing fallback, rather than following the recommended approach to use Chainguard's upstream fallback, you can configure an additional npm
remote repository with lower priority.

### Validate the remote repository

After creating and configuring the `javascript-chainguard` remote repository, validate that Artifactory is successfully proxying through to Chainguard before proceeding. A misconfigured remote repository fails silently; if any remote pointing at the public npm registry is still present, Artifactory resolves through it instead and the build succeeds with no visible error. This can result in pulling an unprotected package.

Common sources of misconfiguration include invalid or expired credentials, an incorrect or incomplete URL, and misconfigured [settings in the Advanced tab](#initial-configuration-1). The Artifactory **Test** button on the repository configuration screen is not a reliable indicator; it may fail for a correctly configured repository, and may pass for an incorrectly configured one. Instead, use the following steps to verify that fetching an artifact through Artifactory produces the same checksum as fetching it directly from `libraries.cgr.dev`.

1. Fetch the artifact directly from Chainguard and compute its checksum, using the same credentials you configured in Artifactory. This example uses `picocolors-1.1.1`. You can substitute any artifact you know to be available.

```bash
curl -sSf -L \
  -u "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" \
  https://libraries.cgr.dev/javascript/picocolors/-/picocolors-1.1.1.tgz \
  | openssl dgst -sha512 -binary | base64
```

1. Fetch the same artifact through the Artifactory remote repository and compute its checksum:

```bash
curl -sSf -L \
  -H "Authorization: Bearer ${ARTIFACTORY_TOKEN}" \
  https://<artifactory-host>/artifactory/api/npm/javascript-chainguard/picocolors/-/picocolors-1.1.1.tgz \
  | openssl dgst -sha512 -binary | base64
```

Replace `artifactory-host` with your Artifactory instance hostname, and replace `${ARTIFACTORY_TOKEN}` with your Artifactory identity token.

1. Test the virtual repository your build tools resolve against as well, so that you catch a stray remote still present in it:

```bash
curl -sSf -L \
  -H "Authorization: Bearer ${ARTIFACTORY_TOKEN}" \
  https://<artifactory-host>/artifactory/api/npm/javascript-all/picocolors/-/picocolors-1.1.1.tgz \
  | openssl dgst -sha512 -binary | base64
```

The checksums returned by the commands must match.

If the checksum from the Artifactory remote or virtual repository differ from the direct fetch, or if the Artifactory fetch fails entirely, review the following before proceeding:

* URL: The remote repository URL must be set to `https://libraries.cgr.dev/javascript/`.
* Credentials: You may need to regenerate your pull token with `chainctl auth pull-token --repository=javascript` and update the Artifactory repository credentials. Expired tokens fail silently.
* Advanced configuration: Ensure all recommended Advanced settings from the [initial configuration steps](#initial-configuration-1) have been applied.
* Corrupted cached tarballs: if the repository previously ran without these settings, Artifactory may still be serving a cached redirect response. In Artifactory, browse the `javascript-chainguard` remote cache and locate the affected `.tgz` artifacts. Right-click each artifact, select **Delete content**, then re-run your install.

Do not proceed to virtual repository setup or build configuration until the checksums match.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Click **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.
1. Select the **Virtual** tab in the repositories view.
1. Locate the *javascript-all* repository.
1. Hover over the row and click the **...** in the last column on the right.
1. Select **Set Me Up** in the dialog.
1. Click **Generate Token & Create Instructions**.
1. Copy the generated token value to use as the password for authentication.
1. Click **Generate Settings**.
1. Copy the value from a **url** field. They are all identical. For example,
   `https://exampleorg.jfrog.io/artifactory/javascript-all/` with `exampleorg`
   replaced with the name of your organization.

Use the URL of the virtual repository in the [build
configuration](/chainguard/libraries/javascript/build-configuration/) and build a
first test project. In a working setup the chainguard remote repository contains
all libraries retrieved from Chainguard.

<a name="nexus"></a>

## Sonatype Nexus Repository

[Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository) allows
for merging multiple remote repositories as a repository group. The
instructions on this page are based on the [Nexus documentation for
npm](https://help.sonatype.com/en/npm-registry.html).

The recommended approach is to use the Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls). If
you are instead configuring your own fallback in your repo manager, for initial
testing it is advised to create a separate proxy repository for the npm
Registry, a separate proxy repository Chainguard Libraries for JavaScript
repository, and a separate repository group.

### Initial configuration

Create a separate proxy repository for the Chainguard Libraries for JavaScript
repository, and include it in a repository group:

1. Log in as a user with administrator privileges.
1. Access the **Server administration** and configuration section with the gear
   icon in the top navigation bar.

Configure a proxy repository for the Chainguard Libraries for JavaScript
repository:

1. Select **Repository - Repositories** in the left hand navigation.
1. Click **Create repository**.
1. Select the **npm (proxy)** recipe.
1. Configure the following:
    * **Name**: `javascript-chainguard`
    * **Proxy - Remote storage**: Add the URL
   `https://libraries.cgr.dev/javascript/`.
    * **HTTP - Authentication**: Select `Username` as the Authentication type,
   and provide the [username and password values as retrieved with
   chainctl](/chainguard/libraries/introduction/access/).
1. Click **Create repository**.

Create a repository group, or add to an existing repository group:

1. Select **Repository - Repositories** in the left hand navigation.
1. Click **Create repository**.
1. Select the **npm (group)** recipe.
1. Configure the following:
    * **Name**: `javascript-all`
    * Under **Group - Member repositories**, move the new repository
   `javascript-chainguard` to the right to include it in the group. Position
   `javascript-chainguard` at the top of the list using the arrow controls.

Repository groups can include multiple repositories, such as hosted
repositories for private packages or additional proxy repositories. In a
typical configuration, the Chainguard repository is placed first to ensure
packages are retrieved through Chainguard when available.

If you are manually managing fallback, you can configure an additional npm
proxy repository and add it to the group after `javascript-chainguard`.

### Build tool access

The following steps allow you to determine the URL and authentication details
for accessing the repository:

1. Click **Browse** in the **Welcome** view or the browse icon (cube) in the top
   navigation bar.
1. Locate the **URL** column for the `javascript-all` repository group and click
   **copy**. For example, `https://repo.example.com/repository/javascript-all/`
   with `repo.example.com` replaced with the hostname of your repository manager.
1. Copy the URL in the dialog.
1. Use your configured username and password, unless **Security** > **Anonymous Access** > **Access** > **Allow anonymous users to access the server** is
   activated. Details vary based on your configured authentication system.

Use the URL of the repository group, such as
`https://repo.example.com/repository/javascript-all/` in the [build
configuration](/chainguard/libraries/javascript/build-configuration/) and build a
first test project. In a working setup the `javascript-chainguard` proxy
repository contains all libraries retrieved from Chainguard.

## Google Artifact Registry

Google Artifact Registry (GAR) is not an officially supported repository manager for Chainguard Libraries for JavaScript. However, it has been shown to work with the following configuration.

Configure two GAR remote repositories, with upstream validation disabled on the second:

* First remote repository: `javascript-chainguard` pointing to `https://libraries.cgr.dev/javascript` with upstream validation enabled
* Second remote repository: `javascript-chainguard-upstream` pointing to `https://libraries.cgr.dev/javascript-upstream` with upstream validation disabled.

When using `artifactregistry-auth`, note that it only injects credentials for repositories explicitly listed in your `.npmrc`. Ensure you add a credentials entry for the `javascript-chainguard-upstream` repository alongside your existing `javascript-chainguard` entry, otherwise you will receive 404s for upstream-fallback packages.

## AWS CodeArtifact

AWS CodeArtifact is not an officially supported repository manager for Chainguard Libraries for JavaScript. However, it has been shown to work with the following configuration.

Because CodeArtifact doesn't support proxying authenticated upstream repositories, these instructions show how to mirror JavaScript packages from Chainguard Libraries into CodeArtifact. After configuring a mirror, configure developers and CI systems to install packages from your private CodeArtifact repository.

If you use Chainguard Repository with upstream fallback enabled, npm clients can point directly to the Chainguard endpoint and retrieve either Chainguard-built packages or policy-protected upstream packages through that single registry. Use the CodeArtifact mirroring workflow only if your organization needs to keep AWS CodeArtifact as the registry your developers install from.

### Prerequisites

You will need the following:

* An AWS account with the following IAM permissions:
    * `codeartifact:PublishPackageVersion`
    * `codeartifact:PutPackageMetadata`
    * `codeartifact:GetAuthorizationToken`
    * `codeartifact:GetRepositoryEndpoint`
* A Chainguard account with entitlement to Chainguard Libraries for JavaScript and credentials you can use to authenticate to the registry.
* The AWS CLI, Node.js and npm, `jq`, and `bash`. If you use pnpm lockfiles, you also need the Go `mikefarah` build of `yq` v4.

This workflow supports both `package-lock.json` and `pnpm-lock.yaml`. For pnpm, the parser supports lockfile versions v5, v6, and v9. Scoped packages such as `@types/node` and `@babel/core` are also supported.

> Note: This workflow preserves standard npm attestations embedded in tarballs, but Chainguard-specific registry metadata is not preserved in the mirrored repository. Because AWS CodeArtifact charges for storage and requests, you should monitor repository growth over time and clean up unused package versions as needed.

### Step 1: Create a CodeArtifact domain and repository

You can create the CodeArtifact resources manually with the AWS CLI:

```bash
export AWS_REGION="us-east-1"

aws codeartifact create-domain \
  --domain npm-mirror-test \
  --region $AWS_REGION

aws codeartifact create-repository \
  --domain npm-mirror-test \
  --repository cg-npm-packages \
  --description "npm packages mirror from Chainguard" \
  --region $AWS_REGION
```

After setup, export the values the mirroring workflow uses:

```bash
export AWS_REGION="us-east-1"
export CODEARTIFACT_DOMAIN="npm-mirror-test"
export CODEARTIFACT_REPOSITORY="cg-npm-packages"
export CGR_USER="your-chainguard-identity"
export CGR_TOKEN="your-chainguard-token"
```

`CODEARTIFACT_DOMAIN_OWNER` is optional. If you do not set it, the workflow can use your current AWS account ID.

### Step 2: Mirror packages from a lockfile

This guide uses a script named `npm-codeartifact-mirror.sh`. Access the bash script and learn more about it in [Chainguard's example on GitHub](https://github.com/chainguard-demo/platform-examples/tree/main/library-copy-aws-code-artifact).

Before running the script, save it to a local working directory and make it executable:

```bash
chmod +x npm-codeartifact-mirror.sh
```

The mirroring workflow reads a project lockfile, extracts package names and versions, checks whether each version already exists in CodeArtifact, downloads missing packages from Chainguard Libraries, and publishes them into your private CodeArtifact repository.

Run the script against either an npm or pnpm lockfile:

```bash
./npm-codeartifact-mirror.sh ./package-lock.json
```

```bash
./npm-codeartifact-mirror.sh ./pnpm-lock.yaml
```

If you do not pass a file path, the script automatically looks for `package-lock.json` and then `pnpm-lock.yaml` in the current directory.

### How mirroring behaves

The mirroring workflow runs in multiple passes. On the first pass, it skips versions that already exist in CodeArtifact and attempts to download and publish everything else. If a package is not yet available because Chainguard is still ingesting it from upstream, the workflow queues that package for a later retry.

By default, the workflow retries unavailable packages up to four times with a 30-second delay between passes. You can tune this behavior with `INGEST_MAX_PASSES` and `INGEST_RETRY_DELAY`.

For transient npm transport failures such as socket timeouts, rate limits, or 5xx responses, you can also tune `NPM_FETCH_RETRIES` and `NPM_FETCH_TIMEOUT`.

### Step 3: Verify mirrored packages

After the mirror completes, use the AWS CLI to verify that packages were published to CodeArtifact:

```bash
aws codeartifact list-packages \
  --domain $CODEARTIFACT_DOMAIN \
  --repository $CODEARTIFACT_REPOSITORY \
  --format npm

aws codeartifact list-package-versions \
  --domain $CODEARTIFACT_DOMAIN \
  --repository $CODEARTIFACT_REPOSITORY \
  --package lodash \
  --format npm
```

For scoped packages, use the `--namespace` parameter:

```bash
aws codeartifact list-package-versions \
  --domain $CODEARTIFACT_DOMAIN \
  --repository $CODEARTIFACT_REPOSITORY \
  --package fs-minipass \
  --namespace isaacs \
  --format npm
```

If any packages could not be mirrored, the workflow writes an unresolved package report. Each line includes the reason and package version, such as `404`, `ETARGET`, or `AUTH`.

### Step 4: Configure npm clients to install from CodeArtifact

Once the packages are mirrored, authenticate to CodeArtifact and point npm at your repository endpoint:

```bash
export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
  --domain $CODEARTIFACT_DOMAIN \
  --query authorizationToken \
  --output text \
  --region $AWS_REGION)

export CODEARTIFACT_REGISTRY=$(aws codeartifact get-repository-endpoint \
  --domain $CODEARTIFACT_DOMAIN \
  --repository $CODEARTIFACT_REPOSITORY \
  --format npm \
  --query repositoryEndpoint \
  --output text \
  --region $AWS_REGION)

npm config set registry $CODEARTIFACT_REGISTRY
npm config set //$(echo $CODEARTIFACT_REGISTRY | sed 's|https://||')/:_authToken $CODEARTIFACT_AUTH_TOKEN
```

You can then install packages as usual:

```bash
npm install
```

As an alternative, you can use `aws codeartifact login` for npm:

```bash
aws codeartifact login \
  --tool npm \
  --domain $CODEARTIFACT_DOMAIN \
  --repository $CODEARTIFACT_REPOSITORY \
  --region $AWS_REGION
```

### Troubleshooting

#### Authentication and AWS permissions

If you cannot get a CodeArtifact authorization token or publish packages, verify your AWS credentials and IAM permissions. The workflow specifically relies on permissions such as `codeartifact:PublishPackageVersion`, `codeartifact:PutPackageMetadata`, `codeartifact:GetAuthorizationToken`, and `codeartifact:GetRepositoryEndpoint`.

CodeArtifact tokens expire after 12 hours. If authentication starts failing later, request a new token and retry.

#### Packages are still unavailable

If packages remain unavailable after all retry passes, Chainguard may still be ingesting them, they may be in a cooldown period, they may be blocked for security reasons, or the requested version may not exist. Re-running the workflow later, or increasing `INGEST_MAX_PASSES` and `INGEST_RETRY_DELAY`, can help pick up packages that were still within the ingestion window during an earlier run.

#### pnpm parsing issues

If you use pnpm and the workflow reports zero packages or fails because of `yq`, make sure you are using the Go `mikefarah` build of `yq` v4 rather than the Python `kislyuk` implementation.

---

### Migrating a JavaScript project to Chainguard Libraries
_Path: chainguard/libraries/javascript/migration.md_

Chainguard Libraries for JavaScript provides a curated registry of npm packages
rebuilt from source, scanned for malware, and verified against the
[OSV database](https://osv.dev/). Because Chainguard Libraries uses the standard
npm registry protocol, switching an existing project requires only a registry
configuration change — no changes to your application code, `package.json`, or
dependency versions.

This guide walks through migrating an existing JavaScript project to Chainguard
Libraries, covering the two most common setups:

- **Direct access** — your build tool connects directly to `libraries.cgr.dev`.
  This option is faster for initial evaluation and smaller-scale setups.
- **Repository manager** — your build tool connects to a repository manager
  (such as JFrog Artifactory or Sonatype Nexus), which proxies requests to
  Chainguard Libraries. This option is recommended for teams and organizations.

To follow along with a ready-made project instead of your own, use the [Chainguard Libraries for JavaScript demo repository](https://github.com/chainguard-demo/chainguard-libraries-javascript). It provides example projects for npm, pnpm, Yarn, and Bun, each with a `demo.sh` script that configures access and installs sample packages.

For a reference of the configuration options for each supported build tool, check out [Configure JavaScript build tools](/chainguard/libraries/javascript/build-configuration/).

## Prerequisites

Before you begin, you'll need:

- An existing JavaScript project with a `package.json` and a lockfile
  (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, or `bun.lock`)
- [`chainctl` installed and authenticated](/platform/chainctl-usage/how-to-install-chainctl/)
- An [entitlement to Chainguard Libraries](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/)
  for JavaScript

### Create an entitlement

To create an entitlement to Chainguard Libraries for JavaScript and enable upstream fallback, including a default 7-day cooldown, run:

```shell
chainctl libraries entitlements create --ecosystems=JAVASCRIPT --policy=CHAINGUARD_AND_UPSTREAM
```

Alternatively, you can create an entitlement and pull token in the Chainguard Console: while viewing the JavaScript ecosystem page, follow the prompts to create an access token.

You can also configure [cooldown policies](#packages-not-available-in-chainguard-libraries)
after you create the entitlement. For example, to create and enforce a
policy for a 14-day cooldown:

```shell
chainctl libraries policy create --name=js-cooldown-14d --cooldown-days=14
chainctl libraries policy enable js-cooldown-14d --ecosystem=JAVASCRIPT --mode=ENFORCE
```

It can take up to 30 minutes for the fallback and cooldown policies to take effect. Learn more about cooldown and other policies in the [Libraries policies documentation](/chainguard/chainguard-repository/library-policies/).

### Create a pull token

If you plan to use a repository manager, or a non-interactive environment such
as CI/CD, you will need a pull token. You must be an Owner or have the
`libraries.javascript.pull_token_creator` permission to create one.

You can [create a pull token in the Chainguard Console](/chainguard/libraries/introduction/access/#creating-pull-tokens-with-the-chainguard-console), or via `chainctl`:

```shell
chainctl auth pull-token --repository=javascript --name=my-js-token
```

This outputs an identity ID and token named `my-js-token`, with a default expiration of 30 days. To configure the expiration, use the `--ttl` flag. Learn more about command options in the [chainctl documentation](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/).

Set the identity ID and token as environment variables:

```shell
export CHAINGUARD_JAVASCRIPT_IDENTITY_ID="<identity-id>"
export CHAINGUARD_JAVASCRIPT_TOKEN="<pull-token>"
```

> **Do not commit credentials to version control.** Configuration files
> generated with a literal token value — such as `.npmrc` files written by
> `chainctl auth configure-npm --pull-token` — should not be committed to a
> repository, especially a public one. Add these files to `.gitignore`, and
> store tokens as CI secrets referenced via environment variables instead. If
> you accidentally commit credentials, [delete the exposed
> token](/chainguard/libraries/introduction/access/#pull-token-management).

### Audit your current registry configuration

Before making changes, identify where your current registry is configured. npm
and other JavaScript build tools can read registry settings from several
locations — a project-level `.npmrc`, a user-level `~/.npmrc`, environment
variables, or a repository manager — and you may have configuration in more than
one place.

To see all currently active npm configuration and where each value comes from:

{{< tabs label="Package manager for auditing registry configuration" >}}

{{% tab title="npm" %}}

```shell
npm config list
```

{{% /tab %}}

{{% tab title="pnpm" %}}

```shell
pnpm config list
```

{{% /tab %}}

{{% tab title="Yarn Berry" %}}

```shell
yarn config
```

{{% /tab %}}

{{% tab title="Yarn Classic" %}}

```shell
yarn config list
```

{{% /tab %}}

{{% tab title="Bun" %}}

```shell
cat bunfig.toml
```

If there is no `bunfig.toml`, or if that file does not contain a specific registry, then it is using the standard npm registry by default.

{{% /tab %}}

{{< /tabs >}}

The `registry` line shows where packages are currently being fetched from. If no
registry is set, npm fetches from `https://registry.npmjs.org` by default.

If you don't have an `.npmrc` file yet, that's fine; you'll create one in the
next step.

## Step 1: Configure authentication and registry

How you configure the registry depends on your environment. Follow the
instructions that match your setup.

> **Choosing what account to use:** For individual evaluation, your personal
> credentials are sufficient. For shared environments, CI/CD pipelines, or team
> rollouts, use a dedicated service account or machine identity rather than a
> personal account. This simplifies token rotation, provides cleaner audit logs,
> and avoids builds breaking if someone leaves the organization.

### Direct access

Session-based authentication is the preferred option when your environment can
use your current Chainguard session or an assumable identity. This keeps
credentials short-lived and avoids passing around static tokens.

#### Local development

For npm and Bun, run the following command to write a project-level `.npmrc` with the
registry URL and credentials from your current Chainguard session:

```shell
chainctl auth configure-npm
```

Because [this
command](/platform/chainctl/chainctl-docs/chainctl_auth_configure-npm/) uses a
session-backed bearer token, you will need to re-run it when the token expires.
If the command returns an error, ensure you are using the [latest version of
chainctl](/platform/chainctl-usage/how-to-install-chainctl/#updating-chainctl).

For pnpm and Yarn, [configure the .npmrc
manually](#manual-registry-configuration). `chainctl auth configure-npm`
generates path-scoped credentials (`//libraries.cgr.dev/javascript/:_auth`) that
do not cover pnpm's upstream-fallback path, causing HTTP 401 errors on packages
Chainguard has not yet rebuilt.

#### CI/CD and automated environments

For CI/CD environments, [assumable
identities](/platform/administration/assumable-ids/assumable-ids/) are the
recommended approach. Rather than managing a static token, an assumable identity
lets your CI/CD workload authenticate directly with Chainguard using its own
platform identity; no long-lived credentials to rotate or accidentally expose.

Once configured, authenticate and write the registry configuration in your
pipeline. For example, in a GitHub Actions workflow using npm:

```yaml
steps:
  - uses: chainguard-dev/setup-chainctl@main
    with:
      identity: "<identity-id>"
  - run: chainctl auth configure-npm
```

For pnpm, Yarn, and Bun, authenticate the workload then apply the
[tool-specific registry configuration](#manual-registry-configuration).

#### Pull token authentication

If your platform does not support assumable identities, you can use a static pull token.

**Configure the .npmrc with `chainctl`**:

```shell
chainctl auth configure-npm --pull-token
```

This generates a project-level `.npmrc` with a pull token. It is supported for npm and Bun. For pnpm, [configure the registry manually](#manual-registry-configuration) to ensure host-level credentials are used.

<a name="manual-registry-configuration"></a>

**Configure the .npmrc manually**:

First create a pull token as described in the [prerequisites](#prerequisites), then configure your build tool manually using the instructions below.

{{< details "Configure registry manually for pnpm, Yarn, and Bun" >}}

> **Note:** The following commands use environment variables to supply
> credentials at runtime. Writing credentials to a local configuration file
> should still be treated as sensitive regardless of the form used. Generate
> credentials at build time where possible, add configuration files to
> `.gitignore` if needed, and store secrets in your CI/CD platform rather than
> in version control.

**pnpm**

> Note: The Chainguard Repository [upstream fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls) has been tested with pnpm v11. We recommend using pnpm v11 or newer.

```shell
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)

pnpm config set registry https://libraries.cgr.dev/javascript/ --location=project
pnpm config set //libraries.cgr.dev/:_auth "${token}" --location=project
```

The authentication entry is keyed to the whole `libraries.cgr.dev` host
(`//libraries.cgr.dev/`) so that it also covers packages served through the
[upstream fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls)
path (`/javascript-upstream/`). A credential scoped only to `/javascript/` causes
pnpm to send no auth header for upstream-fallback packages, resulting in HTTP 401
errors.

Alternatively, use `username` and `_password` instead of `_auth`. Note that the
`_password` value must still be base64-encoded; pnpm does not accept a raw token
here:

```shell
pnpm config set //libraries.cgr.dev/:username "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}" --location=project
pnpm config set //libraries.cgr.dev/:_password "$(echo -n "${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)" --location=project
```

**Yarn Berry (2.x+)**

```shell
export authInfo="${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}"

yarn config set npmRegistryServer https://libraries.cgr.dev/javascript
yarn config set 'npmRegistries["//libraries.cgr.dev/javascript"].npmAuthIdent' "${authInfo}"
yarn config set 'npmRegistries["//libraries.cgr.dev/javascript"].npmAlwaysAuth' "true"
```

**Yarn Classic (1.x)**

```shell
export token=$(echo -n "${CHAINGUARD_JAVASCRIPT_IDENTITY_ID}:${CHAINGUARD_JAVASCRIPT_TOKEN}" | base64 -w 0)
cat > .npmrc << EOF
registry=https://libraries.cgr.dev/javascript/
//libraries.cgr.dev/javascript/:_auth="$token"
//libraries.cgr.dev/javascript/:always-auth=true
EOF
```

**Bun**

```shell
cat > bunfig.toml << EOF
[install.registry]
url = "https://libraries.cgr.dev/javascript/"
username = "$CHAINGUARD_JAVASCRIPT_IDENTITY_ID"
password = "$CHAINGUARD_JAVASCRIPT_TOKEN"
EOF
```

{{< /details >}}

### Repository manager

If your organization uses a repository manager, configure Chainguard Libraries
as an upstream source in that proxy first. Follow the [global configuration
documentation](/chainguard/libraries/javascript/global-configuration/) for your
repository manager.

Once configured, point your build tool at your repository manager URL. In this
setup, the credentials your build tool uses are your repository manager
credentials — not a Chainguard pull token.

{{< tabs label="Package manager for repository manager configuration" >}}

{{% tab title="npm or Yarn Classic" %}}

```shell
cat > .npmrc << EOF
registry=https://repo.example.com:8443/repository/javascript-all
EOF
```

Learn more in the build configuration docs for [npm](/chainguard/libraries/javascript/build-configuration/#using-a-repository-manager) and for [Yarn Classic](/chainguard/libraries/javascript/build-configuration/#using-a-repo-manager).

{{% /tab %}}

{{% tab title="pnpm" %}}

```shell
pnpm config set registry https://<your-repo-manager-url>/repository/javascript-all/ --location=project
```

Learn more in the [build configuration docs](/chainguard/libraries/javascript/build-configuration/#using-a-repository-manager-1).

{{% /tab %}}

{{% tab title="Yarn Berry" %}}

```shell
yarn config set npmRegistryServer https://<your-repo-manager-url>/repository/javascript-all
```

Learn more in the [build configuration docs](/chainguard/libraries/javascript/build-configuration/#using-a-repository-manager-2).

{{% /tab %}}

{{% tab title="Bun" %}}

Add the registry configuration to the `bunfig.toml` file of your project:

```toml
[install]
# set default registry as a string
registry = "https://repo.example.com:8443/repository/javascript-all/"
```

Learn more in the [build configuration docs](/chainguard/libraries/javascript/build-configuration/#using-a-repository-manager-3).

{{% /tab %}}

{{< /tabs >}}

Example URLs by repository manager:

| Repository manager | URL pattern |
|---|---|
| JFrog Artifactory | `https://example.jfrog.io/artifactory/javascript-all/` |
| Sonatype Nexus | `https://repo.example.com:8443/repository/javascript-all/` |

For authentication details specific to your repository manager, refer to the [global
configuration documentation](/chainguard/libraries/javascript/global-configuration/).

## Step 2: Verify authentication

Before reinstalling packages, confirm your credentials are valid. For direct
access with npm or pnpm, run:

```shell
npm ping --userconfig .npmrc
```

A successful response looks like:

```
npm notice PING https://libraries.cgr.dev/javascript/
npm notice PONG 1065ms
```

For repository manager setups, authentication is handled by your organization's
proxy configuration.

## Step 3: Update your lockfile

Your existing lockfile (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, or `bun.lock`)
contains checksums and resolved URLs pointing to the original registry. Running
your package manager's install command after changing the registry does **not**
re-fetch already-resolved packages — the lockfile entries are treated as
satisfied, and source URLs will still point to `registry.npmjs.org`.

You can update your lockfile in one of two ways. Update the checksums in place to
keep your existing pinned versions, or regenerate the lockfile if you also want to
refresh your dependency versions.

{{< tabs label="Lockfile update approach" >}}

{{% tab title="Update in place" %}}

Use [`chainctl libraries update-hashes`](/chainguard/libraries/javascript/build-configuration/#updating-lockfile-hashes)
to rewrite only the integrity hashes in your existing lockfile to match
Chainguard's artifacts, without regenerating the lockfile from scratch. This
preserves your pinned dependency versions. Supported formats include `package-lock.json` (npm v2/v3), `yarn.lock` (Yarn
Classic and Berry), `pnpm-lock.yaml`, and `bun.lock`.

Run the command in the directory containing the lockfile:

```shell
chainctl libraries update-hashes
```

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.javascript.pull` permission or the Owner role.

If your build tool appends the Chainguard hashes to your lock file, include the flag `--replace` to ensure the hashes are replaced with Chainguard hashes. When using a repo manager, pass the full repository URL with `--registry-url`.

You can also specify a lockfile path directly:

```bash
chainctl libraries update-hashes path/to/lockfile
```

After running the command,
ensure your `.npmrc` is configured with Chainguard credentials. The updated hashes are applied when you reinstall. The `chainctl libraries update-hashes` command will
output a "Next steps" section that includes the tool-specific command for
reinstalling.

Learn about using this command with repo managers in the [Global
configuration](/chainguard/libraries/javascript/global-configuration/) page.

{{% /tab %}}

{{% tab title="Regenerate lockfile" %}}

Regenerating the lockfile is another valid approach, and many teams use the
migration as an opportunity to update dependencies at the same time. Before you
regenerate, consider the following:

- Pinning versions is a security best practice. When you regenerate, your package
manager re-resolves all dependencies from scratch using the version constraints
in `package.json`. If a constraint uses `^` or `~` (the npm default), the
resolver picks the newest matching version, so you can lose your existing pins
and pick up unintended upgrades that change your application's behavior.
- Whether Chainguard has a resolved version available depends on the policies
you've configured. For example, a version that was published upstream within your configured cooldown period will return an error. Check the cooldown period you've set before you regenerate.

To regenerate — for example, to intentionally refresh your dependency
versions — use the following commands:

| Tool | Command |
|---|---|
| npm | `rm -rf node_modules package-lock.json && npm install` |
| pnpm | `rm -rf node_modules pnpm-lock.yaml && pnpm install` |
| Yarn Berry | `rm -rf .yarn/cache yarn.lock && yarn` |
| Yarn Classic | `rm -rf node_modules yarn.lock && yarn` |
| Bun | `rm -rf node_modules bun.lock && bun install` |

If you hit 404 errors after regenerating, the most likely cause is that the
resolved version is not yet available in Chainguard Libraries or is still within
the cooldown window. Refer to [Packages not available in Chainguard
Libraries](#packages-not-available-in-chainguard-libraries) for next steps.

{{% /tab %}}

{{< /tabs >}}

## Step 4: Delete node_modules and clear caches

{{< tabs label="Package manager for clearing caches" >}}

{{% tab title="npm" %}}

```bash
rm -rf node_modules && npm cache clean --force
```

{{% /tab %}}

{{% tab title="pnpm" %}}

First, remove `node_modules`:

```bash
rm -rf node_modules
```

Then, clear the caches. pnpm has three separate layers of cached data; remove them in the following order:

**1. Metadata (packuments)**

There is an [experimental command](https://pnpm.io/cli/cache-delete) to delete the metadata cache:

```bash
pnpm cache delete
```

**2. HTTP cache**

pnpm maintains a separate HTTP cache at `~/.cache/pnpm` (or `$XDG_CACHE_HOME/pnpm` if that variable is set). Delete it with:

```bash
rm -rf "${XDG_CACHE_HOME:-$HOME/.cache}/pnpm"
```

**3. Content-addressable store (tarballs)**

To find and manually remove the full store:

```bash
pnpm store path
```

Then delete the directory that command outputs:

On macOS/Linux -

```bash
rm -rf "$(pnpm store path)"
```

On Windows -

Use the path returned by `pnpm store path` and delete it via File Explorer or `rmdir`.

> Note: `pnpm prune` removes unused tarballs but does not remove packument metadata. If you are seeing 404 errors after switching to or updating the Chainguard registry endpoint, use the commands above rather than `pnpm prune`.

{{% /tab %}}

{{% tab title="Yarn Berry" %}}

```bash
rm -rf node_modules .yarn/cache
```

{{% /tab %}}

{{% tab title="Yarn Classic" %}}

```bash
rm -rf node_modules && yarn cache clean
```

{{% /tab %}}

{{% tab title="Bun" %}}

```bash
rm -rf node_modules && bun pm cache rm
```

If this command is not available on your version of Bun, you can instead delete Bun's cache directory manually.

{{% /tab %}}

{{< /tabs >}}

## Step 5: Reinstall dependencies

Reinstall dependencies and confirm that the lockfile reflects Chainguard as the source. Resolved URLs should point to `libraries.cgr.dev/javascript` (direct access) or
your repository manager host, not `registry.npmjs.org`.

> Note: When using the `update-hashes` command, some package managers and tool versions default to appending the hash rather than replacing it. In some cases, the resulting dual-hash format fails on install. If you encounter integrity errors, [run the command again](#step-3-update-your-lockfile) and include the `--replace` flag.

{{< tabs label="Package manager for reinstalling dependencies" >}}

{{% tab title="npm" %}}

Install dependencies:

```shell
npm install
```

Then check the `resolved` field in `package-lock.json`:

```shell
grep "resolved" package-lock.json | head -5
```

{{% /tab %}}

{{% tab title="pnpm" %}}

Install dependencies:

```bash
pnpm install
```

For pnpm versions prior to v9, check the `tarball` field in `pnpm-lock.yaml`:

```shell
grep "tarball" pnpm-lock.yaml | head -5
```

For pnpm v9+, check the `integrity` field:

```shell
grep "integrity" pnpm-lock.yaml | head -5
```

{{% /tab %}}

{{% tab title="Yarn" %}}

Install dependencies:

```shell
yarn
```

Then check the `archiveUrl` field in `yarn.lock`:

```shell
grep "archiveUrl" yarn.lock | head -5
```

{{% /tab %}}

{{% tab title="Bun" %}}

Install dependencies:

```shell
bun install
```

Then check the `packages` section in `bun.lock` to verify that package source URLs reference Chainguard (or your repository manager) rather than npm.

{{% /tab %}}

{{< /tabs >}}

## Step 6: Verify your libraries

After reinstalling, you can verify which of your JavaScript dependencies are built by
Chainguard by scanning your local package manager cache or `node_modules`
directory. `chainctl libraries verify` auto-detects npm and pnpm caches by
their directory structure.

When upstream fallback is enabled, [packages that aren't built by Chainguard](#packages-not-available-in-chainguard-libraries) are subject to Chainguard's security controls.

{{< tabs label="Package manager for verifying libraries" >}}

{{% tab title="npm" %}}

Scan the npm cache:

```shell
chainctl libraries verify ~/.npm
```

Verify an npm tarball:

```shell
chainctl libraries verify PACKAGE-VERSION.tgz
```

{{% /tab %}}

{{% tab title="pnpm" %}}

Use `--store-dir` to install to an explicit path and verify that location:

```shell
pnpm install --store-dir /tmp/my-pnpm-store
chainctl libraries verify /tmp/my-pnpm-store
```

Learn more about verifying a pnpm store in the [Verification page](/chainguard/libraries/policies-and-security/verification/#analyze-javascript-packages).

{{% /tab %}}

{{% tab title="Yarn Classic" %}}

Verify a Yarn Classic cache:

```shell
chainctl libraries verify yarn:
```

{{% /tab %}}

{{% tab title="node_modules" %}}

Scan the project directory:

```shell
chainctl libraries verify ./node_modules
```

{{% /tab %}}

{{< /tabs >}}

> **Note**: Running `chainctl libraries verify` requires the `libraries.javascript.pull` permission or the Owner role.

A successful result shows what percentage of your project's dependencies were built by Chainguard. For example:

```
Artifact: ./node_modules
Verification Coverage: 100.00%
```

For full details on verification options and output, refer to [Verification: Analyze
JavaScript packages](/chainguard/libraries/policies-and-security/verification/#analyze-javascript-packages).

## Step 7: Commit and roll out

Commit the updated lockfile and any registry configuration files that do not
contain literal credentials. Apply the same registry, cache, and hash update
steps to other developer workstations and build servers as you migrate them - including Jenkins, TeamCity, GitHub or other infrastructure
that builds the applications or downloads dependencies.

For organization-wide rollout using a repository manager, refer to the [global
configuration documentation](/chainguard/libraries/javascript/global-configuration/).

## Packages not available in Chainguard Libraries

Chainguard Libraries covers a large and growing collection of popular npm
packages, but not every package in the npm Registry is available. If a package
is missing, your install will fail with a 404 unless you have [configured
upstream fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls).

- For direct access, the Chainguard Repository includes a built-in, configurable
npm upstream fallback. When fallback is enabled, packages not available from
Chainguard are proxied from npm and subject to a configurable cooldown period
and malware scanning before being served. Refer to the [JavaScript Libraries
overview](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls)
for details.
- For repository manager setups, Chainguard recommends using the built-in fallback
rather than configuring a separate public registry fallback in your repository
manager, to preserve Chainguard's security controls.

If you have private scoped packages published to npm under a prefix like
`@your-org/`, you can route them back to npm using per-scope registry
configuration. Refer to [Using private npm packages alongside Chainguard
Repository](/chainguard/libraries/javascript/build-configuration/#using-private-npm-packages-alongside-chainguard-repository)
for details.

## Troubleshooting

**Packages still resolving from `registry.npmjs.org` after migration**  
Running the install command after changing the registry does not re-fetch
packages already satisfied by the lockfile. Follow
[Step 3](#step-3-update-your-lockfile) to update checksums in place or
regenerate the lockfile.

**404 errors during install**  
The requested package or version may not yet be available in Chainguard
Libraries, or may still be within the cooldown window. Check the [Chainguard
Console](https://console.chainguard.dev/libraries/javascript), try an earlier
version, or enable upstream fallback. Refer to [Packages not available in Chainguard
Libraries](#packages-not-available-in-chainguard-libraries). Also note that
upstream fallback and cooldown policies can take up to 30 minutes to go into
effect.

**Authentication errors or `npm ping` failure**  
Confirm your environment variables are set and the token has not expired.
Re-run `chainctl auth pull-token --repository=javascript` to generate a new
token if needed.

**`npm config list` shows an unexpected registry**  
You may have registry configuration at the user level (`~/.npmrc`) or in
environment variables that is overriding your project-level settings. Run
`npm config list` to identify conflicting sources.

**Stale or corrupted package data after switching registries**  
If packages seem to be served from a cache rather than re-fetched, you may need
to clear additional cache layers beyond `node_modules`. See the "Apply registry
changes" sections for your build tool on the [build configuration
page](/chainguard/libraries/javascript/build-configuration/).

## Next steps

- To apply this configuration across your whole organization using a repository
  manager, refer to the [global configuration](/chainguard/libraries/javascript/global-configuration/)
  documentation.
- To verify downloaded packages were built by Chainguard, see the
  [verification](/chainguard/libraries/policies-and-security/verification/) documentation.
- For full per-tool configuration reference, refer to the [build
  configuration](/chainguard/libraries/javascript/build-configuration/)
  documentation.
- To keep pinned versions stable when Chainguard publishes new builds, see the
  [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) documentation.

---

### Chainguard Libraries for JavaScript overview
_Path: chainguard/libraries/javascript/overview.md_

**Chainguard Libraries for JavaScript** is a major ecosystem supported by
[Chainguard Libraries](/chainguard/libraries/introduction/overview/). The JavaScript
ecosystem consists of thousands of open source projects from the communities
around [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript),
[TypeScript](https://www.typescriptlang.org/), [Node.js](https://nodejs.org/),
[React](https://react.dev/), [Vue.js](https://vuejs.org/),
[Angular](https://angular.io/), [Svelte](https://svelte.dev/),
[Next.js](https://nextjs.org/), [Express](https://expressjs.com/), and many
others.

Chainguard Libraries for JavaScript provides access to a growing collection of
popular Javascript packages rebuilt from source. New releases of packages
requested by customers are built and added to the index by an automated system.
These libraries can also be consumed through the [Chainguard
Repository](/chainguard/libraries/chainguard-repository/), which provides a
single endpoint for package retrieval and supports configurable security
policies for both Chainguard-built and upstream packages.

## Background

The main public repository for JavaScript packages is the [npm
Registry](https://npmjs.com/). Launched in 2010, the npm Registry has grown to
become the largest software registry in the world, hosting over three million
packages. It serves as the central hub for open source JavaScript libraries,
tools, and frameworks, supporting a vibrant and rapidly evolving ecosystem. The
registry is widely used by developers for both client-side and server-side
JavaScript projects, and its scale and history make it a critical resource for
modern application development.

It is the default repository in all commonly used build tools from the
JavaScript community, including [npm](https://www.npmjs.com/),
[pnpm](https://pnpm.io/), [Yarn](https://classic.yarnpkg.com/), and [Yarn
Berry](https://yarnpkg.com/), and uses the npm repository format. Chainguard
Libraries for JavaScript covers many of the open source artifacts found in the
npm Registry.

You can use Chainguard Libraries for Javascript with [your repository
manager](/chainguard/libraries/javascript/global-configuration/), such as JFrog
Artifactory or Sonatype Nexus.

## Runtime requirements

The runtime requirements for packages available from Chainguard
Libraries for JavaScript are identical to the requirements of the original
upstream project. For example, if a package retrieved from the npm Registry
requires Node.JS v22 or higher, the same Node.JS v22 requirement applies to the
package from Chainguard Libraries for JavaScript. The same applies to JavaScript,
Typescript, or React versions, as well as any other requirements of the original
upstream project.

## Technical details

The [username and password retrieved with
chainctl](/chainguard/libraries/introduction/access/) are required to access the Chainguard
Libraries for JavaScript repository. The URL for the repository is:

```
https://libraries.cgr.dev/javascript/
```

The URL does not expose a browsable directory structure.

The Chainguard Libraries for JavaScript repository is exposed through the Chainguard Repository endpoint for JavaScript libraries. It uses the npm repository protocol and serves both libraries that Chainguard has rebuilt from verifiable source and, when configured, packages proxied from the public npm registry under configurable policy controls. All packages served through this endpoint are subject to Chainguard security controls such as malware scanning and a configurable cooldown period for newly published upstream versions.

Even with upstream fallback enabled, the repository does not include every package from npm. Packages may be unavailable when:

* No verifiable source code is available. For example, malicious or proprietary packages where Chainguard cannot validate the source.
* The package is blocked by Chainguard or your organization’s policies. For example, packages flagged as malware or packages currently within the configurable cooldown period.

We recommend configuring the Chainguard Repository (or a repository manager that proxies it) as the primary registry for all JavaScript dependency resolution. This ensures your builds always prefer Chainguard‑built libraries first and automatically fall back to policy‑protected upstream packages when a Chainguard build is not yet available.

You can continue to use additional registries alongside Chainguard for needs outside this scope, such as your own private or scoped packages from npm or another internal registry.

Configure this endpoint [globally through a repository manager](/chainguard/libraries/javascript/global-configuration/) for centralized access control across your organization, or use it for [direct access](/chainguard/libraries/javascript/build-configuration/) from individual build tools. If you prefer to manage your own npm fallback rather than using the built-in upstream fallback, refer to the [global configuration documentation](/chainguard/libraries/javascript/global-configuration/) for setup guides per repository manager.

## Updating lockfile hashes

Existing JavaScript lockfiles usually contain upstream integrity hashes. Because Chainguard rebuilds packages from verified source, those hashes must be updated before reinstalling. Use `chainctl libraries update-hashes` to update them in place. Learn more in [Build configuration](/chainguard/libraries/javascript/build-configuration/#updating-lockfile-hashes/).

For a step-by-step walkthrough of moving an existing project to Chainguard Libraries, check out the [JavaScript migration guide](/chainguard/libraries/javascript/migration/).

If you install through a repository manager, refer to [Global configuration](/chainguard/libraries/javascript/global-configuration/#updating-lockfile-hashes/).

When the upstream fallback is enabled, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a version you pulled from upstream stable after Chainguard publishes its own build, so you don't have to update these hashes again unexpectedly.

## Provenance and attestations

Chainguard Libraries for JavaScript include SLSA provenance with signed attestations.
These attestations cryptographically link each package to the Chainguard
Factory build environment, providing verifiable proof of where and how each package
was produced. Provenance attestations follow the npm attestation standard. The
Chainguard publisher identity is verifiable via the Sigstore signing certificate
embedded in the attestation bundle, which links back to https://issuer.enforce.dev,  
the Chainguard OIDC issuer.

You can verify a package tarball in a single command using `chainctl`:

```bash
chainctl libraries verify PACKAGE-VERSION.tgz
```

Refer to [Verification](/chainguard/libraries/policies-and-security/verification/) for setup and usage details.

### Verify attestation manually

Alternatively, you can verify a specific package's provenance attestation manually using `cosign`, which is useful for debugging or integrating individual steps into custom workflows. In the following commands, replace `PACKAGE`
and `VERSION` with the package name and version (for example, `axios-mock-adapter`
and `1.17.0`):

**Download the tarball**

```
curl -L -H "Authorization: Bearer $(chainctl auth token --audience=libraries.cgr.dev)" \
  "https://libraries.cgr.dev/javascript/PACKAGE/-/PACKAGE-VERSION.tgz" \
  -o PACKAGE-VERSION.tgz
```

**Extract the SLSA provenance bundle**

```
curl -H "Authorization: Bearer $(chainctl auth token --audience=libraries.cgr.dev)" \
  "https://libraries.cgr.dev/javascript/-/npm/v1/attestations/PACKAGE@VERSION" | \
  jq -c '.attestations[] | select(.predicateType | contains("slsa")) | .bundle' \
  > PACKAGE-provenance.sigstore.json
```

**Verify the attestation was signed by Chainguard**

```
cosign verify-blob-attestation \
  --bundle PACKAGE-provenance.sigstore.json \
  --type slsaprovenance1 \
  --certificate-oidc-issuer=https://issuer.enforce.dev \
  --certificate-identity-regexp="^https://issuer.enforce.dev/" \
  --check-claims=false \
  PACKAGE-VERSION.tgz
```

If this command returns an error, ensure you are using the latest version of `cosign`.

A successful verification returns:

```
Verified OK
```

The `--certificate-oidc-issuer` and `--certificate-identity-regexp` flags confirm
the attestation was signed by Chainguard.

### Retrieve SBOMs

Chainguard Libraries for JavaScript also include Software Bills of Materials (SBOMs) in SPDX format.

To check whether an SBOM is available for a package, use npm show with the dist.sboms field:

```bash
npm show PACKAGE@VERSION dist.sboms
```

To retrieve the SBOM directly:

```bash
curl -H "Authorization: Bearer $(chainctl auth token --audience=libraries.cgr.dev)" https://libraries.cgr.dev/javascript/-/npm/v1/sbom/spdx/PACKAGE@VERSION
```

Replace `PACKAGE` and `VERSION` with the package name and version (for example, `react-router` and `7.11.0`).

## Upstream fallback policy and controls

Chainguard Libraries for JavaScript supports an optional built-in fallback to
the upstream npm Registry, managed through the [Chainguard
Repository](/chainguard/chainguard-repository/overview/). By default, the endpoint serves
only Chainguard-built packages. When the upstream fallback is enabled, upstream packages are
subject to additional security controls before being served.

Learn about managing fallback and cooldown controls in the [Libraries overview](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

> Note: Upstream fallback has been tested against pnpm v11. When using pnpm, we recommend pnpm v11 or newer.

---

### CVE remediation for Chainguard Libraries
_Path: chainguard/libraries/policies-and-security/cve-remediation.md_

CVE remediation for Chainguard Libraries provides protection against
critical and high CVEs. Applications often rely on older versions of libraries,
but upstream maintainers may not apply and release patches for those versions.
Chainguard addresses this gap by backporting vulnerability fixes
from newer releases to older releases, particularly in cases where maintainers
are no longer able to support and provide fixes.

CVE remediation helps reduce risk for organizations that cannot always upgrade
quickly, especially when moving to a newer version would introduce disruptive
changes. Remediated artifacts are published as incremental patch versions, allowing teams to take a targeted fix for a CVE without taking on a broader upgrade at the same time.

CVE remediation is available for a subset of [Chainguard Libraries for
Python](/chainguard/libraries/python/overview/) and [Chainguard Libraries for Java](/chainguard/libraries/java/overview/) (available in private preview). If you want to request CVE
remediation for additional libraries, reach out to your account team.

## About CVE remediation

CVE remediation focuses on critical and high vulnerabilities. Chainguard
backports fixes that are already available in the new versions of the upstream
project to older versions that may no longer receive updates.

Before publishing a remediated version, Chainguard validates that the remediated
version does not introduce regressions. All upstream test suites are run before
and after applying the fix to confirm functional consistency. Chainguard also
develops additional regression tests to validate the effectiveness of the CVE
fix.

Remediated libraries are distributed through a dedicated repository. This
provides the option to make remediated versions available for your development
or opt out of using these versions completely and continue to use upstream
versions only.

### Remediated version naming

Chainguard publishes remediated versions using ecosystem-specific version suffixes.

For Python, remediated packages use a `+cgr.N` local version suffix. For example, if `flask==1.1.2` has a remediated build, Chainguard publishes it as `flask==1.1.2+cgr.1`. Python package managers treat this as a higher-precedence local version of the base release, so remediated versions can be selected automatically during dependency resolution when the remediated index is configured.

For Java, remediated artifacts use a `-0.cgr.N` suffix appended to the base version. For example, if `org.apache.commons:commons-lang3:3.18.0` has a remediated build, that build is published as org.apache.`commons:commons-lang3:3.18.0-0.cgr.1`. If Chainguard publishes another remediated iteration for the same base version, the trailing number increases, such as `-0.cgr.2` or `-0.cgr.3`.

### Remediation and transitive dependencies

**Python**

For Python, installing a `+cgr.N` package doesn't automatically remediate its entire dependency tree. Chainguard publishes a `+cgr.N` version only for a package that has a remediation to deliver, and it leaves that package's own dependency declarations unchanged.

This is intentional. Most packages don't pin their dependencies tightly enough to require a rewrite, so the package metadata stays identical to upstream.

Remediation propagates across the dependency tree through the index, not through dependency declarations. When you configure the Chainguard index, your package manager resolves every dependency, both direct and transitive, through Chainguard Libraries rather than the upstream index. As described in [Remediated version naming](#remediated-version-naming), a `+cgr.N` build is a higher-precedence local version, so the resolver selects it automatically wherever Chainguard has published one. Dependencies without a remediation resolve to the standard upstream version served through the same index.

**Java**

Java remediation behavior differs from Python. For Java packages that publish a BOM, Chainguard may update the BOM to roll forward dependencies to remediated versions. This means transitive dependencies can receive CVE remediations without requiring changes to your own dependency declarations.

Note that BOM-based remediation is best-effort and does not cover all packages or
dependency trees. To ensure full control over dependency versions in your
project, use `dependencyManagement` or equivalent tooling to explicitly manage
and override dependency versions.

### CVE remediation for vendored dependencies

Some Python packages bundle compiled code written in other languages (such as Go, Rust, or C/C++) directly into their wheel. When a CVE exists in a dependency of that
vendored code, Chainguard may publish a remediated version even when no CVE has been filed
against the Python package itself.

In these cases, Chainguard bumps the vulnerable dependency within the vendored
code and publishes a new `+cgr.N` version of the package. Because the
vulnerability exists at the vendored dependency level rather than the Python
package level, no advisory entry is published in the VEX feed for these
versions. However, scanners that inspect vendored binaries will reflect the fix
in their results.

## Browse libraries with CVE remediation

Remediated libraries are published in dedicated repositories:

- Python: In a PyPI-compatible index at `https://libraries.cgr.dev/python-remediated/` - the simple index is at `https://libraries.cgr.dev/python-remediated/simple/`
- Java: In a repository at `https://libraries.cgr.dev/java-remediated/` - a companion to the standard Chainguard Libraries for Java repository at `https://libraries.cgr.dev/java/`

You can:

- Browse them in the Chainguard Console
- Use the public VEX feed to understand what has been remediated
    - This feed does not include [vendored dependencies](#cve-remediation-for-vendored-dependencies).
- View them in a browser at the simple index URL
    - Learn more in [Python overview > Manual access](/chainguard/libraries/python/overview/#manual-access) and in [Java overview > Manual access](/chainguard/libraries/java/overview/#manual-access).
- Expose them to your developers via a repo manager
    - Learn more in the global configuration docs for [Python](/chainguard/libraries/python/global-configuration/) and [Java](/chainguard/libraries/java/global-configuration/).

### Browse remediated libraries in the Chainguard Console

In the Chainguard Console, navigate to the Python or Java libraries, then click the **Remediated** tab. Click into a library to see which versions have remediated CVEs.

Learn more in [Browsing Chainguard Libraries](/chainguard/libraries/introduction/browse/).

<a id="vex"></a>

### Public VEX feed

Advisories for each CVE addressed in our remediated libraries are published via
a public VEX feed at
[https://libraries.cgr.dev/openvex/v1/all.json](https://libraries.cgr.dev/openvex/v1/all.json).
Supported scanners and your own custom tooling can use this feed to identify and
recognize remediated versions.

To view more details on the CVE and versions of a library that have been remediated, identify the library then navigate to the URL. For example: `https://libraries.cgr.dev/openvex/v1/pypi/urllib3.openvex.json`.

## Scanning remediated libraries

Chainguard works closely with scanner partners so that remediated versions are
properly recognized in vulnerability reports. This ensures that teams can
maintain their existing scanning workflows while benefiting from patched
dependencies.

Find more general information and specifics for supported scanners in
[Vulnerability Scanners and Chainguard
Libraries](/chainguard/libraries/policies-and-security/scanners/).

---

### Chainguard Libraries verification
_Path: chainguard/libraries/policies-and-security/verification.md_

Chainguard's `chainctl` tool with the command [`libraries
verify`](/platform/chainctl/chainctl-docs/chainctl_libraries_verify/) verifies
which of your language ecosystem dependencies were built by Chainguard,
providing critical visibility into your software supply chain security. By
verifying binary artifacts across your projects and repositories, you can confirm which dependencies came from Chainguard's hardened build environment, identify opportunities to
improve security posture, and maintain compliance with supply chain security
policies.

For packages that aren't built by Chainguard, you can enable [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) to apply additional configurable security controls.

Command characteristics:

- Uses a signature-based binary identification and a checksum fallback.
- Supports different binary formats, including JAR, WAR, EAR, ZIP, TAR, WHL,
  APK, and npm tarballs (.tgz), as well as container images.
- Allows analysis of directories and nested archive files.
- Creates output in text, json, yaml, and CSV formats.

## Requirements

Before using `chainctl` to verify libraries, ensure you have the following
installed and available on your path:

- [`chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) —
  Chainguard-maintained tool that includes the `libraries verify` command,
  details also in the [reference
  documentation](/platform/chainctl/chainctl-docs/chainctl_libraries_verify/).

`chainctl libraries verify` checks signatures in-process. To fetch the Sigstore
trust root, the command needs network access to `tuf-repo-cdn.sigstore.dev`.
Refer to [network requirements](/chainguard/libraries/introduction/network-requirements/) for
the full list of domains.

You also need:

- A Linux, macOS, or Windows system (x86_64 or arm64)
- Sufficient [network access](/chainguard/libraries/introduction/network-requirements/)
- Your organization [must include entitlement for access to Chainguard
  Libraries](/chainguard/libraries/introduction/access/#entitlement)
- You must have one of the `libraries.java.pull`, `libraries.javascript.pull`, or `libraries.python.pull` permissions, or the Owner role.

Confirm that `chainctl` is installed and available on the `PATH`:

```sh
chainctl version
```

## Authentication and configuration

You can authenticate with your Chainguard organization using `chainctl`. First,
initiate the login flow:

```sh
chainctl auth login
```

If you are a member of one organization only, you can proceed to use `libraries
verify` and other commands.

If you are a member of multiple organizations, you must provide the name of your
organization using the `--parent` flag as follows, replacing
`<your-organization>` with the name of your organization, with every command:

```sh
chainctl libraries verify --parent <your-organization> /path/to/artifact.jar
```

To avoid the need for the additional parameter, you can configure a default
organization with the following steps.

Find your organization name with the entitlement:

```sh
chainctl iam organizations list
```

Set the configuration for the default group:

```sh
chainctl config set default.group <your-organization>
```

Verify the configuration:

```sh
chainctl config view
```

Ensure that you use this configuration or add the `--parent` parameter in all
the following examples as necessary.

## File analysis

> **Note**: Running `chainctl libraries verify` requires one of the `libraries.java.pull`, `libraries.javascript.pull`, or `libraries.python.pull` permissions, or the Owner role.

### Analyze a Python wheel file

Analyze a Python wheel file in the current directory:

```sh
chainctl libraries verify flask-3.0.1-py3-none-any.whl
```

The analysis of wheel files is fast because the provenance information is
available within the archive. Python development tools often unpack the wheel
file and you can also scan these extracted packages. For example, if you create
a virtual environment in your Python project, you can subsequently analyze the
package in the virtual environment:

```sh
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r requirements.txt
chainctl libraries verify --detailed ./venv/
```

If you use Poetry and the virtual environment is not in the project directory, verify the environment returned by Poetry:

```bash
chainctl libraries verify --detailed "$(poetry env info --path)"
```

For CI/CD, use JSON output to save a machine-readable report:

```bash
chainctl libraries verify --detailed -o json .venv/ > provenance-report.json
```

### Analyze a Java JAR file

Analyze a Java `.jar` file:

```sh
chainctl libraries verify commons-lang3-3.17.0.jar
```

Verifying a JAR file is performed by looking up checksums and provenance
information from the Chainguard repositories. This requires network access and
can take longer if you analyze multiple files or archives that contain multiple
libraries. Typically, you find the JAR files in the local Maven repository cache
in `~/.m2/repository`. For best results, verify individual JAR files from this cache before packaging your application. Refer to [Java fat JAR limitations](#java-fat-jar-limitations) for more details.

Analyze a deployment archive for your custom application that contains other
libraries:

```sh
chainctl libraries verify example-application.tar.gz
```

Note that if your deployment archive is a fat JAR, uber JAR, or shaded JAR,
verification returns 0% coverage. This is expected behavior; refer to [Java fat JAR limitations](#java-fat-jar-limitations) for the recommended verification
approach.

For other archive types such as tarballs that contain individual unmodified JAR
files, scanning can take a significant amount of time if numerous libraries are
included. Consider detailed output with the `--detailed` flag
for more information about the performed verification steps, and potentially
pipe the output into a file.

```sh
chainctl libraries verify --detailed commons-lang3-3.17.0.jar > run.log
```

Use the `--verbose` flag for even more details.

Analyze multiple artifacts output:

```sh
chainctl libraries verify artifact1.jar artifact2.zip
```

Analyze a file and create JSON output:

```sh
chainctl libraries verify -o json commons-lang3-3.17.0.jar
```

#### Recommended build-time workflow for Maven

For Maven-based applications, a recommended workflow is to copy only runtime dependencies into a dedicated directory then verify those files, allowing you to avoid noise from unrelated artifacts in `~/.m2/repository`. For example:

```bash
mvn -U -q -s settings.xml dependency:copy-dependencies \
  -DincludeScope=runtime \
  -DoutputDirectory=target/chainguard-verify

chainctl libraries verify -o json --detailed target/chainguard-verify/*.jar \
  > provenance-report.json
```

> Note: If you belong to multiple Chainguard organizations, include the `--parent=<org>` flag in the command.

It can take up to 5 minutes for this command to return results. It returns output similar to the following:

```bash
{
  "artifactVerificationCoverage": 74.19354838709677,
  "verifiedItems": 23,
  "totalItems": 31,
  "artifactsSummary": {
    "totalArtifacts": 31,
    "fullyVerified": 23,
    "partiallyVerified": 0,
    "notVerified": 8,
    "verifiedPercent": 74.19354838709677
  },
  "results": [
    {
      "artifact": "target/chainguard-verify/jakarta.validation-api-3.0.2.jar",
      "artifactVerificationCoverage": 100,
      "details": "Fully verified by Chainguard (signature verified)\nMaven artifact: jakarta.validation:jakarta.validation-api:3.0.2"
    },
...
```

In this example, out of 31 `totalItems`, 23 were verified. The `arfifactVerificationCoverage` percent is 74.

#### Java fat JAR limitations

The fat JAR packaging approach merges the class files from all dependency
JARs into one combined archive, which means the original JAR boundaries are
lost.

Because `chainctl libraries verify` identifies libraries by checking checksums
and provenance information against individual JAR files, it cannot trace merged
class files back to their source JARs. As a result, running `chainctl libraries
verify` against a fat JAR returns 0% coverage, even if the
dependencies inside it were sourced from Chainguard Libraries.

#### Recommended verification approach for fat JARs

To verify that your Java dependencies come from Chainguard Libraries, run
`chainctl libraries verify` during your build process against the individual JAR
files in your local Maven repository cache, **before** fat JAR assembly.

After resolving dependencies with Maven, the individual JAR files are available
in `~/.m2/repository`. The following example uses `net.logstash.logback:logstash-logback-encoder:8.1`
as the library, but you can replace the path with the specific JAR you want to verify:

```sh
chainctl libraries verify ~/.m2/repository/net/logstash/logback/logstash-logback-encoder/8.1/logstash-logback-encoder-8.1.jar
```

To integrate this into your build pipeline, add the verification step after
dependency resolution and before the packaging phase.

### Analyze JavaScript packages

`chainctl libraries verify` can scan local package manager caches and stores
to confirm that your installed JavaScript packages were built by Chainguard. It supports the following JavaScript package managers:

- pnpm store: auto-detected by `v10/index/` or `v11/index/` structure (pnpm v10 and v11 supported)
- npm cache: auto-detected by `_cacache/index-v5/` structure
- Yarn Classic: v1.x, requires `yarn:` prefix

#### Analyze an npm tarball

Verify an npm package tarball to confirm it was built by Chainguard:

```sh
chainctl libraries verify PACKAGE-VERSION.tgz
```

Replace `PACKAGE`
and `VERSION` with the package name and version (for example, `@eslint-js`
and `9.0.0`)

Verification uses SLSA provenance attestations. `chainctl` computes a SHA-512 digest of the tarball locally, fetches the signed attestation bundle, and verifies in-process that the signature is valid, the certificate chains to the Sigstore root, the signer identity matches the Chainguard JavaScript builder, and the digest matches what was attested at build time.

#### Verify an npm cache

Verify your npm cache:

```sh
chainctl libraries verify "$(npm config get cache)"
```

#### Verify a pnpm store

Verify your pnpm store. Use `--store-dir` to install to an explicit path and verify that location:

```sh
pnpm install --store-dir /tmp/my-pnpm-store
chainctl libraries verify /tmp/my-pnpm-store
```

pnpm v9 and earlier are not supported. Verification works by comparing
the tarball hash recorded in your local store against the hash in Chainguard's
signed SLSA attestation. pnpm v10 records this hash in the index file path;
pnpm v9 does not.

Note that in `pnpm-lock.yaml`, packages resolved from Chainguard have only a
`resolution:` entry with an integrity hash:

```yaml
supports-color@7.2.0:
  resolution: {integrity: sha512-LPhWJX...}
```

Packages that are pulled from the upstream fallback include an explicit `tarball:` URL pointing to `javascript-upstream`. For example:

```yaml
tar-fs@2.1.4:
  resolution: {integrity: sha512-mDAjwm..., tarball: https://libraries.cgr.dev/javascript-upstream/tar-fs/-/tar-fs-2.1.4.tgz}
```

#### Verify a Yarn Classic cache

Verify a Yarn Classic (v1) cache:

```sh
chainctl libraries verify yarn:
```

To specify a non-default cache location:

```sh
chainctl libraries verify yarn:~/Library/Caches/Yarn/v6
```

Unlike npm and pnpm, Yarn Classic requires the `yarn:` prefix because its
cache directory layout cannot be reliably auto-detected.

#### Verify a `node_modules` directory

Verify npm packages installed in a `node_modules` directory:

```sh
chainctl libraries verify ./node_modules
```

If `.package-lock.json` is not present, the directory is not recognized as an npm tree and verification will not run.

#### Verify a container image

Verify JavaScript packages inside a container image:

```sh
chainctl libraries verify IMAGE:TAG
```

Coverage is reported as the percentage of JavaScript packages in the image that are confirmed Chainguard-rebuilt libraries.

Images built with npm versions earlier than v7, or where `.package-lock.json` was removed during the build, cannot be verified this way.

### Other bundled artifact formats

The same limitation applies to other ecosystems where dependencies are bundled
into a single output artifact, such as JavaScript bundles and Python
applications packaged with tools that inline dependencies. Dependencies may also
be minified, partially copied, or otherwise transformed during the build
process. In all of these cases, verification should also be performed against
the original package files before bundling rather than against the final output
artifact.

## Verify artifacts in a repository manager

You can verify what artifacts are retrieved from the Chainguard Libraries
repository on a global level:

- **Artifactory and Nexus**: Browse the `chainguard` proxy repository on your repository manager server.
- **Cloudsmith**: Access the **Packages** tab of the repository on your Cloudsmith instance.
  Filter the package list with the tag value with the name for your upstream
  proxy for Chainguard, for example `tag:chainguard`. The tag uses the name of
  the upstream proxy, with spaces replaced with dashes.

Use the browsing access to locate specific artifacts and identify their name,
file size, checksum values, timestamp and other identifiers. With these details
you can verify your libraries use in the following locations:

- Local cache repositories on developer workstation
- Cache repositories in your CI pipeline
- Libraries in your application bundles
- Installed applications on your hosts or in your container images

A uniquely identifying characteristic of library artifacts are their checksums.
Contrary to filenames and timestamps, checksums do not change in the use of
libraries during an application build or the assembly of a deployment artifact
like a tarball or container. This allows you to identify a library artifact by
determining the checksum and then locating it in your repository manager.

Calculate the different commonly used sums for a file `example.jar` with the
following commands and output examples:

```
$ sha1sum example.jar
aea83e64ebec6a37e0be100f968a55fb381143c2  example.jar

$ sha256sum example.jar
87a25c44e0fdb0c71e898c57f67b236d2205bfa76a25dbbb9779ebe2f93e787e  example.jar

$ md5sum example.jar
fefd660ddc795900d48bdf49c17b3135  example.jar
```

Use the search features in your repository manager to
locate the library. For the specific example, you find that the checksums
correspond to the file `junit-4.13.2.jar` found in `junit/junit/4.13.2/` and
that the artifact is found in the `chainguard` proxy repository. You can
therefore conclude that the `example.jar` file originates from Chainguard, was
built in the Chainguard Factory from source, and is available at
`https://libraries.cgr.dev/java/junit/junit/4.13.2/junit-4.13.2.jar`. You can
[manually download the file to
compare](/chainguard/libraries/java/overview/#manual-access), if desired.

## Container analysis

You can also analyze container images to verify the libraries contained within
the container. Note that this requires more time to verify depending on the
container size, and the number and type of included libraries.

Analyze a container image:

```sh
chainctl libraries verify cgr.dev/chainguard/maven:latest
```

Note that the analysis separately downloads the container tarball and analyzes
it, rather than any container available in your local container setup.

Analyze a local image with localhost prefix:

```sh
chainctl libraries verify localhost/myapp:latest
```

## Other examples

The following examples use Maven Central and PyPI URLs and returns a negative
result, because packages were not built by Chainguard. A practical use of this
functionality points to an internal repository manager with a mixture of
artifacts from Chainguard and elsewhere. Note that authentication to the
repository is not supported and you must download artifacts to a local directory
as an alternative method to verify them.

Analyze a remote artifact on Maven Central:

```sh
chainctl libraries verify remote:repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.17.0/commons-lang3-3.17.0.jar
```

Analyze a remote artifact on PyPI:

```sh
chainctl libraries verify remote:files.pythonhosted.org/packages/...../requests-2.31.0-py3-none-any.whl
```

## Built-in help

Use the `help` command for more command options and details for the `verify` command:

```sh
chainctl help libraries verify
```

## Troubleshooting

### Why might I see 0% coverage when verifying Java artifacts?

A 0% coverage result is expected when verifying a fat JAR, uber JAR, or shaded JAR. Those packaging formats merge dependency contents into a single archive, so `chainctl libraries verify` cannot trace merged classes back to the original JARs.

## Resources

- [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/)
- [Chainguard Libraries authentication](/chainguard/libraries/introduction/access/)
- [`chainctl libraries verify` reference documentation](/platform/chainctl/chainctl-docs/chainctl_libraries_verify/)
- [{{<icon "play-circle-fill">}} Learning Lab: Chainguard Libraries for Java](/software-security/learning-labs/ll202505/)
- [{{<icon "play-circle-fill">}} Learning Lab: Chainguard Libraries for Python](/software-security/learning-labs/ll202506/)

---

### Vulnerability scanners and Chainguard Libraries
_Path: chainguard/libraries/policies-and-security/scanners.md_

Vulnerability scanners enable you to understand the potential security risks
from libraries used within your applications.

Chainguard Libraries provides a trusted source for libraries typically
downloaded from public repositories. Chainguard Libraries are rebuilt from the
upstream open source project code repository content only. This prevents malware
without published source code and reduces almost all risk for software supply
chain attacks. In addition, some library versions are available with CVE fixes
applied. These fixes are backported from newer versions of the open source
project by Chainguard to create new libraries of older versions containing these
newer changes. Find more details in [CVE
Remediation](/chainguard/libraries/policies-and-security/cve-remediation/).

This page provides an overview of vulnerability scanning for libraries and
the use of specific scanning applications in the following sections. For more
information on scanning containers, refer to our guide on [Working with
Container Image
Scanners](/chainguard/containers/security-and-compliance/working-with-scanners/).

## Vulnerability scanning

Vulnerability scanning can be performed at various stages throughout the
software development lifecycle. Scanning earlier in the process helps identify
and remediate issues before they reach production environments. Common scenarios
for scanning include:

- **Before libraries enter the organization:** Scan dependencies as they are
  added to repository managers, developer machines, or during initial CI runs.
- **During application development:** Scan libraries and dependencies on the
  developer machine to catch vulnerabilities early.
- **At build time:** Scan application binaries, such as tarballs or other
  deployment artifacts, during the build process on the developer machine or any
  CI infrastructure.
- **During container image creation:** Scan container images as they are built
  to ensure included libraries are secure.
- **In container registries:** Scan images stored in registries before
  deployment to production.
- **During deployment:** Scan running applications or containers to detect
  vulnerabilities in the deployed environment.

Scanners can be used in different ways depending on the workflow:

- **Standalone CLI tools:** Run scans manually or as part of scripts.
- **Integration with repository managers:** Automatically scan dependencies as
  they are added or updated.
- **Integration with build tools:** Incorporate scanning into build pipelines
  for continuous security checks.
- **IDE integrations:** Many vulnerability scanners offer plugins or extensions
  for popular integrated development environments (IDE). These integrations
  allow developers to scan dependencies and code for vulnerabilities directly
  within their development workflow, providing immediate feedback and helping to
  remediate issues early in the process.
- **Other integrations:** Use scanners with CI/CD platforms, deployment tools,
  or monitoring systems.

Selecting the appropriate scanning approach and timing helps maintain a secure
software supply chain and reduces the risk of introducing vulnerabilities.

All the preceding considerations for vulnerability scanning apply when scanning
for Chainguard Libraries. Different vulnerability scanners offer varying
features, capabilities, and integration options for detecting vulnerabilities in
these libraries. Details about how specific scanners work with Chainguard
Libraries are provided in the following sections.

## Supported scanners

| Scanner | Python | Java |
| --- | --- | --- |
| Amazon Inspector | ✓ | ✓ |
| Anchore Enterprise | ✓ | ✓ |
| Grype | ✓ | ✓ |
| Trivy | ✓ | ✓ |
| Upwind | ✓ | ✓ |
| Wiz | ✓ | ✓ |

### Amazon Inspector

Chainguard Libraries for Python and Java are supported by Amazon Inspector’s enhanced
scanning for Amazon ECR. This integration brings high-impact CVE remediation
directly into your AWS vulnerability management workflows. Refer to the [AWS
documentation](https://docs.aws.amazon.com/inspector/latest/user/supported.html#:~:text=Supported%20programming%20languages%3A%20Amazon%20ECR%20scanning)
for additional details.

### Anchore Enterprise

Anchore Enterprise supports the detection of remediated Chainguard Libraries for Python
starting with version 5.23.0, once the required configuration is applied.

Support for remediated Chainguard Libraries for Java is also available through Anchore's vulnerability data updates. Anchore Data Service v0.32.0 adds support for Maven package remediations from Chainguard Libraries.

To ensure remediated CVEs are filtered out by default, disable CPE matching for
the ecosystem in which you are using Chainguard Libraries. Instructions for
disabling CPE matching are available in the [Anchore
documentation](https://docs.anchore.com/current/docs/vulnerability_management/).

### Grype

[Grype](https://github.com/anchore/grype) supports detection of remediated
Chainguard Libraries for Python and Java starting with Grype **version 0.100.0**. You can use Grype
in multiple ways:

- Scan the Python virtual environment directly. If your Python application is
  not containerized, this is recommended.
- Alternatively, scan the container image for your application. Grype
  detects and accounts for remediated library versions inside the image.

When scanning a Python project source directory that contains a dependency file
such as `requirements.txt`, Grype reports against the declared versions rather
than the installed versions. As a result, Chainguard’s remediated Python package
versions are not recognized in this mode. To ensure accurate results, we
recommend scanning the installed environment, such as a Python virtual
environment directory, instead.

For example, the entry `werkzeug==3.0.2` in the `requirements.txt` file results
in the use of the local version `werkzeug==3.0.2+cg4.1` that includes the
remediation for the CVE. This is apparent in the log output from `pip install`:

```output
Collecting werkzeug==3.0.2 (from -r requirements.txt (line 11))
  Downloading https://repo.example.com:8443/repository/python-all-remediated/packages/werkzeug/3.0.2%2Bcgr.1/werkzeug-3.0.2%2Bcgr.1-py3-none-any.whl (236 kB)
...
Installing collected packages: MarkupSafe, werkzeug
Successfully installed MarkupSafe-3.0.3 werkzeug-3.0.2+cgr.1
```

Use the following command to scan the project directory and, accordingly, the
`requirements.txt` file content:

```shell
grype .
```

The resulting output shows entries for both versions, including the high
severity vulnerability that is fixed in `3.0.2+cgr.1`:

```output
NAME      INSTALLED    FIXED IN  TYPE    VULNERABILITY        SEVERITY  EPSS           RISK
werkzeug  3.0.2        3.0.6     python  GHSA-q34m-jh98-gwm2  Medium    0.9% (74th)    0.5
werkzeug  3.0.2+cgr.1  3.0.6     python  GHSA-q34m-jh98-gwm2  Medium    0.9% (74th)    0.5
werkzeug  3.0.2        3.0.3     python  GHSA-2g68-c3qc-8985  High      0.2% (43rd)    0.2
werkzeug  3.0.2        3.0.6     python  GHSA-f9vj-2wh5-fj8j  Medium    < 0.1% (19th)  < 0.1
werkzeug  3.0.2+cgr.1  3.0.6     python  GHSA-f9vj-2wh5-fj8j  Medium    < 0.1% (19th)  < 0.1
```

Scan the virtual environment in the `venv` directory instead:

```shell
grype venv
```

The output only shows entries for `3.0.2+cgr.1`, the version that is actually
used. The output indicates that the high vulnerability `GHSA-2g68-c3qc-8985` is
no longer applicable:

```output
NAME      INSTALLED    FIXED IN  TYPE    VULNERABILITY        SEVERITY  EPSS           RISK
werkzeug  3.0.2+cgr.1  3.0.6     python  GHSA-q34m-jh98-gwm2  Medium    0.9% (74th)    0.5
werkzeug  3.0.2+cgr.1  3.0.6     python  GHSA-f9vj-2wh5-fj8j  Medium    < 0.1% (19th)  < 0.1
```

For additional guidance for Grype users, refer to our guide [Using Grype
to Scan Software
Artifacts](/chainguard/containers/security-and-compliance/working-with-scanners/grype-tutorial/)
and the [official documentation](https://github.com/anchore/grype).

### Trivy

[Trivy](https://github.com/aquasecurity/trivy) versions 0.54 and newer support
detection of remediated Chainguard Libraries for Python and Java after applying necessary
configuration.

Use the experimental VEX Repo feature of Trivy with the [VEX feed for Chainguard
Libraries](/chainguard/libraries/policies-and-security/cve-remediation/#vex). Configure the Chainguard
VEX feed locally:

```shell
trivy vex repo init
```

The command logs the path to the created configuration file:

```output
INFO [vex] The default repository config has been created  file_path="~/.trivy/vex/repository.yaml"
```

The default configuration includes only the feed from the makers of Trivy, Aqua
Security:

```yaml
repositories:
  - name: default
    url: https://github.com/aquasecurity/vexhub
    enabled: true
    username: ""
    password: ""
    token: ""
```

Add the Chainguard feed to the top of the repository list:

```yaml
repositories:
  - name: chainguard-libraries
    url: https://libraries.cgr.dev/openvex/v1
    enabled: true
  - name: default
    url: https://github.com/aquasecurity/vexhub
    enabled: true
    username: ""
    password: ""
    token: ""
```

Run a scan with the Trivy CLI by explicitly specifying the `--vex repo` flag.
Use the `--show-suppressed` flag to show which CVEs have been resolved by
Chainguard:

```shell
trivy filesystem . --vex repo --show-suppressed
```

Running the command on a Python project managed with `pip` and a dependency
declaration in `requirements.txt` of `werkzeug==3.0.2+cgr.1` shows the
suppressed vulnerability `CVE-2024-340691`:

```output
Suppressed Vulnerabilities (Total: 1)

┌──────────┬────────────────┬──────────┬────────┬───────────┬────────────────────────────────────────┐
│ Library  │ Vulnerability  │ Severity │ Status │ Statement │                 Source                 │
├──────────┼────────────────┼──────────┼────────┼───────────┼────────────────────────────────────────┤
│ werkzeug │ CVE-2024-34069 │ HIGH     │ fixed  │ N/A       │ VEX Repository: chainguard-libraries   │
│          │                │          │        │           │ (https://libraries.cgr.dev/openvex/v1) │
└──────────┴────────────────┴──────────┴────────┴───────────┴────────────────────────────────────────┘
```

Note that using the definition `werkzeug==3.0.2` without the local version
qualifier in `requirements.txt` causes Trivy to wrongly assume the use of that
specific version and therefore reports an invalid vulnerability.

For additional guidance for Trivy users, refer to our guide [Using Trivy to Scan
Software
Artifacts](/chainguard/containers/security-and-compliance/working-with-scanners/trivy-tutorial/)
as well as the [official documentation](https://trivy.dev/docs/latest/).

### Upwind

[Upwind](https://www.upwind.io/) can scan container images that use Chainguard Libraries for Python and Java, and recognize Chainguard backported fixes in [remediated library](/chainguard/libraries/policies-and-security/cve-remediation/) versions.

It is supported for container scanning in CI/CD only.

For Python applications, support is available for:

- `uv` / `pyproject.toml`
- `pip` / `requirements.txt`
- Poetry

When Upwind recognizes a remediated Chainguard library version, the scan results reflect the installed remediated package version rather than only the original upstream version. Vulnerabilities that Chainguard has already remediated in that installed version no longer appear as active findings.

### Wiz

[Wiz](https://www.wiz.io/) supports Chainguard Libraries for Python and Java when scanning applications and images that include CVE-remediated libraries. Remediated Chainguard libraries are recognized appropriately in supported scan results rather than being treated the same as original vulnerable upstream versions.

Chainguard publishes remediation data through its public VEX feed, which supported scanners can use to identify remediated versions correctly.

---

### Configure Chainguard Libraries access in container builds
_Path: chainguard/libraries/policies-and-security/build-containers.md_

When you build a container that installs from Chainguard Libraries, the build must authenticate to Chainguard Libraries — or to a repository manager that proxies it — without baking credentials into the final image.

The package-manager configuration differs by language, but the container-build pattern is the same: pass the credentials into the build stage only for the install step that needs them. For the credentials file, target filename, and file format expected by each package manager, see the ecosystem-specific build configuration page:

* [Java build configuration](/chainguard/libraries/java/build-configuration/)
* [JavaScript build configuration](/chainguard/libraries/javascript/build-configuration/)
* [Python build configuration](/chainguard/libraries/python/build-configuration/)
    * Some Chainguard Libraries for Python packages currently lack macOS-compatible wheels. When the dependency you need is available only as a Chainguard Linux wheel, local installation and testing against the Chainguard-built package must happen in a container. A working build-time secret mount is therefore part of local development on macOS, not only a CI/CD concern.

The repository can be Chainguard Libraries directly or a repository manager that proxies Chainguard Libraries. The secret-mount pattern is the same in either setup.

## Do not bake credentials into image layers

Avoid both of the following approaches:

* Do not `COPY` a credentials file into the build stage. Deleting the file in a later `RUN` instruction does not remove it from the layer history; it can still be extracted with `docker history` or by inspecting the image layers.
* Do not pass credentials through `ARG` or `ENV`. Build arguments and environment variables can be recorded in image metadata and exposed to anyone with access to the image.

Also avoid printing the secret or copying it to another persistent path during the `RUN` instruction that consumes it. A secret mount protects the mounted file; it cannot protect a copy that your build writes into a layer.

## Use BuildKit secret mounts

Docker BuildKit's `--secret` flag mounts a file for a single `RUN` instruction. The file is available only while that instruction runs, is not written to an image layer, and does not appear in the image history.

```dockerfile
# syntax=docker/dockerfile:1
FROM cgr.dev/chainguard/python:latest-dev AS build

RUN --mount=type=secret,id=netrc,target=/home/nonroot/.netrc,uid=65532,gid=65532 \
    pip install -r requirements.txt
```

Supply the secret when you build the image:

```bash
docker build \
  --secret id=netrc,src="$HOME/.netrc" \
  -t myimage .
```

For a multi-stage build, consume the secret in the build stage and copy only the application artifacts into the final stage:

```dockerfile
# syntax=docker/dockerfile:1
FROM cgr.dev/chainguard/python:latest-dev AS build
WORKDIR /app

COPY requirements.txt .
RUN --mount=type=secret,id=netrc,target=/home/nonroot/.netrc,uid=65532,gid=65532 \
    python -m venv /app/venv && \
    /app/venv/bin/pip install --no-cache-dir -r requirements.txt

COPY . .

FROM cgr.dev/chainguard/python:latest
WORKDIR /app
COPY --from=build /app /app
ENV PATH="/app/venv/bin:$PATH"
CMD ["python", "app.py"]
```

The final stage has no secret mount and does not copy the credentials file. Only the built application and its dependencies are copied from the build stage.

The secret can come from a local file, a CI secret store, or another build-time secret source. Do not put it in the Dockerfile or the build context.

The `id` value connects the command-line secret to the `RUN` instruction. The `target` value is the path where the package manager expects the credentials file. Both values are package-manager and image specific.

## Account for the nonroot default user

Chainguard `-dev` images run as a nonroot user by default. This differs from many Debian- and Alpine-based build images, which run as `root` unless you set another user.

BuildKit secret mounts are read-only and are owned by `root` unless you set the mount ownership. If the `RUN` instruction executes as the default nonroot user, the package manager cannot read the file:

```text
cat: can't open '/home/nonroot/.netrc': Permission denied
```

For Chainguard's default nonroot user, set both `uid` and `gid` to `65532`:

```dockerfile
RUN --mount=type=secret,id=netrc,target=/home/nonroot/.netrc,uid=65532,gid=65532 \
    pip install -r requirements.txt
```

The UID/GID is consistent across Chainguard `-dev` images, but the username and home directory are not. Use the target path for the specific image in your `FROM` instruction:

| Image | Default user | Home directory | Example secret target |
| --- | --- | --- | --- |
| `python:latest-dev` | `nonroot` | `/home/nonroot` | `/home/nonroot/.netrc` |
| `node:latest-dev` | `node` | `/home/node` | `/home/node/.npmrc` |
| `jdk:latest-dev` | `java` | `/home/java` | `/home/java/.m2/settings.xml` |
| `maven:latest-dev` | `nonroot` | `/home/nonroot` | `/home/nonroot/.m2/settings.xml` |

If a stage switches to `USER root` before installing packages, the mount target and ownership must match the user active in the `RUN` instruction that reads the credentials. In that case, a root-owned mount should use a root-accessible target such as `/root/.netrc`, not the nonroot path and ownership from the table.

## Package-manager reference

The mount mechanics are shared across languages. Only the target filename and file format change:

| Ecosystem | Typical credentials file | See |
| --- | --- | --- |
| Python | `.netrc` | [Python build configuration](/chainguard/libraries/python/build-configuration/) |
| JavaScript | `.npmrc` | [JavaScript build configuration](/chainguard/libraries/javascript/build-configuration/) |
| Java | Maven `settings.xml` or a Gradle init script | [Java build configuration](/chainguard/libraries/java/build-configuration/) |

The ecosystem-specific page is also the source of truth for repository URLs, authentication fields, fallback behavior, lockfile handling, and package-manager-specific troubleshooting.

## CI/CD

Use the same `--secret` flag in CI/CD. Read the credential from the CI system's secret store and pass it to BuildKit as an environment-backed secret rather than writing it to the workspace.

```yaml
- name: Build image
  run: |
    docker build \
      --secret id=netrc,env=NETRC_CONTENTS \
      -t myimage .
  env:
    NETRC_CONTENTS: ${{ secrets.CHAINGUARD_PYTHON_NETRC }}
```

The same pattern applies to `.npmrc`, Maven `settings.xml`, and other package-manager configuration files: mount the file only for the install step that needs it, and keep it out of the final runtime stage.

---

### Chainguard Libraries policies and security overview
_Path: chainguard/libraries/policies-and-security/overview.md_

Learn how to verify Chainguard Library integrity, identify and remediate vulnerabilities, protect against malicious behavior, and apply configurable policies across Chainguard-built packages and protected upstream fallback packages.

* [Chainguard Library policies](/chainguard/chainguard-repository/library-policies/): Create and enforce rules that control which package versions your organization can pull, including cooldown settings, blocklists, allowlists, and deliberate exceptions.
* [Verification](/chainguard/libraries/policies-and-security/verification/): Use `chainctl libraries verify` to confirm which dependencies were built by Chainguard and review their signed provenance and software bills of materials (SBOMs).
* [CVE remediation](/chainguard/libraries/policies-and-security/cve-remediation/): Learn how Chainguard backports selected high- and critical-severity fixes to supported library versions and how to identify and use remediated releases.
* [Vulnerability scanners](/chainguard/libraries/policies-and-security/scanners/): Learn how common vulnerability scanners work with Chainguard Libraries and how to interpret findings for Chainguard-built and remediated dependencies.
* [Container builds](/chainguard/libraries/policies-and-security/build-containers/): Authenticate to Chainguard Libraries during a container build using BuildKit secret mounts, without baking credentials into the final image.

---

### Manage build pinning for Chainguard Libraries
_Path: chainguard/libraries/policies-and-security/build-pinning.md_

Chainguard Libraries can serve a package version as either a Chainguard-built artifact or an [upstream artifact that is scanned and proxied through Chainguard](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls). Chainguard-built artifacts may have different checksums for the same version of the upstream artifact. If your lockfile records an upstream checksum and Chainguard later builds that package, your package manager can fail with integrity errors upon dependency resolution.

Build pinning keeps library artifacts stable when Chainguard publishes a new build of a package version you previously pulled from the scanned upstream fallback. Chainguard-built artifacts are always the default and take priority when available. Pinning only affects the exact package version already pinned. When enabled, Chainguard remembers which upstream versions your organization pulled and continues serving those specific versions even if a new Chainguard build is available, until you remove the pin. Moving to a different version of the package is unaffected; since that version was never pinned, it resolves fresh and Chainguard’s build is served by default.

This feature is enabled by default.

> Note: Build pinning does not override Chainguard policy or malware controls. If a pinned upstream package is blocked by a policy or by malware scanning, the request will return an error.

## Prerequisites

Before getting started, you need:

* An [entitlement to Chainguard Libraries with upstream fallback enabled](/chainguard/libraries/introduction/access/#manage-library-entitlements)
* [`chainctl` installed and authenticated](/platform/chainctl-usage/how-to-install-chainctl/)
* A working configuration using Chainguard Libraries - a package manager configured to pull from Chainguard Libraries directly or a repository manager that proxies Chainguard Libraries

## Pin builds

Your package versions are automatically pinned after you run an install for your project. Use this workflow when adopting build pinning:

1. Run an install for your project.
1. Confirm that pins appear: Run `chainctl libraries cache list`.
1. Commit the resulting lockfile if it changed.
1. When you are ready to adopt newer Chainguard builds, remove pins for the affected packages.
1. Regenerate or update the lockfile and run your normal build and test commands.

## View pinned builds

To list pins for your organization:

```bash
chainctl libraries cache list
```

The output includes the package, version, serving tier, whether the pin is active, and when the artifact was observed.

## Remove pins

After a zap, affected package versions resolve again, prioritizing Chainguard builds for any package versions that may have previously been pulled from Chainguard’s upstream fallback. Any new Chainguard-built artifacts may result in changes in a package version’s checksums. The zap does not override malware or policy blocks.

### Preview the change

Use `--dry-run` to preview which pins would be removed:

```bash
chainctl libraries cache zap --dry-run
```

### Remove all pins

You can remove all pins per ecosystem. For example, to remove all pins for JavaScript:

```bash
chainctl libraries cache zap --ecosystem javascript
```

After removing pins, regenerate or update your lockfile.

### Remove specific package pins

To remove a specific package pin:

```bash
chainctl libraries cache zap --package <PACKAGE>
```

To narrow the operation to one package version, include the `--version` flag: `--version <VERSION>`.

To skip the confirmation prompt in scripts or automation, include the `--yes` flag.

After removing a pin, regenerate or update your lockfile.

## Opt out of build pins

To stop recording and enforcing pins for an ecosystem, run the following command:

```bash
chainctl libraries cache opt-out --ecosystem javascript
```

## Adopt a Chainguard build after removing a pin

To move a package from an upstream-sourced artifact to a Chainguard-built one, you must force a fetch after the zap. Note that if Chainguard has not rebuilt a package, the following steps will re-pin to upstream again.

First, force a fresh install:

{{< tabs label="Language ecosystem for adopting a Chainguard build" >}}

{{% tab title="Java" %}}

Java (Maven):

```bash
mvn dependency:purge-local-repository -DmanualInclude="<groupId>:<artifactId>:<version>"
mvn install
```

Java (Gradle):

```bash
./gradlew build --refresh-dependencies
```

{{% /tab %}}

{{% tab title="JavaScript" %}}

JavaScript (npm):

```bash
rm -rf node_modules package-lock.json
npm install
```

{{% /tab %}}

{{% tab title="Python" %}}

Python (pip):

```bash
pip install --no-cache-dir --force-reinstall <package>==<version>
```

{{% /tab %}}

{{< /tabs >}}

Next, confirm that the package now resolves to a Chainguard build:

```bash
chainctl libraries cache list --package <PACKAGE> --live
```

After confirming the change, commit the updated lockfile and run your normal install again.

## Troubleshooting and FAQ

### Does build-pinning apply under the Chainguard-only policy?

No. You must have upstream fallback enabled in order for build pinning to take effect.

### What happens to my pins when I switch policies?

Going from `CHAINGUARD_AND_UPSTREAM` (upstream fallback enabled) to `CHAINGUARD` (fallback disabled) stops pins from being served, but the pin records aren’t deleted. They persist until the cache is manually zapped. Switching back to `CHAINGUARD_AND_UPSTREAM` later can resurrect old pins unexpectedly.

---

### Error messages
_Path: chainguard/libraries/troubleshooting/errors.md_

Chainguard Libraries applies security controls to every package it serves through the
Chainguard Repository: malware and greyware scanning, and configurable policies such as a
cooldown period. When one of these controls blocks a package or version, Chainguard
withholds it and the install fails.

Chainguard also surfaces errors for other reasons, such as a missing entitlement or
invalid authentication.

**Note**: If your build tool or repository manager pulls from a public registry as a
fallback, it may fetch a blocked package and bypass Chainguard's controls. Chainguard
recommends pulling all open source packages through the
[Chainguard Repository](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) only.

## Why a package or version is blocked

Chainguard blocks a package or version for one of the following reasons:

* **Malware or greyware detected**: The package or version is on Chainguard's malware and greyware block list, either from a public advisory (MAL ID) or from Chainguard's own source code scanning.
* **Malware scan pending**: A newly published version has not completed malware scanning yet.
* **Policy block**: The version is blocked by a policy configured by your organization, such as a cooldown policy.

To resolve a blocked package, choose a version that is not blocked, wait for a pending scan
or cooldown period to pass, or configure an
[override](/chainguard/chainguard-repository/library-policies/) to allow an exception for a
specific package or version.

## Package manager behavior

How a blocked package appears during development will depend on the package manager and language ecosystem:

* **`npm`** surfaces the block reason directly, reporting a blocked version as a `403` with the reason (for example, `MALWARE_DETECTED`).
* **Other package managers** (such as `pnpm`, `yarn`, `pip`, `uv`, `poetry`, `Maven`, and `Gradle`) typically report a blocked version as a `not found` or `no matching version found` error. When an entire package (all of its versions) is blocked for malware, a `409` error surfaces across most package managers.

## Other errors

The following errors indicate problems with authentication, entitlements, or a nonexistent package.

| Error | Meaning | Next steps |
| -- | -- | -- |
| Not authenticated (`401`) | Your pull token is missing or expired. | Reconfigure access. See [Access Chainguard Libraries](/chainguard/libraries/introduction/access/). |
| Missing entitlement (`403`) | Your organization is not entitled to the specific ecosystem. | See [Manage library entitlements](/chainguard/libraries/introduction/access/#manage-library-entitlements). |
| Package does not exist (`404`) | The requested package or version does not exist. | Confirm that the package name and version exist on the public upstream registry. |

## Learn more

* [View blocked malware in the Console](/chainguard/libraries/introduction/browse/#view-malware-information)
* [Library policies, overrides, and cooldown](/chainguard/chainguard-repository/library-policies/)
* [Access Chainguard Libraries](/chainguard/libraries/introduction/access/)
* [Manage build pinning](/chainguard/libraries/policies-and-security/build-pinning/)

---

### Chainguard Libraries FAQ
_Path: chainguard/libraries/troubleshooting/faq.md_

## How does Chainguard Libraries help developers?

{{< details "Watch: How Chainguard Libraries helps developers" >}}

The following video focuses on Chainguard's built-from-source model: when a
rebuilt package is available, Chainguard serves it with verifiable provenance
and SBOMs. Not every package or version can be built immediately, so the
[Chainguard Repository](/chainguard/chainguard-repository/) also supports an
optional, policy-governed upstream fallback. When enabled, Chainguard-built
packages are preferred, while eligible upstream packages are subject to
configurable controls such as a cooldown period and malware and greyware
scanning. Packages identified as malicious are blocked.

{{< youtube yvo2SyUeaJM >}}

### Transcript

**Interviewer**: So how does Chainguard Libraries help developers?

**Dustin Kirkland**: Yeah, so building off of that Chainguard Factory, we've actually repurposed all of that automation to not just build packages and containers, but actually fetch libraries directly from their upstream source and recompile those Java binaries—JARs—and those Python binaries—wheels—in a new format, or in the same format rather, but totally bootstrapped from source. The fact that we can rebuild those libraries means that we can actually patch them if necessary.

Now, in doing so, we've created an entire repository of Python wheels and Java JARs that we can publish and hydrate into a customer's environment, so that their developers can retrieve their libraries from a secure source, from a trusted source, and avoid malicious packages—deliberately modified or intentionally compromised packages—which, you know, we find in PyPI.org or in Maven Central from time to time. But Chainguard building those from source ensures that that entire open source ecosystem is secured in the same way that we're securing the packages and the container ecosystems.

{{< /details >}}

## How does Chainguard Libraries plug into a developer's workflow?

{{< details "Watch: How Chainguard Libraries plugs into a developer's workflow" >}}

{{< youtube SBisxaL855k >}}

### Transcript

**Interviewer**: So Dustin, how does Libraries actually plug into a developer workflow?

**Dustin Kirkland**: Yeah, so I used the word "hydrate" earlier. We hydrate typically a JFrog Artifactory or a Cloudsmith—we hydrate that registry of artifacts with Chainguard securely built artifacts. And we produce this constant flow of tens of thousands of those library version tuples into that environment. And our customers can come to us and get a license for our entire Java ecosystem or our entire Python ecosystem.

So from that sense, we're certainly not an artifact registry. You use the artifact registry that's typically used inside of your organization. We help populate that with secure artifacts. This is fairly similar to our approach with containers, where we're not a scanner, but what we're trying to do is complement the scanners that you have with better containers that have fewer CVEs, and you end up with cleaner scan results. So in this artifact sense, we're not an artifact registry, but we're putting better binaries into that artifact destination.

**Interviewer**: So once the artifact registry is set up, is there any changes to actual developers' workflow, or will it just work?

**Dustin Kirkland**: Typically not. I mean, if inside of your organization you already have an artifact registry and your developers are pip installing or maybe even importing those classes and libraries from that artifact repository, we're just replacing the artifacts that may have additional vulnerabilities or potentially malicious code with artifacts that have fewer vulnerabilities and are immune to that malicious code.

{{< /details >}}

## What security issues can Chainguard Libraries prevent?

As detailed on the [background](/chainguard/libraries/introduction/overview/#background) and
[introduction](/chainguard/libraries/introduction/overview/#introduction) pages, Chainguard
Libraries are built directly from source in the Chainguard Factory and the
resulting binaries are directly provided to you by Chainguard. Chainguard
operates the whole supply chain for the package lifecycle as one reliable,
secure partner. You can therefore avoid issues from the following software
supply chain attack surface points:

* Build pipeline
* Build system
* Dependency injection
* Bypass of CI/CD systems
* Library distribution
* Library consumption

More information about these stages in the software supply chain is available on the [Supply chain
Levels for Software Artifacts (SLSA) website](https://slsa.dev/).

The following examples are issues, attacks, and compromises that affect stages
of the software supply chain for libraries across different language ecosystems:

{{< details "Malicious GlueStack packages" >}}

* This May 2025 attack uploaded compromised packages to PyPI and npm that enable remote shell access and uploading files to compromised machines
* Chainguard Libraries would have protected against this attack. First, the packages have invalid upstream source URLs so there was no source repository. In the case of the lone exception (a package with a valid source repository link), no code was present for Chainguard to build a valid package.
* [The Hacker News](https://thehackernews.com/2025/06/new-supply-chain-malware-operation-hits.html) blog post on the attack

{{< /details >}}

{{< details "Ultralytics Python project" >}}

* Attackers compromised the GitHub Actions workflows for the Ultralytics repository, injecting malware
  into PyPI package releases.
* Attackers pushed out four malicious versions of the Ultralytics YOLO project over the course of a week (8.3.41, 8.3.42, 8.3.45, 8.3.46).
* Ultralytics YOLO is a widely-used fast object detection neural network library downloaded about five million times per month. Users affected during this period were infected with cryptomining malware.
* Chainguard Libraries would have prevented this attack by building the project from clean source. No source code was modified by attackers during this incident.
* Refer also to [PyPI attack analysis](https://blog.pypi.org/posts/2024-12-11-ultralytics-attack-analysis/) and
  [bleepingcomputer blog post](https://www.bleepingcomputer.com/news/security/ultralytics-ai-model-hijacked-to-infect-thousands-with-cryptominer/).

{{< /details >}}

{{< details "Lottie Player" >}}

* Hackers gained access to the NPM registry by compromising a developer authentication token.
* Token used to upload a compromised version of Lottie Player.
* The malicious package drained crypto wallet funds.
* Chainguard Libraries would have prevented this attack by building the project from clean source. No source code was modified by attackers during this incident.
* Refer also to [npm package Lottie-Player compromised in supply chain attack, Nov 2024](https://www.infosecurity-magazine.com/news/npm-package-lottieplayer-supply/).

{{< /details >}}

{{< details "MavenGate" >}}

* MavenGate is a proof of concept for exploiting abandoned Java library domains.
* Vulnerabilities in Maven dependency management allow unauthorized package replacements.
* All Java build tools using Maven repositories, including Maven, Gradle, and
  Ant, could be affected.
* MavenGate relied on the use of multiple repositories and any attack with the
  proposed mechanism would not publish source code. Chainguard Libraries replace other repositories and the use of Chainguard Libraries, based on
  building from the original source, would have prevented an attack using this approach
* Refer also to [_The Hacker News_ article](https://thehackernews.com/2024/01/hackers-hijack-popular-java-and-android.html),
  [_Oversecured_ blog post](https://blog.oversecured.com/Introducing-MavenGate-a-supply-chain-attack-method-for-Java-and-Android-applications/),
  and [Sonatype's take as Maven Central
  operator](https://www.sonatype.com/sonatypes-ongoing-commitment-to-maven-central).

{{< /details >}}

{{< details "XZ Utils backdoor" >}}

* Example of a supply chain attack leveraging social engineering by a patient actor
* Sophisticated backdoor that had remote code execution capability and the potential to affect many systems
* Vulnerability was patched within hours of disclosure by reverting to a
  previous version known to be safe.
* Malicious source tarball and binaries were distributed successfully, but
  source code repository was not compromised.
* Since no source code was compromised, a similar attack on a protected library ecosystem
  would be prevented by Chainguard Libraries
* XZ Utils is written in C and therefore not available as an ecosystem protected by Chainguard Libraries. However, Chainguard Containers include XZ Utils packages. These are also built
  from source and are not affected.
* Refer also to [Wikipedia article](https://en.wikipedia.org/wiki/XZ_Utils_backdoor)
  and [official page from the XZ data compression](https://tukaani.org/xz-backdoor/).

{{< /details >}}

{{< details "Other examples and resources" >}}

The following links provide details for other software supply chain attacks.
Depending on the exact details some of these attacks and approaches are
prevented by use of Chainguard Libraries.

* [Successful supply chain attack on Solana JS library](https://socket.dev/blog/supply-chain-attack-solana-web3-js-library)
* [PyPI packages without source](https://thehackernews.com/2024/12/researchers-uncover-pypi-packages.html)
* [Compromised PyTorch nightly](https://pytorch.org/blog/compromised-nightly-dependency/)
* [Commercial artifacts with RCE vulnerability and without source on PyPI, Aug 2024](https://giraffesecurity.dev/posts/amazon-hat-trick/)
* [Thwarted attempts to flood npm registry](https://www.sonatype.com/blog/crypto-enthusiasts-flood-npm-with-281000-bogus-packages-overnight)
* [PyPI Python library "aiocpa" found exfiltrating crypto keys via Telegram bot, Nov 2024](https://thehackernews.com/2024/11/pypi-python-library-aiocpa-found.html)
* [Supply chain attack detected in Solana's web3.js library. Dec 2024](https://socket.dev/blog/supply-chain-attack-solana-web3-js-library)
* [PyTorch namespace (dependency) confusion attack](https://www.sonatype.com/blog/pytorch-namespace-dependency-confusion-attack)
* [Typo squatting attempt to gain credentials](https://socket.dev/blog/malicious-maven-package-exfiltrates-oauth-credentials)
* [Typo squatting attempts on Maven Central](https://www.sonatype.com/blog/malware-removed-from-maven-central)
* [tj-actions GitHub action issue as example of build infrastructure supply chain compromise](https://www.cisa.gov/news-events/alerts/2025/03/18/supply-chain-compromise-third-party-tj-actionschanged-files-cve-2025-30066-and-reviewdogaction)

Find pointers to further resources in the [Software supply chain reading
list](https://github.com/chainguard-dev/ssc-reading-list).

{{< /details >}}

## Why do the Chainguard library checksums differ from those published by upstream repositories?

Chainguard rebuilds libraries from source in a controlled environment to improve supply-chain security. As a result, while functionality remains the same, build metadata and generated content, such as SBOMs, differs from upstream distributions. Whether Chainguard library checksums match upstream depends on the ecosystem and build process.

During initial migration to Chainguard Libraries, some common causes of checksum errors include:

* Artifacts were previously cached from upstream repositories
    * Example: Maven's `.m2` or Gradle's cache.
* Dependencies are pinned to upstream checksums or hashes
    * Example: JavaScript's `package-lock.json` or `yarn.lock`.
* Repository managers or build tools enforce strict verification
    * Example: Artifactory validating against Maven Central.

After you migrate, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a version you pulled from the upstream fallback stable when Chainguard later publishes its own build, so checksums don't change unexpectedly across rebuilds.

## What’s the difference between malware‑hardened libraries and CVE remediation?

Malware‑hardened libraries are the baseline Chainguard Libraries experience:
Chainguard rebuilds open source Java, JavaScript, and Python dependencies from
upstream source in the [Chainguard Factory](/platform/factory/), a controlled,
SLSA‑aligned build environment, and publishes them to hardened registries for
customers to consume. This closes off most supply chain malware vectors compared
to pulling directly from public registries like Maven Central, npm, and PyPI.

[CVE remediation](/chainguard/libraries/policies-and-security/cve-remediation/) is an additional
feature where Chainguard backports High and Critical vulnerability fixes from
newer upstream releases to older versions that customers are still using,
particularly when upstream maintainers no longer ship patches for those older
versions. Remediated versions are:

* Published in a separate repository:
  `https://libraries.cgr.dev/python-remediated/simple/` for Python and
  `https://libraries.cgr.dev/java-remediated/` for Java.
* Given a local version suffix -- like `+cgr.N` for Python (for example,
  2.0.0+cgr.1) and `-0.cgr.N` for Java -- so dependency resolvers can
  distinguish them from non‑remediated upstream versions while still preferring
  the remediated build during resolution.

## Why might I still see errors with the upstream fallback enabled through the Chainguard Repository?

Chainguard offers an upstream fallback through the [Chainguard
Repository](/chainguard/chainguard-repository/) as a single, managed endpoint for each ecosystem. This endpoint:

* Serves Chainguard‑built packages first, rebuilt from source.
* Serves upstream packages for versions that are not
  yet available from Chainguard. Chainguard scans these packages for malware and greyware before serving them, and subjects them to configurable policies such as a cooldown period.

Because of those controls, you may still see failed pulls when
the upstream fallback is enabled, for example when:

* A package or version is blocked by malware detection and therefore
  intentionally not served from upstream.
* A recently published version is still in the cooldown period, so the
  repository will not yet serve it.
* The requested package/version truly does not exist in either Chainguard’s
  catalog or upstream.

For customers, this can surface as an error from the Chainguard endpoint even
though a version appears in the public registry.

For more details on the errors you may see when a package is blocked for these reasons,
see the [Error messages documentation](/chainguard/libraries/troubleshooting/errors/).

## What are Chibbies?

Chibbies is the internal codename for the Chainguard Libraries. It evolved from
Chainguard Libraries being shortened to Chainguard Libbies, and then [finally to
Chibbies](https://www.youtube.com/watch?v=adfU9LJg3I0&t=2843s).

## JFrog Artifactory troubleshooting

The following questions apply to repo manager configurations for Chainguard Libraries, using JFrog Artifactory. Learn more about using a repo manager in the global configuration pages for each ecosystem: [Java](/chainguard/libraries/java/global-configuration/), [JavaScript](/chainguard/libraries/javascript/global-configuration/), [Python](/chainguard/libraries/python/global-configuration/).

### What are the most common setup mistakes when using Artifactory with Chainguard Libraries?

Follow these steps for general troubleshooting:

* Verify the token and repository settings.
    * Confirm that the token is scoped correctly, not expired, and copied correctly. Also confirm that the repository URL is the correct language-specific endpoint and that the expected remote repository settings are in place.
* Validate pulling packages with direct access.
    * Attempt to pull a package directly from the Chainguard endpoint from a controlled environment. This helps you confirm that the token works and that the package is available independently of Artifactory.
    * Attempt to pull the same package through the Artifactory remote or virtual repository and compare the result.
    * If direct access works but the Artifactory path fails, check the network path between Artifactory and the Chainguard endpoint. This is where firewall restrictions, proxy behavior, TLS inspection, or object-storage allowlisting issues may have an impact.
* Test with a real package fetch.
    * The **Test** button in Artifactory is not a reliable way to confirm that your integration is working as expected. Instead, use a real package fetch, install, or checksum comparison.
* If results aren't as expected, [clear one cache layer at a time and rerun the same test](#inconsistent-fallback).

### Why might I see TLS or SSL handshake errors and authentication failures after configuring Artifactory with Chainguard Libraries?

In some cases, authentication failures or malformed token behavior are caused by traffic inspection or proxy-layer handling. When troubleshooting, check the following:

* Whether a proxy, TLS inspection layer, or MITM device is in path
* Whether the full certificate chain is installed correctly
* Whether the environment uses an internal CA
* Whether the runtime, package manager, and repository manager trust the same CA bundle
* Whether the proxy is modifying or normalizing headers, tokens, or request format

### Why might I experience timeouts or "connection refused" errors after configuring Artifactory with Chainguard Libraries?

Firewall rules can prevent dependency resolution or break integration behavior. This is often observed when the repository manager can reach one destination but not another required upstream host or storage host. When troubleshooting, check the following:

* Allowed outbound destinations
* DNS resolution
* Port restrictions
* Whether the repository manager can reach all required upstream hosts
* Whether object-storage or redirect targets also need to be allowlisted

### Why might I experience authentication loops, 4xx or 5xx responses, incorrect endpoint routing, stale artifacts, or behavior that differs between direct and proxied paths after configuring Artifactory with Chainguard Libraries?

Proxy layers can change headers, certificate handling, path routing, protocol support, and cache behavior. When troubleshooting, check the following:

* Whether a forward proxy, reverse proxy, or both are present
* Header rewriting
* Path rewriting
* Auth forwarding
* TLS termination point
* HTTP/2 support where required
* Cache behavior at each layer

<a id="inconsistent-fallback"></a>

### Why might I experience inconsistent fallback behavior, outdated package metadata, or inconsistent experience between users after configuring Artifactory with Chainguard Libraries?

Caching is a common cause of unexpected behavior during onboarding and testing.
Builds can continue using previously cached public-registry artifacts or stale
metadata even after you switch a repository over to Chainguard. When
troubleshooting, check the following:

* Local package manager cache
* Artifact repository cache
* Proxy cache
* CI/CD runner cache

Clear one cache layer at a time and rerun the same test after each change. Avoid
clearing multiple cache layers simultaneously unless the steps are documented.
If you are switching an existing Artifactory repository to Chainguard,
invalidate or zap the remote cache before concluding that the configuration is
broken.

---

### Configure Python build tools
_Path: chainguard/libraries/python/build-configuration.md_

Chainguard Libraries for Python works with your existing build tools — pip,
Poetry, and uv — through a repository configuration change. This page is a
reference for configuring each supported build tool. It covers repository
access, authentication, cache clearing, and minimal example projects.

Apply these changes on every workstation and build server that builds your
applications or downloads libraries, including CI/CD infrastructure such as
Jenkins, TeamCity, or GitHub Actions.

The `https://libraries.cgr.dev/python/` endpoint is also the [Chainguard
Repository](/chainguard/chainguard-repository/overview/) endpoint for Python. By
default, it serves only Chainguard-built artifacts. When [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) is
enabled for your organization, the same endpoint can also serve requested
versions from PyPI under Chainguard security controls.

This guide outlines how to configure your build tool. If you are looking for something else, refer to the following guides depending on your goals:

| If you want to... | Use this page |
| --- | --- |
| Understand what Chainguard Libraries for Python is and how it works | [Python overview](/chainguard/libraries/python/overview/) |
| Set up organization-wide access through a repository manager | [Global configuration](/chainguard/libraries/python/global-configuration/) |
| Look up how to configure a specific build tool (pip, Poetry, uv) | This page |
| Migrate an existing project step by step | [Python migration guide](/chainguard/libraries/python/migration/) |
| Install inside a container build without leaking credentials into the image | [Container builds](/chainguard/libraries/policies-and-security/build-containers/) |

Refer to the [minimal example projects](#minimal-example-projects) on this page for demonstrations using `uv` and `pip`.

If a package or version is blocked by a policy or malware scan, your build tool returns an error. Refer to the [Error messages documentation](/chainguard/libraries/troubleshooting/errors/) for more details.

## Step 1: Retrieve authentication credentials

To configure any build tool, you must first access credentials from your
organization's repository manager or for direct access.

<a id="cloudsmith"></a>

### Cloudsmith

The following steps allow you to determine the URL and authentication details
for accessing your organization's Cloudsmith repository manager.

1. Log into Cloudsmith.
1. Select the **Repositories** tab and click on the *python-all* repository.
1. Select the **Packages** tab.
1. Select **Push/Pull Packages** on the right.
1. Choose the **Python** format.
1. Select your desired authentication method for **Entitlement tokens** and copy
   the URL to use in your build tool - for example
   `https://dl.cloudsmith.io/.../exampleorg/python-all/python/simple/`. In the
   URL `...` is replaced with a default token or your personal token depending
   on your selection and `exampleorg` is replaced with the name of your
   organization. The URL contains both the name of the repository `python-all`
   as well as `python` as an identifier for the format.
1. Alternatively, use the **API Key** and copy the URL to use in your build tool
   - for example
   `https://username:{{apiKey}}@dl.cloudsmith.io/basic/exampleorg/python-all/python/simple/`.
   Replace `username` and `exampleorg` with your Cloudsmith details and replace
   `{{apiKey}}` with the API key from the **Personal API Keys** section from the
   drop down on your username.

Note that for use with build tools you must include the `simple/` context so that
the package index is used successfully.

<a name="gar"></a>

### Google Artifact Registry

Use the [Google Cloud Artifact Registry documentation](https://docs.cloud.google.com/artifact-registry/docs/python/authentication) to authenticate to your Python Artifact Registry.

<a id="artifactory"></a>

### JFrog Artifactory

The following steps allow you to determine the identity token and URL for
accessing your organization's JFrog Artifactory repository manager.

1. Select **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.
1. Select the **Virtual** tab in the repositories view.
1. Locate the **python-all** repository row and press the three dots
   (**...**) in the last column on the right.
1. Select **Set Me Up** in the dialog.
1. Select **Generate Token & Create Instructions**
1. Copy the generated token value to use as the password for authentication.
1. Select **Generate Settings**.
1. Copy the value from one of the *URL* fields. They are all identical. For
   example, `https://exampleorg.jfrog.io/artifactory/python-all` with
   `exampleorg`. Note that for use with build tools you must append `simple/` to
   the URL so that the package index is used successfully -
   `https://exampleorg.jfrog.io/artifactory/python-all/simple/`.

<a id="nexus"></a>

### Sonatype Nexus Repository

The following steps allow you to determine the URL and authentication details
for accessing your organization's Sonatype Nexus repository group.

1. Click **Browse** in the **Welcome** view or the browse icon (cube) in the top
   navigation bar.
1. Locate the **URL** column for the *python-all* repository group and press
   **copy**. The URL should take the following format:
   `https://repo.example.com/repository/python-all/`. Note that for use with
   build tools you must append `simple/` to the URL so that the package index is
   used successfully - `https://repo.example.com/repository/python-all/simple/`.
1. No further configuration is necessary if your repository manager is
   configured for anonymous access with **Security** - **Anonymous Access** -
   **Access** - **Allow anonymous users to access the server** is activated. If
   authentication is required, you must use the relevant details such as
   username and password in your build tool configuration.

### Direct access

The build configuration to retrieve artifacts **directly** from the Chainguard
Libraries for Python repositories requires authentication with username and
password from a pull token as detailed in [access
documentation](/chainguard/libraries/introduction/access/#pull-token).

Note that there are multiple repositories:

- `https://libraries.cgr.dev/python/` with the simple index at `https://libraries.cgr.dev/python/simple`
- `https://libraries.cgr.dev/python-remediated` with the simple index at `https://libraries.cgr.dev/python-remediated/simple`

Configuration for multiple index use and authentication varies for each
packaging tool. Typically Python tools include support for
[.netrc](/chainguard/libraries/introduction/access/#netrc).

Refer to examples using `uv` and `pip` under [Minimal example projects](#minimal-example-projects).

## Step 2: Configure your build tools

Once you have credentials and the index URL from your organization's repository
manager, you're ready to set up specific build tools for local development or
CI/CD.

The recommended configuration is to use the [Chainguard Repository](/chainguard/chainguard-repository/overview/) endpoint rather than manually configuring fallback to upstream PyPI.

### Authentication

[pip](#pip), [uv](#uv), poetry, and other Python build and packaging tools have
dedicated support for configuring authentication to the repository manager or
the Chainguard Libraries for Python directly. As an alternative that works
across tools and is often preferred, use [.netrc for
authentication](/chainguard/libraries/introduction/access/#netrc).

### Updating lockfile hashes

If you are migrating an existing Python project to Chainguard Libraries, your lockfile likely contains integrity hashes generated against packages previously downloaded from the PyPI registry or through your repository manager. Because Chainguard rebuilds packages from verified source, the checksums for those packages differ from the ones already recorded in your lockfile. These hashes must be updated before reinstalling.

The [`chainctl libraries update-hashes` command](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/) automates lockfile hash updates for all supported Python lockfile formats. Rather than manually regenerating lock files with each tool, you can run the command directly against your existing lockfile to update hashes to Chainguard checksums while preserving your locked dependency versions, without re-resolving your dependency graph.

Supported formats include `requirements.txt` (pip-tools `--hash` style), `poetry.lock`, `uv.lock`, `pdm.lock`, `Pipfile.lock`, and `pylock.toml`.

Run the command in your project directory to auto-detect the lockfile:

```bash
chainctl libraries update-hashes
```

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.python.pull` permission or the Owner role.

Or specify a lockfile path directly:

```bash
chainctl libraries update-hashes path/to/requirements.txt
```

If you install through a repository manager rather than pulling from Chainguard directly, pass the full repository URL with `--registry-url` so the hashes are updated against the same source your project actually installs from. For example:

```bash
chainctl libraries update-hashes --registry-url https://your-org.jfrog.io/artifactory/api/pypi/chainguard-libraries/simple
```

Learn about using this command with repo managers in the [Global
configuration](/chainguard/libraries/python/global-configuration/) page.

<a id="update-hashes-auth"></a>

#### Authentication

`update-hashes` fetches checksums from Chainguard Libraries (`libraries.cgr.dev`),
which requires authentication. Choose whichever fits your environment:

- **Logged in locally**: Run the command while authenticated; if you have no
  other credential it authenticates with a
  [pull token](/chainguard/libraries/introduction/access/#pull-token) for your
  organization, prompting for one only if you have access to more than one. Pass
  `--parent <organization>` to skip that prompt. To avoid it entirely,
  scope your login to the libraries registry once with
  `chainctl auth login --audience=libraries.cgr.dev` — that session is then used
  automatically.
- **CI or non-interactive**:
    - For a session token, pass `--token <token>` or set `CHAINCTL_AUTH_TOKEN`. The
    token must be scoped to the libraries registry; mint one with
    `chainctl auth token --audience=libraries.cgr.dev`.
    - For a [pull token](/chainguard/libraries/introduction/access/#pull-token) (an identity and
    secret), pass it as basic auth: `--username <identity> --password <secret>`,
    or set `CHAINCTL_REGISTRY_USERNAME` / `CHAINCTL_REGISTRY_PASSWORD`.
- **From `~/.netrc`**: Credentials for the registry host are read from `~/.netrc`
  (or `$NETRC`); refer to [.netrc for authentication](/chainguard/libraries/introduction/access/#netrc).
  Pass `--ignore-netrc` to skip an unrelated entry.

When you target a repository manager with `--registry-url` (for example
Artifactory or JFrog), authenticate with **that** registry's credentials —
`--username`/`--password`, the `CHAINCTL_REGISTRY_USERNAME` /
`CHAINCTL_REGISTRY_PASSWORD` environment variables, or a matching `~/.netrc`
entry. Chainguard-scoped tokens are never sent to third-party hosts.

By default, Chainguard hashes are appended alongside existing upstream hashes. After updating the lockfiles, to switch your environment to use Chainguard packages, configure your tool to use the Chainguard index and reinstall. The command will output
a "Next steps" section that includes the tool-specific command for reinstalling.

<a id="pip"></a>

### pip

The [pip tool](https://pip.pypa.io/en/stable/) is the most widely used utility
for installing Python packages. In this section, we use the credentials from
your organization's repository manager to configure `pip` to ingest dependencies
from Chainguard Libraries.

First, clear your local `pip` cache to ensure that packages are sourced
from Chainguard Libraries for Python:

```shell
pip cache purge
```

#### Using a repository manager

To update `pip` to use our repository manager's URL globally, create or edit
your `~/.pip/pip.conf` file. You may need to create the `~/.pip` folder as
well. For example:

```sh
mkdir -p ~/.pip
nano ~/.pip/pip.conf
```

Update this configuration file with the following, replacing `<repository-url>`
with the URL provided by your repository manager including the `simple/`
context:

```pip.conf
[global]
index-url = <repository-url>
```

Updating this global configuration affects all projects built on the
workstation. Alternately, if your project uses a `requirements.txt` file in
projects, you can add the following to it to configure on a project-by-project
basis:

```
--index-url <repository-url>
package-name==version
```

Note the different syntax for `index-url` in the two files.

Refer to the official documentation for [configuring authentication with
pip](https://pip.pypa.io/en/stable/topics/authentication/) if you are not using
[.netrc for authentication](/chainguard/libraries/introduction/access/#netrc).

#### Using direct access

When using [direct access](#direct-access) to the Chainguard Libraries for
Python repository with `pip`, you must ensure the following are set in your
configuration file:

- Replace any `/` in the username value `CG_PULLTOKEN_USERNAME` with `_`.
- Ensure the `simple` context is used for the URL.
- The password value `CG_PULLTOKEN_PASSWORD` remains unchanged.

Example for `requirements.txt`:

```
--index-url https://CG_PULLTOKEN_USERNAME:CG_PULLTOKEN_PASSWORD@libraries.cgr.dev/python/simple/
```

Example for `~/.pip/pip.conf`:

```
[global]
index-url = https://CG_PULLTOKEN_USERNAME:CG_PULLTOKEN_PASSWORD@libraries.cgr.dev/python/simple/
```

Note that `pip` supports installing Python libraries from one main repository
URL specified with `index-url` and one or more additional repositories specified
with `extra-index-url` without any specific prioritization beyond resolving
semantic versions. The following example uses authentication from a local
`.netrc` file and places the remediated repository first as the primary source,
falling back to the standard Chainguard Libraries repository when a remediated
version is not available:

```
--index-url https://libraries.cgr.dev/python-remediated/simple/
--extra-index-url https://libraries.cgr.dev/python/simple/
```

If you are using `pip` and prefer to pull from multiple repositories while
prioritizing Chainguard Libraries for Python, we recommend using a repository
manager. Alternatively, other Python package managers, detailed in the following
sections, provide support for index priority resolution behavior.

Refer to a demonstration using `pip` under [Minimal example projects](#pip-minimal).

<a id="poetry"></a>

### Poetry

[Poetry](https://python-poetry.org/) helps you declare, manage, and install
dependencies of Python projects, and can be used with Chainguard Libraries for
Python."

List the Python package caches used by your Poetry project:

```shell
poetry cache list
```

The following commands clear the default cache, the cache for a repository named
`pypi`, and the cache of packages of the repo `python-all` from your repository
manager as configured in [the global
configuration](/chainguard/libraries/python/global-configuration/):

```shell
poetry cache clear --all _default_cache
poetry cache clear --all pypi
poetry cache clear --all python-all
```

#### Using a repository manager

Set up HTTP authentication to the repository `python-all` on your repository
manager with the username `example` and the password `secret` in your project
directory:

```shell
poetry config http-basic.python-all example secret
```

The authentication is used for the `python-all` repository that you add to the
`pyproject.toml` with the following command:

```shell
poetry source add python-all https://repo.example.com/../python-all/simple/
```

Example URLs including the required `simple` context:

- JFrog Artifactory: `https://example.jfrog.io/artifactory/api/pypi/python-all/simple/`
- Sonatype Nexus: `https://repo.example.com:8443/repository/python-all/simple/`

The following configuration is added:

```toml
[[tool.poetry.source]]
name = "python-all"
url = "https://repo.example.com/../python-all/simple/"
priority = "primary"
```

Trigger a new download of the dependencies:

```shell
poetry install
```

If necessary, you can fix or even regenerate your `poetry.lock` file:

```shell
poetry lock
poetry lock --regenerate
```

Regenerating re-resolves your dependencies, so it can change your pinned versions, and a release still inside your configured cooldown window returns a 404 error. See [Update your lockfile](/chainguard/libraries/python/migration/#step-2-update-your-lockfile).

Proceed to build your project:

```shell
poetry build
```

#### Using direct access

For [direct access](#direct-access) to Chainguard Libraries for Python with
Poetry, use your username `CG_PULLTOKEN_USERNAME` and password
`CG_PULLTOKEN_PASSWORD` values from the pull token creation and the URL with the
simple context `https://libraries.cgr.dev/python/simple/`:

In order to install Python libraries from multiple repositories with Chainguard
Libraries for Python as the priority, `poetry` supports setting a [primary
package
source](https://python-poetry.org/docs/repositories/#project-configuration). You
can use this to configure Chainguard Libraries for Python as the first choice
for any library access, remediated packages from Chainguard as another choices
and a fallback to the PyPI public index for any missing packages:

```shell
poetry config http-basic.chainguard CG_PULLTOKEN_USERNAME CG_PULLTOKEN_PASSWORD
```

The authentication is used for the `chainguard` repository that you add to the
`pyproject.toml` with the following command:

```shell
poetry source add --priority=primary chainguard https://libraries.cgr.dev/python/simple/
```

Optionally, add the remediated Python libraries as supplemental source:

```shell
poetry source add chainguard-remediated https://libraries.cgr.dev/python-remediated/simple/
```

If you require a fallback to PyPI, you can add it as supplemental source:

```shell
poetry source add PyPI
```

Alternatively, edit the `pyproject.toml` file directly:

```toml
[[tool.poetry.source]]
name = "chainguard-remediated"
url = "https://libraries.cgr.dev/python-remediated/simple"
priority = "primary"

[[tool.poetry.source]]
name = "chainguard"
url = "https://libraries.cgr.dev/python/simple"

[[tool.poetry.source]]
name = "PyPI"
```

The [Poetry documentation](https://python-poetry.org/docs/) contains more
information about your project build, dependencies, versions, and other aspects.

### uv

[uv](https://docs.astral.sh/uv) is a fast Python package and project manager
written in Rust. It uses PyPI by default, but also [supports the use of
alternative package indexes](https://docs.astral.sh/uv/configuration/indexes/).

#### Using a repository manager

To update your global configuration to use your organization's repository
manager with `uv`, create or edit the `~/.config/uv/uv.toml` configuration file.
You may also need to create the `~/.config/uv/` folder first. For example:

```sh
mkdir -p ~/.config/uv
nano ~/.config/uv/uv.toml
```

Add the following to your `uv` global configuration file:

```toml
[[tool.uv.index]]
name = "<repository-manager-name>"
url = "<repository-url>"
```

Add the name for your repository, such as `corppypi`, within the quotes.

Replace the `<repository-url>` with the URL provided by your repository manager
including the `simple/` context.

Note that updating the global configuration affects all projects built on the
workstation. Alternately, you can update each project by adding the same
configuration in `pyproject.toml`.

Refer to the official documentation for [configuring authentication with
uv](https://docs.astral.sh/uv/configuration/authentication/) and [using
alternative package
indexes](https://docs.astral.sh/uv/guides/integration/alternative-indexes/) if
you are not using [.netrc for
authentication](/chainguard/libraries/introduction/access/#netrc).

#### Using direct access

For [direct access](#direct-access) to Chainguard Libraries for Python with
uv, use `.netrc`, environment variables, or embed credentials directly in the
index URL using your username `CG_PULLTOKEN_USERNAME` and password
`CG_PULLTOKEN_PASSWORD` values from the pull token creation and the URL with the
simple context `https://libraries.cgr.dev/python/simple/`.

The recommended approach for CI/CD and shared configurations is to use
uv's native index-scoped environment variables. For a named index, uv reads
credentials from `UV_INDEX_<NAME>_USERNAME` and `UV_INDEX_<NAME>_PASSWORD`,
where `<NAME>` is the index name uppercased with hyphens replaced by underscores.
This avoids storing credentials in config files while keeping the index
configuration shareable.

For example, with an index named `chainguard`:

```shell
export UV_INDEX_CHAINGUARD_USERNAME=CG_PULLTOKEN_USERNAME
export UV_INDEX_CHAINGUARD_PASSWORD=CG_PULLTOKEN_PASSWORD
```

Configure the index without embedded credentials in `pyproject.toml`:

```toml
[[tool.uv.index]]
name = "chainguard"
url = "https://libraries.cgr.dev/python/simple/"
default = true
authenticate = "always"
```

Or in `uv.toml`:

```toml
[[index]]
name = "chainguard"
url = "https://libraries.cgr.dev/python/simple/"
authenticate = "always"
```

Alternatively, embed credentials directly in the URL (avoid in shared or
version-controlled files):

Example for `pyproject.toml`:

```toml
[[tool.uv.index]]
name = "chainguard"
url = "https://CG_PULLTOKEN_USERNAME:CG_PULLTOKEN_PASSWORD@libraries.cgr.dev/python/simple/"
default = true
```

Example for `uv.toml`:

```toml
[[index]]
url = "https://CG_PULLTOKEN_USERNAME:CG_PULLTOKEN_PASSWORD@libraries.cgr.dev/python/simple/"
```

Refer to a demonstration using `uv` under [Minimal example projects](#uv-minimal).

#### Multiple indexes

In order to install Python libraries from multiple repositories with Chainguard
Libraries for Python as the priority, `uv` supports [searching across multiple
indexes](https://docs.astral.sh/uv/concepts/indexes/#searching-across-multiple-indexes).

You can use this to configure Chainguard Libraries for Python as the first
choice for any library access, with a fallback to the PyPI public index. In
addition, if you are consuming from our remediated Python libraries index, we
recommend setting the [index-strategy
setting](https://docs.astral.sh/uv/reference/settings/#index-strategy) to
`unsafe-best-match`. This ensures that index resolution continues to work when
remediated libraries have dependencies on non-remediated libraries.

Example `pyproject.toml` index setup for direct access to remediated and default
packages with netrc-based authentication and lowest priority fallback to PyPI.
Note that the order of the entries in the configuration file is significant and
determines the order for resolving dependencies:

```toml
[[tool.uv.index]]
name = "cgr-pr"
url = "https://libraries.cgr.dev/python-remediated/simple"
authenticate = "always"

[[tool.uv.index]]
name = "cgr-p"
url = "https://libraries.cgr.dev/python/simple"
authenticate = "always"

[[tool.uv.index]]
name = "pypi"
url = "https://pypi.org/simple/"
default = true # important to treat it as lowest priority
```

Set the index strategy to allow fallback from the remediated package index to
the Chainguard index and even PyPI as final fallback in `pyproject.toml`:

```toml
[tool.uv]
index-strategy = "unsafe-best-match"
```

Run a build to observe the resolved packages. For example, the declared
dependency to `flask` version `2.0.0` results in the use of version `2.0.0+cgr.1`.

## Minimal example projects

<a id="uv-minimal"></a>

### uv

Use the following steps to create a minimal example project for uv with
Chainguard Libraries for Python. For testing purposes, you can use direct access
and environment variables as detailed in the [access
documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).

> **Migrating an existing project?** If you have an existing uv lockfile with
> upstream hashes, use [`chainctl libraries update-hashes`](#updating-lockfile-hashes)
> to update hashes in place rather than starting from scratch.

**1. Configure credentials**

Once the environment variables are set, configure credentials in `~/.netrc`:

```bash
cat >> ~/.netrc << EOF
machine libraries.cgr.dev
login ${CHAINGUARD_PYTHON_IDENTITY_ID}
password ${CHAINGUARD_PYTHON_TOKEN}
EOF
chmod 600 ~/.netrc
```

> **Note**: The `machine libraries.cgr.dev` entry is shared across ecosystems.
> Make sure your entry is using a pull token with Python entitlement.

In this example, the global uv index is set to the Chainguard Python repositories
without embedded credentials, allowing uv to authenticate automatically using
`.netrc`.

Create the global index file `~/.config/uv/uv.toml` then open it in a text
editor such as `nano`:

```bash
mkdir -p ~/.config/uv
nano ~/.config/uv/uv.toml
```

Update it to include the remediated and standard Chainguard indexes:

```toml
[[index]]
url = "https://libraries.cgr.dev/python-remediated/simple/"
authenticate = "always"

[[index]]
url = "https://libraries.cgr.dev/python/simple/"
authenticate = "always"
```

**2. Initialize a new project**

This command creates a new directory, moves to the new directory, then initializes it with uv:

```bash
mkdir uv-example && cd $_
uv init
```

**3. Edit pyproject.toml**

Open `pyproject.toml` with a text editor, such as `nano`:

```bash
nano pyproject.toml
```

Add `flask==2.0.0` to the `dependencies` list in the `[project]` section, and add the following index configurations for the Python libraries to the end of the file:

```toml
[project]
name = "uv-example"
version = "0.1.0"
requires-python = ">=3.9"
dependencies = [
    "flask==2.0.0",
]

[tool.uv]
index-strategy = "unsafe-best-match"
# This allows uv to search across multiple indexes to find remediated versions of Python libraries

[[tool.uv.index]]
name = "cgr-pr"
url = "https://libraries.cgr.dev/python-remediated/simple"
authenticate = "always"

[[tool.uv.index]]
name = "cgr-p"
url = "https://libraries.cgr.dev/python/simple"
authenticate = "always"
```

**4. Build the project**

Build the project and sync dependencies:

```bash
uv sync
```

Following this, confirm the patched Chainguard version of flask was resolved:

```bash
uv pip list | grep flask
```

The output should show `flask 2.0.0+cgr.1`, confirming the remediated version was installed.

#### Verify the project works as expected

To verify the installed packages were built by Chainguard, use `chainctl`:

```bash
chainctl libraries verify --detailed .venv/
```

A successfully verified project produces output similar to the following:

```bash
  - flask
    Status: Verified as built from source
    Details: Version: 2.0.0+cgr.1 (verified via per-package SBOM - built from source by Chainguard)
    Python package: flask==2.0.0+cgr.1
```

<a id="pip-minimal"></a>

### pip

Use the following steps to create a minimal example project for pip with Chainguard Libraries for Python.
For testing purposes, you can use direct access and environment variables as detailed in the [access
documentation](/chainguard/libraries/introduction/access/#use-environment-variables-for-pull-token-credentials).  

> **Migrating an existing project?** If you have an existing pip lockfile with
> upstream hashes, use [`chainctl libraries update-hashes`](#updating-lockfile-hashes)
> to update hashes in place rather than starting from scratch.

**1. Update your configuration to point to Chainguard**

Once the environment variables are set, update `~/.pip/pip.conf` to point to Chainguard Libraries.

You may need to create the `~/.pip` directory first:

```bash
mkdir -p ~/.pip
nano ~/.pip/pip.conf
```

In `~/.pip/pip.conf`, add the following:

```pip.conf
[global]
index-url = https://CHAINGUARD_PYTHON_IDENTITY_ID:CHAINGUARD_PYTHON_TOKEN@libraries.cgr.dev/python/simple/
```

> **Note**: Replace any `/` in your `CHAINGUARD_PYTHON_IDENTITY_ID`'s value with `_` in the URL. The password value remains unchanged.

**2. Create a virtual environment**

Create a new directory, navigate to it, and create and activate a virtual environment:

```bash
mkdir pip-example && cd $_
python3 -m venv .venv
source .venv/bin/activate
```

**3. Add and install dependencies**

Create a `requirements.txt` file:

```bash
nano requirements.txt
```

In the `requirements.txt` file, add the following:

```requirements.txt
flask==2.0.0
```

Run the following command to install the dependencies:

```bash
pip install -r requirements.txt
```

#### Verify the project works as expected

To verify the installed packages were built by Chainguard, use `chainctl`:

```bash
chainctl libraries verify --detailed .venv/
```

A successfully verified project produces output similar to the following:

```output
Artifact: .venv/
Verification Coverage: 55.56%
Verified packages: 5 of 9
...
  - flask
    Status: Verified as built from source
    Details: Version: 2.0.0 (verified via per-package SBOM - built from source by Chainguard)
    Python package: flask==2.0.0
```

Adjust the index URL to use your repository manager and add any other desired packages for further testing.

---

### Global configuration
_Path: chainguard/libraries/python/global-configuration.md_

Python library consumption in a large organization is typically managed by a
repository manager. Commonly used repository manager applications are
[Cloudsmith](https://cloudsmith.com/), [JFrog
Artifactory](https://jfrog.com/artifactory/), and [Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository). The
repository manager acts as a single point of access for developers and
development tools to retrieve the required libraries.

The recommended approach is to use the [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls)
feature of Chainguard Repository, which allows you to configure your repository
manager with a single upstream pointed at `https://libraries.cgr.dev/python/`. The
Chainguard Repository handles fallback and policy enforcement; your repository
manager handles local caching and access control. Chainguard proxies and serves
packages from the public PyPI repository on your behalf when upstream
fallback is enabled. All packages served from Chainguard are protected with
malware scanning and a configurable cooldown policy.

At a high level, adopting the use of Chainguard Libraries consists of the following steps:

* Configure your environment to use `https://libraries.cgr.dev/python/` as the single upstream source for Python package retrieval.
* Add the public [PyPI](https://pypi.org/) repository as a remote repository.
* Create a group, virtual, or polyglot repository combining these repository
  sources with any desired internal repositories. Configure the Chainguard
  Libraries repository as the first choice for any library access after any
  desired internal repositories.

You should also:

* Remove all prior cached artifacts in the virtual server or proxy public
  repository. This step reduces confusion about the origin of libraries and
  assists technical evaluation and adoption of Chainguard Libraries.
* Remove any repositories that are no longer desired or necessary. Depending on
  your library requirements, this step can result in removal of some proxy
  repositories or even removal of all proxy repositories.

If your organization does not use a repository manager, you can still use
Chainguard Libraries. However, this approach requires configuration of multiple
build and development platforms and utilities to use Chainguard Libraries. For
this reason, adopting the use of a repository manager is the recommended
approach. Refer to the [direct access documentation for build
tools](/chainguard/libraries/python/build-configuration/#direct-access) for more
information.

## Manually managing fallback

Chainguard recommends using the [Chainguard Repository built-in upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) rather than configuring a public PyPI fallback in your repository manager. Configuring your own fallback bypasses the protection and policy behavior provided by Chainguard Repository.

However, if you intentionally want to manage fallback ordering yourself, you can continue using the repository manager patterns described on this page to combine Chainguard and PyPI sources.

### Updating lockfile hashes

If you are migrating an existing Python project to Chainguard Libraries through a repository manager, your lockfile likely contains integrity hashes generated against packages previously downloaded from PyPI or through your repository manager. The [`chainctl libraries update-hashes` command](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/) automates lockfile hash updates
for all supported Python lockfile formats.

When you are using a repository manager, pass the full repository manager URL with `--registry-url` and authenticate with one of the supported methods: `--username` and `--password`, `--token`, or a `.netrc` entry for the registry host. For example:

```bash
chainctl libraries update-hashes \
  --registry-url https://repo.example.com:8443/repository/python-all/ \
  --token "$REPO_TOKEN"
```

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.python.pull` permission or the Owner role.

After updating the lockfile, keep your repository manager configuration in place and reinstall through the same repository manager endpoint to apply the updated hashes.

Learn more in the [Build configuration page](/chainguard/libraries/python/build-configuration/#updating-lockfile-hashes) and in the [chainctl docs](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/).

<a id="cloudsmith"></a>

## Cloudsmith

[Cloudsmith](https://cloudsmith.com/) supports Python repositories for proxying
and hosting and polyglot repositories that combine multiple repositories sources
with compatible formats. Refer to the [Cloudsmith Python Repository
documentation](https://help.cloudsmith.io/docs/python-repository) and the
[Cloudsmith documentation for creating a
repository](https://help.cloudsmith.io/docs/create-a-repository) for more
information.

The recommended approach is to rely on Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
configuring a single upstream proxy pointed at `https://libraries.cgr.dev/python/`
rather than adding a separate public PyPI proxy. Refer to [Manually managing
fallback](#manually-managing-fallback) if you need to control fallback ordering
yourself.

### Initial configuration

Use the following steps to add a repository with Chainguard Libraries for
Python as the upstream source.

First, create a repository:

1. Log in to your Cloudsmith instance as user with administrator privileges.
1. Select the **Repositories** tab near the top of the screen.
1. Navigate to the **Repositories Overview**, then select **+New repository**.
1. At the new repository form, enter the name *python-all* for your new
   repository. The name should include *python* to identify the repository
   format. This convention helps avoid confusion, since repositories in
   Cloudsmith are multi-format.
1. Select a storage region that is appropriate for your organization and
   infrastructure.
1. Select **+Create Repository**.

Next, configure the upstream proxies:

1. Select the name of the new *python-all* repository on the repositories page
   to configure it.
1. Access the **Upstreams** tab and click **+ Add Upstream Proxy**.
1. Configure an upstream proxy with the format **python** and the following
   details:
    * **Name**: `python-chainguard`
    * **Priority**: `1`
    * **Upstream URL**: `https://libraries.cgr.dev/python/`
    * **Mode**: `Cache and Proxy`
    * Add the **Username** and **Password** value from [Chainguard Libraries
      access](/chainguard/libraries/introduction/access/) in **Authentication Settings**
1. Select **Create Upstream Proxy**.
1. If you want to use the separate repository with
   [remediated Python libraries](/chainguard/libraries/python/overview/#cve-remediation),
   repeat the preceding two steps with the name `python-chainguard-remediated`,
   the priority `2`, the same authentication details, and the URL
   `https://libraries.cgr.dev/python-remediated/`.
1. If you are manually managing fallback rather than using the [Chainguard Repository's built-in fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), configure another upstream proxy with the following details:
    * **Name**: `python-public`
    * **Priority**: `3`
    * **Upstream URL**: `https://pypi.org/`
    * **Mode**: `Cache and Proxy`
1. Select **Create Upstream Proxy**.

### Build tool access

Refer to the page on [build tool configuration for Chainguard Libraries for
Python](/chainguard/libraries/python/build-configuration/#cloudsmith) for
information on accessing credentials and setting up build tools.

<a name="gar"></a>

## Google Artifact Registry

[Google Artifact Registry](https://cloud.google.com/artifact-registry) supports
the Python format for hosting artifacts in **Standard** repositories and proxying
artifacts from public repositories in **Remote** repositories. Use **Virtual**
repositories to combine them for consumption with `pip` and other build tools.
Use the [Python package documentation for Google Artifact
Registry](https://cloud.google.com/artifact-registry/docs/python) as the starting
point for more details.

The recommended approach is to rely on Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
configuring a single remote repository pointed at `https://libraries.cgr.dev/python/`
rather than adding a separate public PyPI remote. Refer to [Manually managing
fallback](#manually-managing-fallback) if you need to control fallback ordering
yourself.

### Initial configuration

Use the following steps to add the Chainguard Libraries for Python repository
as a remote repository and expose it through a virtual repository.

1. Log in to the Google Cloud console as a user with administrator privileges.
1. Navigate to your project and find the **Artifact Registry** with the search.
1. Activate Artifact Registry if necessary.
1. Navigate to your project and find the **Secret Manager** with the search.
1. Activate **Secret Manager** if necessary.

Before configuring the repositories, you must create a secret with the [password
value as retrieved with chainctl](/chainguard/libraries/introduction/access/):

1. Navigate to the **Secret Manager**
1. Click **Create secret**.
1. Set the **Name** to `chainguard-libraries-python`.
1. Use the **Password** from chainctl output to set the **Secret value**.
1. Click **Create secret**.

Navigate to Artifact Registry and select **Repositories** in the left hand
navigation under the **Artifact Registry** label to configure a remote
repository for Chainguard Libraries for Python:

1. Click **+Create a Repository**.
1. Configure the repository:
    1. **Name**: `python-chainguard`
    1. **Format**: `Python`
    1. **Mode**: `Remote`
    1. **Remote repository source**: `Custom`. Set the URL for the Custom repository to `https://libraries.cgr.dev/python/`.
    1. **Remote repository authentication mode**: Select `Authenticated`.
    1. Set **Username for the upstream repository** to the [value as retrieved
   with chainctl](/chainguard/libraries/introduction/access/).
    1. Select the *chainguard-libraries-python* secret in the list for the **Secret** input.
    1. Choose the a **Region** for your development in **Location type**.
1. Click **Create**.
1. If you want to use the separate repository with [remediated Python
libraries](/chainguard/libraries/python/overview/#cve-remediation) repeat the
preceding steps with the name `python-chainguard-remediated`, the same
authentication details, and the URL
`https://libraries.cgr.dev/python-remediated/`.

If you are manually managing fallback rather than using the [Chainguard Repository's built-in fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), configure an additional remote repository for the public PyPI.

Combine the `python-chainguard` repository, and optionally the `python-chainguard-remediated` repository, into a new virtual repository:

1. Click **+** to add another repository.
1. Set the **Name** to `python-all`.
1. Set the **Format** to `Python`.
1. Set the **Mode** to `Virtual`.
1. Click **Add upstream repository** in **Virtual upstream repositories**.
1. Click **Browse**, then locate and select the `python-chainguard`
   repository as **Repository 1** and set the **Policy name 1** to
   `python-chainguard`.
1. Choose a **Region** for your development in **Location type**.
1. Click **Create**.

If you are manually managing fallback rather than using the recommended
[upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
add the public PyPI index as a second remote repository (`python-public`) and
give the `python-chainguard` policy a higher priority than `python-public`.

<a id="artifactory"></a>

## JFrog Artifactory

[JFrog Artifactory](https://jfrog.com/artifactory/) supports PyPI repositories
for proxying and virtual repositories to combine multiple sources into a single
repository. The following instructions are based on the [PyPI Repository
documentation for
Artifactory](https://docs.jfrog.com/artifactory/docs/pypi-repositories).

If you follow the recommended approach to rely on Chainguard Repository's
[upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), disable or remove any existing Artifactory remote repository
that points at the public PyPI index, and remove it from the virtual repository your
builds resolve against. A remote pointing directly at the public upstream bypasses
those protections. Since Artifactory resolves through the virtual repository in
order, a misconfiguration can result in Artifactory serving an unprotected
package.

### Initial configuration

Use the following steps to add Chainguard Libraries for Python as a remote repository:

1. Log in as a user with administrator privileges.
1. Click **Administration** in the top navigation bar.
1. Select **Repositories** in the left hand navigation.

Configure a remote repository for the Chainguard Libraries for Python index:

1. Select **Create a Repository** and choose the **Remote** option.
1. For **Package type**, select `PyPI`.
1. Set the **Repository Key** to `python-chainguard`.
1. Set the **URL** to `https://libraries.cgr.dev/`.
    * Do not include `/python` in
   the URL. Python's [Simple Repository
   API](https://peps.python.org/pep-0503/) keeps the package index on its own
   path which goes in the **PyPI Settings** fields below, and the base
   URL also needs to cover the `/python-upstream/` paths for upstream fallback packages.
1. Set **User Name** and **Password / Access Token** to the [values as retrieved
   with chainctl](/chainguard/libraries/introduction/access/).
    * Note: The **Test** button is not a reliable indicator; to verify your setup, refer to the [validation steps](#validate-the-remote-repository) later on this page.
1. Set the **PyPI Settings - Registry URL** to
   `https://libraries.cgr.dev/`.
1. Set the **PyPI Settings - Registry Index Location URL Suffix** to `python/simple`.
1. Click the **Advanced** configuration tab, then configure the following settings:
    * In the **Network** section:
        * Confirm **Lenient Host Authentication** is unchecked, so that your credentials are not forwarded across the redirect.
        * Optionally check **Enable Cookie Management**. JFrog recommends this for remote repositories that involve redirects.
    * In the **Others** section:
        * Check **Bypass HEAD Requests**, so that Artifactory retrieves each package file with a GET request instead of probing with a HEAD request first.
        * Uncheck **Block Mismatching Mime Types**.
        * Check **Disable URL Normalization**, so that Artifactory does not rewrite the pre-signed redirect URL.
1. Click **Create Remote Repository**.
1. If you want to use the separate repository with [remediated Python
libraries](/chainguard/libraries/python/overview/#cve-remediation) repeat the
preceding steps with the name `python-chainguard-remediated`, the same
authentication details, and the following changes:
   * Set the **URL** to `https://libraries.cgr.dev/`. Do not include `/python-remediated`
   * Set the **PyPI Settings - Registry URL** to `https://libraries.cgr.dev/`.
   * Set the **PyPI Settings - Registry Index Location URL Suffix** to `python-remediated/simple`.

These settings are required because Chainguard Libraries stores artifacts in
Cloudflare R2. A package file download from `libraries.cgr.dev` returns a 302
redirect to a pre-signed URL on a different host, and the redirect response itself
is an HTML document. Without these settings, Artifactory may rewrite the
pre-signed URL, forward your credentials across the redirect, or cache the
redirect response in place of the wheel or source distribution. A cached redirect
response fails checksum verification at install time.

If you are manually managing fallback, rather than using the recommended [Chainguard Repository built-in fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls) approach, configure an additional remote repository for the public PyPI index.

Create a virtual repository to give your build tools a single access point:

1. Click **Create a Repository** and choose the **Virtual** option.
1. Select `PyPI` as the Package type.
1. Set the **Repository Key** to `python-all`.
1. In the **Repositories** section, add `python-chainguard`. If you are using the remediated index, also add `python-chainguard-remediated` and ensure it is first in the displayed list, so that remediated versions resolve first. Use the icon on the right of the repository name to drag and drop repositories into the desired position.
    * If you are manually managing fallback, add the `python-public` repository and ensure it is last in the list.
1. Select **Create Virtual Repository**.

At this point, you have a virtual repository set up in Artifactory that allows
you or others in your organization to access Chainguard Libraries for Python,
optionally including remediated versions, with your chosen tools.

### Validate the remote repository

After creating the `python-chainguard` remote repository, validate that Artifactory is successfully proxying through to Chainguard before proceeding. A misconfigured remote repository fails silently; if any remote pointing at the public PyPI index is still present, Artifactory resolves through it instead and the build succeeds with no visible error. This can result in pulling an unprotected package.

Common sources of misconfiguration include invalid or expired credentials, or an incorrect or incomplete repository URL. As noted in the configuration steps, the Artifactory **Test connection** button is not a reliable indicator; it fails for a correctly configured Chainguard repository, and it may pass for an incorrectly configured one. Use the following steps instead to verify that fetching an artifact through Artifactory produces the same checksum as fetching it directly from `libraries.cgr.dev`.

1. Find the direct URL for a specific package wheel from the Chainguard index. This example uses `urllib3`. You can substitute any artifact you know to be available.

```bash
curl -sSf \
  -u "${CHAINGUARD_PYTHON_IDENTITY_ID}:${CHAINGUARD_PYTHON_TOKEN}" \
  https://libraries.cgr.dev/python/simple/urllib3/ \
  | grep -o 'https://[^"]*\.whl' | head -1
```

1. Fetch a package file directly from `libraries.cgr.dev` and compute its checksum:

```bash
curl -sSf -L \
  -u "${CHAINGUARD_PYTHON_IDENTITY_ID}:${CHAINGUARD_PYTHON_TOKEN}" \
  <url-from-step-1> \
  | sha256sum
```

1. Fetch the same file through the Artifactory remote repository and compute its checksum:

```bash
curl -sSfL \
  -u "${ARTIFACTORY_USERNAME}:${ARTIFACTORY_TOKEN}" \
  "https://<artifactory-host>/artifactory/<python-remote-repository>/${path-to-wheel}" \
  | sha256sum
```

Replace `artifactory-host` with your Artifactory instance hostname and replace `python-remote-repository` with your remote repository name. Replace `path-to-wheel` with the path component of the URL from step 1 (for example: `/files/15f7d141c3b76b85/37e321caa85a8f41/urllib3/urllib3-1.26.9-py2.py3-none-any.whl`)

The checksums returned by the commands must match.

If the checksum from the Artifactory remote repository differs from the direct fetch, or if the Artifactory fetch fails entirely, review the following before proceeding:

* URL: The remote repository URL must be set to `https://libraries.cgr.dev/`.
* Credentials: You may need to regenerate your pull token with `chainctl auth pull-token --repository=python` and update the Artifactory repository credentials. Expired tokens fail silently.
* Advanced Configuration: Ensure all recommended Advanced settings from the [initial configuration steps](#initial-configuration-2) have been applied.
* Corrupted cached artifacts: if the repository previously ran without these settings, Artifactory may still be serving a cached redirect response. In Artifactory, browse the `python-chainguard` remote cache and locate the affected files. Right-click each artifact, select **Delete content**, then re-run your install.

Do not proceed to virtual repository setup or build configuration until the checksums match.

### Build tool access

Refer to the page on [build tool configuration for Chainguard Libraries for
Python](/chainguard/libraries/python/build-configuration/#artifactory) for
information on accessing credentials and setting up build tools.

<a id="nexus"></a>

## Sonatype Nexus Repository

[Sonatype Nexus
Repository](https://www.sonatype.com/products/sonatype-nexus-repository) allows
for merging multiple remote repositories as a repository group. The below
instructions are based on the [Nexus documentation for
PyPI](https://help.sonatype.com/en/pypi-repositories.html)

The recommended approach is to rely on Chainguard Repository's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls),
configuring a single proxy repository pointed at `https://libraries.cgr.dev/python/`
rather than adding a separate public PyPI proxy. Refer to [Manually managing
fallback](#manually-managing-fallback) if you need to control fallback ordering
yourself.

### Initial configuration

The following steps create a remote repository for Chainguard Libraries for
Python and a repository group that exposes it to your build tools.

First, log in to Sonatype Nexus as a user with administrator privileges and
access the **Server administration** and configuration section within the gear
icon in the top navigation bar.

Next, configure a remote repository for Chainguard Libraries for Python repository:

1. Select **Repository - Repositories** in the left hand navigation.
1. Select **Create repository**.
1. Select the **PyPI (proxy)** recipe.
1. Provide a new name, such as `python-chainguard`.
1. In the **Proxy - Remote storage**field, add the following URL:
   `https://libraries.cgr.dev/python/`.
1. In **HTTP - Authentication**, set the **Authentication type** to *username*
   and enter the the [username and password values as retrieved with
   chainctl](/chainguard/libraries/introduction/access/).
1. Select **Create repository**.

If you want to use the separate repository with [remediated Python
libraries](/chainguard/libraries/python/overview/#cve-remediation) repeat the
preceding steps with the name `python-chainguard-remediated`, the same
authentication details, and the URL
`https://libraries.cgr.dev/python-remediated/`.

If you are manually managing fallback rather than using the [Chainguard Repository's built-in fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls), configure an additional remote repository for the public PyPI.

Finally, create a new repository group and add the repositories:

1. Select **Repository - Repositories** in the left hand navigation.
1. Select **Create repository**.
1. Select the **PyPI (group)** recipe.
1. Provide a new name, such as `python-all`.
1. In the section **Group - Member repositories**, move the new repositories
   `python-chainguard-remediated` and `python-chainguard` to the right. Move the  `python-chainguard-remediated` repository to the top of the list.

### Build tool access

Refer to the page on [build tool configuration for Chainguard Libraries for
Python](/chainguard/libraries/python/build-configuration/#nexus) for information on
accessing credentials and setting up build tools.

## Troubleshooting and FAQ

### Sonatype build failures and 404 errors for uv and pip requests ending in `.whl.metadata`

Builds fail intermittently when Sonatype Nexus is configured as a PyPI proxy in front of `libraries.cgr.dev`, even though authentication, entitlements, and network connectivity all check out. The failures look like missing packages, but the packages themselves are present and downloadable. The Nexus outbound request logs show 404 responses specifically for URLs ending in `.whl.metadata`, while the same URL without the `.metadata` suffix succeeds.

Modern Python installers (pip 23.1+, uv) implement [PEP 658](https://peps.python.org/pep-0658/) and request a small per-package metadata file by appending `.metadata` to the wheel's download URL, ahead of downloading the wheel itself. When Nexus is serving a stale cached index page, it can point clients at a metadata URL format that `libraries.cgr.dev` no longer honors. Chainguard's upstream returns 400 for that request, which Nexus in turn surfaces to the client as a 404. The result presents as a missing package, when the underlying issue is a stale cached index.

#### Fix: Recreate the proxy repository

To fix this, delete and recreate the Chainguard PyPI proxy repository in Nexus. This clears all cached index pages and metadata assets for that repository, forcing Nexus to pull fresh copies on the next request.

Alternatively, you could add a Nexus routing rule to block metadata requests outright. Clients fall back to standard resolution automatically when the metadata request fails cleanly, without surfacing an error:

1. In Nexus, go to **Administration** > **Routing Rules** and create a new rule.
1. Set the Mode to `Block`.
1. Set the matcher to `.*\.metadata$`.
1. Assign the rule to your Chainguard PyPI proxy repository.
1. Remove the routing rule once you've recreated the proxy repository, so clients can resume using PEP 658 metadata requests.

---

### Migrating a Python project to Chainguard Libraries
_Path: chainguard/libraries/python/migration.md_

Chainguard Libraries for Python provides a curated index of PyPI packages rebuilt from source and verified against Chainguard's build provenance. Because Chainguard Libraries uses the standard pip simple-index protocol, switching an existing project requires only an index configuration change — no changes to your application code or dependency declarations.

This guide walks through migrating an existing Python project to Chainguard Libraries, covering the two most common setups:

* **Direct access**: Your build tool connects directly to `libraries.cgr.dev`. This option is faster for initial evaluation and smaller-scale setups.  
* **Repository manager**: Your build tool connects to a repository manager (such as JFrog Artifactory or Sonatype Nexus), which proxies requests to Chainguard Libraries. This option is recommended for teams and organizations.

To follow along with a ready-made project instead of your own, use the [Chainguard Libraries for Python demo repository](https://github.com/chainguard-demo/chainguard-libraries-python). It provides example projects for pip, uv, and Poetry, each with a `demo.sh` script that configures access and installs sample packages.

For a reference of the configuration options for each supported build tool, check out [Configure Python build tools](/chainguard/libraries/python/build-configuration/).

## Prerequisites

Before you begin, you need:

* An existing, working Python project with a `requirements.txt`, `poetry.lock`, `uv.lock`, `pdm.lock`, `Pipfile.lock`, or `pylock.toml`
* [chainctl installed and authenticated](/platform/chainctl-usage/how-to-install-chainctl/)
* An [entitlement to Chainguard Libraries](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/) for Python.

If you do not have an entitlement to Chainguard Libraries for Python yet, run the following command to create an entitlement and enable upstream fallback:

```shell
chainctl libraries entitlements create --ecosystems=PYTHON --policy=CHAINGUARD_AND_UPSTREAM
```

It can take up to 30 minutes for fallback policy changes to take effect.

### Authentication prerequisites

For authentication, you need a pull token or the Python keyring provider.

{{< tabs label="Authentication method" >}}

{{% tab title="Pull token" %}}

If you plan to use a repository manager, or a non-interactive environment such as CI/CD, you will need a pull token. You must have the `owner` role or have the `libraries.python.pull_token_creator` permission to create one.

```shell
chainctl auth pull-token create --repository=python --name=my-python-token --ttl=720h
```

To export environment variables directly:

```shell
eval $(chainctl auth pull-token --output env --repository=python --name=my-python-token)
```

Learn more about creating and managing pull tokens in the [Libraries access documentation](/chainguard/libraries/introduction/access/#creating-pull-tokens-for-libraries).

{{% /tab %}}

{{% tab title="Python keyring" %}}

The keyring leverages `chainctl` to fetch temporary credentials whenever your environment requests packages from Chainguard. Supported environments include local development and CI/CD platforms that can use assumable identities. The keyring provider requires pip 23.1 or later.

Learn how to install this package in the [Chainguard Libraries access documentation](/chainguard/libraries/introduction/access/#python-keyring-provider).

Note that `.netrc` takes precedence over the keyring. Verify that you do not have an existing registry entry in `.netrc` for Chainguard Libraries:

```shell
grep -A2 "libraries.cgr.dev" ~/.netrc
```

Remove or correct any stale entry before proceeding.

{{% /tab %}}

{{< /tabs >}}

> **Note: Do not commit credentials to version control.** Store tokens as environment variables or CI secrets, not as literal values in `pip.conf`, `.netrc`, or any file that might be checked into a repository.

## Step 1: Configure authentication and registry

How you configure the index depends on your environment. Follow the instructions that match your setup.

The `https://libraries.cgr.dev/python/` endpoint is also the [Chainguard Repository](/chainguard/chainguard-repository/overview/) endpoint for Python. By default, it serves only Chainguard-built artifacts. When upstream fallback is enabled for your organization, the same endpoint can also serve requested versions from PyPI under Chainguard security controls.

### Direct access

#### Configure authentication

First, configure authentication using a pull token or the Python keyring provider.

Setting pull token credentials in `.netrc` is a common approach for individual work stations. Setting authentication in `pip.conf` is preferred for CI/CD, where you need credentials isolated per project or per pipeline rather than a single shared home-directory file.

{{< tabs label="Direct access authentication method" >}}

{{% tab title="Pull token in .netrc" %}}

> **Note**: `.netrc` only supports one set of credentials per hostname. Since all Chainguard Libraries are served from `libraries.cgr.dev`, configuring `.netrc` for Python will override credentials for any other ecosystem.

First, check for an existing registry entry in `.netrc`:

```shell
grep -A2 "libraries.cgr.dev" ~/.netrc
```

Remove or correct any stale entry before proceeding.

Then, configure your [pull token credentials](#authentication-prerequisites) in `.netrc`:

```shell
cat >> ~/.netrc << EOF
machine libraries.cgr.dev
login ${CHAINGUARD_PYTHON_IDENTITY_ID}
password ${CHAINGUARD_PYTHON_TOKEN}
EOF
chmod 600 ~/.netrc
```

{{% /tab %}}

{{% tab title="Pull token in pip.conf" %}}

Unlike `.netrc`, `pip.conf` can be scoped per project or per pipeline rather than shared globally across a whole workstation.

First, check whether an index or credentials are already configured
elsewhere, since a global `pip.conf` or environment variable can silently
override a project-scoped one:

```shell
pip config list -v
env | grep -i pip
```

Then create a project-scoped config file rather than editing the global
`~/.pip/pip.conf`. This example sets the remediated repository first, with
the standard repository as a fallback, and embeds [pull token credentials](#authentication-prerequisites) directly in
each URL:

```shell
mkdir -p .pip
cat > .pip/pip.conf << EOF
[global]
index-url = https://${CHAINGUARD_PYTHON_IDENTITY_ID}:${CHAINGUARD_PYTHON_TOKEN}@libraries.cgr.dev/python-remediated/simple/
extra-index-url = https://${CHAINGUARD_PYTHON_IDENTITY_ID}:${CHAINGUARD_PYTHON_TOKEN}@libraries.cgr.dev/python/simple/
EOF
```

Point pip at it with the `PIP_CONFIG_FILE` environment variable, scoped to
your current shell or CI job:

```shell
export PIP_CONFIG_FILE="$(pwd)/.pip/pip.conf"
```

This method sets both the index and its credentials in one step.

> **Note**: Do not commit credentials to version control. Generate `.pip/pip.conf`
> at build time from CI secrets, as shown in this section, rather than committing a
> version with a literal token embedded in the URL. Add `.pip/` to
> `.gitignore` if you create it locally with real credentials for testing.

{{% /tab %}}

{{% tab title="Python keyring" %}}

The `keyrings-chainguard-libraries` package supplies short-lived credentials automatically via `chainctl`, avoiding static tokens on your local workstation.

Follow the [instructions to install the keyring package](/chainguard/libraries/introduction/access/#python-keyring-provider).

> **Note**: After switching to Chainguard, you can [reinstall the keyring package](/chainguard/libraries/introduction/access/#python-keyring-provider) to use the Chainguard-built version.

{{% /tab %}}

{{< /tabs >}}

#### Point your build tool at Chainguard

Next, point your build tool at the Chainguard index.

Note that Chainguard publishes both standard and [remediated Python indexes](/chainguard/libraries/policies-and-security/cve-remediation/). Remediated versions use a `+cgr.N` local-version suffix, and Python package managers treat those as compatible higher-precedence replacements for the base version. In addition, CUDA-enabled Python libraries use separate CUDA-specific indexes such as `https://libraries.cgr.dev/cu128/simple/`, and they are not dependency-complete for NVIDIA toolkit components.  

{{< tabs label="Package manager for build tool configuration" >}}

{{% tab title="pip" %}}

If you configured authentication via `.netrc` or the Python keyring provider, run the following commands to set the remediated repository first, then the simple repository:

```bash
pip config set global.index-url https://libraries.cgr.dev/python-remediated/simple/
pip config set global.extra-index-url https://libraries.cgr.dev/python/simple/
```

If you configured authentication via pull token credentials in `pip.conf`, this step
is already done; the `index-url` you set in `.pip/pip.conf` already points
at Chainguard with credentials embedded.

{{% /tab %}}

{{% tab title="uv" %}}

Edit the `pyproject.toml` for project-level or the `~/.config/uv/uv.toml` to make global-level changes, setting the remediated repository first:

```toml
[tool.uv]
index-strategy = "unsafe-best-match"

[[tool.uv.index]]
name = "cgr-pr"
url = "https://libraries.cgr.dev/python-remediated/simple"
authenticate = "always"

[[tool.uv.index]]
name = "cgr-p"
url = "https://libraries.cgr.dev/python/simple"
authenticate = "always"
```

When using the remediated index, set `index-strategy = "unsafe-best-match"` so uv can resolve dependencies that fall back from remediated to non-remediated packages.

If you are using the Python keyring, enable support for it in `pyproject.toml`:

```toml
[tool.uv]
keyring-provider = "subprocess"
```

{{% /tab %}}

{{% tab title="Poetry" %}}

Configure the Chainguard sources, setting the remediated index as the primary:

```shell
poetry source add --priority=primary chainguard-remediated https://libraries.cgr.dev/python-remediated/simple/
poetry source add chainguard https://libraries.cgr.dev/python/simple/
```

{{% /tab %}}

{{< /tabs >}}

### Repository manager

If your organization uses a repository manager, configure Chainguard Libraries as an upstream source in that proxy first. Follow the [global configuration documentation](/chainguard/libraries/python/global-configuration/) for your repository manager.

Once configured, point your build tool at your repository manager URL instead of `libraries.cgr.dev` directly. In this setup, the credentials are your repository manager credentials — not a Chainguard pull token.

{{< tabs label="Package manager for repository manager setup" >}}

{{% tab title="pip" %}}

```shell
pip config set global.index-url https://<your-repo-manager-url>/repository/python-all/simple/
```

{{% /tab %}}

{{% tab title="uv" %}}

Configure `~/.config/uv/uv.toml` for a global default across all projects:

```bash
[[tool.uv.index]]
   name = "chainguard"
   url = "https://<your-repo-manager-url>/repository/python-all/simple/"
   default = true
```

For a per-project configuration, configure the `pyproject.toml`:

```pyproject.toml
[[tool.uv.index]]
name = "python-all"
url = "https://repo.example.com/repository/python-all/simple/"
```

{{% /tab %}}

{{% tab title="Poetry" %}}

Run the following command:

```shell
poetry config http-basic.python-all REPO_MANAGER_USERNAME REPO_MANAGER_PASSWORD
poetry source add python-all https://repo.example.com/repository/python-all/simple/
```

{{% /tab %}}

{{< /tabs >}}

Example URLs by repository manager:

| Repository manager | URL pattern |
| ----- | ----- |
| JFrog Artifactory | `https://example.jfrog.io/artifactory/api/pypi/python-all/simple/` |
| Sonatype Nexus | `https://repo.example.com:8443/repository/python-all/simple/` |
| Google Artifact Registry | `https://<location>-python.pkg.dev/<project>/python-all/simple/` |
| Cloudsmith | `https://dl.cloudsmith.io/.../<org>/python-all/python/simple/` |

For authentication details specific to your repository manager, refer to the [global configuration documentation](/chainguard/libraries/python/global-configuration/).

## Step 2: Update your lockfile

Your existing lockfile or hash-pinned `requirements.txt` contains checksums generated against packages downloaded from PyPI or through your repository manager. Because Chainguard rebuilds packages from verified source as well as providing security controls for upstream artifacts, checksums differ even for identical version numbers. If your file uses `--hash` entries or `--require-hashes`, installation will fail with a hash mismatch after switching to Chainguard until these are updated.

You can update your lockfile in one of two ways. Update the checksums in place to keep your existing pinned versions, or regenerate the lockfile if you also want to refresh your dependency versions.

{{< tabs label="Lockfile update approach" >}}

{{% tab title="Update in place" %}}

Use `chainctl libraries update-hashes` to rewrite only the integrity hashes in your existing lockfile or requirements file to match Chainguard's artifacts, without re-resolving your dependency graph. Supported formats include `requirements.txt`, `poetry.lock`, `uv.lock`, `pdm.lock`, `Pipfile.lock`, and `pylock.toml`.

Run the following command to auto-detect and update the lockfile in the current project:

```bash
chainctl libraries update-hashes
```

> **Note**: Running `chainctl libraries update-hashes` requires the `libraries.python.pull` permission or the Owner role.

Or specify the lockfile when running the command. For example:

```bash
chainctl libraries update-hashes requirements.txt
```

When using a repo manager, run a command similar to the following:

```bash
chainctl libraries update-hashes
  --registry-url https://repo.example.com/repository/python-all/
  --token "$REPO_TOKEN"
```

By default, Chainguard hashes are appended alongside your existing hashes rather than replacing them. If your installer fails on a dual-hash entry, use the `--replace` flag.

{{% /tab %}}

{{% tab title="Regenerate lockfile" %}}

Regenerating the lockfile is another valid approach, and many teams use the migration as an opportunity to update dependencies at the same time. Before you regenerate, consider the following:

* Pinning versions is a security best practice. Regenerating re-resolves your dependencies and can change versions, so you lose your existing pins unless you re-pin afterward.
* Resolvers pick the newest version that satisfies each constraint. Whether Chainguard has that version available depends on the [cooldown
period you've configured](/chainguard/libraries/introduction/overview/#cooldown-period): a release still inside your cooldown window isn't available yet and returns a 404 error.

To regenerate — for example, to intentionally refresh your dependency versions — use the following commands.

pip:

```bash
pip-compile --generate-hashes --index-url https://libraries.cgr.dev/python/simple/ requirements.in
```

uv:

```bash
rm -f uv.lock
uv sync
```

Poetry 1.x:

```bash
poetry lock --no-update
```

Poetry 2.x:

```bash
poetry lock
```

{{% /tab %}}

{{< /tabs >}}

## Step 3: Clear caches

Reinstalling after switching indexes can silently reuse a cached artifact
from your previous index, with no error indicating this happened. To avoid this, clear caches.

{{< tabs label="Package manager for clearing caches" >}}

{{% tab title="pip" %}}

```shell
pip cache purge
```

{{% /tab %}}

{{% tab title="uv" %}}

```bash
uv cache clean
```

{{% /tab %}}

{{% tab title="Poetry" %}}

```bash
poetry cache clear --all pypi
```

{{% /tab %}}

{{< /tabs >}}

Also invalidate cached packages in any repository manager that previously proxied PyPI, and rebuild containers without cached layers if your Dockerfile installs dependencies during build:

```shell
docker build --no-cache .
```

## Step 4: Reinstall dependencies

Reinstall dependencies and confirm that the lockfile reflects Chainguard as the source.

{{< tabs label="Package manager for reinstalling dependencies" >}}

{{% tab title="pip" %}}

```shell
pip install --force-reinstall --no-cache-dir -r requirements.txt
```

{{% /tab %}}

{{% tab title="uv" %}}

```bash
uv sync --reinstall
```

{{% /tab %}}

{{% tab title="Poetry" %}}

```bash
poetry env remove --all
poetry install
```

{{% /tab %}}

{{< /tabs >}}

## Step 5: Verify your libraries

After reinstalling, you can use `chainctl` to verify which dependencies are built by Chainguard. When upstream fallback is enabled, [libraries that aren't built by Chainguard](#packages-not-available-in-chainguard-libraries) are subject to Chainguard's security controls.

{{< tabs label="Package manager for verifying libraries" >}}

{{% tab title="pip and uv" %}}

```shell
chainctl libraries verify --detailed ./.venv/
```

{{% /tab %}}

{{% tab title="Poetry" %}}

Poetry's `virtualenv` location depends on your configuration. If `virtualenvs.in-project` is enabled, it's `.venv` in the project directory. Otherwise, find it with:

```bash
poetry env info --path
```

Then:

```bash
chainctl libraries verify --detailed $(poetry env info --path)
```

{{% /tab %}}

{{< /tabs >}}

> **Note**: Running `chainctl libraries verify` requires the `libraries.python.pull` permission or the Owner role.

A successful result shows what percentage of your project's dependencies were built by Chainguard.

For full details on verification options and output, check out [Verification: Analyze a Python wheel file](/chainguard/libraries/policies-and-security/verification/#analyze-a-python-wheel-file).

## Step 6: Commit and roll out

Commit the updated lockfile and any non-sensitive configuration changes. Apply the same index, cache, and hash-update steps to other developer workstations and build servers as you migrate them, including CI/CD platforms and any infrastructure that builds the application or installs dependencies.

For organization-wide rollout using a repository manager, refer to the [global configuration documentation](/chainguard/libraries/python/global-configuration/).

## Packages not available in Chainguard Libraries

Chainguard Libraries covers a large and growing collection of PyPI packages, but not every package or version is available. If a package is missing, your install will fail with a 404 unless you have configured [upstream fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

With upstream fallback enabled, packages not yet available from Chainguard are proxied from PyPI, subject to Chainguard's security controls. Confirm your current policy with:

```shell
chainctl libraries entitlements list
```

For repository manager setups, Chainguard recommends using the configurable fallback rather than configuring a separate public registry fallback in your repository manager, to preserve Chainguard’s security controls.

Learn more about upstream fallback configurations in the [Libraries overview](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls).

## Troubleshooting

### "403 Forbidden" from the index despite a working keyring

Check for an old or incorrectly scoped `.netrc` entry for `libraries.cgr.dev`, which silently takes priority over keyring authentication. Run with full verbosity to confirm the credential source:

```shell
pip install -vvv <package> 2>&1 | grep -B2 -A2 "credentials\|40[13]"
```

### A pinned dependency shows "not verified" after running `chainctl libraries verify`

Check your install output for a local wheel build (`Building wheel for <package>`), which indicates Chainguard has only a source distribution for that specific pinned version.

## Next steps

* To apply this configuration across your whole organization using a repository manager, refer to the [global configuration](/chainguard/libraries/python/global-configuration/) documentation.  
* To verify downloaded packages were built by Chainguard, refer to the [verification](/chainguard/libraries/policies-and-security/verification/) documentation.  
* For full per-tool configuration reference, refer to the [build configuration](/chainguard/libraries/python/build-configuration/) documentation.
* To keep pinned versions stable when Chainguard publishes new builds, refer to the [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) documentation.

---

### Chainguard Libraries for Python overview
_Path: chainguard/libraries/python/overview.md_

Chainguard Libraries for Python provides enhanced security for the vast Python
ecosystem by rebuilding PyPI packages with comprehensive supply chain protection
and automated patching. With over 600,000 packages on the [Python Package Index
(PyPI)](https://pypi.org/) serving application development, machine learning,
and data science needs, Chainguard addresses the critical security challenges of
depending on packages from untrusted sources by rebuilding them within the
controlled Chainguard Factory environment. In addition, Chainguard eliminates
security risk by remediating High and Critical vulnerabilities across older
package versions where upstream maintainers are not able to prioritize fixes.

Chainguard Libraries for Python enables access to a growing collection of Python
packages rebuilt from source. New releases of common libraries or artifacts
requested by customers are added to the index by an automated system. Any
request for a library or library version missing in Chainguard Libraries
automatically triggers a process to provision the artifacts from relevant
sources if available. In combination with third-party software repository
managers, you can use Chainguard Libraries for Python as a secure source of
truth for your development process.

## Technical details

Most organizations consume Chainguard Libraries for Python through a repository
manager such as Cloudsmith, JFrog Artifactory, or Sonatype Nexus Repository. For
full details, refer to our [Global Configuration
documentation](/chainguard/libraries/python/global-configuration/). The rest of
this article provides details of the underlying implementation of Chainguard
Libraries for Python and how to access individual libraries manually.

The Chainguard Libraries for Python indexes use the PyPI repository format and
only include release artifacts of the libraries built by Chainguard from source.

URLs for the repositories:

```
https://libraries.cgr.dev/python/
https://libraries.cgr.dev/python-remediated/
https://libraries.cgr.dev/cu[**version**]/simple/
```

The first index provides all Python libraries that Chainguard builds from
source, without remediated versions. The second index provides remediated
libraries with high and critical CVE fixes applied to older versions. The
separate indexes provide you the option to make remediated versions available
for your development or to opt out of using these versions completely and
continue to use non-remediated versions only. The third index refers to
CUDA version-specific indexes which include libraries with
GPU-accelerated Python wheels. You can find more details in the [CUDA
Enabled Libraries](#cuda-enabled-libraries) section.

The Chainguard Libraries for Python repository does not include all packages
from PyPI. Chainguard Libraries for Python are rebuilt from source and require
that source be available. Therefore, packages that do not provide a valid source
URL cannot be rebuilt within the Chainguard Factory.

Chainguard Libraries for Python can be consumed through [Chainguard
Repository](/chainguard/libraries/chainguard-repository/), which provides a
single endpoint for Python package retrieval and supports protected upstream
fallback when configured for your organization. This allows builds to prefer
Chainguard-built packages first while still covering packages or wheel files
that Chainguard does not currently serve directly. Configure this endpoint
[globally through a repository
manager](/chainguard/libraries/python/global-configuration/) for centralized
access control across your organization, or use it [directly from individual
build tools](/chainguard/libraries/python/build-configuration/).

> Note: The Chainguard Repository endpoint does not include remediated packages
> with `+cgr` version suffixes. To use those versions, you must also configure the separate
> `python-remediated` index.

Follow the steps detailed in [Manual access](#manual) to browse the Python index
and find available packages, package versions, source distribution (sdist), and
Python wheel files for standard and remediated package version.

## CVE remediation

Chainguard Libraries for Python includes the [CVE
Remediation](/chainguard/libraries/policies-and-security/cve-remediation/) feature. Remediated
libraries include an appended local version identifier of `+cgr.N`. Python
package management tools interpret the `+cgr.N` suffix as a local version that
takes precedence over versions without the version suffix during dependency
resolution.

For example, the `flask` library has a fix for CVE-2023-30861 available in the
upstream codebase. Upon customer request for a specific version, the fix is
backported to the flask versions `1.1.2` and `2.0.0` and made available in new
versions `1.1.2+cgr.1` and `2.0.0+cgr.1`. Python package management tools
consider these local versions, such as `1.1.2+cgr.1` and `2.0.0+cgr.1`, as
newer, compatible replacements automatically.

In some cases, multiple CVEs may be remediated in a specific library version.
For example, `aiohttp` has fixes for both CVE-2024-23334 and CVE-2024-30251 in
the version `3.9.1+cgr.2`.

## CUDA-enabled libraries

Chainguard Libraries for Python includes libraries optimized for specific CUDA
versions. These libraries are GPU‑accelerated Python wheels that are built
and tested against specific NVIDIA CUDA versions. An example is `torch` built
for CUDA 12.8, available via the `https://libraries.cgr.dev/cu128/simple/` index.
These libraries are published to CUDA‑specific indexes to ensure your Python build
tools resolve the correct wheel versions, mirroring how other CUDA-optimized
ecosystems are commonly distributed.

Chainguard Libraries for Python includes the following repositories for
GPU‑accelerated libraries, built for specific CUDA versions:

```
https://libraries.cgr.dev/cu126/simple/
https://libraries.cgr.dev/cu128/simple/
https://libraries.cgr.dev/cu129/simple/
```

Many Python package managers and repository managers support configuring
multiple package indexes. You can generally treat Chainguard’s CUDA indexes
the same way you use other CUDA-specific indexes (for example, the PyTorch
CUDA wheels at https://download.pytorch.org/whl/cu128).

If you use a repository manager as described in the [Global Configuration
documentation](/chainguard/libraries/python/global-configuration/), configure
a remote repository that points at the appropriate Chainguard CUDA index, and
use it in place of any CUDA-specific index you previously proxied.

If you choose to pull directly without an artifact manager, you can similarly
replace the CUDA index you previously used with the corresponding
Chainguard CUDA index, with your existing package management tools like
`pip`, `uv`, or `poetry`.

Note that the CUDA-enabled libraries in these repositories are not dependency
complete, since they do not include packages from the NVIDIA CUDA toolkit. You
must configure your package manager to pull NVIDIA components from an
upstream source such as NVIDIA's index at https://pypi.nvidia.com, or from PyPI
where NVIDIA publishes them directly.

## Python version support

Python 3.9 reached upstream EOL on October 31, 2025. Chainguard Libraries' extended support window for Python 3.9 ends on May 15, 2026. After this date, no new Python 3.9 packages will be built, and existing Python 3.9 packages will no longer receive security updates.

To continue receiving up-to-date, secure packages from Chainguard Libraries, we strongly recommend migrating to a supported Python version. Currently supported versions are Python 3.10 and later.

Learn about Chainguard's library version support in the [Libraries overview](/chainguard/libraries/introduction/overview/#library-version-support).

## Runtime and build requirements

The runtime requirements for Python artifacts available from Chainguard
Libraries for Python are identical to the requirements of the original upstream
project. For example, if a Python wheel retrieved from PyPI requires Python 3.10
or higher, the same Python 3.10 runtime requirement applies to the binary
artifact from Chainguard Libraries for Python.

Chainguard distributes all packages as Python wheels, following the [Python
binary distribution
format](https://packaging.python.org/en/latest/specifications/binary-distribution-format/)
and are typically accompanied by a source distribution tarball. For example, for
the package `flask` version `3.1.2` the files are the
`flask-3.1.2-py3-none-any.whl` wheel and the `flask-3.1.2.tar.gz` source
distribution tarball. Note that the wheel filename includes the indication
`none-any` that signals the platform independence of the wheel.

Some Python libraries include Python extensions that depend on native binaries
supplied by the operating system or included in the distribution archive. The
following list displays all available files for the `pyyaml` package version
`6.0.3`. This list includes numerous wheel files for different environments and
the source distribution tarball:

```
pyyaml-6.0.3-cp310-cp310-manylinux_2_28_aarch64.whl
pyyaml-6.0.3-cp310-cp310-manylinux_2_28_x86_64.whl
pyyaml-6.0.3-cp310-cp310-manylinux_2_39_aarch64.whl
pyyaml-6.0.3-cp310-cp310-manylinux_2_39_x86_64.whl
pyyaml-6.0.3-cp311-cp311-manylinux_2_28_aarch64.whl
pyyaml-6.0.3-cp311-cp311-manylinux_2_28_x86_64.whl
pyyaml-6.0.3-cp311-cp311-manylinux_2_39_aarch64.whl
pyyaml-6.0.3-cp311-cp311-manylinux_2_39_x86_64.whl
pyyaml-6.0.3-cp312-cp312-manylinux_2_28_aarch64.whl
pyyaml-6.0.3-cp312-cp312-manylinux_2_28_x86_64.whl
pyyaml-6.0.3-cp312-cp312-manylinux_2_39_aarch64.whl
pyyaml-6.0.3-cp312-cp312-manylinux_2_39_x86_64.whl
pyyaml-6.0.3-cp313-cp313-manylinux_2_28_aarch64.whl
pyyaml-6.0.3-cp313-cp313-manylinux_2_28_x86_64.whl
pyyaml-6.0.3-cp313-cp313-manylinux_2_39_aarch64.whl
pyyaml-6.0.3-cp313-cp313-manylinux_2_39_x86_64.whl
pyyaml-6.0.3-cp39-cp39-manylinux_2_28_aarch64.whl
pyyaml-6.0.3-cp39-cp39-manylinux_2_28_x86_64.whl
pyyaml-6.0.3-cp39-cp39-manylinux_2_39_aarch64.whl
pyyaml-6.0.3-cp39-cp39-manylinux_2_39_x86_64.whl
pyyaml-6.0.3.tar.gz
```

The different file names use the following qualifiers to allow the build and
packaging tool to download the correct wheel file:

* The values `cp*` indicate CPython compatibility.
* The first value `cp*` value such as `cp39`, `cp310`, and others, indicates the
  compatibility with Python version `3.9`, `3.10`, and others.
* The second value `cp*` value such as `cp39`, `cp310`, and others, indicates
  the compatibility with the Python Application Binary Interface (ABI) version
  `3.9`, `3.10`, and others.
* The `manylinux` value indicates that the wheel is suitable for any modern
  Linux distribution, since no distribution specific requirements are in place.
* The `2_28` and `2_39` values indicate suitability for environments using
  `glibc 2.28` and higher or `glibc 2.39` and higher.
* The `aarch64` and `x86_64` values indicated the processor architecture
  requirement for ARM or x86.

As a result of the provided files for these libraries, the following
requirements apply:

* All Linux distributions must use `glibc 2.28` or higher, such as RHEL 8, Ubuntu
  20.04, or Amazon Linux 2023.
* On Windows and MacOS you must use a suitable Linux distribution with a
  container solution, such as
  [WSL2](https://learn.microsoft.com/en-us/windows/wsl/),
  [apple/container](https://apple.github.io/container/documentation/) or [Docker
  Desktop](https://docs.docker.com/desktop/).
* The runtime environment's processor architecture must be `x86_64` or
  `aarch64`.

### Behavior on Windows and macOS

As a result of the requirements detailed in the preceding section, the developer
experience on Windows and MacOS platforms is impacted. Chainguard only provides
packages including native binaries for Linux platforms. These are not suitable
for use on Windows or MacOS.

When using Chainguard Libraries for Python on these platforms, retrieval for
these libraries, and therefore application builds, fail. The suggested
deployment, detailed in [Technical details](#technical-details) and [Global
Configuration](/chainguard/libraries/python/global-configuration/), involves a
repository manager that uses PyPI as a fall back for such packages. With this
configuration, any build on Windows or MacOS continues to work and pulls the
package from PyPI, since it is not available from Chainguard. Any build on Linux,
however, uses a suitable package from Chainguard Libraries. When using CVE remediation,
this also means that remediated packages with native binaries are only used on
Linux.

<a id="manual"></a>

## Manual access

Use the URLs with your [username and password retrieved with
chainctl](/chainguard/libraries/introduction/access/) to access the Chainguard Libraries for
Python repository manually with a browser.

After successful login, you are redirected to the `simple` sub-context at
`https://libraries.cgr.dev/python/simple/` or
`https://libraries.cgr.dev/python-remediated/simple/` that allow you to inspect
the available packages. The top level contains an alphabetical list of packages:

```
2captcha-python
3d-converter
absql
ahrs
amqpstorm
annogesic
apiflask
apscheduler
...
```

A list of all wheels and tarballs for the versions of a specific package is
available in the context of the package. For example, the `apiflask` context at
`https://libraries.cgr.dev/python/simple/apiflask/` shows the following list:

```
Links for apiflask
apiflask-0.1.0-py3-none-any.whl
apiflask-0.1.0.tar.gz
apiflask-0.10.0-py3-none-any.whl
apiflask-0.10.0.tar.gz
apiflask-0.10.1-py3-none-any.whl
apiflask-0.10.1.tar.gz
apiflask-0.11.0-py3-none-any.whl
apiflask-0.11.0.tar.gz
apiflask-0.12.0-py3-none-any.whl
apiflask-0.12.0.tar.gz
...
```

Each package name is a link to the specific binary. The link includes long
unique identifiers and cannot be determined without browsing. The list uses
ascending order for the full name including the version.

Use the search functionality on [pypi.org](https://pypi.org/) to locate packages
of interest and then browse in the simple index to determine available versions
in Chainguard Libraries for Python.

Use `curl`, specifying the username and password retrieved with
[chainctl](/chainguard/libraries/introduction/access/), and use the URL of the file
to download and save the file with the original name:

With [.netrc authentication](/chainguard/libraries/introduction/access/#netrc):

```shell
curl -n -L -O https://libraries.cgr.dev/files/...
```

With [environment variables](/chainguard/libraries/introduction/access/#env):

```shell
curl -L --user "$CHAINGUARD_PYTHON_IDENTITY_ID:$CHAINGUARD_PYTHON_TOKEN" \
  -O https://libraries.cgr.dev/files/...
```

The option `-L` is required to follow redirects for the actual file locations.

## Hash verification when migrating to Chainguard Libraries

For a step-by-step walkthrough of moving an existing project to Chainguard Libraries, check out the [Python migration guide](/chainguard/libraries/python/migration/). This section covers hash verification, one part of that process.

Because Chainguard rebuilds Python packages from source rather than mirroring upstream PyPI artifacts, it is expected that checksums for Chainguard-built packages differ from their PyPI counterparts, even for identical package versions. This affects any tool that pins or verifies hashes:

* Tools such as `pip` verify that downloaded files match the hashes specified in requirements.txt when using `--require-hashes` or when hashes are pinned
* Tools such as `pip`, `Poetry`, and `uv` generate lock files that include SHA-256 hashes
* Repository managers such as JFrog Artifactory or Sonatype Nexus may have cached upstream PyPI wheels and continue serving them instead of Chainguard versions, even after you have reconfigured to use Chainguard Libraries

Resolving these issues requires two steps: [clearing cached artifacts](#clearing-caches-before-migration) at every layer of your build pipeline, and [updating lock files or requirements files](#updating-lockfile-hashes) so they reflect Chainguard's checksums.

### Clearing caches before migration

Most build systems treat language libraries as immutable artifacts. If a dependency already exists in a cache, the build will reuse the cached copy instead of fetching it again, even after you have reconfigured to use Chainguard. Before migrating, it is critical to start with a clean dependency cache at every layer of your build pipeline. Failing to do so can result in builds silently continuing to use PyPI-sourced artifacts after migration.

Cached packages can exist at multiple layers:

**Local developer machines**

Common cache locations for Python tools include `~/.cache/pip/`, `~/.cache/uv/`, and `~/.cache/pypoetry/`.

Clear the cache for your tool:

```bash
pip cache purge
uv cache clean
poetry cache clear --all pypi
```

**CI/CD pipeline caches**

Build pipelines frequently cache downloaded packages between runs. These caches must be invalidated after switching to Chainguard. Common locations to check:

* GitHub Actions: Packages cached under `/home/runner/.cache/pip` or restored via `actions/cache`. Update the cache key in your `actions/cache` step to force a cache miss after switching to Chainguard.
* GitLab CI: Check for .`cache/pip` defined in the job's cache section and update the cache key or clear the directory.
* Jenkins: Agents may reuse workspaces or home directories such as `/var/lib/jenkins/.cache/pip`. Ensure cache directories are cleared as part of your build setup step.

**Containerized builds**

Cached Docker image layers may reuse upstream dependencies even after reconfiguration. If a Dockerfile contains a layer such as `RUN pip install -r requirements.txt`, Docker will reuse the cached layer unless the base image, the requirements file, or the command itself has changed. To force a fresh install from Chainguard, rebuild without the layer cache:

```bash
docker build --no-cache
```

To authenticate to Chainguard Libraries during a container build without writing credentials into an image layer, see [Container builds](/chainguard/libraries/policies-and-security/build-containers/).

### Updating lockfile hashes

Existing Python lockfiles usually contain upstream integrity hashes. Because Chainguard rebuilds packages from verified source, those hashes must be updated before reinstalling. Use `chainctl libraries update-hashes` to update them in place. Learn more in [Build configuration](/chainguard/libraries/python/build-configuration/).

If you install through a repository manager, refer to [Global configuration](/chainguard/libraries/python/global-configuration/#updating-lockfile-hashes/).

When the upstream fallback is enabled, [build pinning](/chainguard/libraries/policies-and-security/build-pinning/) keeps a version you pulled from upstream stable after Chainguard publishes its own build, so you don't have to update these hashes again unexpectedly.

#### Update lockfiles manually

Alternatively, you can use the following instructions to manually update your lockfiles:

{{< details "Manually updating lockfiles" >}}

Before regenerating lock files, ensure your tool is configured to use Chainguard as the package index by following the [global configuration](/chainguard/libraries/python/global-configuration/) or [direct access](/chainguard/libraries/python/build-configuration/#direct-access) documentation.

To update your lock files and requirements with Chainguard's checksums:

**pip with `--require-hashes`:**

If your `requirements.txt` was generated using PyPI hashes, installation will
fail with a hash mismatch after switching to Chainguard. Once pip is configured
to use Chainguard as the index, regenerate your requirements file to update the
hashes:

```bash
  pip-compile --generate-hashes requirements.in -o requirements.txt
```

Note that `pip-compile` embeds your Chainguard index URL, including credentials, as an `--index-url` line in the generated file. Avoid committing this file to source control, or strip the `--index-url` line before doing so.

**uv:**

When the configured index changes, `uv sync` automatically re-resolves dependencies and updates `uv.lock` with hashes from the new index. No explicit `uv lock` step is required; running `uv sync` after configuring Chainguard as your index is sufficient. However, running `uv lock` explicitly after switching indexes is recommended to ensure your lock file accurately reflects what is being installed before you run `uv sync`.

Note that `uv sync --frozen` bypasses index configuration entirely and downloads packages using the URLs embedded directly in `uv.lock`. If your lock file was generated against PyPI, `uv sync --frozen` will continue to download from PyPI regardless of your configured index. Run `uv lock` first to update the lock file before using `--frozen`.

The credentials from your Chainguard pull token must be embedded in the index URL with the `/` in the username percent-encoded as `%2F`. For example, in `uv.toml`:

```
[[index]]
url = "https://<PULLTOKEN_USERNAME_PART1>%2F<PULLTOKEN_USERNAME_PART2>:<PULLTOKEN_PASSWORD>@libraries.cgr.dev/python/simple/"
authenticate = "always"
```

**Poetry:**

When the configured source changes, Poetry detects that `pyproject.toml` has changed significantly and refuses to install until the lock file is regenerated. Regenerate your lock file to update the hashes:

Poetry 1.x:

```bash
  poetry lock --no-update
```

Poetry 2.x:

```bash
  poetry lock
```

**Repository managers:**

Repository managers such as JFrog Artifactory or Sonatype Nexus may continue serving cached PyPI artifacts even after the upstream index is changed. Clear the cache or invalidate the artifact to ensure the Chainguard-built package is fetched.

Before regenerating lock files, ensure your tool is configured to use Chainguard as the package index by following the [global configuration](/chainguard/libraries/python/global-configuration/) or [direct access](/chainguard/libraries/python/build-configuration/#direct-access) documentation.

{{< /details >}}

>**Note:** While hash mismatches are expected for some tooling and
configurations while migrating to Chainguard, you can verify the authenticity and provenance of Chainguard
packages using SBOM and SLSA attestation files as described in the next section.

## SBOM and attestation files

Chainguard Libraries for Python include files that contain software bill of
material (SBOM) information. Additional files attest details about build
infrastructure with  the [Supply-chain Levels for Software Artifacts
(SLSA)](https://slsa.dev/) provenance information.

### Embedded SBOMs

The related files for Chainguard Libraries for Python are located within the
Python wheel file for each package following the [PEP 770 Improving
measurability of Python packages with Software Bill-of-Materials
specification](https://peps.python.org/pep-0770/) for software composition
analytis (SCA) using the SPDX format.

A wheel file contains two directories:

* The main code directory that uses the name of the library only, and
* The version-specific distribution info directory `.dist.info`.

For example, the wheel archive for Flask version 2.0.0
includes a directory `flask-2.0.0.dist.info`. You can also find this directory
in the `site-packages` directory of a Python project using a virtual environment.

The SBOM information is in the file `*.dist-info/sboms/sbom.spdx.json`. Any package from
Chainguard includes a reference to Chainguard in the `creators` section:

```json
{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "flask",
  "documentNamespace": "https://anchore.com/syft/dir/flask-17f2a052-031c...",
  "creationInfo": {
    "licenseListVersion": "3.27",
    "creators": [
      "Tool: Syft",
      "Tool: ecosystems-wheels-rebuilder",
      "Organization: Chainguard, Inc"
    ],
  ...
  }
}
```

### SLSA provenance

SLSA provenance is available from the Chainguard Python index following the [PEP
740 – Index support for digital attestations
specification](https://peps.python.org/pep-0740/) within the integrity context
at `https://libraries.cgr.dev/python/integrity/PACKAGE/VERSION/FILE/provenance`
with `PACKAGE` as the Python package name, `VERSION` the package version, and
`FILE` the filename of the package archive with configured [basic authentication
using a pull token](/chainguard/libraries/introduction/access/).

For example, for version `2.0.0` of the package `flask` available as a platform
independent wheel archive file `flask-2.0.0-py3-none-any.whl` you can retrieve
the provenance information from
`https://libraries.cgr.dev/python/integrity/flask/2.0.0/flask-2.0.0-py3-none-any.whl/provenance`.

Packages from Chainguard are identified by the `publisher`:`environment` set as
`chainguard`:

```json
{
  "attestation_bundles": [
    {
      "attestations": [
        ...
      ]
      "publisher": {
        "environment": "chainguard",
        "kind": "URL",
        "issuer": "https://issuer.enforce.dev",
        "identity": "https://issuer.enforce.dev/3fab4fe4edb624d...",
        "repository": "chainguard-dev/ecosystems-wheel-rebuilder",
        "workflow": "python-build-versions.yaml"
      }
    }
  ],
  "version": 1
}
```

### Sigstore bundle

A [Sigstore bundle](https://docs.sigstore.dev/about/bundle/) is a self‑contained JSON file that packages everything needed
to verify the authenticity and integrity of a signed artifact.

A Sigstore bundle file is available
as `bundle.json` from the integrity context at
`https://libraries.cgr.dev/python/integrity/PACKAGE/VERSION/FILE/bundle.json`
specifically for each package, version, and file.

## Upstream fallback policy and controls

Chainguard Libraries for Python supports an optional built-in fallback to
the upstream PyPI index, managed through the [Chainguard
Repository](/chainguard/chainguard-repository/overview/). By default, the endpoint serves
only Chainguard-built packages. When the upstream fallback is enabled, upstream packages are
subject to additional security controls before being served.

Learn about managing fallback and cooldown controls in the [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/).

---

### Manage and update dependencies
_Path: chainguard/libraries/python/management.md_

Chainguard Libraries for Python operates transparently after completing the
[repository manager
configuration](/chainguard/libraries/python/global-configuration/) or [build
tool configuration](/chainguard/libraries/python/build-configuration/),
automatically providing security-enhanced versions of your PyPI dependencies.
After setup, most package retrieval happens through your configured package
index or repository manager. Use this page for recurring maintenance tasks and
for deciding where to troubleshoot when a dependency changes.

Chainguard Libraries serves Chainguard-built artifacts when they are available.
When [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls/) is
enabled, an artifact that Chainguard has not yet built may first be served
through Chainguard’s upstream tier. With [build
pinning](/chainguard/libraries/policies-and-security/build-pinning/), the exact package version
remains pinned to the artifact tier your organization first received, so a
previously downloaded wheel or source distribution is not immediately replaced
when Chainguard publishes a built equivalent.

A package may already be present in a developer’s `pip`, `uv`, or Poetry cache,
in a repository manager cache, or a container layer. A cached package is not
automatically replaced just because a Chainguard-built equivalent becomes
available.

For Python, a single package version can resolve to different wheels depending
on the Python version and platform. The pinned file, selected artifact, and
resulting hash may therefore vary by environment; test and update hashes for
each supported environment when applicable.

## Verify dependencies

Use `chainctl libraries verify` to check whether an artifact comes from
Chainguard Libraries.

To verify an installed virtual environment:

```bash
chainctl libraries verify --detailed .venv/
```

For additional verification commands, command options, permissions, and
supported artifact types, refer to the [Verification
documentation](/chainguard/libraries/policies-and-security/verification/).

### Inspect artifacts in a repository manager

If your organization uses a repository manager, you can inspect the Chainguard
proxy or remote repository to audit which artifacts were retrieved through
Chainguard Libraries. Use the repository manager’s package or browsing view to
locate an artifact and compare its coordinates, file name, size, checksum, and
available metadata.

Refer to the [Verification page](/chainguard/libraries/policies-and-security/verification/) for more
information on verifying artifacts in a repository manager.

## Refresh cached artifacts

The number of available artifacts in Chainguard Libraries for Python increases
over time. If an artifact was already retrieved from the PyPI
Repository and is available in your repository manager or local repository it is
not automatically replaced with the equivalent Chainguard Library version.

To adopt new Chainguard-built artifacts, refer to the [build pinning
documentation](/chainguard/libraries/build-pinning/#adopt-a-chainguard-build-after-removing-a-pin)
for instructions on removing existing pinned versions.

Refreshing cached artifacts may also be necessary to solve other issues, such as
stale or corrupted artifacts or metadata, repository configuration changes, and
resolution troubleshooting. To refresh the same artifact your organization is
already using:

1. Confirm that the project and CI/CD environment use the intended Chainguard
   index or repository manager endpoint.
1. Update the dependency or dependency constraint with your package manager.
1. Run the project’s tests and security checks.
1. Review and commit the resulting lockfile or hash-pinned requirements changes.

If an exact package version is pinned, Chainguard continues to serve the pinned
artifact after the cache is refreshed.

For a more fine-grained approach you can also delete subsections of local
repositories and the proxy repositories.

### Prepare for package hash changes

A hash identifies the exact bytes of a downloaded Python artifact.
Chainguard-built artifacts have different hashes from the equivalent upstream
artifacts because they are rebuilt in a secure environment.

During initial migration, if your project uses hash-pinned lockfiles, update
those values with [the `chainctl libraries update-hashes`
command](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/),
then run your normal tests and verification checks. For a full migration
sequence, including cache and project-configuration handling, refer to the
[migration guide for Chainguard Libraries for
Python](/chainguard/libraries/python/migration/).

For organizations that use Chainguard's [upstream
fallback](/chainguard/libraries/introduction/overview/#upstream-fallback-and-controls/),
build pinning keeps the exact artifact previously served for that package
version. This prevents a later Chainguard rebuild from unexpectedly changing the
hash. You must remove the pin to adopt a newer Chainguard build. Refer to [Build
pinning](/chainguard/libraries/policies-and-security/build-pinning/) for more information.

---

### Chainguard Guardener
_Path: chainguard/guardener/_index.md_

Chainguard Guardener is a tool for managing and hardening your source code. Rather than adding a separate integration for every task, the Guardener provides a growing suite of capabilities that you opt into independently. Some capabilities run through a hardened GitHub App and are configured per repository through files committed to your codebase; others, such as Dockerfile migration, run locally through `chainctl`.

{{< beta feature="Chainguard Guardener" access="organizations that have installed and linked the Chainguard Guardener GitHub App" >}}

The Guardener's capabilities fall into two groups:

- **[GitHub App](/chainguard/guardener/github/)** — Capabilities that run through the Guardener GitHub App and are enabled per repository with `.chainguard/` configuration files:
    - **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommends and migrates your GitHub Actions to Chainguard's hardened, SHA-pinned equivalents, through non-blocking pull request review comments or migration pull requests that run on a schedule or [on demand](/chainguard/guardener/github/actions-security/#run-an-on-demand-migration).
    - **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Enforces cryptographically signed commits against a policy you control, supporting both keyless (Sigstore) signatures and static keys such as GPG.
- **[Dockerfile migration](/chainguard/guardener/dockerfile-migration/)** — Uses AI to iteratively convert your Dockerfiles to Chainguard Containers. This capability runs locally through `chainctl agent dockerfile` commands.

Additional capabilities will be added over time, each with its own opt-in configuration.

## Where to start

- **[GitHub App](/chainguard/guardener/github/)** — Install the app, link your organization, and configure the GitHub App capabilities (Hardened Actions and Commit Verification):
    - **[Getting started](/chainguard/guardener/github/getting-started/)** — Install the GitHub App and link your Chainguard organization to your GitHub organization.
    - **[Configuration](/chainguard/guardener/github/configuration/)** — Understand the `.chainguard/` configuration model and how features are enabled per repository.
- **[Dockerfile migration](/chainguard/guardener/dockerfile-migration/)** — Migrate your Dockerfiles to Chainguard Containers using the `chainctl agent dockerfile` commands.

## Support

For questions or feedback, contact your Chainguard account team or email [support@chainguard.dev](mailto:support@chainguard.dev).

---

### Chainguard Guardener Commit Verification
_Path: chainguard/guardener/github/commit-verification.md_

The Commit Verification feature verifies that every commit in a pull request is cryptographically signed by an authorized signer, according to a policy you control. This ensures that changes to your codebase come from identities you trust, and it supports both keyless (Sigstore) signatures and static keys such as GPG.

Keyless commit signatures are verified using [gitsign](https://github.com/sigstore/gitsign) and [Sigstore](/open-source/sigstore/). Static key authorities (such as GPG) are verified directly against the key material you supply, without gitsign.

## Enable Commit Verification

Add a `.chainguard/source.yaml` file to your repository that defines one or more **authorities**. A commit is accepted if it satisfies **any** of the listed authorities.

```yaml
spec:
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
        identities:
          - subjectRegExp: .+@example.com$
            issuer: https://accounts.google.com
      ctlog:
        url: https://rekor.sigstore.dev
```

The example above accepts commits signed with keyless Sigstore signatures where the signer's identity is an `@example.com` address authenticated through Google.

## Keyless (Sigstore) authorities

A `keyless` authority verifies short-lived certificates issued by a Sigstore certificate authority (Fulcio) and logged in a transparency log (Rekor). Use `identities` to constrain which signer identities are trusted. The fields in the example above are:

- `keyless.url` — the Fulcio instance that issued the signing certificate.
- `keyless.identities` — one or more identity constraints. Each entry matches the certificate's subject and issuer.
    - `subjectRegExp` — a regular expression the signer's subject (for example, an email address) must match. Use `subject` for an exact match instead.
    - `issuer` — the OIDC issuer that authenticated the signer (for example, `https://accounts.google.com`). Use `issuerRegExp` for a pattern match.
- `ctlog.url` — the transparency log (Rekor) instance used to verify the signature was logged.

## Static key authorities

A `key` authority verifies signatures made with a static key, such as GPG. This is useful for accepting commits signed by well-known keys — for example, GitHub's own `web-flow` key used when merging in the web UI:

```yaml
spec:
  authorities:
    - key:
        kms: https://github.com/web-flow.gpg
```

## Combining authorities

Because a commit is accepted if it satisfies any authority, you can allow several trusted sources at once. The following policy accepts commits signed either by an `@example.com` Sigstore identity or by GitHub's `web-flow` key:

```yaml
spec:
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
        identities:
          - subjectRegExp: .+@example.com$
            issuer: https://accounts.google.com
      ctlog:
        url: https://rekor.sigstore.dev
    - key:
        kms: https://github.com/web-flow.gpg
```

## Configuration reference

| Field                                                   | Purpose                                                                    |
| ------------------------------------------------------- | -------------------------------------------------------------------------- |
| `spec.authorities`                                      | List of authorities. A commit is accepted if it satisfies any one of them. |
| `spec.authorities[].keyless.url`                        | Fulcio instance that issued the signing certificate.                       |
| `spec.authorities[].keyless.identities[].subjectRegExp` | Regular expression the signer's subject must match.                        |
| `spec.authorities[].keyless.identities[].issuer`        | OIDC issuer that authenticated the signer.                                 |
| `spec.authorities[].ctlog.url`                          | Transparency log (Rekor) instance used to verify the signature.            |
| `spec.authorities[].key.kms`                            | Reference to a static key (for example, GPG) used to verify signatures.    |

## Next steps

- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommend and migrate GitHub Actions to hardened, SHA-pinned equivalents.
- **[Configuration](/chainguard/guardener/github/configuration/)** — Review the shared `.chainguard/` configuration model.
- Learn more about the signing technology behind this feature in the [Sigstore documentation](/open-source/sigstore/).

---

### Chainguard Guardener GitHub App
_Path: chainguard/guardener/github/_index.md_

The Chainguard Guardener GitHub App is a single, hardened bot that runs against your repositories. Its capabilities are opt-in per repository through configuration files committed to a `.chainguard/` directory, so installing the app has no effect on a repository until you enable a capability.

{{< beta feature="Chainguard Guardener" access="organizations that have installed and linked the Chainguard Guardener GitHub App" >}}

## Getting set up

- **[Getting started](/chainguard/guardener/github/getting-started/)** — Install the GitHub App and link your Chainguard organization to your GitHub organization.
- **[App connections](/chainguard/guardener/github/app-connections/)** — Set up, inspect, and remove the connections between your Chainguard organization and your GitHub organizations.
- **[Configuration](/chainguard/guardener/github/configuration/)** — Understand the `.chainguard/` configuration model that all the GitHub App capabilities share.

## Capabilities

- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommends and migrates your GitHub Actions to Chainguard's hardened, SHA-pinned equivalents, through non-blocking pull request review comments or automated migration pull requests. Migration pull requests run on a schedule and can also be [triggered on demand](/chainguard/guardener/github/actions-security/#run-an-on-demand-migration) with `chainctl`.
- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Enforces cryptographically signed commits against a policy you control, supporting both keyless (Sigstore) signatures and static keys such as GPG.

Each capability is configured with its own file in the `.chainguard/` directory.

> **Note:** For Dockerfile migration, which runs locally through `chainctl agent dockerfile` rather than the GitHub App, refer to [Dockerfile migration](/chainguard/guardener/dockerfile-migration/).

---

### Managing GitHub App connections
_Path: chainguard/guardener/github/app-connections.md_

Chainguard Guardener acts on your GitHub repositories on behalf of your Chainguard organization. The bridge between the two is a **connection**: a Guardener GitHub App installation on a GitHub organization, linked to a Chainguard organization. This page explains how connections work and how to set up, inspect, change, and remove them.

For a first-time walkthrough, refer to [Getting started](/chainguard/guardener/github/getting-started/). This page is the fuller reference for managing connections over time.

{{< beta feature="Chainguard Guardener" access="organizations that have installed and linked the Chainguard Guardener GitHub App" >}}

## How connections work

A connection has two halves, one on each side:

1. **A GitHub App installation** — the [Guardener GitHub App](https://github.com/apps/chainguard-guardener) installed on a GitHub organization (or personal account). The installation is what grants the Guardener access to repositories and delivers repository events to it. GitHub assigns each installation a numeric **installation ID**.
2. **A link** — an association, stored on the Chainguard platform, between that installation and a Chainguard organization. The link is what tells the Guardener which Chainguard organization the GitHub activity belongs to.

The two halves do different jobs. Installing the app is enough for the Guardener to start responding on **public** repositories — each feature still has to be enabled with a configuration file, but no link is needed. The link adds the Chainguard side: it attributes the activity to your Chainguard organization and unlocks the features that need one, such as covering **private** repositories (subject to the [repository visibility scope](#repository-visibility-scope)) and group-scoped operations like triggering an Actions migration with `chainctl`. Linking fails if the app is not installed.

A few rules govern connections:

- **A GitHub organization can be linked to exactly one Chainguard organization at a time.** Linking an organization that is already linked elsewhere fails with an "already linked to a different Chainguard group" error; unlink it first (refer to [Moving a GitHub organization](#moving-a-github-organization-to-a-different-chainguard-organization)).
- **A Chainguard organization can link any number of GitHub organizations.** Each linked GitHub organization appears as its own connection.
- **Personal accounts work like organizations.** To connect your own GitHub user account instead of an organization, install the app on your account and pass your GitHub username as the organization.
- **Re-linking is safe.** Linking a GitHub organization that is already linked to the same Chainguard organization succeeds without changing anything.

### Required permissions

The `chainctl guardener github` commands check permissions on both sides of the connection:

| Action | Requires |
| ------ | -------- |
| Link (`link`) | **Both**: the `guardener.association.manage` capability on the Chainguard organization (held by owners), **and** ownership of the GitHub organization. |
| List connections (`status`) | The `guardener.association.list` capability on the Chainguard organization. |
| Unlink (`unlink`) | **Either**: the `guardener.association.manage` capability on the Chainguard organization, **or** ownership of the GitHub organization (refer to [Removing a connection](#removing-a-connection)). |

Refer to the [Built-in roles and capabilities reference](/platform/administration/iam-organizations/roles-role-bindings/capabilities-reference/) for how capabilities map to roles.

Commands that prove GitHub organization ownership (`link`, and the fallback path of `unlink`) open a browser window to authorize with GitHub. Listing connections with `status` is read-only and never involves a browser.

## Setting up a connection

### Step 1: Install the Guardener GitHub App

Install the app on the GitHub organization whose repositories the Guardener should manage:

1. Go to the [Guardener GitHub App page](https://github.com/apps/chainguard-guardener).
2. Select **Install** (or **Configure** if it is already installed on another account).
3. Choose the GitHub organization (or your personal account) to install it on.
4. Choose which repositories the Guardener can access — **All repositories** or a selected subset. You can change this later (refer to [Changing repository access](#changing-which-repositories-are-connected)).
5. Review the requested permissions and confirm.

Installing the app does not change any repository on its own. Every Guardener feature stays disabled until you opt in with a configuration file, as described in [Configuration](/chainguard/guardener/github/configuration/).

### Step 2: Link the GitHub organization to your Chainguard organization

Run `chainctl guardener github link`, passing the GitHub organization login and your Chainguard organization name:

```shell
chainctl guardener github link \
  --github-org <github-org-login> \
  --group <organization-name>
```

If you omit `--group`, `chainctl` prompts you to select from the Chainguard organizations you have access to.

A browser window opens to authorize with GitHub; completing it proves that you own the GitHub organization. On success, `chainctl` prints the linked organization and its installation ID:

```
Linked GitHub organization "example-org" to group example.com (installation 12345678).
```

> **Note:** The first time an organization links a GitHub organization, `chainctl` prompts you to accept the Chainguard Guardener [Terms of Service](https://www.chainguard.dev/legal/guardener) and [Data Privacy Agreement](https://www.chainguard.dev/legal/supplemental-dpa) on behalf of your organization. Acceptance is recorded once per organization and covers subsequent links.

If the browser flow cannot use its default local port (8989), pass a different one with `--port`.

### Step 3: Verify the connection

List the connections for your Chainguard organization:

```shell
chainctl guardener github status --group <organization-name>
```

The linked GitHub organization should appear in the output, as described in the next section.

## Inspecting connections

`chainctl guardener github status` lists every GitHub organization linked to a Chainguard organization:

```
Repository visibility scope: PUBLIC (default; public repositories only)

ORGANIZATION  INSTALLATION ID  SETTINGS
example-org   12345678         https://github.com/settings/installations/12345678
```

- **ORGANIZATION** — the GitHub organization (or user) login for the connection.
- **INSTALLATION ID** — GitHub's identifier for the app installation backing the connection.
- **SETTINGS** — the GitHub settings page for the installation, where a GitHub owner can review its permissions and repository access.

### Repository visibility scope

Above the connection list, `status` prints the organization's **repository visibility scope**, which controls which repositories the Guardener responds to across all of the organization's connections:

- **PUBLIC** (the default) — the Guardener acts on public repositories only, even when the installation grants it access to private repositories.
- **ALL** — the Guardener acts on both public and private repositories.

The visibility scope is managed by Chainguard. If you need the Guardener to cover private repositories, contact Chainguard support to have your organization's scope updated.

> **Note:** Reading the visibility scope requires the `guardener.entitlement.list` capability. Without it, `status` still lists your connections and prints a warning that the scope was skipped.

## Changing which repositories are connected

Repository access is controlled on the GitHub side, by the app installation. To change it:

1. Open the installation's settings page — the **SETTINGS** URL from `chainctl guardener github status`, or your GitHub organization's **Settings → GitHub Apps** page.
2. Under **Repository access**, switch between **All repositories** and **Only select repositories**, or adjust the selected list.

No change on the Chainguard side is needed; the existing link continues to apply to whatever the installation can access. Remember that access alone does nothing — each repository still needs a `.chainguard/` configuration file (or an org-level default) to enable a feature, and the [repository visibility scope](#repository-visibility-scope) still applies.

## Moving a GitHub organization to a different Chainguard organization

Because a GitHub organization can be linked to only one Chainguard organization at a time, moving it is an unlink followed by a link:

```shell
chainctl guardener github unlink \
  --github-org <github-org-login> \
  --group <old-organization>

chainctl guardener github link \
  --github-org <github-org-login> \
  --group <new-organization>
```

The GitHub App installation is untouched by the move; only the Chainguard-side association changes.

## Removing a connection

To remove a connection, unlink the GitHub organization:

```shell
chainctl guardener github unlink \
  --github-org <github-org-login> \
  --group <organization-name>
```

Unlinking accepts either side's authority:

- **Chainguard credentials.** When you pass `--group` and hold the `guardener.association.manage` capability on that organization, the unlink completes with no browser involved.
- **GitHub ownership.** Otherwise — including when you have lost access to the Chainguard organization — `chainctl` falls back to the GitHub authorization flow, and proving that you own the GitHub organization is sufficient. You must still be logged in to Chainguard (`chainctl auth login`), but no access to the linked organization is required.

Unlinking removes only the Chainguard-side half of the connection: the Guardener stops covering the organization's private repositories and group-scoped operations, but features enabled on public repositories keep working for as long as the app remains installed. To stop the Guardener entirely, also uninstall the GitHub App from your GitHub organization's **Settings → GitHub Apps** page. Uninstalling the app without unlinking also stops the Guardener, but leaves a dangling association behind; prefer unlinking first.

## Troubleshooting

**"the guardener GitHub App must be installed on the GitHub account (organization or user) before it can be linked"**
Linking checks for an existing installation. Install the app on the GitHub organization ([Step 1](#step-1-install-the-guardener-github-app)), then run `link` again.

**"that GitHub organization is already linked to a different Chainguard group"**
Each GitHub organization can be linked to only one Chainguard organization. Unlink it from its current organization first — anyone who owns the GitHub organization can do this, even without access to the current Chainguard organization (refer to [Removing a connection](#removing-a-connection)).

**The browser authorization fails or never completes**
The GitHub flow requires that you are an owner of the GitHub organization; membership alone is not enough. If the local callback port is in use, re-run the command with `--port <port>`. The flow times out after a few minutes — re-run the command to try again.

**`status` shows the connection but the Guardener isn't doing anything**
A connection alone changes nothing. Check that the repository is covered by the installation's repository access, that its visibility matches your [repository visibility scope](#repository-visibility-scope), and that the feature you expect is enabled by a `.chainguard/` configuration file (refer to [Configuration](/chainguard/guardener/github/configuration/)).

## Command reference

For the complete set of flags and options, refer to the `chainctl` reference:

- [`chainctl guardener`](/platform/chainctl/chainctl-docs/chainctl_guardener/)
- [`chainctl guardener github`](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)
- [`chainctl guardener github link`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_link/)
- [`chainctl guardener github unlink`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_unlink/)

## Next steps

- **[Configuration](/chainguard/guardener/github/configuration/)** — Enable Guardener features with `.chainguard/` configuration files.
- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommend and migrate GitHub Actions to hardened, SHA-pinned equivalents.
- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Require cryptographically signed commits in pull requests.

---

### Getting started with Chainguard Guardener
_Path: chainguard/guardener/github/getting-started.md_

This guide walks you through everything you need to start using Chainguard Guardener on your GitHub repositories:

1. [Install the Guardener GitHub App](#step-1-install-the-guardener-github-app) on your GitHub organization.
2. [Link your Chainguard organization to your GitHub organization](#step-2-link-your-chainguard-organization-to-github).
3. [Verify the link](#step-3-verify-the-link) and enable your first feature.

Once the app is installed, the Guardener can respond on your public repositories. Linking connects that activity to your Chainguard organization and unlocks the features that require one, such as private repository coverage — there is no separate entitlement step.

{{< beta feature="Chainguard Guardener" access="organizations that have installed and linked the Chainguard Guardener GitHub App" >}}

## Prerequisites

Before you begin, make sure you have the following:

- **`chainctl` installed and authenticated.** If you haven't installed it yet, follow the [chainctl installation guide](/platform/chainctl-usage/how-to-install-chainctl/), then run `chainctl auth login`.
- **A Chainguard organization** where you are an owner, or where you otherwise hold the `guardener.association.manage` capability. This capability is required to link a GitHub organization to your Chainguard group. Refer to the [Built-in roles and capabilities reference](/platform/administration/iam-organizations/roles-role-bindings/capabilities-reference/) for more information on roles.
- **Owner (admin) access to the GitHub organization** you want to link. Installing the app and authorizing the link both require GitHub organization ownership.

The `chainctl guardener` commands identify your Chainguard organization by its group name — you don't need to look up a group ID. Pass the name with `--group`, or omit the flag entirely and `chainctl` will prompt you to select from the organizations you have access to.

## Step 1: Install the Guardener GitHub App

Install the Guardener GitHub App on the GitHub organization whose repositories you want the Guardener to manage.

1. Go to the [Guardener GitHub App page](https://github.com/apps/chainguard-guardener).
2. Select **Install** (or **Configure** if it is already installed on another account).
3. Choose the GitHub organization to install it on.
4. Choose which repositories the Guardener can access. You can grant access to **All repositories** or select specific repositories. You can change this selection later in your GitHub organization settings.
5. Review the requested permissions and confirm the installation.

### Permissions the Guardener requests

The Guardener requests the minimum GitHub permissions needed to operate:

| Permission | Access | Why it's needed |
| ---------- | ------ | --------------- |
| Contents | Read & write | Read repository files (workflows, signatures, configuration) and push migration pull request branches. |
| Pull requests | Read & write | Receive pull request events, read diffs, and post review comments and pull requests. |
| Workflows | Read & write | Read and update GitHub Actions workflow files during Actions migration. |
| Checks | Write | Publish check runs that report the Guardener's results. |

Installing the app does **not** change any repository on its own. Each feature stays disabled until you opt in with a configuration file, as described in [Configuration](/chainguard/guardener/github/configuration/).

## Step 2: Link your Chainguard organization to GitHub

Linking associates your GitHub organization with a Chainguard group so the Guardener knows which Chainguard organization your GitHub activity belongs to.

Run `chainctl guardener github link`, passing your GitHub organization login and your Chainguard group name:

```shell
chainctl guardener github link \
  --github-org <github-org-login> \
  --group <group-name>
```

If you omit `--group`, `chainctl` prompts you to select the Chainguard organization to link.

A browser window opens to authorize with GitHub. This step proves that you own the GitHub organization. The Guardener GitHub App must already be installed on the organization (refer to [Step 1](#step-1-install-the-guardener-github-app)) for the link to succeed.

> **Note**: Linking requires that you are an owner of the Chainguard group (specifically, that you hold the `guardener.association.manage` capability) **and** an owner of the GitHub organization.

If you need to link your own user account rather than an organization, pass your GitHub username to `--github-org`.

## Step 3: Verify the link

After linking, confirm that the Guardener is active on your repositories:

- Open a repository that the Guardener can access and confirm the Guardener GitHub App appears under the repository's or organization's installed GitHub Apps.
- Add your first configuration file (for example, `.chainguard/actions.yaml`) as described in [Configuration](/chainguard/guardener/github/configuration/), then open a pull request to see the Guardener respond.

## Unlinking a GitHub organization

To remove the association between a GitHub organization and a Chainguard group, use `chainctl guardener github unlink`:

```shell
chainctl guardener github unlink \
  --github-org <github-org-login> \
  --group <group-name>
```

When you pass `--group` and hold the `guardener.association.manage` capability on that group, the organization is unlinked using your Chainguard credentials with no browser involved. Otherwise, `chainctl` falls back to the GitHub authorization flow to prove you own the organization. Either way, you must be logged in to Chainguard.

Unlinking stops the Guardener's Chainguard-connected features, such as private repository coverage; features enabled on public repositories keep working while the app is installed. To fully remove the Guardener, also uninstall the GitHub App from your GitHub organization settings.

## Command reference

For the complete set of flags and options, refer to the `chainctl` reference:

- [`chainctl guardener`](/platform/chainctl/chainctl-docs/chainctl_guardener/)
- [`chainctl guardener github`](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)
- [`chainctl guardener github link`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_link/)
- [`chainctl guardener github unlink`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_unlink/)

## Next steps

- **[App connections](/chainguard/guardener/github/app-connections/)** — Inspect, change, and remove the connections between your Chainguard organization and your GitHub organizations.
- **[Configuration](/chainguard/guardener/github/configuration/)** — Learn the `.chainguard/` configuration model and how to enable features per repository.
- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommend and migrate GitHub Actions to hardened, SHA-pinned equivalents.
- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Require cryptographically signed commits in pull requests.

---

### Configuring Chainguard Guardener
_Path: chainguard/guardener/github/configuration.md_

Chainguard Guardener is configured entirely through files committed to a `.chainguard/` directory — either in each repository, or once at the organization level in your `.github` repository. This page explains the configuration model that all the Guardener features share. For the specific options of each feature, refer to its dedicated page.

## The `.chainguard/` directory

The Guardener reads its configuration from the `.chainguard/` directory at the root of each repository. Every feature has its own file:

```text
.chainguard/
├── actions.yaml   # Hardened Actions
└── source.yaml    # Commit Verification
```

Because these files live in your repository, your configuration is reviewed through pull requests, versioned in git history, and audited like any other code change.

## Features are opt-in per repository

Installing the Guardener GitHub App does not change any repository on its own. Each feature stays disabled until you add its configuration file and enable it. This means you can:

- Roll a feature out to one repository at a time.
- Try a feature in report-only or non-blocking mode before enforcing it.
- Keep different repositories on different configurations.

A repository with no `.chainguard/` files is unaffected by the Guardener even when the app is installed and the organization is linked.

## Available features

| Feature                                                           | Config file                | What it does                                                                |
| ----------------------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------- |
| [Hardened Actions](/chainguard/guardener/github/actions-security/)       | `.chainguard/actions.yaml` | Recommends and migrates GitHub Actions to hardened, SHA-pinned equivalents. |
| [Commit Verification](/chainguard/guardener/github/commit-verification/) | `.chainguard/source.yaml`  | Verifies that commits in a pull request are signed by an authorized signer. |

Additional features will be added over time, each with its own `.chainguard/` file and opt-in configuration.

## Organization-level configuration with the `.github` repository

Rather than committing `.chainguard/` files to every repository, you can define configuration once at the organization level. The Guardener reads a `.chainguard/` directory from your organization's `.github` repository and applies it as the default for every repository in the organization.

The `.github` repository is a special repository that GitHub already uses for organization-wide defaults (such as community health files and default workflows). The Guardener follows the same convention:

```text
.github/                # your organization's .github repository
└── .chainguard/
    ├── actions.yaml     # org-wide default for Hardened Actions
    └── source.yaml      # org-wide default for Commit Verification
```

To use org-level configuration:

1. Create a repository named `.github` in your organization if you don't already have one.
2. Add the Guardener GitHub App to the `.github` repository (or install it on **All repositories**).
3. Commit your `.chainguard/` configuration files to the default branch of the `.github` repository.

Once in place, every repository the Guardener can access inherits this configuration without needing its own `.chainguard/` files.

### How repository and organization configuration combine

Configuration committed directly to a repository takes precedence over the organization-level configuration from the `.github` repository:

- A repository with its own `.chainguard/<feature>.yaml` file uses that file for the feature, ignoring the org-level default for it.
- A repository without a given feature file falls back to the org-level default in the `.github` repository.
- A feature that is configured in neither place stays disabled for the repository.

This lets you set a baseline for the whole organization and override it only where a specific repository needs different behavior.

> **Note:** The Guardener reads the org-level configuration from the default branch (that is, `main`) of the `.github` repository, just as it does for per-repository configuration.

## Applying configuration changes

To add or update the Guardener configuration:

1. Create or edit the relevant file in `.chainguard/` on a branch.
2. Open a pull request with your change.
3. Merge the pull request. The Guardener picks up the new configuration for subsequent events.

> **Note:** The Guardener uses the repo's default branch (that is, `main`) for its configuration.

## Next steps

- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Configure `.chainguard/actions.yaml`.
- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Configure `.chainguard/source.yaml`.

---

### Chainguard Guardener Hardened Actions
_Path: chainguard/guardener/github/actions-security.md_

The Hardened Actions feature recommends and migrates your GitHub Actions to Chainguard's hardened, SHA-pinned equivalents. Pinning actions to a specific commit SHA — rather than a mutable tag or branch — protects your workflows from supply chain attacks in which an upstream tag is moved to point at malicious code.

Hardened Actions operates in two independent modes:

- **Pull request recommendations** — non-blocking review comments that suggest hardened action alternatives, with one-click suggestion blocks.
- **Automated migration pull requests** — a periodically maintained pull request that updates workflows across your repository. You can also [trigger this migration on demand](#run-an-on-demand-migration) with `chainctl` instead of waiting for the next scheduled run.

You can enable either mode on its own or both together.

## Enable Hardened Actions

Add a `.chainguard/actions.yaml` file to your repository:

```yaml
enabled: true
```

With just `enabled: true`, the Guardener posts non-blocking recommendation comments on pull requests that touch your workflows. It does not open pull requests of its own.

## Enable automated migration pull requests

To have the Guardener periodically open and maintain a pull request that migrates your workflows, enable the `migrate` block:

```yaml
enabled: true
migrate:
  enabled: true
  period: "168h"
```

The Guardener opens (and keeps updated) a single migration pull request on the cadence you set with `period`.

## Run an on-demand migration

Instead of waiting for the next scheduled run — for example, right after enabling migration, or after Chainguard publishes a hardened equivalent for an action you use — you can trigger the migration immediately with `chainctl`.

An on-demand run performs exactly the same migration as the scheduled flow: it opens (or updates) the repository's single migration pull request and honors the same `.chainguard/actions.yaml` configuration, including `migrate.ignore`. Because it shares the opt-in gate, the repository (or its organization, through the [org-level `.github` configuration](/chainguard/guardener/github/configuration/)) must have `migrate.enabled: true`; if migration is not enabled, the run completes as a no-op without opening a pull request. Triggering an on-demand run does not change the periodic schedule.

Before you start, make sure that:

- The Guardener GitHub App is installed and your Chainguard organization is linked to your GitHub organization, as described in [Getting started](/chainguard/guardener/github/getting-started/). The migration must be requested through the Chainguard organization that owns the GitHub App installation.
- You hold the `guardener.actions.migrate` capability on that Chainguard organization. Organization owners have it, and it is included in the built-in `guardener.user` and `guardener.admin` roles. Refer to the [Built-in roles and capabilities reference](/platform/administration/iam-organizations/roles-role-bindings/capabilities-reference/) for more information on roles.

Run `chainctl guardener github migrate create` with the repository to migrate:

```shell
chainctl guardener github migrate create <owner>/<repo>
```

The repository can be given as `owner/repo` shorthand or as a full URL (`https://github.com/owner/repo`); only github.com repositories are supported today. The migration runs under the Chainguard organization that owns the GitHub App installation. `chainctl` selects that organization automatically when only one is available and prompts you when there are several; pass `--parent <group-name>` to name it explicitly.

By default the command waits for the migration to finish (up to 10 minutes, adjustable with `--timeout`) and prints the result:

```
Repository: https://github.com/<owner>/<repo>
Triggered by: you@example.com (user)
Status: completed
Pull request: https://github.com/<owner>/<repo>/pull/42
```

When there is nothing to migrate — every action is already on a Chainguard equivalent, the ignore rules exclude everything, or the repository has not enabled migration — the run reports `Status: completed (no changes needed)` instead of a pull request.

If the migration fails because the GitHub App installation does not cover the repository (for example, the app was installed on **selected repositories** and this one isn't included), the error says so; grant the app access to the repository in your GitHub organization settings and trigger the migration again.

## Check a migration operation

Pass `--wait=false` to return immediately instead of waiting. The command prints an operation name of the form `operations/migrate/<group>/<id>`, which you can check later with `chainctl guardener github migrate get`:

```shell
chainctl guardener github migrate get operations/migrate/<group>/<id>
```

The owning organization is derived from the operation name, so no `--parent` is needed. Add `--wait` to poll until the operation completes (bounded by `--timeout`, 10 minutes by default). Interrupting a waiting `migrate create` is also safe — the migration keeps running server-side, and the command prints the operation name so you can check it later.

For the complete set of flags and options, refer to the `chainctl` reference:

- [`chainctl guardener github migrate`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate/)
- [`chainctl guardener github migrate create`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_create/)
- [`chainctl guardener github migrate get`](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_get/)

## Exclude files and actions

Use the `migrate.ignore` block to exclude specific workflow files or upstream actions from automated migration. Both fields accept glob patterns:

```yaml
enabled: true
migrate:
  enabled: true
  period: "168h"
  ignore:
    files:
      - "release.yml"
      - "*.deprecated.yml"
    actions:
      - "actions/checkout"
      - "actions/*"
```

- `ignore.files` — workflow files (under `.github/workflows/`) to skip.
- `ignore.actions` — upstream actions to leave untouched.

## Configuration reference

| Field                    | Default | Purpose                                                                             |
| ------------------------ | ------- | ----------------------------------------------------------------------------------- |
| `enabled`                | `true`  | Enables inline pull request recommendation comments.                                |
| `migrate.enabled`        | `false` | Opts into automated migration pull requests.                                        |
| `migrate.period`         | `24h`   | How often the migration pull request is refreshed. Clamped to a minimum of one day. |
| `migrate.version-strategy` | `exact` | Version selection when no exact equivalent exists. Set to `smallest-major-bump` to migrate older pins to the closest Chainguard-supplied major version. |
| `migrate.ignore.files`   | —       | Glob patterns for workflow files to skip during migration.                          |
| `migrate.ignore.actions` | —       | Glob patterns for upstream actions to skip during migration.                        |

The `period` value is a Go-style duration string (for example, `24h`, `168h` for one week).

## Full example

A complete `.chainguard/actions.yaml` enabling both recommendations and weekly automated migration, while leaving the `actions/*` family and a release workflow untouched:

```yaml
enabled: true
migrate:
  enabled: true
  period: "168h"
  ignore:
    files:
      - "release.yml"
    actions:
      - "actions/*"
```

## Next steps

- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Require cryptographically signed commits in pull requests.
- **[Configuration](/chainguard/guardener/github/configuration/)** — Review the shared `.chainguard/` configuration model.

---

### Chainguard Guardener Dockerfile migration
_Path: chainguard/guardener/dockerfile-migration/_index.md_

The Dockerfile migration feature converts your Dockerfiles to use Chainguard Containers. It uses AI to iteratively translate instructions, build images, compare results, and fix issues until the migrated Dockerfile works as expected.

Unlike the Guardener's [Hardened Actions](/chainguard/guardener/github/actions-security/) and [Commit Verification](/chainguard/guardener/github/commit-verification/) features, Dockerfile migration does not run through the GitHub App or the `.chainguard/` configuration directory. Instead, you drive it locally through `chainctl agent dockerfile` commands. The AI runs server-side and scans your workspace to perform its analysis, while Docker builds and file access remain local to your machine.

{{< beta feature="The Guardener" >}}

## Prerequisites

While Dockerfile migration is in beta, your organization needs to join the waitlist. Chainguard will notify you once registration becomes available. You can sign up on [The Guardener landing page](https://www.chainguard.dev/guardener).

You also need the following:

- `chainctl` installed on your local machine. Refer to our [installation guide](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up if you haven't already done so.
- [Docker installed](https://docs.docker.com/engine/install/) and running locally.
- Your Dockerfile and build context (source code and other inputs) present on the same machine where you run the migration.
- A user with permission to accept the Guardener legal terms must accept them for your organization before anyone can run a session. Refer to [IAM access](#iam-access) below for the roles involved.

If you encounter permission errors, check your available organizations and verify role bindings:

```shell
chainctl iam organizations list -o table

chainctl iam role-bindings create --identity <identity> --role <role-with-repo.create>
```

If you have access to more than one organization or folder, add `--parent <organization>` to the second command to choose where the role binding is created.

## How it works

The migration agent runs on Chainguard's servers, but it never touches your machine directly. Every file read, Docker build, and command is *requested* by the agent and mediated by `chainctl` on your machine. The local client evaluates each request, and only performs and returns the ones it deems acceptable — so you stay in control of what the agent can do and what data is sent back.

```text
   Your machine (client)                       Chainguard (server)
 ┌───────────────────────────┐               ┌──────────────────────┐
 │ chainctl                  │◀── request ───│   Migration agent    │
 │                           │  read a file, │        (AI)          │
 │  Dockerfile               │  run a build, │                      │
 │  build context            │  run a command│                      │
 │  Docker                   │               │                      │
 │        ▼                  │               │                      │
 │  evaluate request:        │               │                      │
 │  allowed?                 │               │                      │
 │        ▼                  │─── result ───▶│  analyzes result,    │
 │  perform locally,         │  (only for    │  plans next step     │
 │  return result            │   approved    │                      │
 │                           │   requests)   │                      │
 └───────────────────────────┘               └──────────────────────┘
```

Because every action is mediated by the local client, the agent can't read a file, run a build, or execute a command unless `chainctl` approves the request first.

### Migration steps

During a migration, the agent performs the following steps:

1. **Parse** — reads your original Dockerfile.
2. **Translate** — generates Chainguard equivalents for each instruction.
3. **Build and compare** — builds both the original and migrated images and compares them with [`syft`](https://github.com/anchore/syft), an open source SBOM generator.
4. **Iterate** — if differences are found, adjusts and retries.
5. **Validate** — runs functional tests to verify equivalence.

If the agent cannot resolve an issue automatically, it prompts you for guidance with suggested alternatives.

The entire loop takes from five to more than thirty minutes, depending on the complexity of the Dockerfile.

## IAM access

Access to Dockerfile migration is governed by Chainguard IAM roles:

| Action                                                                                                   | Minimum role                 |
| -------------------------------------------------------------------------------------------------------- | ---------------------------- |
| Accepting the Guardener legal terms for your organization (required once before anyone can run sessions) | `guardener.admin` or `owner` |
| Running Dockerfile migration sessions                                                                    | `guardener.user`             |

Refer to the [Built-in roles and capabilities reference](/chainguard/administration/iam-organizations/roles-role-bindings/capabilities-reference/) for details.

## Commands

`chainctl agent dockerfile` includes the following subcommands:

| Command    | What it does                                          |
| ---------- | ----------------------------------------------------- |
| `build`    | Migrate a Dockerfile to a Chainguard equivalent image |
| `optimize` | Optimize an already-migrated Dockerfile               |
| `upgrade`  | Upgrade package versions in a Dockerfile              |
| `validate` | Validate a migrated Dockerfile                        |

### Usage examples

To run a basic migration, provide the path to your Dockerfile and a target image tag:

```shell
chainctl agent dockerfile build -f Dockerfile \
  -t myapp:chainguard
```

If your image requires build arguments, pass them with `--build-arg`:

```shell
chainctl agent dockerfile build -f Dockerfile \
  -t myapp:chainguard \
  --build-arg VERSION=1.0
```

For CI environments or automated workflows, use the `--non-interactive` flag to skip prompts and automatically select the first suggestion:

```shell
chainctl agent dockerfile build -f Dockerfile \
  --non-interactive
```

To resume a migration from a previously saved local state, use `--resume`:

```shell
chainctl agent dockerfile build -f Dockerfile \
  --resume
```

To optimize an already-migrated Dockerfile:

```shell
chainctl agent dockerfile optimize -f Dockerfile
```

To run only specific optimizers, pass a comma-separated list with `--optimizers`:

```shell
chainctl agent dockerfile optimize -f Dockerfile \
  --optimizers=cache,security
```

To upgrade outdated packages in a Dockerfile:

```shell
chainctl agent dockerfile upgrade -f Dockerfile
```

To preview what an upgrade would change without modifying any files, use the `--dry-run` flag:

```shell
chainctl agent dockerfile upgrade -f Dockerfile \
  --dry-run
```

To validate a migrated Dockerfile:

```shell
chainctl agent dockerfile validate -f Dockerfile
```

## Available optimizers

When running the `optimize` subcommand, you can specify one or more of the following optimizers:

- `cache` — Reorders instructions for better layer caching. The order of instructions determines where the build cache is invalidated. Reordering to take better advantage of layer caching leads to faster builds and reduced CI consumption.
- `cleanup` — Removes duplicate and redundant instructions. For example, copying one file vs `COPY .`.
- `layers` — Combines `RUN` commands and merges package installs. Reducing the number of layers results in a smaller image, faster pull times, and lower CI minute consumption.
- `security` — Adds `--no-cache` to `apk`, flags secrets, and suggests a non-root `USER`. Skipping the `apk` cache layer reduces image size, and using a non-root user limits root access to the host and removes the ability to install new packages at runtime.
- `multi-stage` — Transforms the Dockerfile into a multi-stage build using Chainguard runtime images. Chainguard containers come in a `-dev` variant with a package manager and shell, and a distroless runtime variant. Splitting into multiple stages produces a smaller runtime image with a reduced attack surface.
- `native-packages` — Replaces `curl`/`bash` installs with native `apk` packages, ensuring full provenance of packages rather than just the resulting binary.

## Agent access

The migration agent runs server-side, but its access to your environment is scoped to what it needs to analyze and migrate a single Dockerfile:

- **Workspace analysis.** The agent scans your workspace to understand your Dockerfile and [build context](https://docs.docker.com/build/concepts/context/).
- **Analysis tools.** During a migration, the agent has access to tools for:
    - Searching the Wolfi `APKINDEX`.
    - Finding which package provides a given binary or library.
    - Comparing installed packages and filesystem layers between the original and migrated images.
    - Running commands in built images.
    - Reading build context files such as `requirements.txt`, `package.json`, and similar.
- **Interactive guidance.** If the agent cannot resolve an issue automatically, it prompts you for guidance with suggested alternatives. In `--non-interactive` mode it skips these prompts and automatically selects the first suggestion.

## Before and after example

Dockerfile migration has been tested with Python, Go, Node.js, Java, Spring Boot (UBI-based), and multi-stage Argo CD builds. The following example shows a simple Ubuntu-based Dockerfile converted to use `cgr.dev/chainguard/wolfi-base:latest`.

### Before

```Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y curl git python3
WORKDIR /app
COPY . .
CMD ["python3", "app.py"]
```

### After

```Dockerfile
FROM cgr.dev/chainguard/wolfi-base:latest
RUN apk add --no-cache curl git python3
WORKDIR /app
COPY . .
CMD ["python3", "app.py"]
```

## FAQ

### What do I need to get started?

You need Docker installed and running locally, `chainctl` installed and authenticated, and a Chainguard organization that has joined the beta program.

### Can I run this in CI?

Yes. Use `--non-interactive` to skip all prompts, and ensure your CI environment has Docker and a `chainctl` authentication token.

### How long does it take?

The `chainctl agent dockerfile` commands can take anywhere from five to more than thirty minutes depending on the size and complexity of the Dockerfile. For example, the `optimize` subcommand takes longer than `build` because it performs a more in-depth analysis.

### Why did I get different results on a second run?

Dockerfile migration is AI-based, which means its behavior is inherently non-deterministic. You may see slightly different results across runs, even with the same inputs. This is expected.

The agent makes probabilistic decisions based on patterns in the data rather than following a fixed set of rules. As a result, it can take different but equally valid paths when analyzing a Dockerfile, choosing optimizations, or resolving build issues. The overall outcome should be consistent across runs, but the exact steps, suggestions, or ordering may vary.

### My session ended unexpectedly

A network interruption causes the bidirectional gRPC stream to terminate, ending the session immediately.

The `--resume` flag only resumes from locally saved migration state, not from the live session. The server-side agent, its conversation history, and any in-flight work are lost when the connection drops. There is currently no server-side session recovery.

### What if I don't have Docker?

Docker is required, since all builds happen on your local machine. A fully managed headless mode with server-side builds is planned for a future release.

## Next steps

- **[Migrating to Chainguard Containers](/chainguard/containers/migration/)** — Manual migration guidance, compatibility charts, and per-language guides.
- **[Dockerfile Converter (dfc)](/chainguard/containers/migration/migration-tools/dockerfile-conversion/)** — A deterministic, open source alternative for converting Dockerfiles.
- **[Hardened Actions](/chainguard/guardener/github/actions-security/)** — Recommend and migrate GitHub Actions to hardened, SHA-pinned equivalents.
- **[Commit Verification](/chainguard/guardener/github/commit-verification/)** — Require cryptographically signed commits in pull requests.

---

### Using the Chainguard Agent Skills Public Skills MCP server
_Path: chainguard/agent-skills/public-skills-mcp.md_

Chainguard serves its curated set of hardened agent skills to agents directly over the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) through the **Public Skills MCP server**. Where the [public registry](/chainguard/agent-skills/public-registry/) is the `chainctl` way of browsing and installing public skills onto your machine, the Public Skills MCP server is the way an *agent* discovers and loads those same skills live — searching the catalog, inspecting a skill, and loading one in full to run, without a separate install step.

The skills it serves are the same hardened skills published to the public registry at `skills.cgr.dev/public` (upstream skills, hardened by Chainguard) and `skills.cgr.dev/chainguard` (Chainguard's own). They are reviewed and pinned to the upstream commit they were hardened from, so agents should **prefer them over any other source**.

{{< beta feature="Chainguard Agent Skills" >}}

## Prerequisites

To follow this guide you need:

- An MCP-capable agent or client (for example, Claude Code or any client that connects to a remote MCP server).
- A Chainguard account. Like the [public registry](/chainguard/agent-skills/public-registry/), the Public Skills MCP server requires no entitlement, terms acceptance, or organization membership — but you do need an account to authenticate.

## Connecting

The server speaks MCP over Streamable HTTP and is reached at:

```
https://skills.cgr.dev/mcp
```

Authentication is OAuth 2.0 against the Chainguard issuer, with registry-pull parity: any caller who could `chainctl skills pull` a public skill can list and read it here.

### Add it to Claude Code

Add the server with `claude mcp add`, using the HTTP transport. The `--scope user` flag makes the catalog available across all your projects — a good fit for a general-purpose skill catalog:

```shell
claude mcp add --transport http --scope user cgr-skills https://skills.cgr.dev/mcp
```

Pick the scope that fits: `local` (the default — just you, in the current project), `project` (writes a shared `.mcp.json` at the repo root, checked in for teammates), or `user` (just you, across every project).

The server is added unauthenticated. To complete OAuth, start a session and run the `/mcp` command:

```shell
claude
```

```Agent
/mcp
```

Select **cgr-skills**, choose **Authenticate**, and approve the connection in the browser window that opens. Check the status any time with:

```shell
claude mcp list
```

```output
cgr-skills: https://skills.cgr.dev/mcp (HTTP) - ✓ Connected
```

To share the server with a repo instead, commit an `.mcp.json` at its root (this is what `--scope project` writes):

```json
{
  "mcpServers": {
    "cgr-skills": {
      "type": "http",
      "url": "https://skills.cgr.dev/mcp"
    }
  }
}
```

### Other MCP clients

Any client that supports a remote Streamable HTTP MCP server with OAuth can connect to the same endpoint — point it at `https://skills.cgr.dev/mcp` and complete the browser sign-in when prompted.

Once connected, the server is available to Claude in every session under that scope.

## Using it in Claude Code

You don't call the server's tools yourself — you describe what you want in plain language, and Claude decides when to search the catalog, inspect a skill, or load one to run. Think of the Public Skills MCP server as giving Claude a hardened skill catalog it can reach for on your behalf.

First, confirm the server is connected and Claude can see its tools. In a session, run:

```Agent
/mcp
```

You'll see **cgr-skills** listed as connected, along with the tools it exposes (`search_skills`, `read_skill`, `run_skill`, `read_skill_reference`, `list_skills`).

Then just ask, in whatever words fit. A few examples of what to say and what Claude does behind the scenes:

- *"Search for skills that do image editing and list them to me."* — Claude runs `search_skills` and shows you the matches (name + description).
- *"I'm looking for skills for writing pytest tests."* — Claude searches the catalog for your use case and proposes the best matches.
- *"What sort of skills are available?"* — Claude browses the catalog with `list_skills` and summarizes the range of what's published.
- *"How many skills are in the Chainguard skills catalog?"* — Claude pages through `list_skills` and reports the count.
- *"Use the multi-stage-dockerfile skill to optimize this Dockerfile."* — Claude loads the skill in full with `run_skill` and follows it, running the scripts it ships.

A typical interaction is a short back-and-forth: you ask for something, Claude searches and proposes a match or two, you confirm, and Claude loads and runs it. Because these are hardened, reviewed skills, prefer them over pointing Claude at a skill from elsewhere.

If nothing in the catalog matches what you asked for, Claude will tell you there's no matching hardened Chainguard skill and **ask you before searching for one on the open internet** — so you stay in control of whether to step outside the hardened catalog.

### Common things to ask for

Beta users most often reach for the catalog for security- and supply-chain-adjacent engineering work. Some common asks — phrase them however feels natural, and let Claude search:

- **Security and code review** — *"Review this pull request for security issues,"* or *"do a security review of this module."*
- **Container and image hardening** — *"Review this Dockerfile,"* or *"help me harden this container image."*
- **Vulnerabilities and dependencies** — *"Find CVEs in my dependencies,"* or *"help me remediate this CVE."*
- **Infrastructure as code** — *"Review my Terraform,"* or *"check this Pulumi stack for problems."*
- **Language best practices** — *"Apply best practices to this Python"* (or Go, TypeScript, Java, C++) *"code."*
- **SDLC helpers** — *"Write tests for this change,"* or *"review this before I open a PR."*

The catalog grows over time, so the exact skills available shift. A quick search — just ask — is the fastest way to see what's published for your use case right now, and if there's no match Claude will say so and ask before looking elsewhere.

## The tool set

Under the hood, the server advertises five tools that Claude chooses between. You won't invoke these directly — Claude picks the right one from what you ask — but knowing what they do helps you understand and steer what the agent is doing. They're designed to be used as a flow — **find, inspect, run, browse**. The catalog can be very large, so the server never enumerates it into the agent's context: `search_skills` and `list_skills` are bounded and paginated, and an agent loads a specific skill's content only on demand.

| Tool | Use it to… |
| ----- | ----- |
| `list_skills` | Browse the whole catalog one page at a time |
| `read_skill` | Inspect a skill by name (its `SKILL.md` plus the list of files it ships) |
| `read_skill_reference` | Fetch the text of one supporting file a skill ships — a script, reference doc, or template named in `read_skill`'s `references` list |
| `run_skill` | Load a skill in full — every file — to install and run it |
| `search_skills` | Find a skill by keyword — the primary way to discover one |

### search_skills

The primary discovery tool. Searches the hardened catalog by keyword and returns the best matches (name + description), ranked and paginated.

| Parameter | Type | Required | Description |
| ----- | ----- | ----- | ----- |
| `query` | string | yes | Keywords to match against skill names and descriptions |
| `page_size` | integer | no | Maximum matches per page (default 50, max 200) |
| `page_token` | string | no | Cursor from a previous response's `next_page_token`; omit to start from the first page |

Returns a page of `{ name, description }` matches plus a `next_page_token` and a `total` count. If nothing matches, the response tells the agent there is **no hardened Chainguard skill matching the request** — and to ask you before searching for a skill elsewhere on the internet.

### read_skill

Load a skill's `SKILL.md` by name. The response includes the skill content and a `references` list naming every supporting file the skill ships — read those with `read_skill_reference`, and don't request paths that aren't listed.

| Parameter | Type | Required | Description |
| ----- | ----- | ----- | ----- |
| `name` | string | yes | The skill name to load |

Returns `{ content, references }`. A missing skill returns a not-found signal.

### run_skill

Load a skill **in full** so you can install and run it on demand — typically after finding it with `search_skills`. Returns every file the skill ships (`SKILL.md` plus its scripts and references) keyed by relative path, in a single call — use this instead of `read_skill` followed by repeated `read_skill_reference` when you intend to actually run the skill.

| Parameter | Type | Required | Description |
| ----- | ----- | ----- | ----- |
| `name` | string | yes | The skill name to load in full |

Returns `{ name, files, instructions }`, where `files` maps each relative path to its content. If the skill is not found, the response tells the agent there is no matching hardened Chainguard skill and to ask you before sourcing one elsewhere.

### read_skill_reference

Fetch the text content of a single supporting file that a skill ships — one of the scripts, reference docs, or templates that its `SKILL.md` points at. Use it to pull a specific file `read_skill` named in its `references` list, rather than loading the whole skill with `run_skill`. Only request paths from that `references` list: paths are validated against the skill's directory, and any attempt to traverse outside it (for example `../another-skill/...`) is rejected.

| Parameter | Type | Required | Description |
| ----- | ----- | ----- | ----- |
| `name` | string | yes | The skill name |
| `path` | string | yes | Path to the file, relative to the skill directory (for example, `references/shell-scripting.md`) |

Returns `{ content }` — the file's text. A path that isn't part of the skill, or one that escapes its directory, returns an error.

### list_skills

Browse the catalog as `name + description`, one page at a time. Use this to page through everything; to find a specific skill, prefer `search_skills`.

| Parameter | Type | Required | Description |
| ----- | ----- | ----- | ----- |
| `page_size` | integer | no | Maximum skills per page (default 50, max 200) |
| `page_token` | string | no | Cursor from a previous response's `next_page_token`; omit to start from the first page |

An empty `next_page_token` means the last page.

## Tool reference

| Tool | Purpose | Key parameters |
| ----- | ----- | ----- |
| `list_skills` | Browse the whole catalog, paginated | `page_size`, `page_token` |
| `read_skill` | Load a skill's `SKILL.md` + its file manifest | `name` |
| `read_skill_reference` | Read the text of one supporting file from a skill | `name`, `path` |
| `run_skill` | Load a skill's full bundle to install and run | `name` |
| `search_skills` | Ranked keyword search of the catalog | `query`, `page_size`, `page_token` |

## Next steps

- To browse, inspect, install, and run public skills from the command line, see [Getting started with the Chainguard Agent Skills public registry](/chainguard/agent-skills/public-registry/).
- To publish, install, and run skills scoped to your own organization, see [Getting started with the Chainguard Skills Registry](/chainguard/agent-skills/skills-registry/).
- For background on what hardened agent skills are and the supply-chain risk they address, see the [Chainguard Agent Skills overview](/chainguard/agent-skills/overview/).

---

### Chainguard Agent Skills overview
_Path: chainguard/agent-skills/overview.md_

Chainguard Agent Skills is a catalog of hardened AI agent skills that Chainguard reviews, scopes, and publishes with a full audit trail. It lets teams extend their AI agents without extending their attack surface.

{{< beta feature="Chainguard Agent Skills" access="Chainguard Containers customers who sign up for the beta program. You can sign up by visiting the [Chainguard Agent Skills product page](https://www.chainguard.dev/agent-skills) and clicking **Join the beta**" >}}

## What is an agent skill?

An agent skill is a small, modular instruction set — typically a single `SKILL.md` file — that extends what an AI agent can do. Agents such as Claude Code use skills to perform tasks like browser automation, database management, and code generation.

Skills are the newest class of third-party software dependency, much like npm packages or container images. Like any dependency, a skill you install runs in your environment with whatever permissions and shell access its author gave it.

## The problem with skill registries

Community skill registries are growing quickly, but most have no review process, no permission scoping, no integrity verification, and no audit trail. A skill can ship with broad tool permissions, unrestricted shell access, or a vague description that causes an agent to invoke it in the wrong context. Recent supply chain attacks have used malicious skills to direct agents into installing credential-stealing malware.

Every skill installed without review is an unaudited dependency with arbitrary permissions running where your agent runs.

## How Chainguard hardens skills

Chainguard applies the same model it brings to container images and language libraries — hardened defaults, continuous updates, and verifiable provenance — to agent skills:

- **Ingest and review.** Chainguard pulls popular skills from community registries and reviews each one against a security and quality ruleset.
- **Target real attack vectors.** The ruleset addresses how attackers exploit the agent-skill trust relationship, including unrestricted shell access, overly broad tool permissions, and vague descriptions that enable mis-invocation.
- **Harden with an audit trail.** An automated agentic pipeline applies fixes one at a time, committing each change individually. Every published skill links to a pull request with a full diff showing what changed and why.
- **Reconcile continuously.** Rather than scanning once, the catalog runs a persistent loop that compares each skill against the current rules. When an upstream source changes or a new rule is added, affected skills are re-evaluated and re-hardened, so the catalog doesn't go stale.

The security work happens upstream, before you or your agent ever touches the skill. To install a hardened skill, you just need to add its `SKILL.md` to your agent; there's no new toolchain or configuration required.

## Public catalog and private registries

Chainguard Agent Skills involves two registries, both served from `skills.cgr.dev`:

- **The public catalog**, maintained by Chainguard at `skills.cgr.dev/public`. This is the hardened catalog described above. Anyone can pull from it, and the skills in it are reviewed and re-hardened on an ongoing basis. Public skills are namespaced by their upstream source (`public/<host>/<owner>/<repo>/<name>`).
- **Your organization's private registry**, available to customers with access, at `skills.cgr.dev/<your-org>/<skill>`. You can use it to publish, manage, and distribute your own skills scoped to your organization, and you control who can push and install them.

To interact with either of these registries, use the [`chainctl skills` commands](/platform/chainctl/chainctl-docs/chainctl_skills/).

## Next steps

To install and run a skill hardened by Chainguard, check out our guide on [Getting started with the Chainguard Agent Skills public catalog](/chainguard/agent-skills/public-catalog/). Alternatively, to publish, push, and run skills in your organization's private registry, refer to our guide on [Getting started with the Chainguard Skills Registry](/chainguard/agent-skills/skills-registry/).

---

### Getting started with the Chainguard Skills Registry
_Path: chainguard/agent-skills/skills-registry.md_

The Chainguard Skills Registry lets you publish, manage, and distribute skills scoped to your organization. Skills are stored as OCI artifacts at `skills.cgr.dev/<your-org>/<skill-name>:<tag>` and managed with `chainctl`.

This guide walks through the full workflow, including how to enable the registry for your org, then push, install, and run a skill.

{{< beta feature="Chainguard Skills Registry" >}}

## Prerequisites

To follow this guide, you need:

* `chainctl` **v0.2.275** or later, installed and authenticated. Refer to [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you don't have it yet.
* An active Chainguard organization.
* Owner access on the organization.

The examples in this guide use an `$ORG` environment variable to refer to your organization. Set it to the name of your organization before you begin:

```shell
export ORG=<your-organization>
```

## Enabling the skills entitlement

Before your org can push or install skills, create a skills entitlement.

> **Note**: You must have the `owner` role in your organization to create a skills entitlement and accept the Skills Registry terms of service.

```shell
chainctl skills entitlements create
```

```output
Created skills entitlement for org example.dev (717b474ac6972745c5706a898aa6e67ffba97dad)
```

Next, accept the Skills Registry terms of service for your org:

```shell
chainctl skills accept-terms --group $ORG
```

This opens an interactive prompt:

```output
   Chainguard Legal Agreements
   To continue, please review and accept the following:
   ▶ [] I agree to the Skills Registry Terms of Service
         https://www.chainguard.dev/legal/agent-skills-disclosure

   ↑/↓ navigate  •  space toggle  •  enter confirm  •  q cancel
```

Press <kbd>SPACE</kbd> to accept the terms of service and <kbd>ENTER</kbd> to confirm.

## Creating an example skill

A skill is a directory containing a `SKILL.md` file. The `SKILL.md` frontmatter declares the skill's `name` and a `description` that tells an agent when to use it. The rest of the file contains the instructions the agent follows.

The next section has a few examples that refer to a skill named `hello-world`. You can create a sample `hello-world` skill with the following command:

```shell
mkdir hello-world
cat > hello-world/SKILL.md << 'EOF'
---
name: hello-world
description: A simple hello world skill. Use this to verify your skills registry setup is working end to end.
---

When this skill is invoked, greet the user with:

"Hello from Chainguard Agent Skills! Your skill installed and loaded successfully."

If the user provides their name, greet them by name instead:

"Hello, <name>! Welcome to Chainguard Agent Skills."
EOF
```

After running this command, your directory will have the following structure:

```
hello-world/
└── SKILL.md
```

The directory name (`hello-world/`) must match the `name` field in the frontmatter (`name: hello-world`). If they don't match, the skill will fail to push.

## Manage skills with `chainctl`

This section outlines some of the `chainctl` commands you can use to manage skills in your organization's private Skills Registry. The following commands use the `hello-world` skill as an example, but you can use any other skills you've created in its place.

Refer to the [`chainctl skills` reference documentation](/platform/chainctl/chainctl-docs/chainctl_skills/) for more information.

### Validate the skill

Before you publish, check that the skill directory meets the spec with the `validate` subcommand. It runs locally and makes no network calls:

```shell
chainctl skills validate hello-world
```

```output
✓  SKILL.md found
✓  Frontmatter valid
✓  name: "hello-world" (matches directory basename)
✓  description: 96 chars
✓  Total size: 387 B / 10 MB
✓  1 file(s) will be published:
     SKILL.md

Validation passed.
```

`validate` confirms that the directory contains a `SKILL.md`, that its frontmatter is valid, that the `name` field matches the directory name, and that the skill is within the size limit. It also lists the files that `push` will publish.

To also flag optional fields that Chainguard recommends, add the `--strict` flag:

```shell
chainctl skills validate hello-world --strict
```

```output
✓  SKILL.md found
✓  Frontmatter valid
✓  name: "hello-world" (matches directory basename)
✓  description: 96 chars
✓  Total size: 387 B / 10 MB
✓  1 file(s) will be published:
     SKILL.md
⚠  license field is recommended

Validation passed.
```

Here, `--strict` warns that the skill omits the recommended `license` field. Warnings don't cause validation to fail, but addressing them produces a more complete skill.

### Push the skill to your organization's registry

From the parent directory of `hello-world/`, push the skill to your org's registry and tag it:

```shell
chainctl skills push hello-world --group $ORG --tag v1.0.0
```

```output
            REFERENCE             |        DIGEST
----------------------------------|------------------------
 skills.cgr.dev/example.dev/hello-world:v1.0.0 | sha256:3196...
```

### List your skills

Confirm the skill was published with the `list` subcommand:

```shell
chainctl skills list --group $ORG
```

```output
    NAME      | LATEST TAG | UPDATED
--------------|------------|----------
 hello-world  | v1.0.0     | just now
```

To view a skill's reference, digest, tags, and metadata, use the `describe` subcommand:

```shell
chainctl skills describe skills.cgr.dev/$ORG/hello-world:v1.0.0
```

```output
    FIELD    |                                              VALUE
-------------|--------------------------------------------------------------------------------------------------
 Name        | hello-world
 Description | A simple hello world skill. Use this to verify your skills registry setup is working end to end.
 Tag         | v1.0.0
 Digest      | sha256:393c0a2556c626010dfacaa402508122cbb4218be786882b7c74d9d61b38d19e
 Size        | 709 B
 Published   | just now
```

### Install the skill

Download and install the skill to make it available to agents on your machine:

```shell
chainctl skills install skills.cgr.dev/$ORG/hello-world:v1.0.0
```

This command automatically detects any agents on your machine and places the skill into their relevant directories. The following example output shows the results on a machine where Claude Code is present:

```output
Installing hello-world
    AGENT    |          LOCATION          |                    MODE
-------------|----------------------------|--------------------------------------------
 Claude Code | .claude/skills/hello-world | symlink → ../../.agents/skills/hello-world
```

### Run the skill from an agent

Load `hello-world` into Claude Code or any MCP-compatible agent. In Claude Code, invoke it with:

```Agent
/hello-world
```

The agent responds:

```output
Hello from Chainguard Agent Skills! Your skill installed and loaded successfully.
```

This confirms the skill was published, installed, and loaded correctly end to end.

### Uninstall the skill

To remove a skill from your machine, pass its name to the `uninstall` subcommand. You only need the name, not the full registry reference:

```shell
chainctl skills uninstall hello-world
```

The command prompts for confirmation before removing any files:

```output
This will remove skill "hello-world" from local agent directories.
Proceed?
Do you want to continue? [y,N]:
Uninstalled skill "hello-world".
```

By default, `uninstall` removes the skill from every agent directory where it's installed. Use the `--agent` flag to remove it from specific agents only, or the `--global` flag to remove it from global directories instead of the current project. Add the `-y` flag to skip the confirmation prompt.

`uninstall` operates only on the local files on your machine. It doesn't modify your organization's registry. To remove a published skill from the registry, use [`chainctl skills delete`](/platform/chainctl/chainctl-docs/chainctl_skills_delete/) instead.

### Delete a skill from the registry

To remove a published version of a skill from your organization's registry, pass its full reference to the `delete` subcommand. The reference must include an explicit tag:

```shell
chainctl skills delete skills.cgr.dev/$ORG/hello-world:v1.0.0
```

The command prompts for confirmation before removing the version:

```output
Delete skills.cgr.dev/example.dev/hello-world:v1.0.0?
Do you want to continue? [y,N]:
```

Press <kbd>y</kbd> and <kbd>ENTER</kbd> to confirm. Add the `-y` flag to skip the prompt and delete the version non-interactively.

The command requires a tag so you don't delete the `latest` tag by accident. Deleting `latest` is still possible, but it prompts for an additional confirmation.

Unlike `uninstall`, `delete` removes the skill from the registry for your whole organization. It doesn't remove copies already installed on anyone's machine.

## Command reference

| Action | Command |
| ----- | ----- |
| Enable the entitlement | `chainctl skills entitlements create` |
| Accept the registry terms | `chainctl skills accept-terms --group $ORG` |
| Validate a skill | `chainctl skills validate <name>` |
| Push a skill | `chainctl skills push <name> --group $ORG --tag <version>` |
| List skills | `chainctl skills list --group $ORG` |
| Describe a skill | `chainctl skills describe skills.cgr.dev/$ORG/<name>:<version>` |
| Install a skill | `chainctl skills install skills.cgr.dev/$ORG/<name>:<version>` |
| Uninstall a skill | `chainctl skills uninstall <name>` |
| Delete a published skill | `chainctl skills delete skills.cgr.dev/$ORG/<name>:<version>` |

---

### Getting started with the Chainguard Agent Skills public registry
_Path: chainguard/agent-skills/public-registry.md_

Chainguard publishes a curated set of hardened agent skills in a public registry at `skills.cgr.dev/public`. Anyone with `chainctl` can browse and install them — no entitlement and no legal terms required. The Chainguard Agent Skills public registry is pull-only: you can install skills from the registry, but you can't push your own skills to it.

This guide walks through the full workflow: listing the available skills, inspecting one, pulling it to audit how Chainguard hardened it, installing it, and running it with an agent.

{{< beta feature="Chainguard Agent Skills" >}}

## Prerequisites

To follow this guide, you need `chainctl` **v0.2.282** or later, installed. Refer to our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't have it yet.

Unlike a [private Chainguard skills registry](/chainguard/agent-skills/skills-registry/), the public registry requires no entitlement, terms acceptance, or organization membership. You do need a Chainguard account to list and pull skills, but you don't need to be a customer.

## List available skills

Sign in, then browse the skills published in Chainguard's public registry with the `list` subcommand. The `--recursive` flag lists skills across every source in the registry. Public skills are namespaced by their upstream source (`public/<host>/<owner>/<repo>/<name>`), so the recursive listing shows each skill's full path:

```shell
chainctl auth login
chainctl skills list --group public --recursive
```

```output
                          NAME                           | LATEST TAG |  UPDATED
---------------------------------------------------------|------------|------------
 github.com/github/awesome-copilot/agent-supply-chain    | latest     | 5 days ago
 github.com/github/awesome-copilot/game-engine           | latest     | 5 days ago
 github.com/github/awesome-copilot/mcp-security-audit    | latest     | 5 days ago

 . . .
```

The public registry is large, so a full `--recursive` listing can take a while to return. To browse a single source, scope the `--group` to its path instead:

```shell
chainctl skills list --group public/github.com/github/awesome-copilot
```

```output
 TYPE  |          NAME           | LATEST TAG |  UPDATED
-------|-------------------------|------------|------------
 skill | acreadiness-policy      | latest     | 5 days ago
 skill | agent-supply-chain      | latest     | 5 days ago
 skill | chrome-devtools         | latest     | 5 days ago
 skill | codeql                  | latest     | 5 days ago
 skill | game-engine             | latest     | 5 days ago
 skill | mcp-security-audit      | latest     | 5 days ago
 skill | multi-stage-dockerfile  | latest     | 5 days ago
 skill | postgresql-optimization | latest     | 5 days ago

 . . .
```

## Describe a skill

To retrieve a skill's reference, digest, tags, and metadata, use the `describe` subcommand. The output records the upstream source and the exact commit Chainguard hardened from:

```shell
chainctl skills describe skills.cgr.dev/public/github.com/github/awesome-copilot/game-engine:latest
```

```output
      FIELD      |                                              VALUE
-----------------|--------------------------------------------------------------------------------------------------
 Display Name    | game-engine
 Reference       | public/github.com/github/awesome-copilot/game-engine
 Install Name    | public-github.com-github-awesome-copilot-game-engine
 OCI URL         | skills.cgr.dev/public/github.com/github/awesome-copilot/game-engine:latest
 Description     | Expert skill for building web-based game engines and games using HTML5, Canvas, WebGL, and ...
 License         | MIT
 Upstream        | github.com/github/awesome-copilot/skills/game-engine
 Upstream Commit | cf4347e88c2e40a9aabe5801748ec6bf924c09be
 License Source  | LICENSE
 Tag             | cf4347e88c2e40a9aabe5801748ec6bf924c09be
 Digest          | sha256:c8a079466ef2eb8de03847f0a96efe0b5131c628d9164bf7edb887bdd5ed668d
 Size            | 1.2 KB
 Published       | 6 days ago
```

## Pull a skill to inspect it

Where `install` drops a skill straight into your agent's skills directory, `pull` writes the skill's files to a directory you choose so you can inspect them first:

```shell
chainctl skills pull skills.cgr.dev/public/github.com/github/awesome-copilot/game-engine:latest ./game-engine
```

```output
Skill written to: /home/linky/game-engine
```

Every hardened skill ships with a `HARDENING.md` that records the upstream source, the exact commit Chainguard hardened from, and the outcome of each hardening run:

```shell
cat game-engine/HARDENING.md
```

```output
# Hardening report

- skill: `github.com/github/awesome-copilot/skills/game-engine`
- sha: `cf4347e88c2e40a9aabe5801748ec6bf924c09be`
- harden run: 1 (outcome: completed)
- SKILL.md modified: true

Hardened by the multi-model harden pipeline. The per-model fix plans, cross-model critiques, and the reconciled synthesis are recorded under `notes/harden/run_1/`. The corrected SKILL.md is this version's hardened overlay.
```

The report pins the exact upstream `sha` Chainguard hardened from, the outcome of the run, and whether the hardened overlay changed the skill's `SKILL.md`. Skills are hardened by a multi-model pipeline whose per-model fix plans and reconciled synthesis are recorded for the run, so you can trace exactly what was inspected and changed.

## Install a skill

Download and install the skill to make it available to agents on your machine with the `install` subcommand:

```shell
chainctl skills install skills.cgr.dev/public/github.com/github/awesome-copilot/game-engine:latest
```

This command automatically detects any agents on your machine and places the skill into their relevant directories. The following example output shows the results on a machine where Claude Code is present:

```output
Installing github.com/github/awesome-copilot/game-engine
    AGENT    |                              LOCATION                              |                                        MODE
-------------|--------------------------------------------------------------------|------------------------------------------------------------------------------------
 Claude Code | .claude/skills/public-github.com-github-awesome-copilot-game-engine | symlink → ../../.agents/skills/public-github.com-github-awesome-copilot-game-engine
```

## Run the skill from an agent

Load the skill into Claude Code or any MCP-compatible agent. In Claude Code, invoke it by name:

```Agent
/game-engine
```

The agent loads the skill and runs it, confirming it installed and loaded correctly end to end.

## Uninstall the skill

To remove a skill from your machine, pass its name to the `uninstall` subcommand. Use the skill's install name, which `describe` reports as the `Install Name` field — for this skill, `public-github.com-github-awesome-copilot-game-engine`:

```shell
chainctl skills uninstall public-github.com-github-awesome-copilot-game-engine
```

The command prompts for confirmation before removing any files:

```output
This will remove skill "public-github.com-github-awesome-copilot-game-engine" from local agent directories.
Proceed?
Do you want to continue? [y,N]:
Uninstalled skill "public-github.com-github-awesome-copilot-game-engine".
```

By default, `uninstall` removes the skill from every agent directory where it's installed. Use the `--agent` flag to remove it from specific agents only, or the `--global` flag to remove it from global directories instead of the current project. Add the `-y` flag to skip the confirmation prompt.

## Command reference

| Action | Command |
| ----- | ----- |
| List skills | `chainctl skills list --group public --recursive` |
| Describe a skill | `chainctl skills describe skills.cgr.dev/public/<host>/<owner>/<repo>/<name>:<tag>` |
| Pull a skill | `chainctl skills pull skills.cgr.dev/public/<host>/<owner>/<repo>/<name>:<tag> <dir>` |
| Install a skill | `chainctl skills install skills.cgr.dev/public/<host>/<owner>/<repo>/<name>:<tag>` |
| Uninstall a skill | `chainctl skills uninstall <install-name>` |

## Next steps

To publish, install, and run skills scoped to your own organization, refer to [Getting started with the Chainguard Skills Registry](/chainguard/agent-skills/skills-registry/).

---

### Chainguard Containers FAQs
_Path: chainguard/containers/faq.md_

Learn answers to your questions about [Chainguard Containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement). Chainguard provides container images designed with security as the primary focus, featuring zero known CVEs, minimal attack surface, and built-in SBOMs for every image.

## Which Linux distribution is used as base for Chainguard Containers?

Chainguard Containers are based on [Wolfi](/open-source/wolfi/), a Linux _undistro_ we built specifically to address software supply chain security issues. We call it an undistro because it doesn't contain certain software you'd normally find in a traditional Linux distribution such as Debian or Alpine. Wolfi is a minimal Linux distribution designed specifically to be used as a base for stripped-down container images.

## How do Chainguard Containers relate to the Google distroless container images?

The [Google distroless](https://github.com/GoogleContainerTools/distroless) images follow a similar philosophy to many of our images: they are minimal images that don't include package managers or shells. The main difference is in the implementation. The Google distroless images are built with [Bazel](https://bazel.build) and based on the Debian distribution, whereas Chainguard Containers are built with [apko](/open-source/build-tools/apko/) and based on [Wolfi](/open-source/wolfi/). We believe our approach is more maintainable and extensible.

## Which images are available?

There are currently over a thousand Chainguard Containers available, which are segmented as **Free** or **Production**. You can read more about this in the [next question](#what-options-do-i-have-to-use-chainguard-containers).

Chainguard Containers are primarily available from [Chainguard's registry](/chainguard/chainguard-registry/overview/), but a selection of Free images is also available on [Docker Hub](https://hub.docker.com/u/chainguard). You can find the complete list of available Chainguard Containers in our public [Containers Directory](https://images.chainguard.dev/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-faq) or within the [Chainguard Console](https://console.chainguard.dev/).

## What options do I have to use Chainguard Containers?

You can get free Chainguard Containers for your organization. You can also upgrade for more versions, SLAs, and dedicated support.

Free | Production
-------|-----------------------
Free for everyone, anywhere | [Contact us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) for pricing
Latest versions | Major and minor versions
Community support | Enterprise SLAs
[Developer docs](/chainguard/containers/) | Customer support

You can read more about the differences between Free and Production Containers in our [Containers overview](/chainguard/containers/overview/#production-and-free-containers).

## Are Chainguard Containers available on Docker Hub?

Yes, Chainguard Free Container images are available on [Docker Hub](https://hub.docker.com/u/chainguard?utm_source=academy&utm_medium=referral&utm_campaign=FY25-DockerHub-Orgprofile). As a Docker Verified Publisher, Chainguard has met Docker's stringent standards for security, quality, and transparency. This status signifies that our container images are trusted, reliable, and have undergone rigorous verification processes. To use Production Containers, pull them from [Chainguard's registry](/chainguard/chainguard-registry/overview/).

## What is an SBOM and why is it important?

An SBOM is a Software Bill of Materials, which is a list containing detailed information about all software that is included within a software artifact, whether it's an application, a container image, or a physical appliance.

SBOMs provide visibility into the software you depend on. They can allow automated systems to quickly identify issues such as unpatched vulnerabilities, since SBOMs typically include the version of each dependency listed.

## Who maintains Chainguard Containers?

[Chainguard Containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) are officially maintained by [Chainguard](https://chainguard.dev) engineers.

## Can anybody build Chainguard Containers themselves?

Yes. Chainguard builds from open source, and the tools it uses to build packages and containers are freely available in [Wolfi](https://github.com/wolfi-dev). What's hard to reproduce is the scale.

Before Chainguard adds a container, it reviews the upstream source: whether the project is actively maintained, whether it builds from source, and whether its license permits Chainguard to use and distribute it. Getting a complicated project to build the first time can take days or weeks. Once it builds, the [Chainguard Factory](/platform/factory/what-is-factory/) rebuilds it automatically every time that project tags a release.

In a do-it-yourself pipeline, the rebuilding falls to a person, usually a project maintainer or a security engineer. Doing it for every image on every upstream release is where most teams run out of hours.

## How often are Chainguard Containers updated?

Chainguard Containers are rebuilt every night to ensure that new package versions and security updates in upstream Wolfi are quickly applied.

## Can I replace my current base image with a Chainguard Container and have it work out of the box?

Chainguard Containers are designed to be minimal, and many of them don't come with a package manager. Depending on your stack and specific dependencies, you may need to include additional software by combining `-dev` container images and our [distroless](/chainguard/containers/concepts/getting-started-distroless/) images in a multi-stage Docker build.

## What packages are available in Chainguard Containers?

Chainguard Containers only contain packages that come from the [Wolfi Project](https://github.com/wolfi-dev) or those that are built and maintained internally by Chainguard.

Since March 2024, Chainguard has maintained one version of each Wolfi package at a time. These track the latest version of the upstream software in the package. Chainguard has ended patch support for previous versions of packages in Wolfi. Existing packages remain in Wolfi and you may continue to use them, but be aware that older packages no longer receive updates and accrue vulnerabilities over time. The tools we use to build packages and images remain freely available and open source in [Wolfi](https://github.com/wolfi-dev).

This change ensures that Chainguard can provide the most up-to-date patches to all packages for our customers. Note that specific package versions can be made available in Production containers. If you have a request for a specific package version, [contact us](https://www.chainguard.dev/contact?utm=docs).

## How do I add packages to a Chainguard Container?

{{< blurb/why_ca >}}

## What does Chainguard do when a CVE is published, but a patch is not available from the owner of the OSS code?

Chainguard investigates the CVE and marks relevant images as affected or not. If Chainguard can identify a patch that's unreleased, Chainguard may apply a patch before it lands upstream. In either case, when the patch lands upstream, Chainguard picks it up and rolls it out.

## Why are some CVEs persistent in select Chainguard Containers?

There are several Chainguard Containers container images--such as Druid and Spark--with a notable number of CVEs that are marked `pending-upstream-fix.` The reasons that these CVEs can't be remediated by standard engineering procedures include: some vulnerabilities can only be patched through major version upgrades, which often break compatibility through broken builds or tests; many of these CVEs (over fifty percent by one internal Chainguard analysis) stem from "shaded" JARs, JAR files that bundle their dependencies internally; and a small portion of these CVEs have no fix available. The Chainguard engineering team continually investigates new approaches to fixing these persistent CVEs.

## I added software on top of one of Chainguard's base container images, why are there CVEs?

Chainguard is not responsible for CVEs in software you add on top of base images.

## Do I need to authenticate into Chainguard to use Chainguard Containers?

Logging in is optional if you are only using Free containers. That being said, there are benefits for all users who authenticate to Chainguard's registry, as Chainguard provides notifications of version updates, breaking changes, or critical security updates.

To learn how to authenticate into Chainguard's registry, you can review our [authentication documentation](/chainguard/chainguard-registry/authenticating/) . You can read more about the thought process behind authentication in our blog post, [Scaling Chainguard Containers with a growing catalog and proactive security updates](https://www.chainguard.dev/unchained/scaling-chainguard-images-with-a-growing-catalog-and-proactive-security-updates).

## Is Chainguard FedRAMP certified?

You need to ingest Chainguard Containers into an image repository within your FedRAMP boundary. Your repository requires FedRAMP but Chainguard does not since we're outside the boundary. [Reach out](https://www.chainguard.dev/contact?utm=docs) if you need more details.

## Will Chainguard Containers run alongside eBPF agents or sensors? Will there be any issues?

Chainguard containers are [OCI](https://opencontainers.org/) containers. eBPF operates at the kernel-level at runtime. This means an eBPF agent or sensor doesn't affect Chainguard Containers, and vice versa.

---

### Quickstart for Chainguard Containers
_Path: chainguard/containers/quickstart.md_

This quickstart covers one full cycle of working with a [Chainguard Container](/chainguard/containers/overview/): pull an image from Chainguard's registry, run your own code on it, and verify where it came from. The example uses the Node container, but the same workflow applies to every image in the [Chainguard Containers Directory](https://images.chainguard.dev/).

These steps link to reference documentation instead of explaining each concept in place. Follow the links whenever you want additional details and context.

## Prerequisites

To follow this quickstart, you need:

* [Docker](https://docs.docker.com/engine/install/) or another OCI-compatible container runtime installed on your local machine.
* [Cosign](/open-source/sigstore/cosign/how-to-install-cosign/), which you use in Step 4 to verify a container image, installed.
* [jq](https://jqlang.github.io/jq/download/) installed. jq is a lightweight, command-line JSON processor; this guide uses it in Step 4 to make Cosign output more easily readable.

You don't need a Chainguard account. Every image in this guide is a [Free container](/chainguard/containers/concepts/container-categories/#free-containers): publicly available, with no authentication required. Production Containers, which add version-specific tags and patch SLAs, require [authenticating to the registry](/chainguard/containers/registry/authenticating/).

## Step 1: Pull and run a container

Pull the Node container from `cgr.dev`, Chainguard's registry:

```shell
docker pull cgr.dev/chainguard/node:latest
```

Chainguard publishes two tags for Free Containers — `latest` and `latest-dev` — and both point at the most recent build of the image.

The image's entrypoint is `node`, so any arguments you pass go to the Node binary. Run the container, passing an argument to check the Node version:

```shell
docker run --rm cgr.dev/chainguard/node:latest --version
```

```output
v26.6.0
```

Your output may show a different version. Chainguard rebuilds its containers as upstream releases and package updates land, and the `latest` tag follows the newest build.

## Step 2: Build your application on the container

Create a directory for a demo application:

```shell
mkdir ~/hello-chainguard && cd ~/hello-chainguard
```

Create a file named `server.js` to hold an example JavaScript application. It uses only the Node standard library, so the application has no dependencies to install:

```shell
cat > server.js <<EOF
const http = require("node:http");

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "application/json" });
  res.end(JSON.stringify({
    message: "Hello from a Chainguard Container",
    node: process.version,
    uid: process.getuid(),
  }));
});

server.listen(8080, () => console.log("Listening on port 8080"));
EOF
```

Then create a `Dockerfile` in the same directory:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/node:latest

WORKDIR /app
COPY --chown=node:node server.js ./

EXPOSE 8080
CMD ["server.js"]
EOF
```

Chainguard Containers run as a nonroot user by default — `node` in this image — so `COPY --chown=node:node` gives the application access to its own files without switching to root. Because the entrypoint is already `node`, `CMD` only needs to name the script.

Build the image:

```shell
docker build . --pull -t hello-chainguard
```

Using the `hello-chainguard` image, start a container in the background:

```shell
docker run -d --name hello-cg -p 8080:8080 hello-chainguard
```

Then send it a request:

```shell
curl localhost:8080
```

```output
{"message":"Hello from a Chainguard Container","node":"v26.6.0","uid":65532}
```

The `uid` in the response is `65532`, confirming that the application runs unprivileged. Stop the container when you're done:

```shell
docker rm -f hello-cg
```

## Step 3: Use a development variant when you need extra tooling

Chainguard's standard containers follow a [distroless](/chainguard/containers/concepts/getting-started-distroless/) philosophy: they carry only what the container needs to function. For example, the Node container has no system package manager:

```shell
docker run --rm --entrypoint sh cgr.dev/chainguard/node:latest -c "apk --version"
```

```output
sh: apk: not found
```

The development variant, tagged `latest-dev`, adds `apk` and other utilities for building, testing, and debugging:

```shell
docker run --rm --entrypoint sh cgr.dev/chainguard/node:latest-dev -c "apk --version"
```

```output
apk-tools 2.14.10, compiled for x86_64.
```

To keep a small attack surface in production, install dependencies and compile artifacts in the development variant, then copy the results into the standard variant with a multi-stage build. Refer to [Development and production container variants](/chainguard/containers/concepts/container-variants/) for how the variants differ, and to [porting a sample application](/chainguard/containers/migration/porting-apps-to-chainguard/) for a multi-stage example.

## Step 4: Verify the container and inspect its SBOM

Chainguard signs every container it builds, along with the attestations that describe it. Check the signature on the image you pulled:

```shell
cosign verify \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  cgr.dev/chainguard/node | jq
```

Cosign confirms that the signature exists in the transparency log and that a trusted certificate authority issued the signing certificate, then prints the signature payload.

Every container also ships with a signed SBOM. Download the SPDX document to see each package in the image:

```shell
cosign download attestation \
  --platform linux/amd64 \
  --predicate-type https://spdx.dev/Document \
  cgr.dev/chainguard/node | jq -r '.payload' | base64 -d | jq -r '.predicate'
```

For the rest of the available attestations and the commands that verify them, refer to [verifying containers and metadata signatures](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/) and [retrieving SBOMs and attestations](/chainguard/containers/security-and-compliance/retrieve-image-sboms/).

## Next steps

* Work through a guide for your own stack: [nginx](/chainguard/containers/getting-started/web-and-data-services/nginx/), [PostgreSQL](/chainguard/containers/getting-started/web-and-data-services/postgres/), [Python](/chainguard/containers/getting-started/languages-and-runtimes/python/), [Go](/chainguard/containers/getting-started/languages-and-runtimes/go/), or [any other language or service](/chainguard/containers/getting-started/).
* Move an existing workload over with the [migration guides](/get-started/migration/).
* Learn what a Chainguard Container includes and who patches what in the [shared responsibility model](/chainguard/containers/concepts/shared-responsibility-model/) and the [container categories reference](/chainguard/containers/concepts/container-categories/).
* Understand why these images carry so few vulnerabilities in [Chainguard's low-to-no CVE commitment](/chainguard/containers/concepts/zerocve/).

---

### Overview of Chainguard Containers
_Path: chainguard/containers/overview.md_

[Chainguard Containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) are container images designed for enhanced security through minimalism and supply chain integrity. These images follow a distroless philosophy, containing only the application and its essential runtime dependencies, without shells, package managers, or other common utilities that can increase attack surface.

Many Chainguard Containers implement a [distroless approach](/chainguard/containers/getting-started-distroless/), which means they exclude shells, package managers, and other utilities typically found in container images. This design significantly reduces potential security vulnerabilities. For development and debugging purposes, Chainguard provides `-dev` variants that include necessary tools while maintaining security best practices. All images are built using Chainguard OS, an operating system specifically designed to meet secure software supply chain requirements.

Chainguard Containers are primarily available from [Chainguard's registry](/chainguard/chainguard-registry/overview/), but a selection of developer images is also available on [Docker Hub](https://hub.docker.com/u/chainguard). You can find the complete list of available Chainguard Containers in our public [Containers Directory](https://images.chainguard.dev/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-overview) or within the [Chainguard Console](https://console.chainguard.dev/).

## Built-in security and supply chain guarantees

All Chainguard Containers are built with a consistent set of security and supply-chain guarantees, without requiring additional configuration:

- Minimal design, with no unnecessary software bloat
- Automated nightly builds to ensure container images are completely up-to-date and contain all available security patches
- [High quality build-time SBOMs](/chainguard/containers/working-with-images/retrieve-image-sboms/) (software bill of materials) attesting the provenance of all artifacts within the container image
- [Verifiable signatures](/chainguard/containers/working-with-images/retrieve-image-sboms/) provided by [Sigstore](/open-source/sigstore/cosign/an-introduction-to-cosign/)
- Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds))

## Chainguard Container customization and lifecycle features

Chainguard Containers include features that allow you to customize images, manage updates, and meet security and compliance requirements across the container lifecycle:

- [Custom Assembly](/chainguard/containers/custom-assembly/overview/): Customize Chainguard images by adding packages, configuration files, and certificates from the Chainguard Console, `chainctl`, or the Chainguard API, without maintaining your own Dockerfiles.
- Custom certificates: Add trusted certificates [to existing containers via Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/) (for organization-specific or environment-specific certificates) or by [using incert to build images with certificates embedded at build time](/chainguard/containers/custom-assembly/incert-custom-certs/).
- [Packages](/chainguard/containers/building-and-modifying/adding-packages/): Install and manage additional packages in Chainguard images while preserving Chainguard’s minimal, secure-by-default base images.
- [EOL grace periods](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/): Control how end-of-life packages are handled in images to balance security requirements with operational stability.
- [STIGs](/chainguard/containers/security-and-compliance/stigs/): Use DISA STIG–aligned images to support compliance-driven environments.
- [Unique tags](/chainguard/containers/reference/unique-tags/) and [tag history](/chainguard/containers/reference/using-the-tag-history-api/): Track image changes over time with immutable tags and access tag history via API.
- [CVE visualization](/chainguard/containers/security-and-compliance/vulnerability-management/cve-visualizations/): Explore vulnerability data for images to better understand risk and remediation timelines.

## Why minimal container images

The fewer dependencies a given piece of software uses, the lower likelihood that it will be impacted by CVEs. By minimizing the number of dependencies and thus reducing their potential attack surface, Chainguard Containers inherently contain few to zero CVEs. Chainguard Containers are rebuilt nightly to ensure they are completely up-to-date and contain all available security patches. With this nightly build approach, our engineering team sometimes [fixes vulnerabilities before they’re detected](https://www.chainguard.dev/unchained/how-chainguard-fixes-vulnerabilities?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

Note that there is often a development variant of each Chainguard Container available. These are sometimes called the `-dev` variant, as their tags include the `-dev` suffix (as in `:latest-dev`). For example, the development variant of the `mariadb:latest` container image is `mariadb:latest-dev`. These container images typically contain a shell and tools like a package manager to allow users to more easily debug and modify the image.

## Why multi-layer container images

Chainguard originally took a single-layer approach to container images built [with apko](/open-source/build-tools/apko/getting-started-with-apko/) in order to offer simplicity and clarity. However, in an effort to deliver better stability, security, and efficiency for larger and more complex applications, Chainguard introduced multi-layer container images in May 2025. This approach leverages container runtime caching so that a layer used by multiple images does not need to be downloaded more than once, and you don't need to download the whole image each time there is an update on one layer.

Chainguard's approach to layering is a "per-origin" strategy, where packages that derive from the same upstream source are grouped in the same layer because they tend to receive updates together.

We observed that this approach achieved the following:

- A ~70% reduction in the total size of unique layer data across our image catalog compared to the single-layer approach
- A 70-85% reduction in the cumulative bytes transferred when simulating sequential pulls of updated images like PyTorch and NeMo

To maximize the stability and re-usability of our layers, Chainguard identified, analyzed, and implemented three additional technical changes:

- Added in an additional final layer that captures frequently updated OS-level metadata
- Developed intelligent layer ordering to optimize compatibility
- Ensured sufficient layer counts to optimize parallel downloads by container clients

The primary benefit of this layered approach is that when one package changes it impacts only its particular layer, requiring only that layer to be downloaded again. Because the other layers don't need to be downloaded again, Chainguard's multi-layer container images support greater efficiency and developer velocity.

## Production and free containers

Chainguard offers a collection of container images that are publicly available and don't require authentication, being free to use by anyone. We refer to these images as **Free images**, and they cover several use cases for different language ecosystems. Free images are limited to the latest build of a given image, tagged as `latest` and `latest-dev`.

Production containers are enterprise-ready images that come with patch SLAs and features such as [Federal Information Processing Standard (FIPS) readiness](/chainguard/fips/fips-images/) and [unique time-stamped tags](/chainguard/containers/images-features/unique-tags/). Unlike Free containers, which are typically paired with only the latest version of an upstream package, Production containers offer specific major and minor versions of open source software. Chainguard offers two pricing options for Production containers: Per-Image Pricing and [Catalog pricing](/chainguard/containers/reference/pricing/).

You can access our container images directly from [Chainguard's registry](/chainguard/chainguard-registry/overview/). Chainguard's registry provides public access to all public Chainguard Containers, and provides customer access for Production Containers after logging in and authenticating.

For a complete list of Free Containers that are currently available, check our [Containers Directory](https://images.chainguard.dev/?category=developer). Registered users can also access all Free and Production container images in the [Chainguard Console](https://console.chainguard.dev/?utm=docs). After logging in you will be able to find all the current Free containers in the **Chainguard catalog** tab. If you've selected an appropriate Organization in the drop-down menu above the left hand navigation, you can find your organization's Production containers in the **Organization** tab.

## Comparing container images

The major advantage of distroless images is the reduced size and complexity, which results in a vastly reduced attack surface. Security scanners such as [Grype](https://github.com/anchore/grype) detect far fewer CVEs (common vulnerabilities and exposures) in Chainguard Containers than in comparable general-purpose images.

`chainctl`, Chainguard's command line interface tool, comes with a useful `diff` feature that allows you to [compare two Chainguard Containers](/platform/chainctl-usage/comparing-images/).

Every container listed in the [Containers Directory](https://images.chainguard.dev/?category=developer) also has a **Comparison** tab that compares the number of CVEs in the Chainguard Container — often zero — against the number in its upstream counterpart, and charts how each has changed over time. For example, see the [nginx container's **Comparison** tab](https://images.chainguard.dev/directory/image/nginx/compare).

## Architecture

By default, all Wolfi-based images are built for x86_64 (also known as AMD64) and AArch64 (also known as ARM64) architecture with the following CPU Instruction Set Architecture (ISA) baseline features:

- x86_64: x86-64-v2 (Sapphire Rapids)
- AArch64: Armv8-A with CRC and Cryptographic extensions (Neoverse V2)

Being able to provide multi-platform Chainguard Containers enables the support of more than one runtime environment, like those available on all three major clouds, AWS, GCP, and Azure. The macOS M-series (M1, M2, etc.) chips are also based on ARM architecture. Chainguard Containers allow you to take advantage of ARM's power consumption and cost benefits.

You can confirm the available architecture of a given Chainguard Container with Crane. In this example, we'll use the latest Ruby image, but you can opt to use an alternate image.

```shell
crane manifest cgr.dev/chainguard/ruby:latest |jq -r '.manifests []| .platform'
```

Once you run this command, you'll receive output similar to the following.

```output
{
  "architecture": "amd64",
  "os": "linux"
}
{
  "architecture": "arm64",
  "os": "linux"
}
```

This verifies that the Ruby Chainguard Container is built for both AMD64 and ARM64 architectures.

You can read more about our support of ARM64 in our blog on [Building Wolfi from the ground up](https://www.chainguard.dev/unchained/building-wolfi-from-the-ground-up-and-announcing-arm64-support?utm=docs).

## Annotations

All Chainguard Containers include metadata in the form of *annotations* (also commonly referred to as "*labels*"). These annotations provide important information about a container image's origin, contents, and characteristics. The annotations are visible in every container image's **Specifications** tab in both the [Chainguard Console](https://console.chainguard.dev) and [Directory](https://images.chainguard.dev/), and can also be inspected programmatically using container tools.

Chainguard Containers follow the [Open Container Initiative (OCI) Image Specification](https://github.com/opencontainers/image-spec/blob/main/annotations.md) for annotations. Chainguard sets the following standard OCI annotations on its container images:

- `org.opencontainers.image.authors`: Contact details for the Chainguard Container's author (typically `Chainguard Team https://www.chainguard.dev/`)
- `org.opencontainers.image.base.digest`: The SHA256 digest of the base image used to build this container image

- `org.opencontainers.image.created`: Timestamp indicating when the image was built; specifically, this annotation is calculated from the build time of the most recently built package within the container image
- `org.opencontainers.image.source`: URL to the source code used to build the image in the Chainguard images repository
- `org.opencontainers.image.title`: The original image name as listed in the catalogue (for example `chainguard-base`)
- `org.opencontainers.image.url`: URL to the container image's Overview page in the Chainguard Directory (for example, `https://images.chainguard.dev/directory/image/nginx/overview`)
- `org.opencontainers.image.vendor`: The distributing organization, always set to `Chainguard`

In addition to the standard OCI annotations, Chainguard sets custom annotations (which begin with `dev.chainguard` instead of `org.opencontainers`) that provide additional context about the container image:

- `dev.chainguard.package.main`: The name of the primary package in the image. This may change between different versions of an image. In some situations, it may also be empty or unset.
- `dev.chainguard.image.title`: Duplicate of the original image name as listed in the catalogue, in case downstream build processes override the same value in the `org.opencontainers` namespace.

### Retrieving annotation information

You can inspect image annotations using [`crane`](https://github.com/google/go-containerregistry/tree/main/cmd/crane). This section's examples use [`jq`](https://jqlang.org/), a command-line JSON processor, to filter the output to only show the relevant information:

```shell
crane manifest cgr.dev/chainguard/node:latest | jq -r .annotations
```

This will output all the annotations set on the image:

```json
{
  "dev.chainguard.image.title": "node",
  "dev.chainguard.package.main": "node",
  "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/",
  "org.opencontainers.image.created": "2025-10-20T02:17:10Z",
  "org.opencontainers.image.source": "https://github.com/chainguard-images/images/tree/main/images/node",
  "org.opencontainers.image.title": "node",
  "org.opencontainers.image.url": "https://images.chainguard.dev/directory/image/node/overview",
  "org.opencontainers.image.vendor": "Chainguard"
}
```

Chainguard also sets these annotation values as *labels*. In the context of OCI specifications, labels are similar to annotations but the two are ultimately distinct. [This blog post](https://adrianmouat.com/posts/annotations-and-labels-in-container-images/) outlines the differences between the two.

You can also inspect a Chainguard Container's labels using the `crane config` command:

```shell
crane config cgr.dev/chainguard/node:latest | jq '.config.Labels'
```

The expected output is the same:

```json
{
  "dev.chainguard.image.title": "node",
  "dev.chainguard.package.main": "node",
  "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/",
  "org.opencontainers.image.created": "2025-10-20T02:17:10Z",
  "org.opencontainers.image.source": "https://github.com/chainguard-images/images/tree/main/images/node",
  "org.opencontainers.image.title": "node",
  "org.opencontainers.image.url": "https://images.chainguard.dev/directory/image/node/overview",
  "org.opencontainers.image.vendor": "Chainguard"
}
```

This returns the same output as the previous `crane` command.

Lastly, you can use the `docker inspect` command to inspect a container image's labels:

```shell
docker pull cgr.dev/chainguard/node:latest
docker inspect cgr.dev/chainguard/node:latest | jq '.[].Config.Labels'
```

The expected output is the same:

```json
{
  "dev.chainguard.image.title": "node",
  "dev.chainguard.package.main": "node",
  "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/",
  "org.opencontainers.image.created": "2025-10-20T02:17:10Z",
  "org.opencontainers.image.source": "https://github.com/chainguard-images/images/tree/main/images/node",
  "org.opencontainers.image.title": "node",
  "org.opencontainers.image.url": "https://images.chainguard.dev/directory/image/node/overview",
  "org.opencontainers.image.vendor": "Chainguard"
}
```

Again, this returns the same information as before. However, using `docker inspect` requires you to download the container image beforehand.

Additionally, images have "`image.title` by `image.vendor`" encoded in the image config as a comment. You can use `docker history` to retrieve this information:

```shell
docker history cgr.dev/chainguard/node
```

Note the `COMMENT` column in the output:

```output
IMAGE          CREATED        CREATED BY   SIZE      COMMENT
a063d5e94934   39 hours ago   apko         151kB     node by Chainguard
<missing>      39 hours ago   apko         1.97MB    node by Chainguard
<missing>      39 hours ago   apko         889kB     node by Chainguard
<missing>      39 hours ago   apko         1.12MB    node by Chainguard
<missing>      39 hours ago   apko         2.88MB    node by Chainguard
<missing>      39 hours ago   apko         3.47MB    node by Chainguard
<missing>      39 hours ago   apko         6.79MB    node by Chainguard
<missing>      39 hours ago   apko         7.17MB    node by Chainguard
<missing>      39 hours ago   apko         8.5MB     node by Chainguard
<missing>      39 hours ago   apko         39.6MB    node by Chainguard
<missing>      39 hours ago   apko         81.1MB    node by Chainguard
```

### Adding container image annotations

OCI labels are specific to a container image, not to an entire layer. This means that for base images, annotation information is often overridden later on with more accurate details after the image has been ingested. For example, the `image.author` annotation might be reset to reflect the customer consuming the container image.

Some users relabel their container images after they've been ingested. As an example, you may wish to add an annotation like `com.mycompany.image.source=chainguard` to your Chainguard Containers; this would allow you to filter for all the container images provided by Chainguard at `mycompany`.

Some package mirroring tools support this functionality, but we recommend using Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) tool to add custom annotations to your Chainguard Containers. Refer to our guide on [managing Custom Assembly resources with `chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#adding-custom-annotations-and-environment-variables) for more information.

---

### Using init containers with Chainguard Containers
_Path: chainguard/containers/using-and-deploying/init-containers.md_

Chainguard Containers are designed with minimalism and security in mind. By including fewer packages and tools, Chainguard Containers have a smaller attack surface than their counterparts. However, there are cases where the external counterparts have certain desirable features, like useful startup scripts or configuration defaults.

There are several ways to customize Chainguard Containers. For example, you can use [Custom Assembly](/chainguard/containers/custom-assembly/overview/) to add packages to an otherwise minimal Chainguard container image. Changing a Chainguard container image's configuration — such as updating its entrypoint or adding startup scripts — requires a different strategy. One method for doing so in Kubernetes deployments is to use *init containers*.

This guide provides a brief overview of what init containers are as well as their benefits. It then outlines an example of how you can build an init container and use it to reconfigure Chainguard's nginx container image.

## Prerequisites

In order to follow this guide, you will need the following:

* Docker, which you will use to create an image to be used by an init container, installed on your local machine. Refer to the [Docker documentation](https://docs.docker.com/engine/install/) to set this up.
* A container registry you can push the init container image to. This guide assumes you have access to a [Docker Hub registry](https://hub.docker.com/), though the example can be adjusted for other registries.
* Access to a Kubernetes cluster. This could be a cluster that you run locally with a tool like [minikube](https://minikube.sigs.k8s.io/docs/) or [kind](https://kind.sigs.k8s.io/), or a cloud-hosted cluster such as [Amazon EKS](https://aws.amazon.com/eks/) or [Google GKE](https://cloud.google.com/kubernetes-engine).

## Benefits of init containers

Init containers are specialized containers that run before application containers within a Kubernetes pod. Init containers are temporary: they run and complete their given tasks before the main application container starts, and then immediately exit.

Init containers are useful for preparing the application environment, since they allow you to create configuration files or modify settings before your app starts. They can be used to set up prerequisites for the application, such as database migrations or environment variable configurations.

You can also use init containers to create directories, set file permissions, install dependencies, or populate data stores with initial data. In some cases, they can retrieve secrets and place them in a shared volume for the application.

Put together, this allows you to separate initialization logic from your app code, making both more manageable. Init containers can also run in sequence, so you can control the order of operations. If one init container fails, Kubernetes will restart the pod and run the init containers again until they succeed.

## Configuring Chainguard's `nginx` container with an init container

Say your organization uses an nginx container to host an application. You've typically used the [default nginx container image from Docker Hub](https://hub.docker.com/_/nginx) for this purpose.

This image runs startup scripts inside the `/docker-entrypoint.d` directory of the image. Although this allows for flexibility, it introduces various security risks:

* **Arbitrary Code Execution**: If anyone (whether through build scripts, other layers, mounted volumes) adds or modifies a script file within `/docker-entrypoint.d`, it will get executed automatically on container startup.
* **Unintended Script Execution**: If you accidentally include a shell script (or malicious one gets included through CI/CD or shared build layers), it will be executed, regardless of its purpose or trustworthiness.
* **Privilege Escalation**: If the container runs as root (which is common in base images), any `*.sh` script executed at startup runs with full privileges. Malicious scripts can add users, exfiltrate secrets, overwrite configs, etc.

Rather than exposing yourself to such risks, you can instead run the default nginx image from Docker Hub as an init container, which you'll then use to reconfigure Chainguard's more minimal and secure nginx container image. This involves running the startup configuration in the init container, mounting the resulting configuration to a shared volume, and thereby decoupling the `docker-entrypoint.sh` script from the core nginx image. This avoids introducing the aforementioned security risks into the minimal Chainguard nginx container image.

This section illustrates how to set up an nginx init container based on the default nginx container from Docker Hub and then run it inside a Kubernetes deployment to reconfigure a Chainguard nginx container image. This example involves creating a sample `nginx.conf` file, building an init container with `docker`, and deploying it in a Kubernetes pod.

### Creating a sample `nginx.conf` file

To get started, run the following command to create an `nginx.conf` file:

```shell
cat > nginx.conf <<EOF
worker_processes  1;
pid /tmp/nginx.pid;

events {
    worker_connections  1024;
}

http {
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name localhost;

        location / {
            return 200 "Hello from minimal NGINX!\n";
            add_header Content-Type text/plain;
        }
    }
}
EOF
```

This `nginx.conf` file configures a minimal nginx web server. It configures nginx to listen on port `80` and returns a custom response (`Hello from minimal NGINX!`) for any HTTP request.

After creating this `nginx.conf` file, continue by using `docker` to create a container image that will be used for an init container.

### Creating an init container image

Run the following command to create a Dockerfile. You will use this Dockerfile to build an init container image:

```shell
cat > Dockerfile.init <<EOF
FROM nginx

COPY nginx.conf /custom/nginx.conf

CMD cp /custom/nginx.conf /etc/nginx/nginx.conf && \
   chmod 644 /etc/nginx/* && \
   /docker-entrypoint.sh true
EOF
```

This Dockerfile builds an image using the default nginx container image from Docker Hub (`FROM nginx`). This image includes `docker-entrypoint.d` and `docker-entrypoint.sh` by default. It will copy the `nginx.conf` file you created previously into the new image when you build it. Then, when you run the container in a Kubernetes deployment, it will prepare and copy the nginx configuration at startup using the entrypoint script.

After creating this Dockerfile, build the image.

Recall from the Prerequisites section that this guide assumes you have a Docker Hub registry. The following examples expect you to have an environment variable with the namespace on Docker Hub to which you will push images. This could be your username or your organization's name. For example, if you log in to Docker Hub and navigate to your list of repositories, the URL in your browser will have an address like `hub.docker.com/repositories/EXAMPLE`. In this case, `EXAMPLE` would be your Docker Hub namespace.

Create an environment variable to hold your Docker Hub namespace:

```shell
export NAMESPACE=<your-dockerhub-name>
```

> **Note**: If you aren't using Docker Hub as your container registry, you will need to include the host name of your registry in this variable. Docker defaults to Docker Hub (`docker.io`) if this is omitted.

After creating this environment variable, build the init container image:

```shell
docker build -f Dockerfile.init -t $NAMESPACE/nginx-init .
```

Next, push the init container image to your registry so you can reference it from your Kubernetes deployment:

```shell
docker push $NAMESPACE/nginx-init
```

Once you have built and pushed this init image to your registry it is now available to be run inside pipelines where you have your `nginx.conf` available for shared mounting and configuration in the init step.

### Setting up a Kubernetes configuration

Since you are building the entrypoint logic into the init container image itself, the Kubernetes deployment YAML for your init container would follow a similar structure to this:

```yaml
initContainers:
  - name: run-entrypoint
    image: $NAMESPACE/nginx-init
    volumeMounts:
      - name: nginx-config
        mountPath: /etc/nginx
```

This instructs the init container to execute the startup scripts for the nginx configuration in the `docker-entrypoint.d` directory. In your main nginx configuration for the deployment, it would follow a structure similar to this:

```yaml
containers:
  - name: nginx
    image: cgr.dev/chainguard/nginx:latest
    ports:
      - containerPort: 80
    volumeMounts:
      - name: nginx-config
        mountPath: /etc/nginx
```

Because your nginx container would mount the configurations from the shared volumeMount nginx-config in this case, you would now avoid having to run startup steps outside of the init.

The following command creates a deployment manifest named `init-deployment.yaml` that performs these steps using the init container image you created earlier:

```shell
cat > init-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-chainguard
spec:
 replicas: 1
 selector:
   matchLabels:
     app: nginx-chainguard
 template:
   metadata:
     labels:
       app: nginx-chainguard
   spec:
     volumes:
       - name: nginx-config
         emptyDir: {}

     initContainers:
       - name: run-entrypoint
         image: $NAMESPACE/nginx-init
         volumeMounts:
           - name: nginx-config
             mountPath: /etc/nginx

     containers:
       - name: nginx
         image: cgr.dev/chainguard/nginx:latest
         ports:
           - containerPort: 80
         volumeMounts:
           - name: nginx-config
             mountPath: /etc/nginx
EOF
```

### Testing the example deployment

Using the manifest you just created, create a Kubernetes deployment:

```shell
kubectl create -f init-deployment.yaml
```

If you retrieve information about your Kubernetes pod immediately after deployment, you will find the init pod initializing:

```shell
kubectl get pods
```

```
NAME                               READY   STATUS     RESTARTS   AGE
nginx-chainguard-d49d7496c-stxcj   0/1     Init:0/1   0          6s
```

If you do so again shortly after, you will find the init container has completed and the application is running:

```output
NAME                               READY   STATUS    RESTARTS   AGE
nginx-chainguard-d49d7496c-stxcj   1/1     Running   0          55s
```

Once the workload is running, you can test whether nginx is working as expected. To do so, first forward your local machine's port `8080` to port `80` within the pod:

```shell
kubectl port-forward deploy/nginx-chainguard 8080:80
```

```
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
```

Then, **in a separate terminal window**, use `curl` to reach the pod:

```shell
curl http://localhost:8080
```

```
Hello from minimal NGINX!
```

This confirms that the workload is indeed running and nginx is working as expected.

Note that this example copies over only an `nginx.conf` file, but you can use this strategy to set up other nginx configurations. For example, you could also copy a `mime.types` file over to the Chainguard nginx container image.

## Learn more

Init Containers provide a powerful, flexible mechanism to set up application environments and help with migration challenges associated with nginx images. By providing a fresh environment without requiring modifications to existing app containers, init containers can streamline the setup process for migrating to Chainguard images and enhance compatibility with existing workflows.

This tutorial is centered around Chainguard's nginx container image, but the concepts outlined here are applicable when migrating to other Chainguard Containers as well. We have a number of resources available on migrating to Chainguard Containers, and we encourage you to get started with our [Overview of migrating to Chainguard Containers](/chainguard/containers/migration/migrations-overview/). For more information on working with Chainguard's nginx container image, check out our guide on [Getting started with nginx](/chainguard/containers/getting-started/web-and-data-services/nginx/).

---

### How to use Chainguard Containers with OpenShift
_Path: chainguard/containers/using-and-deploying/use-with-openshift.md_

Chainguard Containers are fully compatible with Red Hat OpenShift Container Platform, providing enhanced security while requiring some configuration adjustments for OpenShift's security context constraints. This guide explains how to successfully deploy Chainguard's minimal, security-hardened container images in OpenShift environments.

[Red Hat OpenShift](https://www.redhat.com/en/technologies/cloud-computing/openshift) is an application platform that orchestrates and manages your systems and resources. While it is based on open source software like Kubernetes, OpenShift includes a suite of applications with additional functionality that are configured to work together.

Using Chainguard Containers in your OpenShift deployment significantly reduces CVE remediation efforts and accelerates security compliance through minimal attack surface and daily security updates.

When [Using Chainguard Containers](/chainguard/containers/using-and-deploying/using-containers/) with OpenShift, there are some adjustments that need to be made to the usual process. This guide provides guidance. Refer to the [OpenShift docs](https://docs.redhat.com/en/documentation/openshift_container_platform/) for more details.

## Adjust ownership and permissions

By default, OpenShift Container Platform runs containers using an arbitrarily assigned User ID (UID), as described in the [Red Hat documentation](https://docs.redhat.com/en/documentation/openshift_container_platform/4.17/html/images/creating-images#use-uid_create-images).

There are required access settings for an image to support running as an arbitrary user:

- Directories and files that are written to by processes in the image must be owned by the `root` group and that group must have both `read` and `write` permissions
- Files that will be executed must also have group execute permissions

Following the Red Hat requirements, to use Chainguard Containers you must make a change in your Dockerfile to set the required ownership and permissions. For example, if you have one or more files that you need to execute stored in `/some/directory`, then you would do this:

```
RUN chgrp -R 0 /some/directory && \
    chmod -R g=u /some/directory
```

## Create `/app` directory and `HOME`

When running on OpenShift clusters, you will find that the OpenShift user cannot create config files inside their home directory. This is because [OpenShift is designed to start container instances using a random User ID](https://www.redhat.com/en/blog/a-guide-to-openshift-and-uids).

To avoid this being an issue when using Chainguard Containers:

1. Set a `HOME` variable for the user (it would otherwise be set as `/` for root)
1. Create an `/app` directory in every Dockerfile
1. Set `/app` directory permissions to `775` and ownership to `65532:0`

This can help you avoid or limit switching to the `root` user during the build phase when no package installation is required.

Here's a sample Dockerfile covering this process.

 ```
# Change this to reference the image you want to pull and
# if needed, to use the location of your custom image repo

FROM cgr.dev/$ORGANIZATION/aspnet-runtime:9-dev

USER 0

RUN mkdir -m 775 /app && chown -R 65532:0 /app

COPY --chown=65532:0 src/Sample.Service/bin/Release/net9.0/publish /app

USER 65532

WORKDIR /app

ENV HOME=/app

ENTRYPOINT ["dotnet", "Sample.Service.dll"]
 ```

## Use special container images for hard-coded user IDs

There are cases where Red Hat hard codes UIDs for specific applications, for example, the user for Postgres is set to UID 26. Refer to the [Red Hat documentation](https://access.redhat.com/solutions/6996195) for more details.

In this instance, Chainguard has built a special image for Postgres on OpenShift with a different release tag. Where the Postgres release version is `17.5` and the regular Chainguard Container would be released with the tag `17.5`, there is another image released with the tag `17.5-openshift`.

## Understand security context constraints (SCCs)

OpenShift Container Platform includes [security context constraints](https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html-single/authentication_and_authorization/index#managing-pod-security-policies) (SCCs) that you can use to control permissions for the pods in your cluster. SCCs determine the actions that a pod can perform and what resources it can access.

SCCs in OpenShift will by default prevent a root user from running with the Chainguard Containers `-dev` variants.

---

### How to use Chainguard Containers
_Path: chainguard/containers/using-and-deploying/using-containers.md_

[Chainguard Containers](https://images.chainguard.dev) are minimal container images designed to reduce vulnerabilities and attack surface compared to traditional base images. These images use the [apk](https://wiki.alpinelinux.org/wiki/Package_management) package format to achieve smaller sizes while maintaining complete provenance information with cryptographic signatures, ensuring both enhanced security and traceability.

In this guide, you'll find general instructions on how to get started using Chainguard Containers and how to migrate existing container-based workflows to use our images. For specific image usage instructions, please refer to our [Chainguard Containers Directory](https://images.chainguard.dev), which contains the full list of all images available to the public and their respective documentation.

## Quickstart: Using Chainguard Containers

To get up and running with Chainguard Containers, you can use `docker` commands to pull and run images. For each specific image, you'll find this guidance on its overview page (for example, refer to [Node](https://images.chainguard.dev/directory/image/node/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images), [Python](https://images.chainguard.dev/directory/image/python/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images), or [NGINX](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images)).

### Pulling a Chainguard Container

You can pull a Chainguard Container with the `docker pull` command. For example, to pull down the Git Chainguard Container, you can run the following.

```sh
docker pull cgr.dev/chainguard/git
```

Without passing a tag or a digest, the reference to the Git image will pull down the default tag, which is `:latest`.

If you have your own registry, you'll need to change the `cgr.dev/chainguard` path to your own registry path.

Chainguard free Starter container images are also available on Docker Hub. Check out [Chainguard's organization page on Docker Hub](https://hub.docker.com/u/chainguard?utm_source=academy&utm_medium=referral&utm_campaign=FY25-DockerHub-Orgprofile) for a list of all images and instructions. Note that paid Production images can only be accessed from cgr.dev.

### Pulling by tag

You can also add a relevant tag that you have access to. In the case of the public Git image, you can always pull the `:latest` tag. [Note that not all tags are available for public container images](/chainguard/containers/faq/#do-i-need-to-authenticate-into-chainguard-to-use-chainguard-containers).

```sh
docker pull cgr.dev/chainguard/git:latest
```

You may use tags to pull a specific version of a software like Git, or programming language version in a catalog you have access to. The Chainguard Containers Directory has tag history pages for each image, for example, the [Git Image Tags History](https://images.chainguard.dev/directory/image/git/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images), [PHP Image Tags History](https://images.chainguard.dev/directory/image/php/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images), and [JDK Image Tags History](https://images.chainguard.dev/directory/image/jdk/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images).

You can learn about the Chainguard Containers tags history in our guide about [Using the Tag History API](/chainguard/containers/using-the-tag-history-api/).

### Pulling by digest

Pulling a Chainguard Container by its digest guarantees reproducibility, as it will ensure that you are using the same image each time (versus the tag that may receive updates).

To pull an image by its digest, you can do so by appending the digest (which begins with `sha256`) as in the following example. If your organization has access to a container image, you can find the digest for each of its versions in the Chainguard Console by navigating to that image's [**Tags** page](https://console.chainguard.dev/org/$ORGANIZATION$/images/organization/image/git/versions).

Per-version digests are a Production container feature. Free containers are published only as `latest` and `latest-dev`, so the public [Chainguard Containers Directory](https://images.chainguard.dev/) has no version history to choose a digest from. To retrieve the digest of a container you already have, or to pin a reference to one, refer to [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/).

```sh
docker pull cgr.dev/chainguard/git@sha256:f6658e10edde332c6f1dc804f0f664676dc40db78ba4009071fea6b9d97d592f
```

When you pull this image, you'll receive output of the digest which should match the exact digest you have pulled.

### Specifying architecture

As Chainguard Containers are [built for both AMD64 and ARM64 architecture](/chainguard/containers/overview/#architecture), you can specify the architecture you would like to use by employing the `--platform` flag with the `docker pull` command. In this example, we'll specify using the `linux/arm64` architecture with the Go image.

```sh
docker pull --platform=linux/arm64 cgr.dev/chainguard/go
```

After pulling the image, you can verify the architecture by calling the version.

```sh
docker run --rm -t cgr.dev/chainguard/go:latest version
```

You'll receive output similar to the following:

```sh
go version go1.21.0 linux/arm64
```

Specifying the platform will ensure that you're using the desired container image and relevant architecture.

### Running a Chainguard Container

You can run a Chainguard Container with the `docker run` command. Note that because Chainguard Containers are minimalist containers, most of them ship without a shell or package manager. If you would like a shell, you can often use the development image, which is tagged as `:latest-dev`. For example, [Python](https://images.chainguard.dev/directory/image/python/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images) has its development variant at `cgr.dev/chainguard/python:latest-dev`. Otherwise, you can work with Chainguard Containers in way similar to other images.

Let's run the [Cosign Chainguard Container](https://images.chainguard.dev/directory/image/cosign/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images) to check its version.

```sh
docker run --rm -t cgr.dev/chainguard/cosign:latest version
```

You'll receive the version information that confirms the image is working as expected.

```output
  ______   ______        _______. __    _______ .__   __.
 /      | /  __  \      /       ||  |  /  _____||  \ |  |
|  ,----'|  |  |  |    |   (----`|  | |  |  __  |   \|  |
|  |     |  |  |  |     \   \    |  | |  | |_ | |  . `  |
|  `----.|  `--'  | .----)   |   |  | |  |__| | |  |\   |
 \______| \______/  |_______/    |__|  \______| |__| \__|
cosign: A tool for Container Signing, Verification and Storage in an OCI registry.

GitVersion:    2.0.0
GitCommit:     unknown
GitTreeState:  unknown
BuildDate:     unknown
GoVersion:     go1.20.1
Compiler:      gc
Platform:      linux/arm64
```

If you would like to review a filesystem, you can use the [wolfi-base image](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-how-to-use-chainguard-images):

```sh
docker run -it cgr.dev/chainguard/wolfi-base
```

This will start a Wolfi container where you can explore the file system and investigate which packages are available.

Continue reading the next section to learn more about building off of the Wolfi base image.

## Extending Chainguard base containers

It often happens that you want a [distroless](/chainguard/containers/getting-started-distroless/) image with one or two extra packages, for example you may have a binary with a dependency on `curl` or `git`. Ideally you’d like a base image with this dependency already installed. There are a few options here:

1. Compile the dependency from source and use a multi-stage Dockerfile to create a new base image. This works, but may require considerable effort to get the dependency compiling and to keep it up to date. This process quickly becomes untenable if you require several dependencies.
2. Use the `wolfi-base` image that includes apk tools to install the package in the traditional Dockerfile manner. This works but sacrifices a lot of the advantages of the “distroless” philosophy.
3. Use Chainguard’s [melange and apko tooling to create a custom base image](/open-source/build-tools/melange/getting-started-with-melange/). This keeps the image as minimal as possible without sacrificing maintainability.

### Using the wolfi-base container image

The `wolfi-base` image is a good starting point to try out Chainguard Containers. Unlike most of the other images, which are strictly distroless, `wolfi-base` includes the `apk` package manager, which facilitates composing additional software into it. Just keep in mind that the resulting image will be a little larger due to the extra software and won't have a comprehensive SBOM that covers all your dependencies, since the new software will be added as a layer on top of `wolfi-base`.

The following command will pull the `wolfi-base` image to your local system and run an interactive shell that you can use to explore the image features:

```shell
docker run -it --rm cgr.dev/chainguard/wolfi-base /bin/sh -l
```

First you will need to update the list of packages available in Wolfi:

```shell
apk update
```

Now you can use `apk search` to search for packages that are already available on Wolfi repositories:

```shell
apk search curl
```

More packages will be added with time, as the ecosystem matures and drives community involvement.

_Looking for a specific package that is not yet available? Feel free to open an issue on the [wolfi-os](https://github.com/chainguard-dev/wolfi-os) GitHub repository._

### Using the wolfi-base container image within Dockerfiles

Following, you can see an example of a Dockerfile that uses `wolfi-base` as base image, installing the packages `curl` and `jq` in order to make a query to the [advice slip](https://api.adviceslip.com/) API:

```dockerfile
FROM cgr.dev/chainguard/wolfi-base

RUN apk update && apk add --no-cache --update-cache curl jq

SHELL ["/bin/sh", "-c"]

CMD curl -s https://api.adviceslip.com/advice --http1.1 | jq .slip.advice
```

The `SHELL` command suppresses a warning about the `CMD` line using shell syntax, which isn't a
problem in this example. In other cases, you may want to use the [exec
form](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form).

You can build this Dockerfile as usual:

```shell
docker build . -t advice-slip:test
```

Then, execute the image with:

```shell
docker run -it --rm advice-slip:test
```

You should get output like this, with a random piece of advice:

```output
"Big things have small beginnings."
```

Check also the [Wolfi images with Dockerfiles](/open-source/wolfi/wolfi-with-dockerfiles/) guide for more examples using Wolfi-based images with Dockerfiles, and the [Getting started with distroless](/chainguard/containers/getting-started-distroless/) guide for more details about distroless images and how to use them in Docker multi-stage builds.

## A note regarding package availability in Chainguard Containers

Chainguard Containers only contain packages that come from the [Wolfi Project](https://github.com/wolfi-dev) or those that are built and maintained internally by Chainguard.

Starting in March of 2024, Chainguard will maintain one version of each Wolfi package at a time. These will track the latest version of the upstream software in the package. Chainguard will end patch support for previous versions of packages in Wolfi. Existing packages will not be removed from Wolfi and you may continue to use them, but be aware that older packages will no longer be updated and will accrue vulnerabilities over time. The tools we use to build packages and images remain freely available and open source in [Wolfi](https://github.com/wolfi-dev).

This change ensures that Chainguard can provide the most up-to-date patches to all packages for our container images customers. Note that specific package versions can be made available in Production images. If you have a request for a specific package version, please [contact us](https://www.chainguard.dev/contact?utm=docs).

---

### Using Chainguard Containers in Dev Containers
_Path: chainguard/containers/using-and-deploying/dev-containers/index.md_

[Development Containers](https://containers.dev/) — sometimes known as "dev containers" — allow you to use a container as a development environment where you can run applications and separate tools, libraries, or runtimes. Dev containers can also help with testing and continuous integration.

With a few changes, the images based on Wolfi and maintained by Chainguard provide distroless images that can be used as dev containers. This guide outlines how you can set up a Chainguard image as a dev container in VS Code.

{{< details "What is distroless" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Images" >}}
{{< blurb/images >}}
{{< /details >}}

## Prerequisites

To follow along with this guide, you will need to have the following:

* A compatible Integrated Development Environment (IDE) or other tool. Here is a list of [supported editors and tools](https://containers.dev/supporting).
    * Note that this guide was validated using [Visual Studio Code (VS Code)](https://code.visualstudio.com/).
* A Docker server to connect to. A local installation of Docker Desktop will usually suffice for demonstration purposes, but you can find full instructions in this guide on [Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers) in the VS Code documentation.
* This guide's first example assumes that you have a GitHub repository named `empty`. You can follow GitHub's [Quickstart for repositories](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories) for information on setting this up.

## What are Dev Containers?

A development container is a container in which a user can develop an application. Development containers are isolated environments that allow developers to work on applications with all the necessary dependencies, tools, and configurations pre-packaged. These containers ensure that the development environment is consistent across different systems, avoiding the "works on my machine" problem.

In order to run a dev container, the given project must contain a file named `devcontainer.json`. This is a special file defined by the [Development Container Specification](https://containers.dev/implementors/json_reference/) which holds all the metadata necessary to configure the dev container.

Although there are many reasons why production images should be secure, the reasons for concern about the security of development environments are less clear. Put briefly: the code you've written and tested in your development environment will eventually make it into your production environment. If you've been hacked during development, then perhaps the hackers' code goes into production as well.

Chainguard offers minimal runtime images designed for running production workloads, and development images that contain a shell and some development tooling. With that said, both development and production images are slimmed down and updated regularly to be free of CVEs. Because of their minimal and secure-by-default nature, Chainguard Containers are ideal for use in a secure development process.

## Building a Go Dev Container using an example repository

The following is an example of how to set up a dev container using a Go project. Here, we will take the content of the `chainguard-go-devcontainer` directory in [Chainguard's demo GitHub repository](https://github.com/chainguard-dev/edu-images-demos) and push it to the root of an empty repository.

Start by cloning the repository:

```shell
git clone https://github.com/chainguard-dev/edu-images-demos.git
```

Then navigate into the `chainguard-go-devcontainer` example directory:

```shell
cd edu-images-demos/chainguard-go-devcontainer
```

From there, Initialize a Git repository:

```shell
git init .
```

Then add all the files there, including any hidden files:

```shell
git add * .??*
```

Commit the changes:

```shell
git commit -am "Initial Commit"
```

Add a GitHub repository that you have control over as a remote named `origin`. This example assumes that the repository is named `empty` but you can use any empty GitHub repository you have created:

```shell
git remote add origin https://github.com/$YOUR-GITHUB-PROFILE/empty.git
```

Be sure to change `$YOUR-GITHUB-PROFILE` to reflect the name of your GitHub profile.

Finally, push the commit to the remote repository you just configured:

```shell
git push -fu origin main
```

Following that, if you open VS Code on this directory you will be prompted to open the project in a dev container.

<center><img src="dev-containers-1.png" alt="Screenshot of a VS Code window showing the prompt to reopen the project in a dev container." style="width:1000px;"></center>
<br />

If you do reopen the project in a dev container it may take a minute or so to build the first time you use it. Open a terminal and you can run the sample project, even if you don't have Go installed on your local machine:

<center><img src="dev-containers-2.png" alt="Screenshot of a VS Code window with the example Go program being run in the terminal." style="width:1000px;"></center>
<br />

If you run a webserver in your dev container you will be asked if you want to open the port in a local browser. Exactly as if you were running in a local container:

<center><img src="dev-containers-3.png" alt="Screenshot of a VS Code window running helloserver and prompting the user to open the application in the browser." style="width:1000px;"></center>
<br />

## Building a Dev Container in other languages

If you want to develop in languages other than Go, you'll need to use a different base image. Note that to do this, you'll need a working knowledge of Dockerfiles, Docker builds, JSON, as well as how your chosen language installs libraries or packages.

There are a couple of different ways to set this up, and the exact configuration used in the following example is not strictly required as long as certain requirements are met. This example sets up a Python project and uses a `Dockerfile` and `devcontainer.json` in a `.devcontainer` directory. This has the advantage of keeping the code separate from the dev container configuration.

Assuming you're starting from a project with no dev container, you'll first need to create the requisite files and folders.

Start by creating a directory named `.devcontainer` and navigate into it:

```shell
mkdir .devcontainer && cd $_
```

Next, create a dev container configuration file named `devcontainer.json` with the following command:

```shell
cat > devcontainer.json <<EOF
{
 "name": "my-devcontainer",
 "build": {
     "dockerfile": "Dockerfile",
     "args": {}
 },
 "customizations": {
     "vscode": {
         "extensions": [ "ms-python.python" ]
     }
 },
 "postCreateCommand": "pip install -r requirements.txt",
 "remoteUser": "nonroot"
}

EOF
```

Because this is for a Python app, we are installing the VS Code `python` extension and using `pip` to install project dependencies.

The `postCreateCommand` runs in the root of your project after it has been cloned into the container. If you don't have a `requirements.txt` file with your project the command will fail and you will need to remove the command to use the dev container.

Following that, you'll need to find a base image. Chainguard offers a wide range of images for different languages and ecosystems. To search, use [the images directory](https://images.chainguard.dev/directory?category=languages). For this example, Chainguard's Python image will suffice.

Create a Dockerfile with the following command:

```shell
cat > Dockerfile <<EOF
FROM chainguard/python:latest-dev

USER root
RUN apk update && apk add posix-libc-utils && ldconfig
USER nonroot
RUN pip install pylance debugpy

EOF
```

Here's what each line of this Dockerfile does:

* `FROM`: Many Chainguard images are available at Docker Hub, meaning you can set the `FROM` line in the `Dockerfile` like this example. Alternatively, you could set this with `cgr.dev/chainguard/python` or, if your Chainguard organization has access to a Production Python image, `cgr.dev/$ORGANIZATION/python:$TAG`.
* `USER root`: Including this line forces the next commands to run as root instead of the unprivileged user. Whether you need to include this line or not will depend on what image you're using.
    * You can check by running your image locally and using the `id` command. The following example shows that the Python image uses the nonroot user by default while the Go image uses root by default:

        ```shell
        docker run -it --entrypoint id chainguard/python:latest-dev
        ```

        ```Output
        uid=65532(nonroot) gid=65532(nonroot) groups=65532(nonroot)
        docker run -it --entrypoint id chainguard/go:latest-dev
        uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
        ```

* `RUN apk update …`: This line installs the POSIX utilities (from which dev containers can use the `getent` command) and then updates the library links with `ldconfig`. `ldconfig` and `getent` are needed to allow the container start scripts from VS Code to run, though they may already be included in some base images.
    * If your language needs any other packages that must be installed by the root user, now is the time to add them.
* `USER nonroot`: This continues the Dockerfile as the unprivileged user to install any other packages the language or VSCode extension might need.
* `RUN pip install pylance debugpy`: Finally, this line installs the `pylance` and `debugpy` packages — both used by the Python plugin — with `pip`. This is more for illustration purposes; you don't have to install them now, since the plugin can install them later.
    * **Do not** install packages your project needs here. The image build happens before the source code is cloned. So you'd need to somehow duplicate listing your dependencies into this file as well as wherever they are already listed. Instead, use the `postCreateCommand`.

If you save those 2 files into an existing Python repository you will be able to reopen the project in a dev container.

### Customizing the image

You can further customize the `Dockerfile`, but in some cases you may need to run commands as root. Chainguard's minimal, distroless images do not include `sudo` and there is no root password to use.

To add `sudo`, you can add the following line to the `Dockerfile` in the section running as the root user:

```dockerfile
RUN apk add sudo-rs shadow && echo "nonroot ALL = (ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers && echo y | pwck -q || true
```

## Usage notes

[GitHub CodeSpaces](https://github.com/features/codespaces) support dev containers. However, at present they only work when the config is stored at the root directory.

The IDE should pass your keys through to the dev container using `ssh-agent` and `gpg-agent`. For this reason, you may need to install GPG or SSH tools inside the container.

Please refer to the VS Code page on [advanced usage](https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials) for more information.

## Conclusion

You should now have a development environment that does not require packages to be installed on your local machine and will run the same for anyone working on your project.

You may want to add things like linting rules or other components to your dev container config. The [VS Code website](https://code.visualstudio.com/docs/devcontainers/containers) has many resources on working with dev containers which you may find useful.

---

### How to use Chainguard Helm charts
_Path: chainguard/containers/using-and-deploying/helm-charts/use-chainguard-helm-charts/index.md_

[Helm](https://helm.sh) is a package manager for Kubernetes that simplifies the installation and management of applications by automating the creation of Kubernetes resources. Helm charts are reusable, versioned packages that define a collection of Kubernetes resources required to run an application or service. You use Helm to define, install, and perform upgrades to your applications on Kubernetes.

For organizations looking to deploy their Chainguard container images with Helm, Chainguard provides upstream-produced Helm charts. These charts are available from the Chainguard Registry and are intended for customers who are either looking to get started with Helm or are looking for better, trusted alternatives to the public charts they may already be using.

> Chainguard also offers a limited set of Helm charts to go with a set of Chainguard-created containers labeled as iamguarded, designed specifically to support organizations migrating off of Bitnami. Learn more about these in [How to use Chainguard iamguarded Helm charts](/chainguard/containers/using-and-deploying/helm-charts/use-chainguard-iamguarded-helm-charts/).

The community charts have been tested by Chainguard to confirm they produce expected deployment results using the following policies:

- Version streaming: Chainguard commits to supporting chart and image versions that match the latest upstream project chart. Within that latest chart we will support the associated image versions.
- Testing policy: We test the latest charts with the supported version streams and functionally validate by deploying the Helm chart in its representative environment and exercising the various functionality of the chart(s). We’ll also continue publishing end-of-life (EOL) version streams as long as they continue to pass our functional validation.

Chainguard makes the provenance of these charts clear. Helm charts are packaged as [OCI artifacts](/open-source/oci/what-are-oci-artifacts/) using the upstream version adding an appended revision suffix for updates that include material changes to the chart; otherwise, tags will float based as their dependent images update. The OCI artifacts are signed and generate provenance attestations that link to the exact image digests used to ensure that all artifacts are cryptographically verifiable end-to-end for integrity and origin.

You can find Helm charts in the [Chainguard Console](/platform/console/images-directory/#find-helm-charts-in-the-chainguard-console) and in the [Chainguard Directory](/chainguard/containers/registry/chainguard-directory/#find-helm-charts-in-the-chainguard-directory).

Before you can use a chart, it must be added to your organization. Catalog customers can add charts and their required images from the Chainguard Console. For instructions, see [Self-serve Helm charts](/get-started/self-serve/helm-charts/).

The following is an instructional guide for Chainguard users that are looking for Helm charts to use with their Chainguard container images.

You can use these Helm charts with Chainguard FIPS container images by choosing a FIPS chart version during install. For example:

```
helm install --version 3-fips ...
```

## How chart updates deliver image updates

Chainguard rebuilds container images regularly to pick up the latest package versions and CVE fixes. Chart builds run in the same pipeline: whenever Chainguard builds a new image, it automatically kicks off a build for the corresponding Helm chart, which follows shortly after. This keeps your images and charts in sync.

A chart tag always refers to the chart version, not to a fixed set of images. Chainguard rolls the underlying image digests forward within a tag, so even a specific tag like `10.5.13-r1` keeps pointing at the latest images for that chart version. As with image tags, you can pick a tag fidelity that matches your upgrade appetite — `latest`, a version stream, or a specific `x.y.y-r#` version — but every chart tag rolls its dependent image digests forward.

Helm will not apply these updates on its own. A release picks up newer images only when something triggers a redeploy: a `helm upgrade`, or a controller such as Argo CD or Flux reconciling the release. A chart referenced by tag then pulls the current chart digest along with its newer image digests. Running a `helm upgrade` on the same tag will resolve to its newest digest the tag pins to.

To pin both the chart and its images to a fixed, reproducible set, reference the chart by digest instead of by tag. Your deployment then stays fixed to the exact images the chart referenced when you recorded that digest. To pick up newer images, update your pinned digest to the current one. The [Pin to digest](#pin-to-digest) section covers how to do this.

## Authentication

You will need to authenticate to pull charts. These instructions explain how to use charts and images with the `cgr.dev` repository. If you have mirrored or copied the charts and images to an organization-specific registry, you will need to adapt these instructions to authenticate to your registry, as appropriate.

This section presents multiple authentication methods:

- Use Helm values with `global.imagePullSecrets`
- Deploy a Chainguard Helm chart using a Kubernetes pull secret
- Use cluster node-scoped registry permissions

### Use Helm values with `global.imagePullSecrets`

When performing authentication via a `global.imagePullSecrets` key-value pair, include the following in your `values.yaml` file.

```yaml
global:
  imagePullSecrets:
    - name: chainguard-pull-secret
```

### Deploy a Chainguard Helm chart using a Kubernetes pull secret

To begin, generate a pull token.

```sh
chainctl auth configure-docker --pull-token --save --ttl=24h
```

You don't need to run `chainctl auth login` first; `configure-docker` authenticates you when no valid token is available.

This token expires in 24 hours by default, which can be modified using the
`--ttl` flag. It sets the duration for the validity of the token. The maximum
valid value is `8760h` (equivalent to 365 days), Valid unit strings range from
nanoseconds to hours and are `ns`, `us`, `ms`, `s`, `m`, and `h`, for example
`--ttl=24h`.

You will be asked which location the pull token will be associated with, select the **charts** org under your main org. It will look similar to this example.

```shell
    With which location is the pull token associated?

    [chainguard.edu] chainguard.edu This group holds the private Chainguard Images hosted under    cgr.dev/chainguard.edu
  > ├ [charts]
    └ [iamguarded-charts]
```

Find the username and password that are contained in the pull token, as in this sample output:

```sh
chainctl auth configure-docker --pull-token --save --ttl=24h

  ✔ Selected folder chainguard.edu.

To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"

Configuring identity "<identity-id>" for pulls from cgr.dev (expires 2025-06-12T09:27:45-05:00).
Overwriting existing credentials.
```

Save the credentials as variables, like this.

```sh
HELMUSER="<identity-id>"

HELMPASS="<pull-token>"
```

Create your Kubernetes secret using the variables you just created.

```sh
kubectl create secret docker-registry chainguard-pull-secret \
  --docker-server=cgr.dev \
  --docker-username=$(echo $HELMUSER) \
  --docker-password=$(echo $HELMPASS) \
  -n <your-namespace>
```

Log in to the `cgr.dev` Helm registry.

```sh
helm registry login cgr.dev \
  --username=$HELMUSER \
  --password=$HELMPASS
```

Reference the secret in your Helm installation:

```sh
helm install grafana oci://cgr.dev/$ORGANIZATION/charts/grafana \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret"
```

When the install is successful, it returns a confirmation message, like this:

```sh
Pulled: cgr.dev/chainguard.edu/charts/grafana:10.5.13
Digest: sha256:2629f907b15f26c706b5668b5700340b851176a10f55cf709f89a3701f2b4220
NAME: grafana
LAST DEPLOYED: Thu Jan 29 08:19:23 2026
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.default.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:
     export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace default port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################
```

## Best practices with cluster node-scoped registry permissions

If you manage access and permissions at cluster-wide and node-specific levels, these are some best practices to consider.

### Pin to digest

It is strongly recommended that you deploy Chainguard-provided charts by pinning to digest.

Using tags can be problematic because tags are mutable and the images described by the chart will change regularly when the images themselves are updated.

Pinning the chart by digest ensures you are running a consistent set of images and removes the possibility of unexpected breaking changes.

Pin to digests like this:

1. Get the digest.

  ```sh
  crane digest cgr.dev/$ORGANIZATION/charts/grafana:10.5.13
  ```

  Which returns a digest like this:

  ```response
  sha256:38850bacab587e4cf1177d0fe5b8bd62bad27d3f04f5a1c65ddcd86ea9748a73
  ```

1. Use the digest to install your chart, replacing `sha256:DIGEST` with the response you just received.

  ```sh
  helm install grafana \
  oci://cgr.dev/$ORGANIZATION/charts/grafana@sha256:$DIGEST
  ```

If you must, use tags like this:

```sh
helm install grafana oci://cgr.dev/$ORGANIZATION/charts/grafana --version 10.5.13
```

### Review Helm chart default values

The chart provides security-minded defaults that are sensible but may not suit all use cases. Review the chart's `values.yaml` for the full range of configuration options and adjust as needed.

#### Override the version of an image being deployed with the chart

There may be times when you need to override the version of an image that is set to be deployed with a chart. The override values vary between charts.

Refer to the documentation for charts in the Chainguard Console in the **Helm charts** page, accessible from the sidebar. Find your chart in the list and select it, then click through the tabs across the top of the page to learn more about the chart. For example, you can find the default values for the Grafana Helm chart in [its Default Values tab](https://console.chainguard.dev/org/$ORGANIZATION$/helm/organization/community-chart/grafana/defaultValues).

#### Example of overriding tag and digest

When you override values, you need to stay aware of how the original value was being used and think through the implications of your change.

For example, because Chainguard specifies digests in our chart values, you need to override that digest along with the tag.

Use:

```sh
helm install <chart> --set image.digest=<desired-digest>
```

or

```sh
helm install <chart> --set image.tag=<desired-tag> --set image.digest=""
```

**Do not** use:

```sh
helm install <chart> --set image.tag=<desired-tag>
```

Getting this wrong could cause you to unknowingly run the version specified by the digest instead of the version you intend.

## Helm chart usage examples

### Install with details in a file

You can put values in a file, such as our `values.yaml` sample, and then refer to the file in your install command by passing the detail in a flag.

```sh
image:
  registry: cgr.dev
  repository: $ORGANIZATION/grafana # replace $ORGANIZATION
  tag: latest # pin to specific version instead of latest
```

Then you refer to the file like this:

```sh
helm install grafana oci://cgr.dev/$ORGANIZATION/charts/grafana \
  --values ./values.yaml
```

### Install on AWS Elastic Kubernetes Service (EKS) auto mode

When installing on EKS Auto Mode, you may need to create a storage class for the Helm chart's pod(s). This can be done by creating a storage class:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp3-automode
provisioner: ebs.csi.eks.amazonaws.com
parameters:
  type: gp3
  encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
EOF
```

You then pass the storage class's name to the `helm install` command. Here, we use `grafana` as an example:

```sh
helm install grafana oci://cgr.dev/$ORGANIZATION/charts/grafana \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret" \
  --set "persistence.storageClass=gp3-automode"
```

### Install using a mirror

Many customers choose to handle container images by overriding the Chainguard repository and registry and using their own internal mirror. How you set this up depends on your chosen solution, but it does affect these Helm charts. You will need to override values in the Helm chart with the appropriate new values for your mirror.

One way you can do this is with the `chainctl image helm values` command, which generates minimal Helm value overrides that modify image references in a Chainguard Helm chart to refer to a different registry and/or organization that you specify. Refer to [[chainctl images helm values](/platform/chainctl/chainctl-docs/chainctl_images_helm_values/)] for specifics along with:

```sh
chainctl images helm values --help
```

This command is a subcommand of [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/), which groups Helm chart related commands.

## Troubleshooting

To check the Helm configuration, you can run `helm install` with `--dry-run` flag. This will output the generated Kubernetes YAML. Double check the values for the image and `imagePullSecrets` to ensure they point to the correct registry and authentication is in place.

To see the files, run:

```sh
helm pull --untar oci://cgr.dev/$ORGANIZATION/charts/grafana
```

To get the `values.yaml` so you can examine it, run:

```sh
helm show values oci://cgr.dev/$ORGANIZATION/charts/grafana
```

If `helm registry login` fails, or if the login succeeds and the install then returns a `403`, refer to [Troubleshoot registry authentication errors](/chainguard/containers/troubleshooting/registry-errors/). Those two failures have different causes, and that page tells them apart.

Refer to the [Helm commands documentation](https://helm.sh/docs/helm/) for more information.

---

### How to use Chainguard iamguarded Helm charts
_Path: chainguard/containers/using-and-deploying/helm-charts/use-chainguard-iamguarded-helm-charts/index.md_

[Helm](https://helm.sh) is a package manager for Kubernetes that simplifies the installation and management of applications by automating the creation of Kubernetes resources. Helm charts are reusable, versioned packages that define a collection of Kubernetes resources required to run an application or service. You use Helm to define, install, and perform upgrades to your applications on Kubernetes.

Chainguard offers this limited iamguarded set of Helm charts to go with a set of Chainguard-created containers labeled as iamguarded, designed specifically to support organizations migrating off of Bitnami. The iamguarded charts are forked from upstream Bitnami charts, but now configured out-of-the box for use with Chainguard’s hardened container images. These charts only receive edits necessary to make them work with Chainguard container images and retain the intended functionality of the originals they are based on. Because the iamguarded charts are forks, they may be susceptible to breaking changes introduced by the upstream. In such cases, customers should plan to transition to a community-provided alternative (or an equivalent one from Chainguard) where possible.

> For organizations looking to deploy their Chainguard container images with Helm and who don't need or want the iamguarded charts, Chainguard provides upstream-produced Helm charts. Learn more about these in [How to use Chainguard Helm charts](/chainguard/containers/using-and-deploying/helm-charts/use-chainguard-helm-charts/).

These iamguarded charts have been tested by Chainguard to confirm they produce expected deployment results using the following policies:

- We only build the latest/mainline versions of iamguarded images and test them against the latest version of the corresponding iamguarded Helm charts.

Chainguard makes the provenance of these charts clear. Helm charts are packaged as [OCI artifacts](/open-source/oci/what-are-oci-artifacts/) using the upstream version adding an appended revision suffix for updates that include material changes to the chart; otherwise, tags will float based as their dependent images update. The OCI artifacts are signed and generate provenance attestations that link to the exact image digests used to ensure that all artifacts are cryptographically verifiable end-to-end for integrity and origin.

You can find iamguarded Helm charts in the [Chainguard Console](/platform/console/images-directory/#find-helm-charts-in-the-chainguard-console) and in the [Chainguard Directory](/chainguard/containers/registry/chainguard-directory/#find-helm-charts-in-the-chainguard-directory).

The following is an instructional guide for Chainguard users that are looking for Helm charts to use with their iamguarded Chainguard container images.

If there is a FIPS version of the iamguarded image the chart needs, you can use these Helm charts with Chainguard FIPS container images, but you will need to set the image in the values because they use the non-FIPS images by default. We build a single chart per application and validate that both FIPS and non-FIPS Chainguard Images work with it. If there is no appropriate iamguarded-fips image then you cannot use a non-iamguarded FIPS image.

## Configuration requirements

If you are pulling container images directly from Chainguard, then you must set a `global.org` value. You don't need this if you are pulling from your own internal registry.

You can set a `global.org` value using a `--set` flag during installation, as shown in this example:

```sh
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
  --set "global.org=$ORGANIZATION"
```

Alternately, you can set this value in a YAML file:

```yaml
global:
  org: $ORGANIZATION
```

In addition, users who mirror images to custom repositories should use `global.imageRegistry` to override the default `cgr.dev`. If you have a complex mirroring strategy, consult the chart’s `values.yaml` for individual image configuration options including `registry`, `repository`, `tag` and `digest`. Here’s a sample from the RabbitMQ `iamguarded` chart documentation:

```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

You will need to authenticate to pull charts. These instructions explain how to use charts and images with the `cgr.dev` repository. If you have mirrored or copied the charts and images to an organization-specific registry, you will need to adapt these instructions to authenticate to your registry, as appropriate.

This section presents multiple authentication methods:

- Use Helm values with `global.imagePullSecrets`
- Deploy a Chainguard Helm chart using a Kubernetes pull secret
- Use cluster node-scoped registry permissions

### Use Helm values with `global.imagePullSecrets`

When performing authentication via a `global.imagePullSecrets` key-value pair, include the following in your `values.yaml` file.

```yaml
global:
  imagePullSecrets:
    - name: chainguard-pull-secret
```

### Deploy a Chainguard Helm chart using a Kubernetes pull secret

To begin, generate a pull token.

```sh
chainctl auth configure-docker --pull-token --save --ttl=24h
```

You don't need to run `chainctl auth login` first; `configure-docker` authenticates you when no valid token is available.

This token expires in 24 hours by default, which can be modified using the
`--ttl` flag. It sets the duration for the validity of the token. The maximum
valid value is `8760h` (equivalent to 365 days), Valid unit strings range from
nanoseconds to hours and are `ns`, `us`, `ms`, `s`, `m`, and `h`, for example
`--ttl=24h`.

Find the username and password that are contained in the pull token, as in this sample output:

```sh
chainctl auth configure-docker --pull-token --save --ttl=24h

  ✔ Selected folder chainguard.edu.

To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"

Configuring identity "<identity-id>" for pulls from cgr.dev (expires 2025-06-12T09:27:45-05:00).
Overwriting existing credentials.
```

Save the credentials as variables, like this.

```sh
HELMUSER="<identity-id>"

HELMPASS="<pull-token>"
```

Create your Kubernetes secret using the variables you just created.

```sh
kubectl create secret docker-registry chainguard-pull-secret \
  --docker-server=cgr.dev \
  --docker-username=$(echo $HELMUSER) \
  --docker-password=$(echo $HELMPASS) \
  -n <your-namespace>
```

Log in to the `cgr.dev` Helm registry.

```sh
helm registry login cgr.dev \
  --username=$HELMUSER \
  --password=$HELMPASS
```

Reference the secret in your Helm installation:

```sh
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
  --set "global.org=$ORGANIZATION" \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret"
```

When the install is successful, it returns a confirmation message, like this:

```sh
Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq:16.0.2
Digest: sha256:cfc18fe651760c91c7596f7d9d44512b162f19e4bfd8ba81b5ff6cb6d8e61d6d
NAME: rabbitmq
LAST DEPLOYED: Mon Jun  9 08:35:39 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: rabbitmq
CHART VERSION: 16.0.2
APP VERSION: 4.1.0** Please be patient while the chart is being deployed **

Credentials:
    echo "Username      : user"
    echo "Password      : $(kubectl get secret --namespace default rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 -d)"
    echo "ErLang Cookie : $(kubectl get secret --namespace default rabbitmq -o jsonpath="{.data.rabbitmq-erlang-cookie}" | base64 -d)"

Note that the credentials are saved in persistent volume claims and will not be changed upon upgrade or reinstallation unless the persistent volume claim has been deleted. If this is not the first installation of this chart, the credentials may not be valid.
This is applicable when no passwords are set and therefore the random password is autogenerated. In case of using a fixed password, you should specify it when upgrading.
More information about the credentials may be found at https://docs.iamguarded.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases.

RabbitMQ can be accessed within the cluster on port 5672 at rabbitmq.default.svc.cluster.local

To access for outside the cluster, perform the following steps:

To Access the RabbitMQ AMQP port:

    echo "URL : amqp://127.0.0.1:5672/"
    kubectl port-forward --namespace default svc/rabbitmq 5672:5672

To Access the RabbitMQ Management interface:

    echo "URL : http://127.0.0.1:15672/"
    kubectl port-forward --namespace default svc/rabbitmq 15672:15672

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
```

### Use cluster node-scoped registry permissions

If you manage access and permissions at cluster-wide and node-specific levels, these are some best practices to consider.

**Use Image Pinning:** All `iamguarded` charts pin images to specific **digests** that have been tested for compatibility, ensuring reliable deployments.

**Pin to Digest:** While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart **digest** to prevent unexpected updates:

```sh
helm install rabbitmq \
oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
```

**Review Default Values:** The chart provides security-minded defaults that are sensible but may not suit all use cases. Review the chart's `values.yaml` for the full range of configuration options and adjust as needed.

## Helm chart usage examples

### Install with details passed in a flag

To install a Helm chart using standard Helm commands and passing details as flag values in the command itself, add the flags and values at the end like this example, substituting your organization for `$ORGANIZATION`.

```sh
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
 --set "global.org=$ORGANIZATION"
```

### Install with details in a file

Alternatively, you can put values in a file, such as our `values.yaml` sample, and then refer to the file in your install command.

```sh
image:
  registry: cgr.dev
  repository: $ORGANIZATION/rabbitmq # replace $ORGANIZATION
  tag: latest # pin to specific version instead of latest
```

Then you refer to the file like this:

```sh
helm install test oci://cgr.dev/chainguard-private/iamguarded-charts/rabbitmq --values ./values.yaml
```

### Install on AWS Elastic Kubernetes Service (EKS) auto mode

When installing on EKS Auto Mode, you may need to create a storage class for the Helm chart's pod(s). This can be done by creating a storage class:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp3-automode
provisioner: ebs.csi.eks.amazonaws.com
parameters:
  type: gp3
  encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
EOF
```

You then pass the storage class's name to the `helm install` command. Here, we use `rabbitmq` as an example:

```sh
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
  --set "global.org=$ORGANIZATION" \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret" \
  --set "persistence.storageClass=gp3-automode"
```

## Troubleshooting

To check the Helm configuration, you can run `helm install` with `--dry-run` flag. This will output the generated Kubernetes YAML. Double check the values for the image and `imagePullSecrets` to ensure they point to the correct registry and authentication is in place.

To see the files, run:

```sh
helm pull --untar oci://cgr.dev/chainguard-private/iamguarded-charts/rabbitmq
```

To get the `values.yaml` so you can examine it, run:

```sh
helm show values oci://cgr.dev/chainguard-private/iamguarded-charts/rabbitmq
```

If `helm registry login` fails, or if the login succeeds and the install then returns a `403`, refer to [Troubleshoot registry authentication errors](/chainguard/containers/troubleshooting/registry-errors/). Those two failures have different causes, and that page tells them apart.

Refer to the [Helm commands documentation](https://helm.sh/docs/helm/) for more information.

---

### Proxy and cache Helm charts with Artifactory
_Path: chainguard/containers/using-and-deploying/helm-charts/proxy-and-cache/index.md_

This page shows you how to set up and use Chainguard Helm Charts with Artifactory via remote Helm OCI repositories.

## Create and configure Helm OCI repository in Artifactory

In Artifactory's **Administration** module, select **Repositories**, then **Create a Repository**, and choose **Remote**. Set the package type to **Helm** and give the repository a key (name); this guide uses `iamguarded-charts`. For the full list of settings, refer to JFrog's [remote repositories documentation](https://docs.jfrog.com/artifactory/docs/remote-repositories).

To determine values for the `User Name` and `Password / Access Token` fields, run the following command:

```bash
chainctl auth configure-docker --pull-token --save
```

Output will look like this:

```bash
To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

In the repository's configuration, set the **URL** to `https://cgr.dev`, and set the **User Name** and **Password / Access Token** to the values from the command output above.

Once created, the next step is to configure Helm to pull from the mirrored repository. We can then test that it works by pulling the Helm Chart from the repository.

## Configure Helm to pull from the mirrored repository and install

> **NOTE:** In the following example, $JFROG_USERNAME and $JFROG_TOKEN refer to the Artifactory username and token used to gain access to the newly created Helm repository. For testing purposes, a quick way to generate this against any repository is by using the "Set Me Up" button in the top right corner of the UI.

```bash
JFROG_USERNAME= # Your username, i.e. username@chainguard.dev
JFROG_TOKEN= # Your token
helm registry login -u $JFROG_USERNAME -p $JFROG_TOKEN chainguard.jfrog.io
Login Succeeded
helm pull oci://chainguard.jfrog.io/iamguarded-charts/YOUR-ORGANIZATION/iamguarded-charts/kafka
Pulled: chainguard.jfrog.io/iamguarded-charts/YOUR-ORGANIZATION/iamguarded-charts/kafka:32.2.18
Digest: sha256:8cc051f049fbd75cfc84306bf11adf0ef4ea0d19bc3a1d3ae46284b3aab5b083
```

Finally, we'll create a Kubernetes Secret that will be used to pull the `kafka-iamguarded` image from Artifactory and then run the `helm install` process.

> **NOTE:** Similar to the Helm example, `$JFROG_USERNAME` and `$JFROG_TOKEN` refer to the Artifactory username and token used to gain access to your existing remote repository used to mirror Chainguard images from your organization. This may be different than the credentials used to gain access to your remote Helm repository.

```bash
JFROG_USERNAME= # Your username, i.e. username@chainguard.dev
JFROG_TOKEN= # Your token
ORGANIZATION= # Your organization, i.e. YOUR-ORGANIZATION
kubectl create secret docker-registry chainguard-pull-secret \
    --docker-server=chainguard.jfrog.io \
    --docker-username=$JFROG_USERNAME \
    --docker-password=$JFROG_TOKEN

secret/chainguard-pull-secret created

helm install kafka oci://chainguard.jfrog.io/iamguarded-charts/YOUR-ORGANIZATION/iamguarded-charts/kafka \
    --set image.registry=chainguard.jfrog.io \
    --set image.repository=iamguarded-charts/YOUR-ORGANIZATION/iamguarded-charts/kafka \
    --set "global.org=$ORGANIZATION" \
    --set "global.imagePullSecrets[0].name=chainguard-pull-secret"

    Pulled: chainguard.jfrog.io/iamguarded-charts/YOUR-ORGANIZATION/iamguarded-charts/kafka:32.2.18
    Digest: sha256:8cc051f049fbd75cfc84306bf11adf0ef4ea0d19bc3a1d3ae46284b3aab5b083
    NAME: kafka
    LAST DEPLOYED: Fri Jul 11 15:10:56 2025
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: kafka
    CHART VERSION: 32.2.18
    APP VERSION: 4.0.0
```

A few things to note regarding the above values:

- The `global.org` value is set to the organization name you're pulling Helm Charts from.  This is specific to the Chainguard variant of the Helm Chart.
- The `global.imagePullSecrets[0].name` value is set to the name of the Kubernetes Secret that will be used to pull the `kafka-iamguarded` image from Artifactory (or whichever registry images are being pulled from, for non-Artifactory setups).

---

### Building minimal container images
_Path: chainguard/containers/building-and-modifying/building-minimal-containers.md_

The less software a container image holds, the less there is to transfer, to maintain, and to attack. Chainguard's [distroless](/chainguard/containers/concepts/getting-started-distroless/) container images take that as far as it goes: no shell, no package manager, and only the libraries the application needs.

That raises a practical question: without a shell or a package manager, how do you get your application into the image? The answer is a multi-stage build. One stage compiles or assembles your application with all the tooling that requires, and the final stage copies the result into a minimal base. This page covers both shapes that build takes, depending on whether your application needs a language runtime once it's running.

## Applications that compile to a static binary

Go, Rust, and other toolchains that produce a statically linked binary can use the smallest base Chainguard publishes. Build in the language's own image, then copy the binary into `cgr.dev/chainguard/static`:

```Dockerfile
FROM cgr.dev/chainguard/go:latest AS build

COPY main.go /main.go
RUN CGO_ENABLED=0 go build -o /hello /main.go

FROM cgr.dev/chainguard/static:latest

COPY --from=build /hello /usr/local/bin/
CMD ["hello"]
```

`CGO_ENABLED=0` matters here. The `static` image ships no C library, so the binary must not link against one dynamically.

### Why not `scratch`?

For a binary that needs nothing else, the empty `scratch` image is smaller still, and it works. Most applications need more than that, though: TLS root certificates to make outbound HTTPS calls, time zone data to handle local times, and directories such as `/tmp`, `/etc`, and `/home` that libraries expect to find. The `static` image provides those and close to nothing else, which makes it a better default than `scratch` for a statically compiled application.

The following video walks through this build and compares the result against other minimal base images:

{{< youtube ZT6177U0fUM >}}

## Applications that need a language runtime

Java, Python, and .NET applications can't run on `static` or `scratch`, because the runtime files have to be in the container image. The build keeps the same two stages; only the final base changes, from an empty image to a runtime image.

For a Maven project, the build stage runs Maven against your sources to produce a JAR, and the final stage starts from `cgr.dev/chainguard/jre`, copies in that JAR, and sets an entrypoint that runs it. The build stage is large, since it holds the JDK, Maven, and everything Maven downloaded. The final image holds the JRE and your JAR, and like the `static` image it has no shell and no package manager.

You can find complete, working Dockerfiles for this example — a Spring Pet Clinic application built with the Chainguard Maven and JRE images — in the [minimal_images_for_language_runtimes](https://github.com/chainguard-dev/minimal_images_for_language_runtimes) repository.

### Choosing a runtime version

An untagged build uses the latest Maven and the latest JRE. That suits many projects, but sometimes you need to pin the Java version in both stages. The latest version of each container is free for everyone; tagged major and minor versions come with a subscription, as described in the [Containers overview](/chainguard/containers/overview/#production-and-free-containers).

If a tagged runtime isn't available to you, you can assemble your own runtime layer on `cgr.dev/chainguard/wolfi-base`, installing the JDK and Maven packages you need with `apk` and setting `JAVA_HOME` yourself. The minimal_images_for_language_runtimes repository includes this variant too. However, this method comes with two important tradeoffs:

* `wolfi-base` includes a shell and a package manager, so the image you finish with is no longer distroless.
* The JRE image ships locale data that `wolfi-base` leaves out. Java applications that depend on locale data need that package added back, which increases the image's size.

For a supported way to add packages to a distroless image without giving up its properties, check out [Custom Assembly](/chainguard/containers/custom-assembly/).

This video works through the Maven and JRE build, then the `wolfi-base` variant:

{{< youtube P7pmV-s5ZYY >}}

## Learn more

* Confirm what your finished image contains with [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/).
* If the application fails in the distroless stage but works in the build stage, refer to [Debugging distroless container images](/chainguard/containers/troubleshooting/debugging-distroless-images/).
* To add APK packages to a distroless variant directly, refer to [Installing APK packages in distroless variants](/chainguard/containers/building-and-modifying/install-apks-in-distroless-variants/).

---

### Installing APK packages in distroless variants
_Path: chainguard/containers/building-and-modifying/install-apks-in-distroless-variants.md_

This page documents workflows for installing APK packages in [distroless variants](/chainguard/containers/concepts/getting-started-distroless/) of Chainguard container images, such as most builds tagged `:latest`. We copy a filesystem from a distroless container image to a build image, install APKs to it using `chroot`, then copy the modified filesystem back to the distroless image in the final step.

## Overview: Installing packages in distroless containers

> **Note**: The chroot workflow on this page is one of several ways to add a package to a Chainguard Container, and it's the most involved. For a comparison of all of them, see [Adding a package to a Chainguard Container](/chainguard/containers/building-and-modifying/adding-packages/).

The distroless variants of Chainguard Containers do not contain shells or package managers by design. This reduces attack surface and exploitability for these images. In cases where additional packages are required, we typically recommend the following:

- If packages for the language runtime (such as those installed with Python’s pip or Node’s npm) are required and no additional system-level (APK) dependencies are needed, we recommend following one of our language-specific multi-stage build tutorials ([Python](https://edu.chainguard.dev/chainguard/containers/getting-started/languages-and-runtimes/python/), [Node](https://edu.chainguard.dev/chainguard/containers/migration/migration-guides/node/), [PHP](https://edu.chainguard.dev/chainguard/containers/migration/migration-guides/php/)).
- Use Chainguard's [Custom Assembly](https://edu.chainguard.dev/chainguard/containers/custom-assembly/) tool to create an image with additional packages added.
- For some use cases, consider running our variant tagged `:latest-dev` in production. These Chainguard Containers are also low-to-zero CVE and are considered production-ready.
- Consider requesting a custom image from Chainguard.

However, we understand that there are specific use cases that require installation of system-level APK packages in distroless variants, such as maintaining internal build environments requiring application- or team-based packaging. In these cases, you may wish to implement the approach described in this document.

## Comparing workflow options

Why not just directly copy individual APK files to a distroless image? If you’re familiar with the package or packages that need to be installed to the distroless image, this *may* work. However, this approach has a number of disadvantages:

- Scanners will typically not detect the copied files as a system-level package.
- You will also need to know the locations of all relevant files and configurations in order to copy these resources manually.
- This method can be verbose in cases where you need many packages or where packages install many files.

The chroot approach typically registers installed packages correctly, making them visible to scanners—one of the key reasons we recommend it.

Here are three options that you may be considering and our thoughts about them before we focus solely on chroot:

- **Copying** — Copying individual package files to a distroless image has the drawbacks mentioned.
- **Bind mount** — In a multi-stage build, mount APK and other required development resources from a development image, then install needed APKs using these mounted resources. This approach can work for a single point in time but can be difficult to maintain as the APK resources needed to copy over change over time.
- **Chroot (recommended)** — In a multi-stage build, install any build-time dependencies and build any required software artifacts such as binaries. Use a second base image to install runtime dependencies to a directory specified with chroot for later copying. In a final step, copy built software artifacts and the chroot installation directory to scratch and set the desired entrypoint. This method is recommended.

## Using chroot

> **Note**: If you’re working to a deadline, you can skip to this short [appendix with full code example](#appendix-b-example-code-for-chroot-method-c-binary).

This workflow allows you to install APKs to a distroless image during a Dockerfile build by generating required software artifacts in a development environment, preparing a directory structure with runtime dependencies installed using chroot, then assembling these components back in the distroless image. The steps are as follows:

1. Pull a distroless base image for use as a filesystem reference image and as the base image for the final step. This image should be as close as possible to your desired runtime environment.
2. Pull an image with package managers and shells (typically tagged `latest-dev`) with the desired environment for building your software artifacts.
3. Install any build time dependencies and build your software artifacts, such as virtual environments or binaries.
4. Copy the entire filesystem from the reference image to a directory on the build image. Install any desired runtime APKs to this directory using chroot.
5. Switch to the original distroless image for the final assembly.
6. Copy the directory with installed runtime dependencies from the build image to root on the distroless image. Copy any built software artifacts from the build image to the distroless image.
7. Set the desired entrypoint.

In short, we pull a distroless image, replicate its file structure as a folder on the build image, install APKs to that file structure, build our artifacts on the build image, then put the customized file structure and artifacts into the distroless image.

### Considerations

- You should build with the \`--no-cache\` flag enabled to ensure the latest remediated binaries are used and \`–pull\` to pull the most recent images.
- Images built using this approach should be rebuilt periodically, even when reference base & build images did not change, to get updates of custom packages.
- Scanners should correctly register packages in the final image.

### Example A: Preparing a Python virtual environment with APK install and runtime dependencies

In this example, we prepare a virtual environment that will support the Python module for MariaDB, create a customized distroless file structure with needed APKs, and assemble these components in a distroless image. Creating this virtual environment (installing from pip) requires specific APKs be available at both install time and runtime.

Note that, in this example, the same APKs are installed at install and runtime. In some cases, the packages required at install and runtime will not be the same. Many or most packages in interpreted language ecosystems like Python will only require system-level APKs to be present at runtime, and in these cases you can leave out adding APKs before installation. In the example case, system-level packages are required to install MariaDB using pip as well as at runtime.

Let's get started.

1. Create a `run.py` file that will import the `_mysql` object from the `MySQLdb` module and print the version:

```python
from MySQLdb import _mysql
print(_mysql.__version__)
```

1. Create a `requirements.txt` file with `mysqlclient` as the only listed Python dependency:

```plaintext
mysqlclient
```

1. Create a Dockerfile. Here's the full file, followed by line-by-line explanations.

```Dockerfile
# syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/python:latest AS base

FROM cgr.dev/chainguard/python:latest-dev AS build

WORKDIR /app

USER root
RUN apk add --no-cache mariadb-connector-c-dev mariadb

USER 65532
RUN python -m venv venv
ENV PATH="/app/venv/bin":$PATH
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r /app/requirements.txt

USER root
COPY --from=base / /base-chroot
RUN mkdir -p /base-chroot
RUN apk add --no-cache --no-scripts --root /base-chroot mariadb-connector-c-dev mariadb && \
  ldconfig -r /base-chroot

FROM cgr.dev/chainguard/python:latest
# Copy over the apks prep'ed at the end of the build stage (no apk-add in this image)
COPY --link --from=build /base-chroot /

WORKDIR /app
COPY --from=build /app/venv /app/venv
COPY run.py run.py
ENV PATH="/app/venv/bin:$PATH"

ENTRYPOINT ["python", "run.py"]
```

First, we pull the distroless image we wish to customize. This image will be used both as a reference filesystem we will customize with our chosen APKs and later as the base image for our final assembly.

`FROM cgr.dev/chainguard/python:latest AS base`

Next, we pull our build image. The following steps will run in this environment.

`FROM cgr.dev/chainguard/python:latest-dev AS build`

Create a working directory:

`WORKDIR /app`

Now let’s add dependencies needed to install `mysqlclient` using pip. For many libraries, dependencies are needed only for runtime, so installing APKs at this stage is not needed. Note that we need root access to install APKs.

`USER root`
`RUN apk add --no-cache mariadb-connector-c-dev mariadb`

We now create a virtual environment, give this environment precedence on the path, and install Python dependencies, in this case only `mysqlclient`. Installation by pip takes place as a nonadministrative user.

`USER 65532`
`RUN python -m venv venv`
`ENV PATH="/app/venv/bin":$PATH`
`COPY requirements.txt /app/`
`RUN pip install --no-cache-dir -r /app/requirements.txt`

We have now created the software artifact that will be copied into our final distroless image, in this case a Python virtual environment set up to run MariaDB. Now we will create a customized file structure that uses the filesystem from our distroless image as a base and includes required additional APKs needed during runtime.

First, copy the full contents of the distroless image we pulled at the beginning (labeled “base”) to a folder on our build image:

`USER root`
`COPY --from=base / /base-chroot`
`RUN mkdir -p /base-chroot`

Now install APKs to this copied folder using chroot. We add `--no-scripts` and `ldconfig -r /base-chroot` to skip the pre- and post-install scripts in the APKs which would fail in a distroless environment and then regenerate the cache after installation:

`RUN apk add --no-cache --no-scripts --root /base-chroot mariadb-connector-c-dev mariadb && ldconfig -r /base-chroot`

We’ve now prepared two components on our build image: the required software artifacts (a Python virtual environment) and a file structure customized with installed APKs needed for runtime. We will now assemble these components in the distroless image.

Switch to the distroless image:

`FROM cgr.dev/chainguard/python:latest`

Copy the customized folder structure we created on the build image, replacing the root of our distroless image:

`COPY --link --from=build /base-chroot`

Note here that we have chosen to use the [`--link` flag](https://docs.docker.com/reference/dockerfile/#copy---link). This adds an independent layer with the copied files and replaces the filesystem without reference to existing files, resulting in a more complete replacement. However, use of this flag can increase image size, so you may wish to experiment with disabling this flag in your build.

Next, we copy our virtual environment and run script:

`WORKDIR /app`
`COPY --from=build /app/venv /app/venv`
`COPY run.py run.py`

Set the path so that the virtual environment has precedence:

`ENV PATH="/app/venv/bin:$PATH"`

Finally, set the entrypoint:

`ENTRYPOINT ["python", "run.py"]`

1. Once you have your Dockerfile, `run.py`, and `requirements.txt`, build the image:

`docker build . --pull --no-cache -t mariadb-distroless`

Here, `--pull` ensures we receive the latest images, even if one is locally stored, and `--no-cache` ensures that we receive the latest versions of packages.

1. Once the build completes, run the container:

`docker run mariadb-distroless`

The output should be the version of the `MySQLdb` module (from the output of `run.py`).

### Example B: Binary compilation with local build and runtime dependencies

In this example, the work is done in our Dockerfile, which is presented in full here and then annotated below.

```Dockerfile
FROM cgr.dev/chainguard/glibc-dynamic:latest AS base

FROM cgr.dev/chainguard/gcc-glibc:latest-dev AS build

COPY <<EOF ./test.c
#include <stdio.h>
#include <curl/curl.h>
void main(){
    printf("%s\\n", curl_version());
}
EOF

RUN apk add pc:libcurl

RUN gcc test.c `pkg-config --cflags --libs libcurl` -o dynamic-binary

COPY --from=base / /base-chroot

RUN apk add --no-scripts --root /base-chroot so:libcurl.so.4 && \
  ldconfig -r /base-chroot

FROM scratch

COPY --from=build /base-chroot /

COPY --from=build /work/dynamic-binary /usr/bin/dynamic-binary

ENTRYPOINT ["/usr/bin/dynamic-binary"]

```

In this Dockerfile, we start by pulling a reference image as similar as possible to our desired runtime environment. In this case, we pull the distroless `glibc-dynamic` Chainguard Image suitable for running compiled C binaries.

`FROM cgr.dev/chainguard/glibc-dynamic:latest AS base`

Next, pull a build image with shell, APK, and needed toolchains for binary compilation or other build process:

`FROM cgr.dev/chainguard/gcc-glibc:latest-dev AS build`

Copy source file(s) for our desired artifact. This example will use a [here document](https://en.wikipedia.org/wiki/Here_document) with a short example depending on libcurl.

`COPY <<EOF ./test.c`
`#include <stdio.h>`
`#include <curl/curl.h>`
`void main(){`
   `printf("%s\\n", curl_version());`
`}`
`EOF`

Install any needed build-time dependencies using APK:

`RUN apk add pc:libcurl`

Build the binary:

``RUN gcc test.c `pkg-config --cflags --libs libcurl` -o dynamic-binary``

We now have the binary we’ll run in the final image. Next, we take steps to add runtime dependency APKs. We’ll first copy the entire filesystem of our reference distroless runtime image (here labeled “base”) pulled above to a directory on our build image. We will then install APKs to this directory. In the final step, this directory will be used as the filesystem in our assembled output image.

Copy the filesystem of our reference image (“base”)to a directory on our build image:

`COPY --from=base / /base-chroot`

Install APKs to the copied folder using chroot. We add `--no-scripts` and `ldconfig -r /base-chroot` to skip the pre- and post-install scripts in the APKs which would fail in a distroless environment and then regenerate the cache after installation:

`RUN apk add --no-scripts --root /base-chroot so:libcurl.so.4 && ldconfig -r /base-chroot`

We now have our needed components, the compiled software artifact (in this case, a binary depending on libcurl) and a directory structure customized without runtime dependencies. We will now assemble these components in scratch.

First, pull scratch:

`FROM scratch AS custom-production-image`

Copy the customized file structure to root on the scratch image (“custom-production-image”):

 `COPY --from=build /base-chroot /`

Copy the binary:

`COPY --from=build /work/dynamic-binary /usr/bin/dynamic-binary`

In the last line of the Dockerfile, set the entrypoint:

`ENTRYPOINT ["/usr/bin/dynamic-binary"]`

We will now build the image from this Dockerfile:

`docker build . --pull --no-cache -t dynamic-binary`

Finally, run our image:

`docker run dynamic-binary`

You should see output similar to the following:

```
libcurl/8.12.1 OpenSSL/3.4.1 zlib/1.3.1 brotli/1.1.0 libpsl/0.21.5 nghttp2/1.64.0 OpenLDAP/2.6.9
```

You have now created a production image based on a minimal distroless Chainguard Image customized with additional runtime dependencies as installed APKs.

## Appendix A: Example code for chroot method (Python virtualenv)

`Dockerfile`:

```Dockerfile
# syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/python:latest AS base

FROM cgr.dev/chainguard/python:latest-dev AS build

WORKDIR /app

USER root
RUN apk add --no-cache mariadb-connector-c-dev mariadb

USER 65532
RUN python -m venv venv
ENV PATH="/app/venv/bin":$PATH
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r /app/requirements.txt

USER root
COPY --from=base / /base-chroot
RUN mkdir -p /base-chroot
RUN apk add --no-cache --no-scripts --root /base-chroot mariadb-connector-c-dev mariadb && \
  ldconfig -r /base-chroot

FROM cgr.dev/chainguard/python:latest
# Copy over the apks prep'ed at the end of the build stage (no apk-add in this image)
COPY --link --from=build /base-chroot /

WORKDIR /app
COPY --from=build /app/venv /app/venv
COPY run.py run.py
ENV PATH="/app/venv/bin:$PATH"

ENTRYPOINT ["python", "run.py"]
```

---

`run.py`:

```python
from MySQLdb import _mysql
print(_mysql.__version__)
```

---

`Requirements.txt`:

```plaintext
mysqlclient
```

## Appendix B: Example code for chroot method (C binary)

Annotated `Dockerfile`:

```Dockerfile
# SPDX-FileCopyrightText: 2025 Chainguard, Inc.
# SPDX-License-Identifier: Apache-2.0

# Pull unmodified base image
FROM cgr.dev/chainguard/glibc-dynamic:latest AS base

# Pull build container with toolchains and apk
FROM cgr.dev/chainguard/gcc-glibc:latest-dev AS build

# Get workload source code
COPY <<EOF ./test.c
#include <stdio.h>
#include <curl/curl.h>
void main(){
    printf("%s\\n", curl_version());
}
EOF

# Install build-time dependency
RUN apk add pc:libcurl

# Compile workload code
RUN gcc test.c `pkg-config --cflags --libs libcurl` -o dynamic-binary

# Copy base image contents to a subfolder
COPY --from=base / /base-chroot

# Customize base image chroot
RUN apk add --no-scripts --root /base-chroot so:libcurl.so.4 && \
  ldconfig -r /base-chroot

# Create customized production image from scratch
FROM scratch AS custom-production-image
# Copy customized base image
COPY --from=build /base-chroot /
# Copy workload binary
COPY --from=build /work/dynamic-binary /usr/bin/dynamic-binary

ENTRYPOINT ["/usr/bin/dynamic-binary"]
```

Build the image:

`docker build . --no-cache -t dynamic-binary`

Run the image:

`docker run dynamic-binary`

If the build was successful, you should see version information from libcurl as `output.t`.

---

### Adding a package to a Chainguard Container
_Path: chainguard/containers/building-and-modifying/adding-packages.md_

Chainguard Containers ship with only the packages their application needs, so sooner or later you'll want one that isn't there. [Custom Assembly](/chainguard/containers/custom-assembly/overview/) is the supported way to add it. You declare the package you want, Chainguard builds the image on its own infrastructure, and Chainguard rebuilds that image whenever the package is updated. You can drive Custom Assembly from the Chainguard Console, interactively with `chainctl`, or non-interactively with `chainctl` from a pipeline.

This page helps you pick an approach, then covers the three steps that apply whichever one you pick: finding the package name, adding the package, and confirming that it reached the finished image.

## Choose an approach

The following table compares the available approaches:

| Approach | Use it when | What you need |
| --- | --- | --- |
| [Custom Assembly in the Console](#add-the-package) | You want to browse the packages your organization can add and apply the change in a few clicks. | A Console account with a role that has the `repo.update` capability. |
| [Custom Assembly with `chainctl`, interactively](#add-the-package) | You work from a terminal and want to review a diff before it applies. | `chainctl`, installed and authenticated. |
| [Custom Assembly with `chainctl`, non-interactively](#add-the-package) | You keep image configuration in version control or apply it from CI/CD. | `chainctl` and a YAML build configuration file. |
| [Custom Assembly with the Chainguard API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/) | You're building your own tooling around Custom Assembly. | An API client and a Chainguard token. |
| [`apk add` in a Dockerfile](/chainguard/containers/using-and-deploying/using-containers/#extending-chainguard-base-containers) | You build on a `-dev` variant or on `wolfi-base`, and you're prepared to pin package versions and image digests yourself. | A Dockerfile and a container image that includes `apk`. |
| [`apk` with `chroot` in a multi-stage build](/chainguard/containers/building-and-modifying/install-apks-in-distroless-variants/) | You need a package in a distroless image and Custom Assembly doesn't fit your workflow. | A multi-stage Dockerfile. |

Custom Assembly is the recommended approach because Chainguard's build pipeline resolves the packages you add against the packages already in the base image, then rebuilds the image when any of them change. Adding packages with `apk add` in your own Dockerfile moves that work to you: without pinned package versions and image digests, a package update can conflict with an older dependency in the base image and break your build until a new base image is released. For the longer version of this argument, see [Why use Custom Assembly for adding packages](/chainguard/containers/custom-assembly/overview/#why-use-custom-assembly-for-adding-packages).

{{< note >}}
Custom Assembly is available to organizations with access to [production Chainguard Containers](/chainguard/containers/concepts/container-categories/#production-containers). If you use Chainguard's free container images, take one of the Dockerfile approaches.
{{< /note >}}

## Before you begin

The Custom Assembly approaches on this page share these prerequisites:

* Access to production Chainguard Containers.
* A role with the `repo.update` capability, to customize an existing image in place, or the `repo.create` capability, to save the result as a new image. Of Chainguard's three default roles — `viewer`, `editor`, and `owner` — only `owner` has both. For a custom role you can create instead, see [Custom Assembly permissions requirements](/chainguard/containers/custom-assembly/overview/#custom-assembly-permissions-requirements).
* For the `chainctl` approaches, [`chainctl` installed](/platform/chainctl-usage/how-to-install-chainctl/) and [authenticated](/platform/chainctl-usage/authentication-options/).

Custom Assembly adds packages to an image; it can't remove the packages the source image already contains. You can, however, remove packages you added in an earlier build.

## Find the package name

You can add only the packages your organization is entitled to, which are the packages that appear in the Chainguard Containers you already have access to. Package names often carry a version stream — `python-3.14` rather than `python` — so confirm the exact name before you add it. Look it up in the Console, or with `apk` from inside a running container.

{{< tabs label="Ways to find a package name" >}}

{{% tab title="Console" %}}

Open the image in the [Chainguard Console](https://console.chainguard.dev), click **Customize image**, then use the **Filter packages** box. The list holds every package your organization can add. If the package you want isn't listed, [open a Chainguard support ticket](/get-started/get-support/).

{{% /tab %}}

{{% tab title="apk" %}}

Container images that include `apk` — such as a `-dev` variant — can search the repository from inside a running container. For a free container image, no authentication is needed:

```shell
docker run --rm --entrypoint sh cgr.dev/chainguard/wolfi-base:latest \
  -c 'apk update > /dev/null && apk search -e "mongo*"'
```

```output
mongo-tools-100.18.0-r6
mongodb-kubernetes-operator-0.13.0-r14
mongodb-kubernetes-operator-compat-0.13.0-r14
mongodb-kubernetes-operator-readinessprobe-0.13.0-r14
```

To search the packages your organization is entitled to, start a `-dev` variant of one of your organization's images with an `HTTP_AUTH` variable so that `apk` can reach your [Private APK Repository](/chainguard/containers/building-and-modifying/packages/private-apk-repos/):

```shell
docker run -it --rm --entrypoint /bin/sh --user root \
  -e "HTTP_AUTH=basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)" \
  cgr.dev/$ORGANIZATION/$CONTAINER:latest-dev
```

From the container's shell, run `apk update` and then `apk search`.

{{% /tab %}}

{{< /tabs >}}

## Add the package

The three procedures below all produce the same result. Pick the tab that matches how you work.

{{< tabs label="Ways to add a package with Custom Assembly" >}}

{{% tab title="Console" %}}

1. In the [Chainguard Console](https://console.chainguard.dev), open the image you want to customize.
2. Click **Customize image**, then select the packages to add.
3. Click **Continue**, then choose **Create a new image** or **Customize current image**.
4. Click **Preview changes** and review the package list.
5. Click **Apply changes**.

For the full walkthrough, including how to edit or remove customizations later, see [Using the Chainguard Console to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-console/).

{{% /tab %}}

{{% tab title="chainctl, interactively" %}}

1. Open the image's build configuration:

    ```shell
    chainctl images repos build edit --repo $CONTAINER
    ```

    Replace `$CONTAINER` with the name of the image. If you omit it, `chainctl` prompts you to choose. It also prompts for the organization when you have access to more than one; pass `--parent=<organization>` to skip that prompt.

2. `chainctl` opens the configuration in your default text editor. Add the package under `contents.packages`:

    ```yaml
    contents:
      packages:
      - yarn
      - wget
      - bash
    ```

3. Save and close the file. `chainctl` prints a diff and asks you to confirm:

    ```output
    /tmp/3352123767.yaml (-deletion / +addition):

     contents:
       packages:
       - yarn
       - wget
    +  - bash

    Applying build config to $CONTAINER
    Are you sure?
    Do you want to continue? [y,N]:
    ```

4. Enter `y` to start the build.

To save the result as a new image rather than changing the existing one, add `--save-as $NEW_NAME`. For the rest of what you can set in this file, including environment variables, annotations, and custom user accounts, see [Using chainctl to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-chainctl/).

{{% /tab %}}

{{% tab title="chainctl, non-interactively" %}}

Both `apply` and `edit` accept a configuration file, which skips the editor and the prompt. Use this form in CI/CD and anywhere you keep image configuration in version control.

1. Write the build configuration to a file:

    ```shell
    cat > build.yaml <<EOF
    contents:
      packages:
        - bash
        - curl
        - mysql
    EOF
    ```

2. Preview what the file would change, without changing anything:

    ```shell
    chainctl images repos build apply -f build.yaml --repo $CONTAINER --dry-run
    ```

    `--dry-run` prints the diff and exits with a non-zero status if there's anything to apply, which makes it usable as a drift check in a pipeline.

3. Apply the configuration. `--yes` confirms the change without prompting:

    ```shell
    chainctl images repos build apply -f build.yaml --repo $CONTAINER --yes
    ```

To save the result as a new image, add `--save-as $NEW_NAME`. This works when you target a single repository; it isn't available when you target several at once with repeated `--repo` flags or a wildcard.

For a worked GitHub Actions pipeline built around these commands, see [Using GitOps to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-gitops/).

{{% /tab %}}

{{< /tabs >}}

## Confirm the package is in the image

Custom Assembly builds run on Chainguard's infrastructure and normally finish in under 20 minutes, so your change won't reach the registry immediately.

1. Check that the build succeeded:

    ```shell
    chainctl images repos build list --repo $CONTAINER
    ```

    ```output
              START TIME           |        COMPLETION TIME        | RESULT  |             TAGS
    -------------------------------|-------------------------------|---------|-------------------------------
     Wed, 09 Sep 2026 12:46:56 CDT | Wed, 09 Sep 2026 12:47:13 CDT | Success | 26-full, 26.8-full, latest-full
     Wed, 09 Sep 2026 12:45:22 CDT | Wed, 09 Sep 2026 12:46:13 CDT | Success | 26-dev, 26.8-dev, latest-dev
    ```

    The Console shows the same information on the image's **Builds** tab. Builds stay listed for 24 hours.

2. Pull the image:

    ```shell
    docker pull cgr.dev/$ORGANIZATION/$CONTAINER:latest
    ```

3. Check for the package. If the image includes `apk`, query it directly. `apk info -e` prints the package name when the package is installed and exits with a non-zero status when it isn't:

    ```shell
    docker run --rm --entrypoint apk \
      cgr.dev/$ORGANIZATION/$CONTAINER:latest-dev info -e bash
    ```

    ```output
    bash
    ```

    Distroless images have no `apk`, so read the image's SBOM instead. This command lists the apk packages in the image:

    ```shell
    cosign download attestation \
      --platform linux/amd64 \
      --predicate-type https://spdx.dev/Document \
      cgr.dev/$ORGANIZATION/$CONTAINER:latest \
      | jq -r '.payload' | base64 -d \
      | jq -r '.predicate.packages[]
               | select(.externalRefs[]?.referenceLocator? // "" | startswith("pkg:apk/"))
               | .name'
    ```

    ```output
    ca-certificates-bundle
    gdbm
    glibc-2.44
    ld-linux-2.44
    python-3.14
    ```

    The Console shows the same list on the image's **SBOM** tab. For more ways to read this data, see [Retrieving Chainguard Container SBOMs](/chainguard/containers/security-and-compliance/retrieve-image-sboms/).

## If the build fails

A Custom Assembly build reports failure only after it finishes. Retrieve the logs for a build with the `logs` subcommand, which prompts you to pick a build report:

```shell
chainctl images repos build logs --repo $CONTAINER
```

In the Console, click a row on the image's **Builds** tab to open the same logs.

Builds fail for a few recurring reasons:

* Two packages install the same file, and Custom Assembly can't resolve the conflict.
* A package is newer than the base image and was built against a newer version of `glibc`.
* The build ran longer than an hour and timed out.
* The package isn't one your organization is entitled to.

For more on these cases, see [Custom Assembly troubleshooting](/chainguard/containers/custom-assembly/faq/#custom-assembly-troubleshooting). If you can't resolve a failure, [contact Chainguard support](https://www.chainguard.dev/contact?utm=docs).

## Learn more

* [Overview of Chainguard Custom Assembly](/chainguard/containers/custom-assembly/overview/) covers what Custom Assembly can change, its limitations, and how the CVE remediation SLA applies to customized images.
* [Custom Assembly FAQs](/chainguard/containers/custom-assembly/faq/) answers questions about entitlements, FIPS, and support boundaries.
* [Overview of Chainguard's package repositories](/chainguard/containers/building-and-modifying/packages/package-model/) explains where the packages you can add come from.
* [Adding custom certificates with Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/) covers embedding internal CA certificates in an image.

---

### Build Go containers with Ko
_Path: chainguard/containers/building-and-modifying/build-tools/building-go-containers-with-ko.md_

[Ko](https://ko.build/) is a tool for building Go applications into container images without using Dockerfiles. When combined with Chainguard's minimal containers, Ko creates smaller and more secure container runtimes with only your application and its essential dependencies.

This tutorial will guide you through installing Ko and using it to containerize Go applications with Chainguard Containers. By the end of this tutorial, you'll understand how to build, configure, and deploy secure, custom containers with your Go-based application using Ko's streamlined workflow.

## Prerequisites

To follow along with this tutorial, you will need:

- A working Go development environment to set up the demo
- Docker or another OCI-compatible container runtime installed and running, so that you can test the resulting image
- Ko installed following the [official installation instructions](https://ko.build/install/)

Once you're finished installing Ko, check that it is functional by running:

```shell
ko version
```

You should get output similar to the following:

```shell
v0.18.0
```

## Step 1: Creating a sample Go application

To demonstrate Ko's capabilities, we'll create a simple Go web server that runs a minimal web application. Later on, you’ll be able to containerize it.

Create a new directory for your project:

```shell
mkdir ko-demo && cd ko-demo
```

Initialize a new Go module:

```shell
go mod init ko-demo
```

Use the following command to create a `main.go` file containing the logic for a basic web server application:

```shell
cat > main.go <<EOF
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello from Ko! Running on port %s\n", port)
    })

    http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprint(w, "OK")
    })

    log.Printf("Server starting on port %s", port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}
EOF
```

This creates a web server with two endpoints: a root endpoint (`/`) that returns a greeting message and a health check endpoint (`/health`) to check the status of the server. The server listens on port `8080` by default but can be configured using the `PORT` environment variable.

Test that your application works locally:

```shell
go run main.go
```

Your application should start and display output similar to:

```
2025/08/04 15:35:45 Server starting on port 8080
```

Open another terminal and test the endpoint:

```shell
curl http://localhost:8080
```

You should receive the following response:

```
Hello from Ko! Running on port 8080
```

Stop the application by pressing `CTRL+C` in the terminal where it's running.

## Step 2: (Re) authenticating to the Chainguard registry

In case you have previously authenticated to the Chainguard registry via `chainctl`, you might need to refresh your token by pulling an image and reauthenticating with your OIDC provider of choice. Run the following command for that:

```shell
docker pull cgr.dev/chainguard/static
```

Once you’re able to pull images without being prompted to authenticate, you can proceed to the next step.

## Step 3: Building your first container with Ko

To get started, you'll build your application locally using Ko’s default configuration. Ko supports cross-compilation to other CPU architectures and operating systems via the `--platform` flag, so it can build container images for any platform that is supported by the base image. Chainguard Containers are available for both `amd64` and `arm64` architectures.

To build the image locally using default settings, run:

```shell
ko build --local .
```

If you're on macOS, you may want to include the `--platform=linux/arm64` flag to your command, or use `--platform=all` to build all supported platforms.

```shell
ko build --local --platform=linux/arm64 .
```

The `--local` flag tells Ko to build the image and load it into your local Docker daemon instead of pushing it to a registry. The output includes information such as the image name and tags added to this build:

```
...
2025/08/04 15:53:05 Building ko-demo for linux/amd64
2025/08/04 15:53:11 Loading ko.local/ko-demo-f2e1cf7eebaa497931a6a58522f6d83f:2f27fb1252ce004cf29fa713e8c7d3bce1c2e95352f3ddb33fb72690431e73fd
2025/08/04 15:53:12 Loaded ko.local/ko-demo-f2e1cf7eebaa497931a6a58522f6d83f:2f27fb1252ce004cf29fa713e8c7d3bce1c2e95352f3ddb33fb72690431e73fd
2025/08/04 15:53:12 Adding tag latest
2025/08/04 15:53:12 Added tag latest
ko.local/ko-demo-f2e1cf7eebaa497931a6a58522f6d83f:2f27fb1252ce004cf29fa713e8c7d3bce1c2e95352f3ddb33fb72690431e73fd
```

By default, Ko creates a unique image name for the project based on the import path, and a unique tag name that identifies this specific build. If you run the command again multiple times, you’ll get the same combination of image name \+ tag. The tag will only change if there are changes in the build, such as  updates in the base image, or updates to dependencies. This feature facilitates reproducible builds.

You can change this behavior at runtime with the flags `--base-import-paths` to omit the hash appended to the image name, and `--bare` to use only the base registry name. For example, the following command will rebuild the image using only the path information for the image name, while still creating a unique tag in addition to `latest`:

```shell
ko build --local . --base-import-paths
```

```
...
2025/09/02 12:57:00 Adding tag latest
2025/09/02 12:57:00 Added tag latest
ko.local/ko-demo:d403c3992168125d8dbb960f6c47783dfb7d20f660791d16334310e9dee26b9e
```

You can use the `docker image list` command to check the images and tags you created with Ko:

```shell
docker image list | grep ko
```

```
ko.local/ko-demo                  d403c3992168125d8dbb960f6c47783dfb7d20f660791d16334310e9dee26b9e   9c710b8a98a2   4 weeks ago     9.07MB
ko.local/ko-demo                  latest                                                             9c710b8a98a2   4 weeks ago     9.07MB
ko.local/ko-demo-f2e1cf7eebaa497931a6a58522f6d83f   d403c3992168125d8dbb960f6c47783dfb7d20f660791d16334310e9dee26b9e   9c710b8a98a2   4 weeks ago     9.07MB
ko.local/ko-demo-f2e1cf7eebaa497931a6a58522f6d83f   latest                                           86528e034ac8   4 weeks ago     9.07MB

```

It’s worth noting that the resulting image is very minimal, with less than 10MB in size.

Now you can test your containerized application. The following command runs the image using a port mapping to redirect requests on port `8080` in the host to the same port inside the container:

```shell
docker run -p 8080:8080 ko.local/ko-demo
```

Your application should start inside the container. Test it with curl in another terminal:

```shell
curl http://localhost:8080
```

You should receive the same response as before. Stop the container by pressing `CTRL+C`.

## Step 4: Pushing images to a remote registry

Ko can build and push images to a remote registry with a single command. To push images, you’ll need to set up the `KO_DOCKER_REPO` environment variable with your preferred push registry. The value can be either your own registry URL (such as `ghcr.io/my-org/my-repo`) or your Docker username, in case you are using the Docker Hub registry.

For example, the following will set up Ko to push to a Docker Hub registry under the `linky` user:

```shell
export KO_DOCKER_REPO=linky
```

To build the image and push it to the remote registry, run:

```shell
ko build --base-import-paths
```

The image will be built and pushed to the remote registry automatically, which you can confirm from the output:

```
2025/09/15 13:09:10 Using base cgr.dev/chainguard/static:latest@sha256:b2e1c3d3627093e54f6805823e73edd17ab93d6c7202e672988080c863e0412b for ko-demo
2025/09/15 13:09:11 current folder is not a git repository. Git info will not be available
2025/09/15 13:09:11 Building ko-demo for linux/amd64
2025/09/15 13:09:11 Publishing linky/ko-demo:latest
2025/09/15 13:09:14 pushed blob: sha256:8cf6f1c6fcba0c40fba9e61b39672b1cd91626c7c6fd78d3ce1679dfae2b8b1c
2025/09/15 13:09:14 pushed blob: sha256:8d9d552233adea41e9d0d6b73cf2847b736ac13bd9a4b8df39836193652c6500
2025/09/15 13:09:15 pushed blob: sha256:250c06f7c38e52dc77e5c7586c3e40280dc7ff9bb9007c396e06d96736cf8542
2025/09/15 13:09:15 pushed blob: sha256:7493e3cb9c5dc55615efb3f5298804d5817c43127a5e82bc7d6d6b5edf472912
2025/09/15 13:09:16 pushed blob: sha256:4fcce664a6320a086990883b95e0377ca0e410844c7fa93a8ca02869aac6dd12
2025/09/15 13:09:16 pushed blob: sha256:59b34ce0532f011950c3e51cd19f924aaa4dc9fdb722448610a0e3e47ea1138b
2025/09/15 13:09:17 index.docker.io/linky/ko-demo:sha256-6ce1b8b932e5249ce5aaaee33ceaa491ef5c83ef3a2f44dc51700113806f46c6.sbom: digest: sha256:a5dd8c1ad4a415db5944f848427271a4bb87b475cd04cd31eb17a6bfd4dd0b5b size: 373
2025/09/15 13:09:17 Published SBOM index.docker.io/linky/ko-demo:sha256-6ce1b8b932e5249ce5aaaee33ceaa491ef5c83ef3a2f44dc51700113806f46c6.sbom
2025/09/15 13:09:17 linky/ko-demo:latest: digest: sha256:6ce1b8b932e5249ce5aaaee33ceaa491ef5c83ef3a2f44dc51700113806f46c6 size: 1336
2025/09/15 13:09:17 Published linky/ko-demo@sha256:6ce1b8b932e5249ce5aaaee33ceaa491ef5c83ef3a2f44dc51700113806f46c6
linky/ko-demo@sha256:6ce1b8b932e5249ce5aaaee33ceaa491ef5c83ef3a2f44dc51700113806f46c6

```

You’ll notice that Ko also pushes an SBOM to the remote registry.

To verify that the image is available in the remote registry, you can pull it to your local machine with a command similar to this, using the remote registry’s URL and the image name:

```shell
docker pull linky/ko-demo
```

Remember to replace `linky/ko-demo` with your own unique registry address and image name.

## Next steps

You now have a foundation for using Ko to build secure, minimal images for your Go applications. To continue learning about Ko and container security, consider exploring:

- [Ko's official documentation](https://ko.build/) for advanced configuration options
- [Chainguard's image catalog](https://images.chainguard.dev/) to discover specialized base images for different use cases
- [Container signing with Cosign](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-install-cosign/) to add cryptographic signatures to your images

Ko's declarative approach to container building combined with Chainguard's security-focused base images provides a powerful toolkit for modern Go application deployment.

---

### Build Java containers with Jib
_Path: chainguard/containers/building-and-modifying/build-tools/building-java-containers-with-jib.md_

[Google's Jib](https://github.com/GoogleContainerTools/jib) is a container
image build tool designed specifically for Java applications. Unlike other
approaches, Jib does not depend on Docker or require users to write
Dockerfiles. Instead, Jib integrates directly with the Maven and Gradle build
systems to create container images for Java applications. When paired with
[Chainguard Java
Containers](https://images.chainguard.dev/directory/image/jre/versions), these tools provide:

- improved security through minimal base images,
- faster builds through layer optimization,
- and simplified CI/CD integration without Docker daemon requirements

This tutorial will walk you through building a demo application with Maven,
Jib, and Chainguard Containers.

## Prerequisites

Before proceeding, you'll need to meet the following requirements:

- [Java Development Kit](https://www.oracle.com/java/technologies/downloads/) (JDK) 21 or later installed
- [Maven 3.6+](https://maven.apache.org/install.html) installed
- [Docker](https://docs.docker.com/engine/install/) to test the containerized application

## Understanding Chainguard Java images

Chainguard provides several Java-related images optimized for different use
cases. Understanding which image to use depends on your application's
requirements:

- [cgr.dev/chainguard/jre](https://images.chainguard.dev/directory/image/jre): Java Runtime Environment only; for running pre-compiled Java applications
- [cgr.dev/chainguard/jdk](https://images.chainguard.dev/directory/image/jdk): Full Java Development Kit; use if your build process requires compilation within the container
- [cgr.dev/chainguard/maven](https://images.chainguard.dev/directory/image/maven): Pre-configured with Apache Maven for build environments
- [cgr.dev/chainguard/gradle](https://images.chainguard.dev/directory/image/gradle): Pre-configured with Gradle for build environments

For most production applications built with Jib, the JRE image is appropriate
since Jib handles the compilation outside the container.

You can verify the version of Java in a container as follows:

```sh
docker run --rm cgr.dev/chainguard/jre:latest -version
```

This will display the Java version information from the image:

```
openjdk version "25" 2025-09-16
OpenJDK Runtime Environment (build 25+-wolfi-r1)
OpenJDK 64-Bit Server VM (build 25+-wolfi-r1, mixed mode, sharing)
```

Note that the latest version of the JRE (currently 25) is freely available from
Chainguard but access to other versions requires a subscription.

## Stage 1 — Creating a demo Java application

Start by creating a demo Java application to demonstrate Jib's containerization
capabilities. This example uses a basic Spring Boot application, but the
principles apply to any Java application.

Create a new directory for your project and navigate into it:

```sh
mkdir jib-demo
cd jib-demo
```

Next, create the following source code directory for your application:

```sh
mkdir -p src/main/java/com/example/demo
```

You can now create the main application class. The following command creates a
new `DemoApplication.java` file defining a Spring Boot application with two
endpoints that you can use to verify that the containerized application works
correctly:

```java
cat > src/main/java/com/example/demo/DemoApplication.java <<EOF
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/")
    public String hello() {
        return "Hello from Jib and Chainguard!";
    }

    @GetMapping("/health")
    public String health() {
        return "Application is healthy";
    }
}
EOF
```

The application is bootstrapped, but still needs build details for Maven. The
following command will create the pom.xml file with basic build settings for
Java 21:

```xml
cat > pom.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0           http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>jib-demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <properties>
    <maven.compiler.release>21</maven.compiler.release>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>3.5.6</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>3.5.6</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
EOF
```

To run the build, run the following command:

```sh
mvn clean install
```

Observe the output indicating that the build was successful:

```
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.733 s
[INFO] Finished at: 2025-09-25T11:40:03+01:00
[INFO] ---
```

Now you can run the application with the following command:

```sh
java -jar target/jib-demo-1.0.0.jar
```

The application exposes a web server on port `8080`. You can test the application
with a `curl` request from another terminal window:

```sh
curl localhost:8080
```

You should get output like the following:

```
Hello from Jib and Chainguard!
```

After validating that the application builds successfully and works as
expected, you can stop the server by pressing `Ctrl+C` in the terminal where it's
running.

## Stage 2 — Configuring Jib with Chainguard Containers

The next step is to include and configure Jib as a plugin in the `pom.xml`
file.

Locate the `<plugins>` section of your `pom.xml` file. Add the Jib plugin
definition like this:

```xml
      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.4.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>dockerBuild</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <from>
            <image>cgr.dev/chainguard/jre:latest</image>
            <platforms>
              <platform>
                <os>linux</os>
                <architecture>amd64</architecture>
              </platform>
              <platform>
                <os>linux</os>
                <architecture>arm64</architecture>
              </platform>
            </platforms>
          </from>
          <to>
            <image>linky</image>
          </to>
          <container>
            <ports>
              <port>8080</port>
            </ports>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
          </container>
        </configuration>
      </plugin>
```

The configuration specifies several settings:

- **Build goal**: The execution goal is defined as `dockerBuild`. This will build a container image for the application and then load the built image into the local Docker instance, allowing you to immediately run and test the container.
- **Base (or "from") image**: Uses Chainguard's JRE image (`cgr.dev/chainguard/jre:latest`). This example explicitly specifies both `arm64` and `amd64` architectures. If you don't do this, Jib will build an `amd64` image only, regardless of host architecture.
- **Target image**: Name of the image to build (`linky`). The tag will default to `latest` if not specified.
- **Port**: Documents that port `8080` is used for the Spring Boot application
- **Creation time**: Uses the current timestamp

## Stage 3 — Building container images with Jib

With Jib configured, you can now build your containerized Java application.
Because we have specified `dockerBuild` as the execution goal, this step will
require a local Docker install. If you want to avoid using Docker and push the
image straight to a registry, jump to Stage 5.

Run:

```sh
mvn clean install
```

You’ll get output like the following:

```
...
[WARNING] Detected multi-platform configuration, only building image that matches the local Docker Engine's os and architecture (linux/arm64) or the first platform specified
[INFO]
[INFO]
[INFO] Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.example.demo.DemoApplication]
[INFO] Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.example.demo.DemoApplication]
[INFO]
[INFO] Built image to Docker daemon as linky
...
```

This command has compiled the application, built the container, and loaded it
into the local Docker instance.

To verify that the image was built:

```sh
docker images linky
```

Which will provide details on the new image:

```
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
linky        latest    43171844f68e   3 minutes ago   466MB
```

You should also scan the image for CVEs. This example uses
[grype](https://github.com/anchore/grype), but you can use your preferred
scanner:

```sh
grype linky
```

This should give you output similar to the following:

```
 ✔ Vulnerability DB                [updated]
 ✔ Loaded image                                                  linky:latest
 ✔ Parsed image                    sha256:bf2e8781db85416a96815753aa5dce19f9d8
 ✔ Cataloged contents              a25dc3225e1f655da4f3f160acf6004973061ae0a25
   ├── ✔ Packages                        [72 packages]
   ├── ✔ Executables                     [121 executables]
   ├── ✔ File metadata                   [1,335 locations]
   └── ✔ File digests                    [1,335 files]
 ✔ Scanned for vulnerabilities     [0 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 0 low, 0 negligible
No vulnerabilities found
```

In this case, there were no CVEs found. Try comparing those results to images built with different base images.

## Stage 4 — Testing the containerized application

After building your container image, test it to ensure it works correctly.
Start by running the container locally:

```sh
docker run -p 8080:8080 linky
```

The application will start, and you'll see Spring Boot's startup logs. In a
separate terminal, test the endpoints:

```sh
curl http://localhost:8080/
```

This should return:

```
Hello from Jib and Chainguard!
```

Test the health endpoint:

```sh
curl http://localhost:8080/health
```

Expected output:

```
Application is healthy
```

Stop the container by pressing `Ctrl+C` in the terminal where it's running.

## Stage 5 — Building and pushing to a remote registry

One of the strongest points of jib is that you don't need Docker installed to
build and distribute container images. In this step we will change `pom.xml` to
push the image directly to a container registry.

This example uses `ttl.sh`, which is a free-to-use Docker registry for short-lived hosting of images. You can also change the code to use your own registry such as a local one or the Docker Hub.

Replace the previous plugin definition with this one (or add this one if you skipped Stage 3):

```xml
      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.4.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <from>
            <image>cgr.dev/chainguard/jre:latest</image>
            <platforms>
              <platform>
                <os>linux</os>
                <architecture>amd64</architecture>
              </platform>
              <platform>
                <os>linux</os>
                <architecture>arm64</architecture>
              </platform>
            </platforms>
          </from>
          <to>
            <image>ttl.sh/jib-demo-${maven.build.timestamp}:20m</image>
          </to>
          <container>
            <ports>
              <port>8080</port>
            </ports>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
          </container>
        </configuration>
      </plugin>
```

This contains a couple of changes:

- The execution goal is now `build`. This will push to the registry rather than the
local Docker instance.
- The image name now refers to the `ttl.sh` registry and includes a timestamp for uniqueness.

Run the build again:

```sh
mvn clean install
```

You’ll get output like this:

```
...
[INFO] Using base image with digest: sha256:60a6d264537fbad2f5d37a01cf6222f2f172415f686bf59afe3b1043f79323f0
[INFO]
[INFO]
[INFO] Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.example.demo.DemoApplication]
[INFO] Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.example.demo.DemoApplication]
[INFO]
[INFO] Built and pushed image as ttl.sh/jib-demo-20250925104449:20m
...
```

The image name is parameterised with a timestamp, so yours will look different.
The image won't be in your local Docker instance, but you can pull it as
normal (remember to copy your unique image name from the output):

```sh
docker pull ttl.sh/jib-demo-20250925104449:20m
```

And run it as before:

```sh
docker run -p 8080:8080 ttl.sh/jib-demo-20250925104449:20m
```

The `ttl.sh` registry is only for temporary testing of images and your image
will be deleted in 20 minutes.

This time the built image is a multi-platform image -- if you pull the image
from an `amd64` host you will get the `amd64` version and if you pull from an
`arm64` host you will get the `arm64` version. You can also force the platform
when pulling:

```sh
docker pull --platform amd64 ttl.sh/jib-demo-20250925104449:20m
```

## Other features

### Building a tar archive

If you want a local copy of the image as a file that can be later loaded by a
container runtime or saved to a file server, you can instead build the image as
a tar archive.

This doesn't work for multiplatform images unfortunately, so to test you will
need to remove one of the platforms in the from definition. (Or alternatively,
pull the architecture setting into a parameter.)

The following plugin definition will build a tarball for the `amd64` platform:

```xml
      <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.4.6</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>buildTar</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <from>
            <image>cgr.dev/chainguard/jre:latest</image>
            <platforms>
              <platform>
                <os>linux</os>
                <architecture>amd64</architecture>
              </platform>
            </platforms>
          </from>
          <to>
            <image>linky</image>
          </to>
          <container>
            <ports>
              <port>8080</port>
            </ports>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
          </container>
        </configuration>
      </plugin>
```

After replacing the plugin definition, run:

```sh
mvn clean install
```

And the output should give you the location of the built tarball:

```
...
[INFO]
[INFO] Built image tarball at /Users/amouat/proj/jib-demo/target/jib-image.tar
...
```

You can directly load this tarball into Docker:

```sh
docker load < target/jib-image.tar
```

This should respond with the name of the built image:

```
Loaded image: linky:latest
```

If required, the image can then be retagged and pushed to a registry.

### Calling goals directly

In these examples, you've been editing the pom.xml to configure the execution goal. You can also directly call these from Maven, for example:

```sh
mvn install jib:dockerBuild
```

For full details of Jib plugin configuration and features, refer to the [guide on GitHub](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin).

## Next steps

You've now successfully containerized a Java application using Jib and Chainguard's
minimal container images. You have seen how Jib and Chainguard combine to provide
a streamlined path to building secure, minimal container images for Java
applications.

To continue learning about container security and optimization for the Java ecosystem, consider exploring:

- [Chainguard Libraries for
    Java](https://edu.chainguard.dev/chainguard/libraries/java/overview/):
provides enhanced security for the Java ecosystem by rebuilding popular Maven
dependencies with the latest patches and comprehensive supply chain protection.

- [How to Migrate a Java Application to Chainguard
    Images](https://edu.chainguard.dev/chainguard/containers/migration/migration-guides/java/):
in this video, learn how to migrate Java applications to Chainguard Containers
for reduced vulnerabilities, smaller images, and comprehensive JDK/JRE support
with daily security updates.

By combining Jib's build optimization with Chainguard's security-focused
images, you've established a foundation for building secure, efficient
container images as part of your Java development workflow.

---

### Overview of Chainguard's package repositories
_Path: chainguard/containers/building-and-modifying/packages/package-model.md_

Chainguard Containers are built using packages from the Wolfi and Chainguard OS Linux distributions. If you need to extend or customize an image, it can be useful to access these packages directly.

Chainguard offers curated package repositories to support containerized workloads and simplify dependency management. These repositories ensure you can access trusted packages — whether building custom container images, working with Chainguard OS, or using Chainguard Containers in production.

This article provides an overview of Chainguard's package model, highlighting the different Chainguard package repositories available to customers.

## Repository types

All users have access to two distinct package repositories maintained by Chainguard:

* Wolfi
* Extra

Additionally, Chainguard customers have access to a Private APK Repository specific to their organization.

> **Note**: Be aware that SLAs apply to container images, not individual packages.

Chainguard Containers are designed to run apk packages, a package format developed for [Alpine Linux](https://www.alpinelinux.org/). Accordingly, Chainguard's package repositories contain apk packages, and you can interact with them using the standard [`apk` commands](https://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html). Chainguard maintains the packages within all of these package repositories.

The following table presents a high-level overview of these package repositories:

| Repository Type | Access Level | Package Scope | Authentication Required | Typical Use Case |
| ----------------- | :----------------: | :----------------------: | :-----------------------: | :------------------------: |
| Wolfi | Public | Wolfi ecosystem | No | Free images |
| Extra | Public | Supplemental utilities | No | Additional dependencies, non-open source software |
| Private | Private/Organization-specific | Packages in org-entitled container images ¹ | Yes | Customizing Chainguard Containers with [Custom Assembly](/chainguard/containers/custom-assembly/overview/) |

¹ Customers using Chainguard OS Packages have access to far more packages than this to build their own images, but the additional packages are not available to use with Custom Assembly. Read the details in [Private APK repositories](#private-apk-repositories).

## Public repositories

Chainguard has two public package repositories: the Wolfi and Extra Packages repositories. These repos typically include the latest stable versions and explicitly exclude FIPS-validated packages or version streams.

### Wolfi

The [Wolfi packages repository](https://github.com/wolfi-dev/os) is the public package source for [Wolfi, Chainguard's open-source Linux "undistro."](/open-source/wolfi/overview/) It contains all the open-source packages used in Chainguard's Free container images. As a public repository, the Wolfi APK repo doesn't require authentication.

By default, Chainguard's Free container images use a generic address for this repository (`https://apk.cgr.dev/chainguard`) in their `/etc/apk/repositories` files:

```shell
docker run -it --rm --entrypoint cat cgr.dev/chainguard/python:latest-dev /etc/apk/repositories
```

```output
https://apk.cgr.dev/chainguard
```

Users that aren't Chainguard customers can use this URL to add packages from the Wolfi repository. Chainguard customers can access it with a URL that's unique to their organization:

```url
https://virtualapk.cgr.dev/$ORGANIZATION_ID/chainguard
```

If you need packages outside Wolfi's open-source scope, or under less permissive licenses, Chainguard offers a supplemental Packages repository

### Extra packages

Chainguard's Extra Packages repository is a public-facing APK repository that includes utilities and compatibility packages that aren't fully open-source, but can still be redistributed by Chainguard. The repository’s primary role is to provide supplemental packages needed to support containerized applications, especially when those utilities fall outside the scope of the official base images or are under less permissive licenses than those in the Wolfi repository.

The Extra Packages repository follows similar rules to the Wolfi repo, but explicitly allows packages under more restrictive licenses as long as redistribution is permitted.

The Extra Packages repository isn't specified in the `/etc/apk/repositories` file of Chainguard's Free images by default. However, users that aren't Chainguard customers can access it through the generic address `https://apk.cgr.dev/extra-packages`.

Like the Wolfi repository, customers can access it with a URL that's unique to their organization:

```url
https://virtualapk.cgr.dev/$ORGANIZATION_ID/extra-packages
```

### Working with public repositories

As mentioned previously, both the Wolfi and Extra Packages repositories are public and don't require authentication. Chainguard customers can access both with a URL that's unique to their organization:

* Wolfi: `https://virtualapk.cgr.dev/$ORGANIZATION_ID/chainguard`
* Extra: `https://virtualapk.cgr.dev/$ORGANIZATION_ID/extra-packages`

You must replace `$ORGANIZATION_ID` with your organization's unique identifier (UID). You can find this with `chainctl` if [you've installed it](/chainguard/chainctl-usage/how-to-install-chainctl/):

```shell
chainctl iam orgs ls -o table
```

You must replace `$ORGANIZATION_ID` with your organization's `ID` value, not its name:

```output
                    ID                    |      NAME       |          DESCRIPTION
------------------------------------------|-----------------|--------------------------------------
 0a************************************c8 | example.com     | This is an example organization
```

You can also find this in the [Chainguard Console](https://console.chainguard.dev/). After logging in, open the **Settings** tab. There, you'll find your organization's identifier under **Organization UID**. Be aware that these repository URLs **will not** resolve properly if you include the name of your organization instead of the UID.

For any of your organization's Chainguard Containers that include the APK package manager, these repositories are included by default. You can also add them to the `/etc/apk/repositories` file of any container that uses APK. Our guide on [How to pull packages from Chainguard package repositories through Artifactory](/chainguard/containers/registry/pull-through-guides/artifactory-packages-pull-through/#configuring-pull-through-caches-for-chainguards-public-repositories) includes directions for setting up pull-through caches for these repositories on Artifactory.

### Package retention in public repositories

To limit the size of public APK repositories and maintain efficient `apk` operations, Chainguard periodically removes older package versions based on a package retention policy.

The public Wolfi and Extra repositories currently retain non-latest package versions for **12 months**. Over time, this retention window may be reduced to **3 months**; any change will be announced in advance.

Retention rules for public repositories:

* Non-latest package versions older than 12 months are removed unless:
    * They are required by other Wolfi packages.
    * They are required by Chainguard Container images.
* Additionally, Chainguard removes latest package versions if the corresponding package definition has been removed from the Wolfi source repository (`https://github.com/wolfi-dev/os`), unless they meet one of these exceptions.

If you pin specific package versions, ensure those versions remain within the retention window or mirror them internally.

Chainguard removes packages on a monthly basis, on the second Wednesday of each month. Candidates for removal are announced one month in advance.

Public repositories affected:

* Wolfi (`https://apk.cgr.dev/chainguard`)
* Extra (`https://apk.cgr.dev/extra-packages`)

## Private APK repositories

Chainguard customers have access to a private APK repository that is only accessible to members of their organization. An organization's private APK repository contains packages not included in either of the public repos, such as the main packages found in [Production containers](/chainguard/containers/concepts/container-categories/#production-containers), as well as any packages relating to FIPS support. That said, it's likely an organization's private APK repository also includes many of the same packages found in the Wolf or Extra Packages repositories.

The list of packages available in a given organization’s private repository is based on the packages available in the Chainguard Containers that the organization already has access to. For example, say your organization has access to the Chainguard MySQL container image. Along with the container's main package (`mysql`), this image comes with other apk packages, including `bash`, `glibc`, and `pwgen`. This means that you’ll have access to these apk packages through your organization’s private APK repository, along with any that appear in other Chainguard container images that your organization has access to.

Chainguard's private APK repositories have URLs that follow this form:

```url
https://apk.cgr.dev/$ORGANIZATION_ID
```

Because Chainguard's private APK repos are only accessible to members of a specific organization, you must authenticate in order to access them. Refer to our overview of [Chainguard's private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) for more information. Additionally, note that if you customize a Chainguard Container using the [Custom Assembly tool](/chainguard/containers/custom-assembly/overview/), the list of packages available for you to add to your container image is taken from your organization's private APK repository.

There is one exception: Chainguard OS Packages is an offering for larger customers who already build their own images from packages using tools like Bazel, Dockerfiles, and rules\_apko and want to use a wider set of packages from Chainguard. This includes over 400,000 packages that will be made available in a private APK repository. You are responsible for the image builds, the build tooling, validation, and compatibility while Chainguard builds the packages in the Chainguard Factory with complete SBOMs and our standard enterprise-grade, zero-CVE process. This offering is limited to those who want to use Chainguard-sourced packages in their existing, mature image building processes.

Chainguard OS Packages are not currently available for use with Chainguard Custom Assembly. However, they are made available to you in the same private APK repository location as is described in this page. The only difference is the number of packages that are available. So, any existing build automation you are using will continue to work.

### Package retention in private repositories

Private APK repositories for Chainguard customers follow a **12-month** retention period for non-latest package versions. They follow the same retention rules and removal schedule as the public Wolfi repository.

Customers that require older package versions should mirror or store copies internally.

## Package support

Chainguard commits to build packages in the Chainguard Factory with complete SBOMs and our standard enterprise-grade, zero-CVE process. Packages that are used in Chainguard Container images are also covered by our [CVE remediation SLA](https://www.chainguard.dev/legal/cve-policy?utm_source=docs). That commitment continues to apply to these packages when they are included in private APK repositories, but not to images you build yourself using those packages. We cannot extend our SLA to the images because we do not have control of your build.

Similar to the [Chainguard shared responsibility model](https://edu.chainguard.dev/chainguard/containers/concepts/shared-responsibility-model/) for container images, you are responsible for your authored image builds, the build tooling, validation, and compatibility, but now you can do all this using packages that are scanned daily for CVEs. We recommend you always update your builds to new package versions as we release them so are still benefiting from the SLA even if your custom-built images are not covered by it.

## Learn more

Chainguard’s package repositories provide trusted apk packages to support both standard and advanced containerized workloads. With the public Wolfi and Extra repositories alongside organization-specific private repositories, customers can reliably source the dependencies they need for production environments.

We encourage you to learn more about Chainguard's private APK repositories by referring to our [documentation on the subject](/chainguard/containers/building-and-modifying/packages/private-apk-repos/). If you're ready to add a package to one of your container images, [Adding a package to a Chainguard Container](/chainguard/containers/building-and-modifying/adding-packages/) compares the available approaches and walks through the task.

---

### Chainguard's private APK repositories
_Path: chainguard/containers/building-and-modifying/packages/private-apk-repos/index.md_

With Chainguard's private APK repositories, you can access packages that are included within your organization's container image entitlements. This allows you to build custom images based on components that are already part of your organization catalog.

This guide provides a brief overview of Chainguard's private APK repositories and outlines different ways you can incorporate them into your organization's workflows.

{{< beta feature="Private APK Repositories" access="all Chainguard Containers customers" >}}

## About private APK repositories

Chainguard's private APK repos allow customers to pull secure apk packages from Chainguard. The list of packages available in an organization's private repository is based on the apk repositories that the organization already has access to.

For example, say your organization has access to the [Chainguard MySQL container image](https://images.chainguard.dev/directory/image/mysql/versions). Along with `mysql`, this image comes with other apk packages, including `bash`, `openssl`, and `pwgen`. This means that you'll have access to these apk packages through your organization's private APK repository, along with any others that appear in Chainguard container images that your organization has access to.

## Contents of private APK repositories

Your private APK repository contains all packages available in the container images your organization is entitled to, plus some extra utilities, like `curl`.

Chainguard offers [Chainguard OS Packages](/chainguard/chainguard-os/chainguard-os-packages/), a beta feature that extends the set of available packages in your private APK repository to include the latest versions of all 30,000 packages Chainguard maintains as part of Chainguard OS and Wolfi. If you are a catalog customer, your private APK repository will contain the full set of packages built for Chainguard OS and Wolfi. If you're a per-image customer, your private APK repository will contain most of these packages, but won't contain any "main" packages for images you aren't entitled to, preventing you from recreating our images. If you're interested in expanding the set of available packages in your private APK repository and are a current customer, reach out to your account team to be added to the Beta.

## Your repository address

Your private APK repository will be available at a URL like the following:

`https://apk.cgr.dev/$ORGANIZATION`

You will need to replace `$ORGANIZATION` with the name of your organization as it appears in the Chainguard Console.

You can always find your private APK repository's address by logging into the [Chainguard Console](https://console.chainguard.dev/) and navigating to the **Settings** tab in the left-hand navigation menu. This will take you to the **General** section where you can copy the repository address.

In order to use your private repository, you must add this URL to the list of apk repositories found in an `/etc/apk/repositories` file, and you'll also need to provide credentials to have access to this repo. To set this up, you must follow these general steps:

1. Set up an `HTTP_AUTH` environment variable with appropriate credentials
2. Add `https://apk.cgr.dev/ORGANIZATION` to `/etc/apk/repositories`
3. Update your apk cache
4. Install your desired packages

In the following sections, this guide will outline how to implement this process in a live container and also when building container images from a Dockerfile or using apko.

## Authenticating to your private APK repository

To access the apk packages in your private repository, you'll first need to authenticate. You can do so by setting up an `HTTP_AUTH` environment variable with an authentication string that uses `chainctl` to obtain an ephemeral token to access the registry.

The `HTTP_AUTH` environment variable expects a string in the following format:

```example
HTTP_AUTH=basic:apk.cgr.dev:user:password
```

You will need to replace `password` with an apk token which you can obtain using the following `chainctl` command:

```shell
chainctl auth token --audience apk.cgr.dev
```

The following `docker run` command injects the `HTTP_AUTH` environment variable directly into the container by calling `chainctl` from the host machine:

```shell
docker run -ti --rm \
   -e "HTTP_AUTH=basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)" \
   cgr.dev/$ORGANIZATION/$IMAGE
```

In this command and throughout the rest of this guide, be sure to change `$ORGANIZATION` to reflect the name of your organization's repository within Chainguard's registry. Additionally, this guide was validated using the [chainguard-base](https://images.chainguard.dev/directory/image/chainguard-base/overview) image, but you can use any container image that is part of your organization's image catalog. However, to follow along with every example this guide, you should use a container image that includes a shell, such as an image's `-dev` variant.

Also, you can initialize these placeholder values by setting them as environment variables as in the following examples. This will make it easier to follow along:

```shell
ORGANIZATION="chainguard.edu"
IMAGE="chainguard-base"
```

This command will start an interactive container and open up a shell interface. From there, you can add your organization's private APK repository to the list of apk repositories in `/etc/apk/repositories`.

First, you'll need to retrieve your organization's private repository address. Recall that you can find this in the **Settings** tab in the Chainguard Console.

From the interactive container's shell, add the repository address to your list of apk repositories with a command like the following:

```container
echo https://apk.cgr.dev/$ORGANIZATION > /etc/apk/repositories
```

Note that this command uses `>` to overwrite the contents of the `/etc/apk/repositories` file. You could instead append the private APK repository's address with `>>`, but here we overwrite the file to ensure that we're only installing packages from the private repo.

Then update the apk cache to include the newly-added private repository:

```container
apk update
```

Following that, you can proceed to search and install packages from your private APK repository.

## Searching for and installing packages

As an example of how you can search for and install packages from these private repositories, this section will install `wget`. However, you could also try this out with any apk package that is included in any of the Chainguard container images your organization has access to.

First, search for the `wget` package from the interactive container's shell:

```container
apk search wget
```

You will receive output similar to the following:

```Output
wget-1.25.0-r0
```

You can call `apk policy` to find which repositories contains the package:

```container
apk policy wget
```

This example output shows that it's available from the private APK repository:

```Output
wget policy:
wget policy:
  1.24.5-r4:
    https://apk.cgr.dev/$ORGANIZATION
  1.24.5-r5:
    https://apk.cgr.dev/$ORGANIZATION
  1.25.0-r0:
    https://apk.cgr.dev/$ORGANIZATION

```

Install the package with `apk add`:

```container
apk add wget
```

Finally, run the same `apk policy` command you ran previously:

```container
apk policy wget
```

```Output
wget policy:
  1.24.5-r4:
    https://apk.cgr.dev/$ORGANIZATION
  1.24.5-r5:
    https://apk.cgr.dev/$ORGANIZATION
  1.25.0-r0:
    lib/apk/db/installed
    https://apk.cgr.dev/$ORGANIZATION

```

This output shows that the `wget` package is now installed.

## Using private APK repositories with Dockerfiles

So far, this guide has outlined how to manually fetch apk packages from a private repository. We'll now go over how to use a private APK repo within a Dockerfile workflow. We'll be using the same organization, container image, and private package used in the previous examples.

If you haven't already done so, close the container you were running in the previous section. Then run the following command to create a Dockerfile. This Dockerfile uses [Docker Build Secrets](https://docs.docker.com/build/building/secrets/#using-build-secrets) to inject the credentials into a `RUN` command that will update the apk cache and another that will install the `wget` apk package:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/$ORGANIZATION/$IMAGE

USER root
RUN echo https://apk.cgr.dev/$ORGANIZATION > /etc/apk/repositories
RUN --mount=type=secret,id=cgr-token sh -c "export HTTP_AUTH=basic:apk.cgr.dev:user:\$(cat /run/secrets/cgr-token) apk update && apk add wget"
USER 65532
EOF
```

Again, this Dockerfile overwrites the contents of the `/etc/apk/repositories` file. This isn't necessary, but will force Docker to build the image and install the `wget` package without falling back to the default repositories.

You may need to change the final `USER` statement to match the default user of the image you are extending. This can be found by running `docker inspect` or in the Specifications tab of the Chainguard Console entry for the image.

Now you can build the image while passing along credentials obtained with `chainctl`. The following example builds an image named `my-custom-image`:

```shell
CGR_TOKEN=$(chainctl auth token --audience apk.cgr.dev) \
   docker build --secret id=cgr-token,env=CGR_TOKEN . -t my-custom-image
```

Following that, you can verify that the image has access to the private repository and contains the apk package that was installed at build time:

```shell
docker run --rm my-custom-image apk policy wget
```

```Output
wget policy:
  1.24.5-r4:
    https://apk.cgr.dev/$ORGANIZATION
  1.24.5-r5:
    https://apk.cgr.dev/$ORGANIZATION
  1.25.0-r0:
    lib/apk/db/installed
    https://apk.cgr.dev/$ORGANIZATION
```

As this output shows, the `wget` apk package is installed in the container.

## Using private APK repositories with apko builds

You can also use your private APK repository with [apko](/open-source/build-tools/apko/overview/) builds. One of the advantages of this method is that you can build distroless images that include only the apk packages you need in the final image.

As with the previous examples, you'll need to provide the `HTTP_AUTH` environment variable containing your Chainguard token to the apko runtime building the image.

The following Dockerfile includes the private APK repository used in previous examples and installs a single package (`wget`) in the image:

```shell
cat > apko.yaml <<EOF
contents:
  repositories:
  - https://apk.cgr.dev/$ORGANIZATION
  packages:
  - wget

archs:
- x86_64
- aarch64
EOF
```

The following `docker run` command will inject the `HTTP_AUTH` environment variable within an `apko` runtime and build the image:

```shell
docker run --rm \
  -e "HTTP_AUTH=basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)" \
  --workdir /work -v ${PWD}:/work \
  cgr.dev/chainguard/apko build apko.yaml test-apk test-apk.tar
```

You'll get output similar to the following, indicating that the `wget` package was installed using the private APK repo:

```shell
2025/02/20 21:23:48 INFO Building images for 1 architectures: [amd64]
2025/02/20 21:23:48 INFO setting apk repositories: [https://apk.cgr.dev/$ORGANIZATION]
2025/02/20 21:23:50 INFO installing ca-certificates-bundle (20241121-r1)
2025/02/20 21:23:50 INFO installing wolfi-baselayout (20230201-r16)
2025/02/20 21:23:50 INFO installing ld-linux (2.40-r8)
2025/02/20 21:23:50 INFO installing glibc (2.40-r8)
2025/02/20 21:23:50 INFO installing libgcc (14.2.0-r8)
2025/02/20 21:23:50 INFO installing glibc-locale-posix (2.40-r8)
2025/02/20 21:23:50 INFO installing libcrypto3 (3.4.1-r0)
2025/02/20 21:23:50 INFO installing libssl3 (3.4.1-r0)
2025/02/20 21:23:50 INFO installing wget (1.25.0-r0)
2025/02/20 21:23:50 INFO setting apk repositories: [https://apk.cgr.dev/$ORGANIZATION]
2025/02/20 21:23:50 INFO built image layer tarball as /tmp/apko-temp-2854430999/apko-x86_64.tar.gz

. . .
```

## Using private APK repositories with Bazel rules for apko

You can also use your private APK repository with [Bazel](https://bazel.build/) using
[rules_apko](https://github.com/chainguard-dev/rules_apko), which wraps
`apko` for use in Bazel builds. Like the `apko` approach, you get the
advantage of building distroless images that include only the APK packages
you need in the final image, with the additional benefits of Bazel's
hermetic, reproducible, and cached build system.

As with the previous examples, you'll need to provide the `HTTP_AUTH`
environment variable containing your Chainguard token to the `apko` runtime
building the image:

```shell
export HTTP_AUTH="basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)"
```

In your `apko.yaml`, reference your private Chainguard APK repository:

```shell
cat > apko.yaml <<EOF
contents:
  repositories:
  - https://apk.cgr.dev/$ORGANIZATION
  packages:
  - wget

archs:
- x86_64
- aarch64
EOF
```

With `HTTP_AUTH` set and your `apko.yaml` in place, run your Bazel build:

```shell
build //:my_image
```

You'll get output similar to the following, indicating that the `wget`
package was installed using the private APK repository:

```output
INFO: Analyzed target //:my_image (123 packages loaded, 656 targets configured).
INFO: From Action my_image:
2026/03/12 12:46:27 INFO installing wolfi-baselayout (20230201-r28) arch=x86_64
2026/03/12 12:46:27 INFO installing ca-certificates-bundle (20251003-r4) arch=x86_64
2026/03/12 12:46:27 INFO installing ld-linux (2.43-r2) arch=x86_64
2026/03/12 12:46:27 INFO installing glibc (2.43-r2) arch=x86_64
2026/03/12 12:46:27 INFO installing wget (1.25.0-r0) arch=x86_64
INFO: Found 1 target...
Target //:my_image up-to-date:
  bazel-bin/my_image
INFO: Build completed successfully, 128 total actions
```

<a id="pull-token-automation"></a>

## Pull token for authentication in automated workflows

Use a pull token with a custom time to live (TTL) to authenticate to your
private APK repository. The following example creates a pull token with a TTL of
2190 hours, equivalent to 3 months, and produces an output with `export`
commands to set environment variables `CHAINGUARD_IDENTITY_ID` for username and
`CHAINGUARD_TOKEN` for password values and basic authentication use.

```shell
chainctl auth pull-token --repository=apk --ttl=2190h --output=env
```

```output
export CHAINGUARD_IDENTITY_ID=<identity-id>
export CHAINGUARD_TOKEN=<pull-token>
```

* `--repository=apk`: create a role binding to bind the pull token identity the
`apk.pull` role, enabling the identity to download packages from the private APK
repository of the parent organization.
* `--ttl=2190d`: set the duration for the validity of the token, defaults to
  `720h` (equivalent to 30 days), maximum valid value is `8760h` (equivalent to
  365 days), valid unit strings range from nanoseconds to hours and are `ns`,
  `us`, `ms`, `s`, `m`, and `h`.
* `--output=env`: set the command output to use export commands for environment
  variables. `apk` and `oci` pull tokens use the unqualified
  `CHAINGUARD_IDENTITY_ID` and `CHAINGUARD_TOKEN` names; library ecosystems use
  names such as `CHAINGUARD_JAVA_IDENTITY_ID`. Refer to [pull token output
  formats and credential
  names](/platform/chainctl-usage/pull-token-output/) for the full mapping.

Each invocation of the command creates a new identity with access rights as a
pull token. `chainctl` uses your organization automatically when you belong to
only one; if you have access to more than one, add `--parent=ORGANIZATION`.

Combine the call with `eval` to populate the environment variables directly by
calling `chainctl`. The following example uses the default TTL value of 30 days,
which is suitable for regular CI runs:

```shell
eval $(chainctl auth pull-token --repository=apk --output env)
```

The generated pull token can be provided in the `HTTP_AUTH` environment variable
for accessing the private APK repository:

```shell
export HTTP_AUTH=basic::${CHAINGUARD_IDENTITY_ID}:${CHAINGUARD_TOKEN}
```

Now you can structure your CI workflow to utilize this variable for
authentication against the APK repository.

## Troubleshooting

You may receive a 403 error when pulling down a package:

`403 FORBIDDEN caller does not have the required capabilities`

This error may mean that your Chainguard identity doesn't have the proper capabilities to download the image. To pull an image, the identity will need a role with the `apk (list)` capability. The least privileged role with this capability is `apk.role`, though more privileged roles like `owner`, `editor`, and `viewer` also have this capability.

You can check this and fix it by following these steps:

1. Run `chainctl auth status` and check the `Capabilities` field in the output. If you don't find the `apk.pull` role (or a more privileged role) for the organization you're trying to pull from, you will need to add the role.
2. Create the `apk.pull` role using the steps outlined in our [Overview of roles and role-bindings](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) resource.
3. Try pulling the package again.

If you'd like to provide feedback or need further help troubleshooting, [reach out to our Customer Support team](https://www.chainguard.dev/contact?utm=docs).

## Conclusion

Private APK repositories offer customers a convenient way to make use of the packages their organization has access to. By following this guide, you should have a good understanding of how you can use them in your particular workflows.

Be aware that you can use private APK repositories to install packages within container images customized with Chainguard's Custom Assembly tool. Refer to our [Custom Assembly documentation](/chainguard/containers/custom-assembly/#installing-packages-from-a-chainguard-private-apk-repository) for more information.

---

### Chainguard Catalog Starter
_Path: chainguard/containers/reference/catalog-starter.md_

Chainguard Catalog Starter is a way to try production-grade Chainguard Containers for free, without committing to a full subscription. It lets you choose a set of five container images from the broader Chainguard catalog so you can validate security, performance, and operational fit in your own environment before you buy.

{{< beta feature="Chainguard Catalog Starter" >}}

To sign up for Catalog Starter, follow the steps on this page. Once set up, you can start piloting up to five secure container images from the Chainguard catalog.

## What is Catalog Starter?

With Chainguard Catalog Starter, users can choose any five non-FIPS images from our catalog of secure-by-default containers. Any Helm charts that depend on those images are included and count toward the five-image limit.

Catalog Starter is designed as a standalone free plan, separate from paid Catalog or per-image subscriptions. It's meant for teams who want to try Chainguard Containers in real workloads before committing to a larger rollout, giving them a better understanding of how Chainguard’s hardened images and CVE posture behave in practice.

> **Note**: Catalog Starter is best suited for small teams to get them started right away. When you are ready to standardize on Chainguard and deploy organization-wide, we have several paid plans that provide unlimited user access to the Chainguard Containers and additional features like Custom Assembly, FIPS images, EOL/EmeritOSS image versions, a contractual CVE-remediation SLA, and dedicated support.

## Sign up for Catalog Starter

### 1. Sign up and select your images

1. Go to [console.chainguard.dev/signup](https://console.chainguard.dev/signup).
2. Sign in with a business email address and create a new account. Catalog Starter requires a corporate email domain — personal email addresses and social media sign-ins are not supported.
3. Enter your company name.
4. Click **Set up an organization**.
5. Complete the form and click **Submit**.
6. Click **Select images**, choose between one and five images, and confirm your selection. You can also go to the **Images** page at any time to make or change your selection.

Once you've added all five images, a prompt directs you to contact Chainguard if you need access to additional images.

### 2. Integrate with your registry and pipelines

After you complete signup, you're free to use the five images you selected however you like. For example, you can pull them into your CI/CD pipelines and runtime environments, or pull them through a third-party registry like [JFrog Artifactory](/chainguard/containers/registry/pull-through-guides/artifactory-containers-pull-through/). These container images are the same as those provided to Chainguard's paying customers, and are covered by Chainguard’s standard hardening, rebuild, and CVE-remediation processes, although they are not covered by [Chainguard's CVE SLA](https://www.chainguard.dev/legal/cve-policy).

### 3. Upgrade when you’re ready

After trying out Chainguard Containers with Catalog Starter, you can reach out to our sales team to upgrade to one of Chainguard's paid plans:

* [Catalog pricing](/chainguard/containers/reference/pricing/) — a subscription that grants broad access to the full Chainguard Containers catalog with self-service provisioning through the Console.
* Per-image pricing — a scoped set of images licensed individually, often used for tightly defined image deployments.

Moving to a paid plan means moving off Catalog Starter; the free five-image entitlement is not stacked on top of a paid subscription.

## Manage Catalog Starter with `chainctl`

As an alternative to the Console, you can sign up for and manage Catalog Starter from the command line with `chainctl`.

### Sign up with `chainctl`

To sign up for a new account, run the interactive [`chainctl starter init`](/platform/chainctl/chainctl-docs/chainctl_starter_init/) command:

```shell
chainctl starter init
```

This requires selection of a valid authentication option:

```shell
    Choose an identity provider to login to Chainguard

  > Email and password
    Google
```

Use the arrow keys and press **Enter** to select an option, which launches a browser window to the Chainguard Console to complete sign-up.

### Request access with `chainctl`

If your organization already has a Catalog Starter plan, request access to it with [`chainctl starter request-access`](/platform/chainctl/chainctl-docs/chainctl_starter_request-access/):

```shell
chainctl starter request-access
```

### Add images with `chainctl`

You can see which images are available [using the Chainguard Directory](/chainguard/chainguard-images/how-to-use/chainguard-directory/). To add one or more images, run [`chainctl starter add-images`](/platform/chainctl/chainctl-docs/chainctl_starter_add-images/), substituting the desired image names for the variables:

```shell
chainctl starter add-images $IMAGE1 [$IMAGE2] ... [$IMAGE4]
```

After the Chainguard system has processed your request, the images become accessible. This can take up to a few hours. When available, you can pull the images like this, replacing `$ORGANIZATION` with your organization's name and `$IMAGE` with the desired image's name:

```shell
docker pull cgr.dev/$ORGANIZATION/$IMAGE:latest
```

### Check status with `chainctl`

To show the status of your Catalog Starter organization, including the registry path, account provisioning status, image quota usage, and per-image readiness, run [`chainctl starter status`](/platform/chainctl/chainctl-docs/chainctl_starter_status/):

```shell
chainctl starter status
```

## Plan limitations and terms

Catalog Starter allows users to try out Chainguard Containers, but it comes with certain limitations, including the following:

* You can select up to five non-FIPS images. Once chosen, these images cannot be swapped or replaced during the lifetime of the free plan.
* The following types of Chainguard Containers are not included in the Catalog Starter plan:
    * [FIPS-validated images](/chainguard/fips/fips-images/)
    * Images that fall under the [EOL grace period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/#understanding-chainguards-eol-grace-period)
    * Images whose software is part of [Chainguard EmeritOSS](https://github.com/chainguard-forks/)
* Teams using Chainguard Catalog Starter will not have access to the support services available to paying customers: they will not be added to Chainguard's support platform, be able to create support tickets, or have access to root cause analysis (RCA).
    * Catalog Starter users will still have access to Chainguard resources like our [documentation](https://edu.chainguard.dev/), [courses](https://courses.chainguard.dev/), the [Community Slack channel](https://www.chainguard.dev/unchained/the-chainguard-slack-community-is-here), and the [public support knowledge base](https://support.chainguard.dev/hc/en-us).
* [Chainguard's CVE SLA](https://www.chainguard.dev/legal/cve-policy) does not apply to container images obtained through Catalog Starter.
* The free plan does not support user management or role-based access control (RBAC). If a colleague from the same company signs up for Catalog Starter, your organization's administrator receives an email with instructions for adding them. You cannot add users directly. Any additional users in your organization have access to the five images selected by the first user and cannot change them.
* Users in a Catalog Starter organization are assigned the `limited_owner` role, which allows them to browse the Console, pull images, and create pull tokens, but does not include permission to invite other users to the organization or access features like [Custom Assembly](/chainguard/containers/custom-assembly/).
* Neither Custom Assembly nor Commercial Builds, Chainguard's bespoke paid build services, are included in the Catalog Starter plan.
* Catalog Starter cannot be combined with an existing Chainguard Containers license. Existing customers remain on their current paid plans; this free offering can’t be used to subsidize or partially offset paid image counts.

## Frequently asked questions

### Can I change my five images after I select them?

No. Once you’ve selected your five images under Catalog Starter, that selection is fixed for the life of the free plan and cannot be swapped or replaced.

If you anticipate needing different images over time, we recommend talking to our team about Catalog Pricing or per-image licensing.

### Does Catalog Starter include FIPS images or Chainguard commercial builds?

No. FIPS images and Chainguard Commercial Builds are not included in the Catalog Starter plan.

If you require FIPS-validated images or dedicated commercial build work, you’ll need a paid plan that includes those capabilities.

### Can my colleagues and I use the same Catalog Starter images?

Yes. If a Catalog Starter organization already exists for your email domain, the administrator of that organization receives an email with instructions for adding you to it. Once added, you'll have access to the five images the first user selected, and neither of you will be able to change them.

Catalog Starter does not include user management or RBAC, so users can't add others to their Chainguard organization themselves.

### I’m already a Chainguard Containers customer. Can I add Catalog Starter to my account?

No. Catalog Starter is a distinct, standalone free plan meant for new organizations. It can’t be combined with existing licenses or used to "carve out" a subset of images from a current subscription.

If you try to sign up using an email domain already associated with a paid Chainguard account, you’ll receive an error message. Contact your Chainguard account administrator for access to your organization’s existing account.

### Can I use Catalog Starter to cover some of the images I need?

No. Catalog Starter is not a discount instrument for larger deployments. You can’t, for example, license 10 images but expect to pay for only five by applying this plan to the rest.

If you know you’ll need more than five images, it’s usually better to start with Catalog Pricing or per-image licensing so you can scale cleanly.

### Can I sign up using a social media account?

No. Catalog Starter requires a business email address. If you sign in using a social login (such as GitHub or Google), you'll be prompted to create a new account with a business email instead.

### What happens if I decide to upgrade to a paid plan?

When you upgrade:

* Your organization moves off the free Catalog Starter plan.
* You gain access to the broader capabilities of your chosen paid tier (for example, full Catalog Pricing with self-service provisioning and, optionally, FIPS access), as well as Chainguard's full support services and CVE SLA.
* Pricing is based on the paid plan’s terms (such as developer bands for Catalog Pricing or image counts for per-image plans).

Our team will work with you to map your existing Catalog Starter images into the right long-term structure.

---

### Using the Tag History API
_Path: chainguard/containers/reference/using-the-tag-history-api.md_

Chainguard Containers have automated nightly builds, which ensures our container images are always fresh including any recent patches and updated software. Even though it is important to keep your base images always updated, there will be situations where you'll want to keep using an older build to make sure nothing will change in your container environment until you feel it's safe to update.

For cases like this, it is useful to point your Dockerfile to use a specific **container image digest** as base image.

A container image digest is a unique identifier that is generated for each and every image build. Digests always change, even when the contents of the image remain the same.

If you have a container environment that was working fine but suddenly breaks with a new build, using a previous container image build version by declaring an image digest instead of a tag is a way to keep things up and running until you're able to assert that a new version of a container environment works as expected with your application.

> NOTE: If you are looking for a quick way to learn the tag history of a container image, you may want to consider using the `chainctl images history` command instead of the API. Refer to **[Examine the history of container images](/chainguard/chainctl-usage/chainctl-images/#examine-the-history-of-container-images)** for more information.

## Obtaining a registry token

Before making API calls, you'll need to generate a token within [Chainguard's registry](/chainguard/chainguard-registry/overview/).

### Public containers

The Registry API endpoint for obtaining the token is:

```
https://cgr.dev/token?scope=repository:chainguard/IMAGE_NAME:pull
```

Where `IMAGE_NAME` is the name of the container image that you want to pull the tag history from. It's worth noting that the token is only valid for pulling the history of that specific image.

For free-tier container images (tagged as `latest` or `latest-dev`), you can request a registry token anonymously, without providing any pre-existing auth.

The following command will obtain a token for the **Python** container image and register a variable called `auth_header` with the resulting value, which you can use in a subsequent command to obtain the tag history:

```shell
auth_header="Authorization: Bearer $(curl 'https://cgr.dev/token?scope=repository:chainguard/python:pull' \
  | jq -r .token)"
```

### Private containers

For private images, you need a registry token scoped to the `cgr.dev` audience. After you authenticate with `chainctl auth login`, the most direct way to get one is `chainctl auth token`:

```shell
auth_header="Authorization: Bearer $(chainctl auth token --audience cgr.dev)"
```

The `--audience cgr.dev` flag is required. Without it, `chainctl auth token` issues a token for a different audience and the Tag History API rejects it with a `403` response.

If you have already set up Docker authentication with [`chainctl auth configure-docker`](https://edu.chainguard.dev/chainguard/chainguard-registry/authenticating/), you can instead read the token from the Docker credential helper:

```shell
auth_header="Authorization: Bearer $(echo 'cgr.dev' | docker-credential-cgr get | jq -r .Secret)"
```

You can also use the [`crane` tool](https://github.com/google/go-containerregistry/tree/main/cmd/crane):

```shell
auth_header="$(crane auth token -H cgr.dev/ORGANIZATION_NAME/IMAGE_NAME)"
```

Replace `ORGANIZATION_NAME` and `IMAGE_NAME` as required. For example, if your organization is `foo.com` and you're interested in the `chainguard-base` image, you will use the following command:

```shell
auth_header="$(crane auth token -H cgr.dev/foo.com/chainguard-base)"
```

You should now be ready to call the API, either manually or programmatically.

## Calling the API

Make sure your authorization header is set, by running the following command:

```shell
echo $auth_header
```

You should receive `Authorization: Bearer` followed by a long string (a [JWT](https://jwt.io/introduction)) as output. You can now run a `curl` query to this endpoint, following the below format.

```shell
https://cgr.dev/v2/ORGANIZATION_NAME/IMAGE_NAME/_chainguard/history/IMAGE_TAG
```

Where:

- For private images `ORGANIZATION_NAME` is the name of your organization, for example: `foo.com`.
- For public images `ORGANIZATION_NAME` is always `chainguard`.
- `IMAGE_NAME` is the name of the image, for example: `chainguard-base` or `python`.
- `IMAGE_TAG` is the tag that you want to pull history from.

For example, this is how you can fetch the tag history of **foo.com's** **chainguard-base:latest** Chainguard image using `curl` on the command line:

```shell
curl -H "$auth_header" \
  https://cgr.dev/v2/foo.com/chainguard-base/_chainguard/history/latest | jq
```

Or for a free-tier container image such as **python:latest**:

```shell
curl -H "$auth_header" \
  https://cgr.dev/v2/chainguard/python/_chainguard/history/latest | jq
```

You should get output like the following:

```
{
  "history": [
 {
   "updateTimestamp": "2023-05-12T13:46:10.555Z",
   "digest": "sha256:81c334de6dd4583897f9e8d0691cbb75ad41613474360740824d8a7fa6a8fecb"
 },
 {
   "updateTimestamp": "2023-05-12T20:50:19.702Z",
   "digest": "sha256:a8724b7a80cae14263a3b55f7acb5d195fcbb24afbc8067aa5198aa2a9131cde"
 },
 ...

  ]
}
```

## Using the start and end parameters

In some cases it may be helpful to specify digests created in a given time period rather than querying the entire history of a tag. For this, you can use the `start` and `end` parameters. These optional parameters can be added to requests to the Tag History API and should be specified in the `ISO 8601` format.

To illustrate how to query digests of a container image created in the last week, first create a local shell variable named `timestamp`. On Ubuntu, you would create the `timestamp` variable as follows:

```shell
timestamp=$(date -d "-1 week" +%Y-%m-%dT%H:%M:%SZ)
```

And on Wolfi, you would create it like this:

```shell
timestamp=$(date -d @$(( $(date +%s ) - 604800 )) +%Y-%m-%dT%H:%M:%SZ)
```

Then to query digests of the **python:latest** Chainguard Container created in the last week you would run a command like the following:

```shell
curl -s -H "Authorization: Bearer $tok" \
 "https://cgr.dev/v2/chainguard/python/_chainguard/history/latest?start=${timestamp}" | jq
```

To query digests of the **python:latest** Chainguard Container created before 2024, first create a new `timestamp` variable like this:

```shell
timestamp="2024-01-01T00:00:00Z"
```

Then run the query like this:

```shell
curl -s -H "Authorization: Bearer $tok" \
 "https://cgr.dev/v2/chainguard/python/_chainguard/history/latest?end=${timestamp}" | jq
```

Both of these examples filter the `curl` command's output through [`jq`](https://jqlang.github.io/jq/), a useful tool for processing JSON on the command line.

## Page limit

Please note that the Tag History API will return a maximum of 1000 records on a single request. For tags with many digests, since the oldest digests are ordered first, it may be necessary to specify the timestamp of the desired digests - for this, the `start` and `end` parameters may be used as specified above.

## Using container digests within a Dockerfile

Setting up your Dockerfile to use an older build is a matter of modifying your `FROM` line to use a container image digest instead of a tag. For instance, let's say you want to make sure you keep using the current latest build of the Python image. In a previous section of this page we obtained the tag history of the Python image, and the most recent build digest is listed as `sha256:81c334de6dd4583897f9e8d0691cbb75ad41613474360740824d8a7fa6a8fecb`. With that information, you can edit your Dockerfile and replace:

```
FROM cgr.dev/chainguard/python:latest
```

With:

```
FROM cgr.dev/chainguard/python@sha256:81c334de6dd4583897f9e8d0691cbb75ad41613474360740824d8a7fa6a8fecb
```

And your container image will then be locked into that specific build of the `python:latest` image variant.

---

### Package and image name mappings
_Path: chainguard/containers/reference/package-name-mappings.md_

When migrating to Chainguard Containers, you may notice that some package and image names differ from their upstream counterparts. This guide explains why these mappings exist and provides a comprehensive reference of how Chainguard maps image and package names to our container ecosystem.

## Why Chainguard remaps package names

Different Linux distributions often use different names for the same software. For example, Debian calls its C compiler package `build-essential`, while Alpine calls the equivalent package `build-base` and Fedora uses `gcc` and related packages. Chainguard Containers standardize these names to provide consistency regardless of which distribution you're migrating from.

In some cases, upstream package names can be ambiguous or misleading. To create more clarity, Chainguard maps `netcat-traditional` to `netcat-openbsd` to specify the implementation, and `google-chrome-stable` to `chromium` to reflect the open-source base.

Some distributions split a single piece of software into many sub-packages, while others bundle functionality together. Chainguard's package naming reflects a more streamlined approach that reduces the number of packages you need to install, minimizing the attack surface by avoiding unnecessary package splits.

### Container image name conventions

For container images, Chainguard follows naming conventions that prioritize:

- **Specificity**: Instead of generic names, we use descriptive names (for example, `argocd-repo-server` instead of just `argocd`)
- **Consistency**: All our images follow similar naming patterns
- **Discoverability**: Names that clearly indicate the software's purpose

### Using package mappings

When you're using Chainguard's [Dockerfile Converter (dfc)](/chainguard/containers/migration/migration-tools/dockerfile-conversion/), these mappings are applied automatically. The tool recognizes upstream package and image names and translates them to their Chainguard equivalents.

For manual migrations, you can reference the following tables to find the correct package or image name you need.

## Package name mappings

### Debian/Ubuntu packages

The following table shows how Debian and Ubuntu package names (used with `apt`, `apt-get`) map to Chainguard package names (used with `apk`).

{{< package-mappings/debian-packages >}}

### Fedora/RedHat/UBI packages

The following table shows how Fedora, RedHat, and UBI package names (used with `yum`, `dnf`, `microdnf`) map to Chainguard package names.

{{< package-mappings/fedora-packages >}}

### Alpine packages

Alpine Linux package names generally align with Chainguard's package names, as both use `apk` and share similar package management philosophies. In most cases, no mapping is necessary when migrating from Alpine to Chainguard Containers.

## Image name mappings

The following table shows how upstream container image names map to Chainguard Containers. Note that wildcard patterns (indicated by `*`) match multiple variants of an image name.

{{< package-mappings/image-mappings >}}

## Learn more

For more information about working with Chainguard Containers and package management, you can check out our overview of [Chainguard's package model](/chainguard/containers/building-and-modifying/packages/package-model/). Additionally, you may find our doc on [Using the Dockerfile Converter](/chainguard/containers/migration/migration-tools/dockerfile-conversion/) to be useful.

---

### Unique tags for Chainguard Containers
_Path: chainguard/containers/reference/unique-tags/index.md_

Chainguard's unique tags feature provides unique timestamped tags for every container image build, addressing enterprise requirements for precise version tracking and automated deployment workflows. Many organizations rely on distinct tags to trigger automated deployments and maintain audit trails, making traditional floating tags like 'latest' unsuitable for production use.

To help with cases like this, Chainguard offers Unique Tags for private registries. Unique Tags are ideal for organizations that require a strict tag per release or update of their images. They benefit teams looking for precise tracking and management of container images.

Unique Tags are an opt-in feature that is only available for private registries. If your organization is interested in using Unique Tags, [contact support](https://support.chainguard.dev/) and we'll enable this feature for you. Refer to [Get support](/get-started/get-support/) for the portal's prerequisites.

This guide provides an overview of what these Unique Tags are, the kinds of problems they aim to solve, and how you can access them in the Chainguard Console.

## Chainguard's unique tags

Unique Tags are only available for private registries, as Chainguard's public registry only has the `:latest` or, in some cases, the `:latest-dev` tags available. Unique Tags feature an opt-in feature, which allows customers the flexibility to enable it based on their specific operational and security requirements.

Chainguard's Unique Tags end in a timestamp, such as `20240229`, which indicates the date when the Container was built. Because Chainguard Containers are rebuilt whenever there is a change to an included package, the timestamp ensures that the specific tag always represents that specific container image build and not another.

One benefit of using this timestamp scheme with Unique Tags is that it can help users to quickly identify when a given version of an container image was built. It also helps to make them human-readable, as opposed to the long, unpronounceable strings that make up container image digests.

Unique Tags also allow for individual image repositories within a registry to be included or excluded as needed. For example, if you have an application that requires a specific tagging scheme to be compatible with an existing Helm chart, you can enable Unique Tags for your registry, but exclude that specific repository so that its container images only receive the standard tags.

This granular level of control ensures that organizations can implement unique tagging in a way that best suits their organization's specific needs. It offers a tailored approach to image management, allowing for precise and efficient tracking of image versions and builds across different environments.

Additionally, the Unique Tags feature is integrated with Chainguard's [Tag History API](/chainguard/containers/using-the-tag-history-api/) and [event notifications](/chainguard/administration/cloudevents/events-reference/). These integrations allow you to track changes over time.

## How do I find unique tags?

After signing into the Chainguard Console, click **Organization images** in the left-hand navigation. This takes you to your organization's container images directory, which lists all the Chainguard Production container images you can access.

To the right of the search box and **Category** drop-down menu there's a filter button labeled **Visible tags**. Click that button, and you'll see a drop-down menu with two options: **Epoch tags** and **Unique tags**. Toggle **Unique tags** to see the Unique Tags available for your organization's container images.

With this button toggled on, each container image's details page shows the Unique Tags available for it.

To illustrate, toggle this button on and then click any paid Production container image listed in your organization's directory. The **Version** column now shows the Unique Tags available for that container image. These tags include a timestamp in the format `YYYYMMDDHHMM`, and may include a prefix to help identify and parse the tag name programmatically.

For example, a container image version might have a tag similar to `:openjdk-17-202412120223`. This means that this particular version of the container image was last updated on December 12, 2024, at 2:23 AM. You can use this version's **Pull URL** (`cgr.dev/$ORGANIZATION/jdk-fips:openjdk-17-202412120223`) to download this container image, and you can be confident that this Pull URL always refers to the same container image.

## Unique vs immutable tags: are unique tags right for me?

By design, container image tags are mutable and can change over time. Although Unique Tags are meant to serve as a solution for teams whose internal workflows require unique tags, for true image immutability we recommend pinning images by digest (`{repo}:{tag}@{digest}`) to ensure immutability and reproducibility whenever possible, rather than Unique Tags.

Some things to be aware of before opting into Unique Tags:

- It applies across the entire organization, to every image. While Unique Tags may be appropriate for one use case, it may not be appropriate for all the use cases in your organization.
- It appends a timestamp to all tags, like `1.2.3-20260218175623`
- You no longer receive updates for non-unique tags, like `1.2.3`. It's an either/or situation.
- It arguably makes the tags harder to browse in the Chainguard UI and the UI of other registry solutions.
- It can cause performance issues in certain scenarios, as the response when listing tags is much larger.
- We don't enforce immutability at the registry level. So while we won't update unique tags, there is nothing on a technical level that prevents them from being pushed to. Once tags are mirrored to an internal registry, unless that registry supports tag immutability, the tags can be overwritten.

For all of these reasons, digests are a stronger mechanism for ensuring immutability than unique tags for almost everyone.

Check out the ["Pulling by digest" section](/chainguard/containers/using-and-deploying/using-containers/#pulling-by-digest) of our guide on How to Use Chainguard Containers for more information.
[Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/) covers how to retrieve a digest and pin a reference to it.

Additionally, you may find our three-part blog series on Chainguard's image tagging philosophy to be of interest.

- [Part 1](https://www.chainguard.dev/unchained/chainguards-image-tagging-philosophy-enabling-high-velocity-updates-pt-1-of-3?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)
- [Part 2](https://www.chainguard.dev/unchained/chainguards-image-tagging-philosophy-enabling-high-velocity-updates-pt-2-of-3)
- [Part 3](https://www.chainguard.dev/unchained/chainguards-image-tagging-philosophy-enabling-high-velocity-updates-pt-3-of-3)

Many dependency automation tools like [Dependabot](https://docs.github.com/en/code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories#docker) and [Renovatebot](https://docs.renovatebot.com/docker/#digest-pinning) support digest pinning with tag hints. For example if an image is of the form `cgr.dev/example.com/image:1.2@sha256:...`, these tools attempt to update image digests based on the `1.2` tag. **NOTE**: OCI/docker runtimes ignore tags in this format - there is no guarantee that the digest belonged to the tag at any point in time. They are used as version hints, but are not enforced - digest takes priority.

---

### Requesting new Chainguard resources
_Path: chainguard/containers/reference/request-resources/index.md_

The Chainguard Console includes the Requests section where customers can submit and track requests for resources that Chainguard doesn't currently offer. This improves transparency around which technologies Chainguard is working to build and helps minimize duplicate build requests.

This guide provides an overview of how to submit a request for a new resource to Chainguard, as well as the limitations on what resources can be built.

{{< beta feature="The Requests section" >}}

## Prerequisites

In order to submit requests for new resources in the Chainguard Console, you must be part of a [verified organization](/chainguard/administration/iam-organizations/verified-orgs/). Users with access to only Chainguard's Free tier of container images will not be able to submit requests.

## The requests section

To begin, navigate to the [**Requests** section of the Chainguard Console](https://console.chainguard.dev/org/chainguard/requests/active). This section includes three tabs:

* **My requests**, showing any requests you've upvoted or initiated, as well as any initiated by other members of your organization
* **Active builds**, which includes any resources the Chainguard team is in the process of building
* **Community requests**, showing all the resource requests not currently being built

Each of these tabs contains a table with the following columns:

* A column at the far left where you can upvote requests by clicking the upward-pointing arrow.
    * Click the arrow again to remove an upvote.
* The **Name** of the resource requested.
* The request's **Status**. This can be one of the following:
    * **Future**
    * **In progress**
    * **Paused**
    * **Reviewing**
    * **Won't build**
* If the original requester included them, **Project Details** that describe the resource being requested

Additionally, the **Community requests** tab includes a **Demand** column, showing what demand percentile the request falls into. Also, the **Active builds** tab includes an **Estimated delivery** column that shows when Chainguard expects the resource to be available.

## Requesting new resources

Within each tab in the **Requests** section of the console is a button labeled **New request**. Click this button to open a modal window where you can enter the details of your resource request.

This window contains several fields. The following are required for you to submit a request:

* **Type** — Specify the type of resource you're requesting, either an **Image**, a **Package**, or a **Helm chart**.
* **Name** — Enter the existing public name of the resource you're requesting.
* **Open Source project repository** — Include a link to a public repository containing the source code for the open source project you're requesting.
* **Include FIPS-validated variant?** — Select either **Yes** or **No**.
* Additionally, you must confirm that none of Chainguard's existing artifacts or requests match your request.

There are also a few optional fields you can fill in:

* **Project Dockerfile** — Include a URL to a Dockerfile for the application that includes a build definition; if the project does not include a Dockerfile, provide as much build information as possible.
* **Dependencies** — Specify any other resources the artifact you're requesting needs to function.
* **Deployment method** — Specify how you plan to use this resource; for example, if you're requesting an image, you can specify that you plan to run it using Helm, Cloud Run, Argo, Docker, etc.

Although these fields aren't required, filling them in provides Chainguard with more context for your request and can help speed up the approval process.

After filling out the form, click **Request image** to submit your request. Your request will then appear in both the **My requests** and **Community requests** tabs, and other customers will be able to upvote it.

The Chainguard team will then review the request and prioritize it based on demand, as determined by the number of upvotes the request has received from users.

## Limitations

There are a few limitations you should consider before submitting a new request:

* Chainguard will not build resources based on proprietary code.
    * Note that some projects distributed under open source licenses have strict terms that prevent Chainguard from building artifacts based on them.
* If a project is no longer receiving updates or releases, Chainguard typically won't build it since there aren't reliable security fixes upstream.
* There are cases where Chainguard cannot fulfill a FIPS request and be FIPS compliant. In such cases the standard variant can often still be built but the FIPS variant will get marked as **Won't build**.

Finally, be aware that requesting that Chainguard build a software artifact does not mean it will automatically be accessible to your organization. Once the resource is built, you can reach out to our sales team to add it to your organization; alternatively, if your organization has [Catalog pricing](/chainguard/containers/reference/pricing/) enabled, you can add it yourself after it's built.

Note that the **Requests** section is for resources Chainguard doesn't build at all. If Chainguard already builds the container image and you need a version that isn't listed, or the image isn't in your organization's catalog yet, refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/) instead.

---

### Chainguard container catalog pricing
_Path: chainguard/containers/reference/pricing/index.md_

Chainguard offers Catalog Pricing for our library of secure container images, providing access to the full catalog of Chainguard Containers. Catalog Pricing enables you to add individual images from the wider Chainguard catalog to your organization's repository using the Self-Serve  Catalog Experience.

This article highlights the benefits of the Catalog Pricing plan and outlines how you can provision container images through the Self-Serve Experience.

## Catalog pricing

The Catalog Pricing model provides a single subscription that grants unlimited access to the full catalog of container images maintained by Chainguard. This model removes the need for per-repository licensing and offers predictable monthly or annual costs. Subscriptions can include FIPS-compliant images, depending on the selected tier.

Chainguard's catalog contains more than a thousand secure-by-default container images that are continuously rebuilt and maintained under a [CVE SLA](https://www.chainguard.dev/legal/cve-policy). With Catalog Pricing, organizations can use any image in the catalog without having to manage individual licenses or track image usage.

You can also add multiple instances of the same container image to your organization. Note that, as of this writing, organizations are limited to a maximum of 2500 container image repositories.

This model is best suited for organizations that use many different Chainguard images across teams or projects. It allows platform and security teams to standardize on Chainguard images while giving developers unrestricted access to pull the images they need. Once a subscription is in place, any image from the catalog can be pulled and used without additional approvals or per-image fees.

## Self-serve catalog experience

Organizations that have signed up for Catalog Pricing can add container images through [Chainguard's Self-Serve Catalog Experience](http://chainguard.dev/unchained/introducing-the-self-serve-catalog-experience). This allows customers to independently add Chainguard Containers to their organization's catalog directly within the console, without needing to file support tickets or wait for Chainguard to provision resources manually.

In order for a user to add images to their organization through the Self-Serve Experience, they must be bound to a role with the `repo (create, list, update)` capabilities. Additionally, it may be helpful for users working with the Self-Serve Experience to have the `registry.entitlement (list)` capability in order to understand their organization's registry access entitlements.

The only built-in role with all of these capabilities is the `owner` role. Users intending to work with the self-serve catalog experience should be bound to the `owner` role or a custom role with the appropriate capabilities. Refer to our documentation [Roles and role-bindings](/chainguard/administration/iam-organizations/roles-role-bindings/) for more details.

To add a container to your organization through the Self-Serve Experience, start by logging in to the [Chainguard Console](https://console.chainguard.dev). After logging in, click **Images** in the left-hand navigation.

By default, this will take you to the **Organization** tab, where you'll find your organization's list of container images. Above the list of container images, to the right of the search box, there will be an **Add image** button. Click this button to open a window containing a list of Chainguard Containers you can add to your organization.

Within this window, you can scroll through the entire list of container images available for you to add to your organization. You can also use the search box within the window to search for a specific Chainguard Container to add.

After finding the container image you want to add to your organization, click on it. This changes the window to include a text field where you can optionally set a different name for the image.

This is the name that your users and tooling will use to refer to the container image, such as in a `docker pull` command. Note that this is required if you're adding another instance of an image already included in your organization's catalog.

Finally, click the **Add image** button in the window, and the container image will appear within your organization's catalog after a few minutes.

You can also add container images from the **Chainguard catalog** tab. This tab contains a list of every container image Chainguard has to offer, not just those that have already been added to your organization's catalog.

Within this tab, scroll or search for whatever image you want to add to your organization. At the right end of its row will be a button labeled **Add to org**.

Click the **Add to org** button to add the image to your organization; this will follow the same process as outlined previously. As before, you have the option to set a new name for the container image before clicking the **Add image** button.

After provisioning your new container image through Self-Serve, you and other members of your organization will be able to access it from the Console, with `chainctl`, or through Chainguard's API.

If there comes a point where you no longer need the image, you can remove it. Navigate to the image's page within the Console and click the **More** button in the upper-right corner.

Click **Delete** and enter the name of the container image to confirm that you want to remove it.

### Updating container image names with `chainctl`

You can also use [`chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/), Chainguard's command-line interface, to change the name of a container image that has already been added to your organization.

To begin, run a command like the following to check whether the container image you want to add is already in your organization. This example checks whether the `php` container image is included:

```shell
chainctl images repos list --repo=php -o json | jq -r '.items[0].id'
```

```Output
b41c4dd8fa86b9f0174b2ad10133cb506778aee4/2750044fc718841c
```

Note that this example uses [`jq`](https://jqlang.org/), a lightweight command-line JSON processor, to filter the output to only show the image's unique ID within the `example.com` organization.

Knowing that the image is included in the organization, you can rename it. This example renames the `php` container image to `php-new`:

```shell
chainctl images repo update php --name=php-new
```

```Output
ID: b41c4dd8fa86b9f0174b2ad10133cb506778aee4/2750044fc718841c
Name: php-new
Tier: BASE
```

After making this change, references to the previous name will no longer work for this image. This applies to any clients referencing this image by name.

If you happen to rename an image in error, you can change it back using the same command, swapping the old name and new name:

```shell
chainctl images repo update php-new --name=php
```

## Learn more

Chainguard's Catalog Pricing provides access across Chainguard's library of container images. To learn more about the Catalog Pricing model, we encourage you to [reach out for more information](https://www.chainguard.dev/contact?utm=docs). Additionally, you may find the following resources to be helpful:

- [Blog announcement: Unlock the Full Chainguard Containers Catalog – Now with a Catalog Pricing Option](https://www.chainguard.dev/unchained/unlock-the-full-chainguard-containers-catalog-now-with-a-catalog-pricing-option?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)
- [Blog announcement: Introducing the self-serve catalog experience](http://chainguard.dev/unchained/introducing-the-self-serve-catalog-experience)
- [Chainguard Pricing](https://www.chainguard.dev/pricing?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)

---

### Troubleshoot container and version availability
_Path: chainguard/containers/troubleshooting/container-version-troubleshooting.md_

You need a container image, or a particular version of one, and you can't pull it. The right next step depends on why it's missing, and there are five distinct reasons. This guide helps you tell them apart and resolve each one.

First, distinguish between the public container registry and your organization's registry:

* The [Chainguard Containers Directory](https://images.chainguard.dev/) at `images.chainguard.dev` is public. It lists every container image Chainguard builds, along with the tags, sizes, and metadata for each. Anyone can browse it.
* Your organization's registry at `cgr.dev/$ORGANIZATION/` holds only the images your organization has access to. This is what your teams pull from.

Browsing an image in the Directory doesn't mean your organization can pull it. For a fuller explanation of that distinction and how it relates to your subscription, see [Onboard your teams](/get-started/onboard-your-teams/).

## Find your situation

You identify several of these situations from a label in the Console. On a container's **Tags** tab, the **Pull URL** column shows the pull URL for a version when your organization can pull that version. When it can't, the column shows a status label instead, and that label describes the repository rather than the version on that row. A label where you expected a URL means the version isn't available to you.

Look up the image in the Directory, then match what you see to the following table:

| What you find | Go to |
| --- | --- |
| The image is in the Directory, but the Console shows **Unavailable to organization**, **Add to organization for access**, or **Request image for access** | [The container isn't in your organization's catalog](#the-container-isnt-in-your-organizations-catalog) |
| The image isn't in the Directory at all | [Chainguard doesn't build the container](#chainguard-doesnt-build-the-container) |
| The version is listed and the Console shows **Available in organization**, but the pull fails | [The version shows as available but won't pull](#the-version-shows-as-available-but-wont-pull) |
| The image is in the Directory, but not the version you need | [The version you need isn't listed](#the-version-you-need-isnt-listed) |
| The version is listed with a pause icon, an **Expired** status, or an end-of-life date that has passed | [The version has reached end of life](#the-version-has-reached-end-of-life) |

## The container isn't in your organization's catalog

Chainguard builds the image, but your organization hasn't added it yet. What you do next depends on your subscription.

**Catalog customers.** A Catalog subscription covers the whole catalog, but only a subset of images is loaded into your organization's registry at any time. Administrators add more as teams need them. If you have the `owner` role, you can add the image yourself from the Console: go to **Images**, then click **Add image** on the **Organization** tab, or **Add to org** on the **Chainguard catalog** tab. The image appears in your catalog after a few minutes.

Self-serve adds require a role with the `repo (create, list, update)` capabilities, and the `registry.entitlement (list)` capability is useful for understanding what your organization is entitled to. The `owner` role is the only built-in role that carries all of them. For the full walkthrough and the role details, see [Chainguard container catalog pricing](/chainguard/containers/reference/pricing/) and [Overview of roles and role-bindings](/platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings/).

If you don't have the `owner` role, ask an administrator in your organization to add the image.

**Per-image customers.** A per-image subscription covers a specific licensed set of images rather than the whole catalog. You can browse everything in the Directory, but only your licensed images are permitted for builds, deployments, and production workloads. Ask your administrators to start a request; once they approve it, they add the image to your organization's registry.

Questions about what your organization is licensed for go to your account team, meaning the customer success manager or solutions architect assigned to your organization.

## Chainguard doesn't build the container

If the image doesn't appear in the Directory, Chainguard doesn't build it yet, and you can ask for it. Submit the request from the **Requests** section of the Chainguard Console, where you can also see what Chainguard is already building and upvote requests from other customers. Chainguard prioritizes requests by demand, so upvoting an existing request helps more than filing a duplicate.

Submitting requests requires membership in a [verified organization](/platform/administration/iam-organizations/verified-orgs/). The form asks for the resource type, the resource's existing public name, and a link to the upstream open source repository.

Some requests can't be fulfilled. Chainguard won't build resources from proprietary code, won't build projects that no longer receive upstream updates, and can't always produce a FIPS variant. For the full process and the current limitations, see [Requesting new Chainguard resources](/chainguard/containers/reference/request-resources/).

## The version shows as available but won't pull

The **Pull URL** column reads **Available in organization**, but `docker pull` on that exact tag returns not found.

That label is about the repository: your organization has the container, and at least one of its versions is active. It says nothing about the version on the row where you read it. The column falls back to a label only when it has no pull URL to show for that row, so seeing one tells you this version has no pull URL for you. Two things cause that.

### The container is still syncing

When a container is added to an organization, its tags take a few minutes to reach that organization's registry. While the sync runs, an upload icon appears alongside the filters above the version list. Hover over it to see which stage it's in:

* `A new update for this image has been queued and will begin shortly.`
* `This image is currently being updated with newly built tags.`

Either message means the sync hasn't finished. Wait a few minutes, then reload the page. The icon appears only in your organization's view of the container, so not seeing it doesn't rule out a sync in progress. If the icon persists for more than a couple of hours, treat this as the next case.

### The tag isn't in your organization's registry

When a container is added to an organization, only its actively supported tags come across. An organization that has carried a container for a long time also holds records of older tags, from back when those tags were the supported ones.

Those records outlive the images they name. A superseded tag can still appear in the Console with a pull URL beside it, and still be listed by `chainctl`, while pulling it returns `MANIFEST_UNKNOWN`. A tag's presence in a listing is a weaker signal than whether that tag is still active.

So check against the active tags. This command reads your default organization:

```shell
chainctl images tags list --repo=$IMAGE --active-only
```

If the tag you want isn't in that output, treat it as unavailable, whatever the Directory or the Console shows for it. Drop `--active-only` to see everything your organization holds, including tags that are no longer maintained. Some of those will fail to pull.

What you do next depends on which kind of tag it is:

* The tag is actively maintained and missing from your organization. [Open a support request](#open-a-support-request).
* The tag has been superseded within its stream. Use that stream's current tag, or pin the exact build you need by digest, as described in [The version you need isn't listed](#the-version-you-need-isnt-listed).

## The version you need isn't listed

This is the most common case, and often the version you're asking for isn't the one you need. Before you request anything, it's worth understanding how Chainguard versions its container images, because that determines what's available.

### How Chainguard maintains versions

Chainguard actively maintains the latest patch release of each supported upstream version stream, not every patch that stream has ever released. If Python maintains 3.11, 3.12, and 3.13 upstream, Chainguard maintains all three streams; within each one, only the current patch is rebuilt. So `python:3.13` tracks the newest patch of the 3.13 stream, which was `3.13.9` when this was written.

Chainguard Containers also use *floating tags*. A tag points at the most recent build within its version stream rather than at a fixed image, so a tag's contents change as Chainguard rebuilds it. No tag stays pinned to one specific upstream patch release.

That combination explains most missing-version reports. If you need `7.79.2` and the stream has moved on to `7.80.1`, the supported path is the stream tag, which gives you that stream's latest patch with current security fixes applied. Requesting the older patch tag gets you an image that is no longer rebuilt and will accumulate CVEs.

Two related points follow from how tags float:

* A newer epoch tag supersedes the previous one. Once `1.14.5-r4` exists, `1.14.5-r3` stops being updated. Epoch tags aren't a locking mechanism.
* To list what's actually maintained for an image, run `chainctl image repo list --repo=$IMAGE -o json | jq -r '.items[].activeTags'`. See [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/) for more on tags, epochs, and how to inspect them.

### Pin to a specific build with a digest

If your reason for wanting a specific patch version is reproducibility, use a digest instead of a tag. A digest is a content-addressed reference to one exact build, and it never changes:

```shell
docker pull cgr.dev/$ORGANIZATION/node@sha256:ede7ef4ca485553f5313f7a02ad3537db1fe337079fc7cfb879f44cf709326db
```

Retrieve the digest for a tag with `crane`:

```shell
crane digest --full-ref cgr.dev/$ORGANIZATION/node:latest
```

A digest identifies one build and keeps identifying that same build even after the tag that pointed to it has moved on. Note the tradeoff: a pinned digest also stops receiving patches, so pair digest pinning with a process for updating the pin. Refer to [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/) for the full workflow.

### If an actively maintained tag is missing from your organization

When the Directory shows a tag as actively maintained but that tag isn't available in your organization's registry, that's worth reporting. [Open a support request](#open-a-support-request) with the image name and the exact tag.

The Console makes the same point from the image's **Tags** tab. Below the tag table is a link labeled **Looking for older tags?**, which explains that only actively supported tags are available when an image is added to your organization, and asks you to try a supported tag before opening a request.

## The version has reached end of life

When an upstream project stops maintaining a version, Chainguard generally stops patching it. New builds are no longer published, and vulnerabilities accumulate in that version over time. Chainguard doesn't build or maintain end-of-life versions, so requesting one isn't a path forward. Move to an actively maintained version instead.

Chainguard also doesn't retroactively build versions that had already reached end of life before Chainguard began maintaining an image. If an upstream project released a version years before the image entered the catalog, that version was never built and can't be added.

### Check the end-of-life date

Use `chainctl` to see the end-of-life date and grace period end date for each release track:

```shell
chainctl package versions list python --show-active
```

```output
 VERSION |  EOL DATE  | EOL GRACE PERIOD END DATE
---------|------------|---------------------------
 3.10    | 2026-10-31 | 2027-05-01
 3.11    | 2027-10-31 | 2028-05-01
 3.12    | 2028-10-31 | 2029-05-01
 3.13    | 2029-10-31 | 2030-05-01
 3.14    | 2030-10-31 | 2031-05-01
```

The [endoflife.date](https://endoflife.date) website lists the release tracks and product lifecycles of many open source projects, and its information generally aligns with the lifecycle of the corresponding Chainguard container image. If the date you see from Chainguard differs from the one on the upstream project's own site, the two are probably using different definitions of a support tier.

Several signals tell you a version is no longer being rebuilt:

* In the Console, an inactive tag appears in gray text with a pause icon beside its name. Hovering the icon shows the message `This tag is no longer considered active.` You may [open a support request](#open-a-support-request) if you want to request an inactive tag. Specify all the tags you need in a single request if requesting more than one to save time. Note that inactive versions are not supported and may contain CVEs and/or functional bugs that we are not able to fix. This is why we don't add them automatically.
* On the **Organization** tab under **Images**, the **Status** column shows **Expired** for images your organization no longer has access to.
* The **Vulnerabilities** tab reports that a tag is no longer being scanned. Scanning stops because the image contents have stopped changing.

None of these mean the image was deleted. They mean the version has been superseded, and you should move to the current version of that stream.

### Continue past end of life with the EOL Grace Period

Sometimes you can't upgrade on Chainguard's schedule, whether because a version reaches end of life ahead of your release cycle or because a later version has a problem that blocks you.

For these cases, the End-of-Life Grace Period gives eligible containers up to six more months of new builds after the primary package reaches end of life. Eligibility depends on several requirements, and you can query grace period status through the Chainguard API. See the [EOL Grace Period overview](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for the requirements and the API.

## Open a support request

Open a support request when:

* An actively maintained tag appears in the Directory but is missing from your organization.
* A version isn't end of life upstream but doesn't appear in the Directory. Chainguard may not have it in the build matrix yet, or it may be a recent upstream release still moving through the build pipeline. Support can confirm whether a build is planned.
* A tag that used to be available in your organization has disappeared unexpectedly.

Include the image name, the exact tag you need, and the date you need it by. For the full list of what to include and the portal's prerequisites, see [Get support](/get-started/get-support/).

Questions about your subscription or entitlements, including whether a particular image is covered, go to your account team rather than the support portal.

---

### Debugging distroless container images
_Path: chainguard/containers/troubleshooting/debugging-distroless-images.md_

Because distroless images are minimal and don't include a package manager or a shell, debugging issues that occur at runtime may require a distinctive approach.

In this article, we'll discuss a few different strategies to debug distroless images.

## 1. Using development container image variants

Before moving a workload to a distroless runtime image, it is important to make sure that it runs without issues in a similar but less restrictive environment, which allows for easier debugging. It is also possible to make a temporary base image change from a distroless image to a fully featured image that offers more debugging capabilities.

The development variants of [Chainguard Containers](/chainguard/containers/) are designed to replicate the same packages of their distroless version, but with additional software that helps in developing, building, and debugging applications in different language ecosystems. These are sometimes referred to as `-dev` variants since they are tagged with `:latest-dev`.

> **Note**: If you're debugging a workload that crashes because it expects packages from its previous upstream image, a *full* variant may help. Available for a number of our most popular Containers and tagged `-full`, these variants map their upstream equivalent. Refer to [Full container variants](/chainguard/containers/concepts/container-variants/#full-container-variants).

For example, the following table shows a comparison between the development variants of the PHP image, and which packages are included with each variant:

|                       | latest | latest-dev | latest-fpm |
|--------------------------|--------|------------|------------|
| `wolfi-baselayout`    | X   | X       | X       |
| `ca-certificates-bundle` | X   | X       | X       |
| `php`                 | X   | X       | X       |
| `apk-tools`           |     | X       |         |
| `bash`                |     | X       |         |
| `busybox`             |     | X       |         |
| `git`                 |     | X       |         |
| `composer`            |     | X       |         |
| `php-fpm`             |     |         | X       |

You can find similar detailed package information for all [Chainguard Containers](https://images.chainguard.dev) in their respective image details pages under the SBOM section.

Once you have changed your Dockerfile base image to use a development variant, you can overwrite the entry point command to get a shell on the container:

```shell
docker run -it --entrypoint /bin/sh cgr.dev/chainguard/php:latest-dev
```

Having a package manager and the ability to log into the image to debug any issues is very important at development time, but becomes unnecessary (and less safe) when talking about production environments. That's why we recommend using a distroless variant for production workloads.

### Chainguard Containers in production

Although the development image variants have similar security features as their distroless versions, such as complete SBOMs and signatures, they feature additional software that is typically not necessary in production environments. The general recommendation is to use the development variants to build the application and then copy all application artifacts into a distroless image, which will result in a final container image that has a minimal attack surface and won't allow package installations or logins.

That being said, it's worth noting that the `-dev` variants of Chainguard Containers are still **more secure** than many popular container images based on fully-featured operating systems such as Debian and Ubuntu, because they carry less software, follow a more frequent patch cadence, and offer attestations for what is included.

### Language ecosystem guides

The following guides show how to use these development images in combination with their distroless variants in order to build a final image that is also distroless, but contains everything the application needs to run:

- [Getting started with the Python Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/python/)
- [Getting started with the Ruby Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/ruby/)
- [Getting started with the Go Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/go/)
- [Getting started with the Node Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/node/)
- [Getting started with the PHP Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/php/)

Check also the guide on [Creating Wolfi container images with Dockerfiles](/open-source/wolfi/wolfi-with-dockerfiles/) for guidance on how to build a custom image that can be used for development and debugging.

## 2. Using ephemeral debug containers

Another method to debug distroless images running in production is to use ephemeral debug containers, a special type of container that is temporarily attached to an existing Pod to troubleshoot and inspect running services.

Suppose you have a Kubernetes cluster and one of the containers is having issues. Perhaps it doesn't seem to be able to connect to other services in the cluster, or expected processes aren't running. If the container has a shell, you'd be able to use `kubectl exec` to run debugging commands from inside the container to help diagnose the issue. With a minimal image, this isn't possible, but we can achieve something very similar using `kubectl debug` to launch an ephemeral container.

Let's review an example. We'll start by running a Chainguard NGINX image on a Kubernetes cluster:

```shell
kubectl run nginx --image=cgr.dev/chainguard/nginx:latest
```

Which should result in:

```output
pod/nginx created
```

We can try to start a shell in this pod:

```shell
kubectl exec -it nginx -- sh
```

But the following error occurs:

```output
error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "67bd5164394b1170ac1846bd77ea0b826332365970fbde3b3201bb9abec9b72c": OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown
```

Which is a long way of telling us there is no shell in the image. What we can do instead is use an ephemeral container. An ephemeral container will connect to the namespaces of an existing container, effectively allowing you to sideload debugging tools. Let's try that now:

```shell
kubectl debug -it nginx --image=cgr.dev/chainguard/wolfi-base --target=nginx
```

You should get output similar to:

```
Targeting container "nginx". If you don't see processes from this container it may be because the container runtime doesn't support this feature.
Defaulting debug container name to debugger-87792.
If you don't see a command prompt, try pressing enter.
nginx:/#
```

Now we can try running some debugging commands. Let's start by seeing what's running:

```
nginx:/# ps aux
PID   USER     TIME  COMMAND
    1 65532     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf -e /dev/stderr
   10 65532     0:00 nginx: worker process
   11 65532     0:00 nginx: worker process
   12 65532     0:00 nginx: worker process
   13 65532     0:00 nginx: worker process
   14 65532     0:00 nginx: worker process
   15 65532     0:00 nginx: worker process
   16 65532     0:00 nginx: worker process
   23 root      0:00 /bin/sh -l
   32 root      0:00 ps aux
```

And the open ports:

```
nginx:/# netstat -lntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
```

To facilitate accessing processes running in other containers without having to specify a target, you may enable [process namespace sharing](https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/) within your Pod setup. It's also worth noting that the filesystem may not be accessible due to default user permissions.

### Troubleshooting volume mounts

Kubernetes starts the ephemeral container without mounting the same volumes in the target container. As a result, directories like `/var/log`, which are backed by a volume in the original container, will appear empty or missing in the ephemeral container.

Kubernetes does not currently offer a built-in way to automatically replicate volume mounts from the main container to the ephemeral debug container. There is ongoing discussion in the Kubernetes community regarding this limitation, including proposals for features like `--with-volume-mounts[=<container>]` which would allow mounting the same volumes in ephemeral containers. This feature is not yet available.

To work around this issue, you can manually create a copy of the pod definition with a new debug container that replicates the necessary volume mounts.

Proxy the Kubernetes API:

```
kubectl proxy
```

Patch the pod to add an ephemeral container:

```
curl http://localhost:8001/api/v1/namespaces/default/pods/<pod-name>/ephemeralcontainers \
-X PATCH \
-H 'Content-Type: application/strategic-merge-patch+json' \
-d '
{
  "spec": {
    "ephemeralContainers": [
      {
        "name": "debugger",
        "command": ["sh"],
        "image": "cgr.dev/chainguard/wolfi-base",
        "targetContainerName": "<container-name>",
        "stdin": true,
        "tty": true,
        "volumeMounts": [
          {
            "mountPath": "/var/log",
            "name": "varlog",
            "readOnly": true
          }
        ]
      }
    ]
  }
}'
```

- Replace `<pod-name>` and `<container-name>` with your actual values.
- Be sure to match the `volumeMounts` spec to those in your target container.

#### Pods enforcing runAsNonRoot

If the pod enforces `runAsNonRoot: true`, the ephemeral container will fail to start with a `CreateContainerConfigError` because `wolfi-base` runs as root by default. In this case, add a `securityContext` to the patch that matches the target container’s policy:

```
curl http://localhost:8001/api/v1/namespaces/default/pods/<pod-name>/ephemeralcontainers \
-X PATCH \
-H ‘Content-Type: application/strategic-merge-patch+json’ \
-d ‘
{
  "spec": {
    "ephemeralContainers": [
      {
        "name": "debugger",
        "command": ["sh"],
        "image": "cgr.dev/chainguard/wolfi-base",
        "targetContainerName": "<container-name>",
        "stdin": true,
        "tty": true,
        "securityContext": {
          "runAsUser": 1001,
          "runAsNonRoot": true,
          "allowPrivilegeEscalation": false,
          "capabilities": {
            "drop": ["ALL"]
          }
        },
        "volumeMounts": [
          {
            "mountPath": "/var/log",
            "name": "varlog",
            "readOnly": true
          }
        ]
      }
    ]
  }
}’
```

Set `runAsUser` to match the UID of the target container’s process. You can find this in the Pod spec’s `securityContext.runAsUser`, or by running `ps aux` in the ephemeral container before the `securityContext` constraint takes effect.

#### Accessing the target container’s filesystem without volumeMounts

As an alternative to replicating `volumeMounts`, you can access the target container’s filesystem directly via `/proc/1/root/<path>` in the ephemeral container. Because `targetContainerName` puts the ephemeral container in the same PID namespace as the target, PID 1 is the target container’s main process, and `/proc/1/root/` traverses its full mount namespace — including Kubernetes-backed volumes such as `emptyDir`, `configMap`, `secret`, and persistent volume claims.

For example, to read a log file from the target container:

```shell
cat /proc/1/root/var/log/app/app.log
```

This requires the ephemeral container to run as the same UID as the target process, which is why the `securityContext` fix above is a prerequisite. If security policies in your environment block `/proc/<pid>/root` access (for example, strict seccomp or AppArmor profiles), use the explicit `volumeMounts` approach instead.

Attach to the debug container:

```
kubectl attach <pod-name> -c debugger -ti
```

In the ephemeral container shell, you should now see the expected contents within `/var/log` or other paths you’ve mounted.

For more strategies on how to debug production distroless containers, check the [Kubernetes documentation on debugging running Pods](https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/).

## Resources to learn more

- [Minimal Container Images: Towards a More Secure Future](https://www.chainguard.dev/unchained/minimal-container-images-towards-a-more-secure-future) - Chainguard Blog
- [Why distroless](/chainguard/containers/overview/) - Chainguard Container Documentation
- [Ephemeral Containers](https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/) - Official Kubernetes Documentation
- [Introducing Ephemeral Containers](https://opensource.googleblog.com/2022/01/Introducing%20Ephemeral%20Containers.html) - Google Open Source Blog
- Talk: [Running a Go Debugger in Kubernetes](https://www.youtube.com/watch?v=V3SrFyMxmq4&t=2691s) - Cloud Native Rejekts EU 23

---

### Troubleshoot registry authentication errors
_Path: chainguard/containers/troubleshooting/registry-errors.md_

A login or pull against `cgr.dev` failed and you have an error string. This page maps the errors Chainguard's registry returns to their causes and tells you what to check for each one.

If your pull fails for a container you can see in the [Chainguard Containers Directory](https://images.chainguard.dev/), the container most likely hasn't been added to your organization yet. That case has its own guide: refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).

## Where registry errors come from

Pulling a container from `cgr.dev` takes two separate requests, and each one fails differently:

1. **Credential exchange.** Your tool sends your credentials to the token endpoint at `https://cgr.dev/token` and gets back a bearer token scoped to the repository you asked for. `docker login`, `helm registry login`, `podman login`, and `chainctl auth configure-docker` all exercise this step.
1. **The pull.** Your tool presents that bearer token to the registry API at `https://cgr.dev/v2/` and requests the tags, manifest, and layers.

The two steps reuse the same HTTP status codes for unrelated problems. A `403` from the token endpoint means something different from a `403` from the registry API, so read the error code and message in the response body rather than the status number on its own:

| Response body | Returned by | Meaning |
| -- | -- | -- |
| `UNAUTHORIZED`, "Authentication required" | Token endpoint | The repository requires credentials and you presented none that worked. |
| `FORBIDDEN`, "Forbidden" | Token endpoint | The endpoint won't issue a token for the repository you named, or it couldn't use the credentials you sent. |
| `BAD_REQUEST`, "InvalidArgument" | Token endpoint | The organization in the image reference didn't resolve. |
| `FORBIDDEN`, "caller does not have the required capabilities" | Registry API | You're authenticated, but you aren't authorized for this repository. |
| `NAME_UNKNOWN`, "repository does not exist" | Registry API | The repository name doesn't exist in that organization. |

A bare `Forbidden` message doesn't tell you which of those two it is. Chainguard's registry returns the same `403` to a caller that sent no credentials, a caller whose credentials it can't use, and a caller naming a repository it won't grant a token for. Treat it as a prompt to work through the possible causes in order rather than as a single diagnosis, and in particular don't read it as confirmation that your credentials were accepted.

## Authentication required from the token endpoint

You'll see a `401` like the following when a build or pull runs with no credentials configured:

```output
failed to fetch anonymous token: unexpected status from GET request to https://cgr.dev/token?scope=repository%3A$ORGANIZATION%2Fpython%3Apull&service=cgr.dev: 401 Unauthorized
```

The word "anonymous" is the signal. Your tool found no credentials for `cgr.dev`, so it asked for a public token, and the repository you named isn't public. Containers in the `cgr.dev/chainguard/` namespace are public and need no authentication. Everything in your organization's own namespace at `cgr.dev/$ORGANIZATION/` requires credentials.

Configure the credential helper, then retry:

```shell
chainctl auth configure-docker
```

You don't need to run `chainctl auth login` first. For headless machines, CI systems, and other login flows, refer to [Authenticate to Chainguard's Registry](/chainguard/containers/registry/authenticating/) and [Authentication options for `chainctl`](/platform/chainctl-usage/authentication-options/).

If the failure happens inside `docker build` rather than `docker pull`, check that the builder can see your Docker configuration. A `FROM` line pointing at your organization's namespace needs the same credentials a direct pull does.

## Forbidden from the token endpoint

A `403` from the token endpoint looks like this, often from `helm registry login` or another tool that logs in without naming a repository:

```output
Error: authenticating to "cgr.dev": GET "https://cgr.dev/token?service=cgr.dev": response status code 403: forbidden
```

This response means the token endpoint rejected the request outright. It doesn't tell you which part of the request it objected to, so check these in order:

1. **The credential format.** The username for a pull token is the Chainguard identity ID that owns the token, not your email address. Refer to [Check your credential format](#check-your-credential-format).
1. **The credential's age.** Pull tokens expire 30 days after creation by default. Create a replacement with `chainctl auth configure-docker --pull-token`.
1. **The repository name.** A scope the endpoint won't grant returns this `403` rather than a `404`, whether the repository doesn't exist or isn't in your organization's catalog. Confirm the name against `chainctl images repos list`.

## The organization didn't resolve

A `400` means the organization portion of the image reference didn't match any Chainguard organization:

```output
{"errors":[{"code":"BAD_REQUEST","message":"rpc error: code = InvalidArgument desc = unable to resolve ..."}]}
```

Unlike the other errors on this page, this one has nothing to do with your credentials. The organization name is wrong. List the organizations you belong to and compare:

```shell
chainctl iam organizations list
```

Organization names are usually domain names, such as `example.com`, and the full image reference is `cgr.dev/$ORGANIZATION/$IMAGE:$TAG`. Omitting the organization, or using your organization's display name instead of its registry name, can produce this error.

## Missing capabilities from the registry API

This `403` is the one that means your login worked and your authorization didn't:

```output
{"errors":[{"code":"FORBIDDEN","message":"caller does not have the required capabilities at \"...\""}]}
```

It also surfaces through the tool you're running. A Helm install that logged in successfully and then failed reports it against the API path:

```output
Error: INSTALLATION FAILED: ... /$ORGANIZATION/postgresql/tags/list ... response status code 403
```

Two different problems produce this error, and the fix differs:

- **The repository isn't in your organization's catalog.** This is the more common cause. Your credentials are valid, but the container hasn't been added to your organization. Refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/) for how to add it or request it, along with the roles that each path requires.
- **Your identity lacks a role that grants pull access.** Check which capabilities your current credentials carry:

    ```shell
    chainctl auth status
    ```

    Read the `Capabilities` field in the output. Pulling containers needs a role with the `manifest (list)` capability; `registry.pull` is the least privileged built-in role that has it. To grant it, refer to [Overview of roles and role-bindings](/platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings/). Pulling APK packages needs `apk (list)` instead, which [Private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/#troubleshooting) covers.

An identity federated from a CI system carries only the role you assigned when you created it. An identity created with `--role=registry.pull` can pull containers and do nothing else, which is intentional, but it means the same credentials fail if your workflow later tries to list repositories or read entitlements.

## Repository does not exist

Once you hold a valid token, a name that isn't in the organization returns a `404` rather than a `403`:

```output
{"errors":[{"code":"NAME_UNKNOWN","message":"repository does not exist \"...\""}]}
```

Check the spelling against `chainctl images repos list`, then against the [Chainguard Containers Directory](https://images.chainguard.dev/). If the Directory doesn't list the container either, Chainguard doesn't build it yet and you can ask for it through [Requesting new Chainguard resources](/chainguard/containers/reference/request-resources/). To work out which of those situations you're in, refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).

## Check your credential format

When you authenticate with a pull token, the username is the Chainguard identity ID associated with that token, and the password is the token itself:

```shell
docker login "cgr.dev" \
  --username "<identity-id>" \
  --password "<pull-token>"
```

The email address you use to sign in to the Chainguard Console is not a valid registry username. Neither is your organization name. `chainctl auth configure-docker --pull-token` prints the correct pair, and `chainctl auth pull-token create --output=env` writes them to `CHAINGUARD_IDENTITY_ID` and `CHAINGUARD_TOKEN` for use in scripts.

The same pair works with any tool that logs in to an OCI registry:

```shell
helm registry login cgr.dev \
  --username "$CHAINGUARD_IDENTITY_ID" \
  --password "$CHAINGUARD_TOKEN"
```

Helm and Podman need `chainctl` installed only to create the token. Once you have the identity ID and token, the login itself doesn't call `chainctl`, so you can run it on a machine that doesn't have `chainctl` at all. Refer to [pull token output formats and credential names](/platform/chainctl-usage/pull-token-output/) for the other output formats.

## Errors from a pull-through cache or mirror

A registry mirror reports Chainguard's errors in its own wording, which can obscure which of the preceding cases you're in. Artifactory, for example, reports a rejected credential as a configuration problem:

```output
Invalid username/password configured for Remote Docker repository: $REPOSITORY_NAME ... Can't fetch token for repo ... realm: https://cgr.dev/token
```

The `realm: https://cgr.dev/token` fragment tells you the failure happened during credential exchange, so work through [Forbidden from the token endpoint](#forbidden-from-the-token-endpoint) and [Check your credential format](#check-your-credential-format). Mirrors are a common place for the username to be wrong, because their configuration forms label the field "username" and invite an email address.

Pull tokens expire, so a mirror that worked for a month and then stopped is likely holding an expired token. For the tool-specific settings each platform needs, refer to the [pull-through guides](/chainguard/containers/registry/pull-through-guides/).

## Isolate the failing step

To find out which of the two requests is failing, ask the token endpoint directly. This returns the HTTP status for a credential exchange with no credentials attached:

```shell
curl -s -o /dev/null -w '%{http_code}\n' \
  "https://cgr.dev/token?scope=repository%3A$ORGANIZATION%2F$IMAGE%3Apull&service=cgr.dev"
```

A `401` means the reference resolved and the endpoint wants credentials, so your tool's configuration is the problem rather than the name you used. Drop the `-o /dev/null` to read the error code and message in the response body.

To check the second request, compare `chainctl auth status` against the capabilities listed in [Missing capabilities from the registry API](#missing-capabilities-from-the-registry-api).

## Can't create a pull token

If the Console won't let you create a pull token, or `chainctl auth pull-token create` fails, the problem is your role rather than the registry. Creating a pull token creates a Chainguard identity and a role-binding for it, so it needs a role carrying the `identity (create)` and `role_bindings (create)` capabilities.

`registry.pull_token_creator` is the least privileged built-in role with both. Ask an administrator in your organization to bind it to your account, or refer to [Overview of roles and role-bindings](/platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) to do it yourself. The [capabilities reference](/platform/administration/iam-organizations/roles-role-bindings/capabilities-reference/) lists every capability each built-in role carries.

## Learn more

- [Authenticate to Chainguard's Registry](/chainguard/containers/registry/authenticating/)
- [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/)
- [Onboard your teams](/get-started/onboard-your-teams/#what-your-organization-can-pull)
- [Network requirements](/chainguard/containers/registry/network-requirements/)
- [Get support](/get-started/get-support/)

---

### Inspecting Chainguard Containers
_Path: chainguard/containers/troubleshooting/inspecting-containers.md_

Two questions come up repeatedly once you're running Chainguard Containers: which exact build is this, and what software versions are inside it? A digest answers the first. The container's SBOM answers the second.

The following examples pull from `cgr.dev/chainguard/`, the namespace that holds Chainguard's Free containers, so they run as written. If you pull from your organization's own registry, substitute `cgr.dev/<organization>/`.

## Identify a build by its digest

A digest is a content-based hash of a container image. No two images share one, so pulling by digest returns the same image every time.

Tags don't behave that way. A tag such as `latest`, or a version tag like `3.0`, points at the newest build in its version stream, and Chainguard moves it as it publishes rebuilds. If you pull the same tag twice on two different days, you may end up pulling two different images, making it difficult to reproduce a build later. [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/) explains how those tags float.

### Retrieve the digest of a container

`docker pull` reports the digest of whatever it pulled:

```sh
docker pull cgr.dev/chainguard/node
```

```output
. . .

Digest: sha256:ede7ef4ca485553f5313f7a02ad3537db1fe337079fc7cfb879f44cf709326db
Status: Downloaded newer image for cgr.dev/chainguard/node:latest
cgr.dev/chainguard/node:latest
```

That digest refers to the image *index*, which lists one image per platform rather than pointing at a single image. In most cases the index is what you want to reference, since it lets the same digest work on every architecture you deploy to.

To find out what the index holds, inspect it:

```sh
docker manifest inspect cgr.dev/chainguard/node@sha256:ede7ef4ca485553f5313f7a02ad3537db1fe337079fc7cfb879f44cf709326db | jq
```

The output lists a digest for each platform in the index, typically `linux/amd64` and `linux/arm64`. You can reference one of those directly, but an image pinned to a platform-specific digest only runs on that platform, so be deliberate about it.

[`crane`](https://github.com/google/go-containerregistry/tree/main/cmd/crane) prints the digest alone with nothing to parse, making it useful for scripts:

```sh
crane digest --full-ref cgr.dev/chainguard/node:latest
```

Add `--platform` to get the digest for one platform:

```sh
crane digest --full-ref --platform linux/arm64 cgr.dev/chainguard/node:latest
```

### Pin a reference to a digest

Append the digest to the reference to pull one specific build:

```sh
docker pull cgr.dev/chainguard/node:latest@sha256:ede7ef4ca485553f5313f7a02ad3537db1fe337079fc7cfb879f44cf709326db
```

Registries ignore the tag when a reference carries a digest, which frees the tag to carry a version hint for whoever reads the file next:

```
cgr.dev/chainguard/go:1.22@sha256:7e60584b9ae1eec6ddc6bc72161f4712bcca066d5b1f511d740bcc0f65b05949
```

Chainguard recommends that form, and both [Dependabot](/chainguard/containers/security-and-compliance/updating-containers/dependabot/) and [Renovate](/chainguard/containers/security-and-compliance/updating-containers/renovate/) update the tag and the digest together when they find it.

While you *can* use digests on the command line, they're much more commonly found in configuration files, such as a Dockerfile, a Compose file, or a Kubernetes manifest:

```Dockerfile
FROM cgr.dev/chainguard/go:latest@sha256:7e60584b9ae1eec6ddc6bc72161f4712bcca066d5b1f511d740bcc0f65b05949 AS build

WORKDIR /src
RUN CGO_ENABLED=0 go build -o /bin/server ./src

FROM cgr.dev/chainguard/static:latest AS prod

COPY --from=build /bin/server /bin/
EXPOSE 8000
ENTRYPOINT [ "/bin/server" ]
```

Every run of this Dockerfile build uses the same Go compiler, so a build that works today works the same way next month, even if Chainguard has since rebuilt the container image.

Note the tradeoff: a pinned digest stops receiving patches, because the whole point is that it never changes. Pair digest pinning with something that updates the pin, such as [Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/), and refer to [Considerations for image updates](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/) for how to think about the schedule.

The following video covers the same ground, including what the index looks like from the inside:

{{< youtube xYlLfjgG64E >}}

## Read software versions from a container

Every Chainguard Container records the version of each package it installs.

One way to find this is to list `/var/lib/db/sbom` inside the container. It holds one SPDX document per installed package, and the filenames carry the versions:

```sh
docker run cgr.dev/chainguard/wolfi-base ls /var/lib/db/sbom
```

```output
apk-tools-2.14.10-r14.spdx.json
busybox-1.38.0-r2.spdx.json
ca-certificates-bundle-20260611-r1.spdx.json
glibc-2.44-2.44-r5.spdx.json
. . .
```

That works because `wolfi-base` includes a shell, and with it `ls`. Most Chainguard Containers are distroless and include neither. For those, run the `-dev` variant, which does have a shell:

```sh
docker run --entrypoint /bin/sh cgr.dev/chainguard/python:latest-dev -c "ls /var/lib/db/sbom"
```

Or copy the directory out of the distroless container without running anything in it:

```sh
id=$(docker create cgr.dev/chainguard/python)
docker cp "$id":/var/lib/db/sbom ./sbom
docker rm "$id"
```

Chainguard also publishes a signed, image-level SBOM for every build, which you can retrieve without pulling the container. Refer to [How to retrieve SBOMs and attestations for Chainguard Containers](/chainguard/containers/security-and-compliance/retrieve-image-sboms/) for details.

The following video walks through both routes:

{{< youtube K60-jhVf2I4 >}}

## Related reading

* [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/) — when the container or version you need isn't there to inspect.
* [Unique tags](/chainguard/containers/reference/unique-tags/) — an alternative to digests for teams whose workflows require a stable tag.
* [Debugging distroless container images](/chainguard/containers/troubleshooting/debugging-distroless-images/) — further techniques for looking inside a container with no shell.

---

### Getting started with distroless container images
_Path: chainguard/containers/concepts/getting-started-distroless.md_

## About distroless container images

[Distroless](https://www.chainguard.dev/unchained/minimal-container-images-towards-a-more-secure-future) container images, like the ones built by Chainguard, are a type of container image designed to include only essential software required to run an application or service. Unlike traditional images based on Debian or Ubuntu — which include package managers, utilities, and shells — Chainguard's distroless images remove these components to significantly reduce attack surface and minimize vulnerabilities.

This minimal approach offers several benefits, including:

- **Enhanced Security:** By stripping out unnecessary components, distroless images reduce the potential attack surface for vulnerabilities. With fewer extraneous programs, there are fewer opportunities for malicious actors to exploit.
- **Simplified Dependency Management:** Traditional container images can introduce dependency bloat, making it difficult to track and manage exactly what's included. Distroless images keep things clear by only containing what's directly required for the application to function.
- **Potentially Smaller Image Sizes:** By eliminating extraneous OS components, distroless images can be significantly smaller than their full-blown counterparts.

Chainguard offers a mix of distroless and container images, which are minimalist and contain provenance attestations for increased security, and development (or `-dev`) images, which feature development tools like a shell or package manager. Since distroless images have fewer tools and don't come with a package manager, some adaptation might be necessary when migrating from traditional base images. A typical approach is using multi stage builds to compose a final distroless image containing the additional artifacts required by the application in order to run successfully.

## Multi stage builds

A multi stage build is a technique for creating slimmer and more efficient container images. It allows you to define multiple stages within a single Dockerfile. Each stage acts like a separate build environment with its own base image and instructions.

The key benefit of multi stage builds is that they enable you to separate the build process from the final runtime environment. This separation helps in reducing the final image size by:

- **Using different base images**: You can leverage a larger image containing all the build tools in the initial stage and then switch to a smaller, leaner base image for the final stage that only includes the necessary runtime dependencies for your application.
- **Excluding unnecessary layers**: By separating the build and runtime stages, you can exclude all the temporary files, build tools, and intermediate artifacts from the final image. These elements are only required during the build process and not needed when running the application.

Overall, multi stage builds promote efficient container images by minimizing their size and optimizing their contents for execution.

### Example 1: Distroless images as runtime for static binaries

Distroless images are typically designed to work as platforms for running workloads in as minimal an environment as possible. In the case of languages that can compile completely static binaries (such as C and Rust), the **static** base image can be used as a runtime. You'll still need to get your application compiled in a separate build stage that has the tooling necessary to build it.

In this example, we'll build a distroless image to run a "Hello World" program in C. Start by creating a directory for the demo. We'll call it **distroless-demo**.

```sh
mkdir ~/distroless-demo && cd $_
```

Create a new Dockerfile within this directory. You can use `nano` or other command line editor of your choice.

```sh
nano Dockerfile
```

The following Dockerfile will build a final distroless image using two distinct build stages. The first stage, named `build`, builds a C program using the `cgr.dev/chainguard/gcc-glibc:latest` image. The final image, which is then based on the `cgr.dev/chainguard/static:latest` distroless image, will copy the compiled binary from the `build` environment and define it as the entry point command for the final image.

```dockerfile
# syntax=docker/dockerfile:1.4
FROM cgr.dev/chainguard/gcc-glibc:latest AS build

COPY <<EOF /hello.c
#include <stdio.h>
int main() { printf("Hello Distroless!%c",0x0A); }
EOF
RUN cc -static /hello.c -o /hello

FROM cgr.dev/chainguard/static:latest

COPY --from=build /hello /hello
CMD ["/hello"]
```

Run the following command to build the demo image and tag it as `c-distroless`:

```shell
DOCKER_BUILDKIT=1 docker build -t c-distroless  .
```

If you receive an error, you may try removing the top line of the Dockerfile. Now you can run the image with:

```shell
docker run c-distroless
```

You should get output like this:

```output
Hello Distroless!
```

You can note the size of the resulting image.

```shell
docker images c-distroless
```

```output
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
c-distroless   latest    cd3bb76a84f5   45 seconds ago   2.04MB
```

If you look into the image layers with `docker inspect c-distroless`, you'll also notice that it has only two layers: a single layer from the `static` image that serves as base for the final image, and one layer with the `COPY` command that brings in the compiled binary from the **build** stage.

```shell
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cfc10a76380242be256af62b8782e536770dee83dcc823fce6c196c1ef5638e5",
                "sha256:bc7690d8bd810d969e6601d8468b4ae42fa411dfe460440e96092db454d80080"
            ]
        },
```

### Example 2: Incorporating application-level dependencies in distroless images

When working with language ecosystems that have their own dependency management tools such as PHP (Composer) and Node (npm), a multi stage build is necessary to include application dependencies within the final distroless runtime.

The next example creates a Dockerfile to run a demo PHP application that has third-party dependencies managed by [Composer](https://getcomposer.org/). The application is a single executable that queries the [cat facts API](https://catfact.ninja/) and returns a random fact.

Start by creating a directory for the demo. We'll call it **distroless-php**.

```sh
mkdir ~/distroless-php && cd $_
```

The following command will create a new `composer.json` file with a single dependency, a small curl library called `minicli/curly`. We are using a shared volume so that the `vendor` folder is shared with our local directory.

```shell
docker run --rm --entrypoint composer --user=root -v ${PWD}:/app cgr.dev/chainguard/php:latest-dev require minicli/curly
```

In this case, we had to use the **root** image user in order to be able to write files in the current host directory. The following command will fix file permissions for our current system user:

```shell
sudo chown -R ${USER}:${USER} .
```

Now create the PHP executable. You can call it `catfact.php`:

```shell
nano catfact.php
```

The following code makes a query to the cat facts API, returning the quote as output. Copy the contents to your own `catfact.php` script:

```catfact.php
<?php

require __DIR__ . '/vendor/autoload.php';

$curly = new Minicli\Curly\Client();
$response = $curly->get("https://catfact.ninja/fact");
if ($response['code'] === 200) {
    echo "\n" . json_decode($response['body'], true)['fact'] . "\n";
    return 0;
}

echo "query error.";
return 1;
```

Save the file when you're done. Now you can create your Dockerfile.

```sh
nano Dockerfile
```

The following Dockerfile will create a `run.php` script that makes a curl query using the library we just added as a dependency.

```Dockerfile
FROM cgr.dev/chainguard/php:latest-dev AS builder
USER root
COPY . /app
RUN chown -R php /app
USER php
RUN cd /app && \
    composer install --no-progress --no-dev --prefer-dist

FROM cgr.dev/chainguard/php:latest
COPY --from=builder /app /app

ENTRYPOINT [ "php", "/app/catfact.php" ]
```

Now you can build the image with:

```shell
docker build . -t distroless-demo-php
```

Finally, you can run the new app with:

```shell
docker run --rm distroless-demo-php
```

And you should get a cat fact as output, such as:

```output
A domestic cat can run at speeds of 30 mph.
```

Upon inspection with `docker images`, you can check the image size around 38MB:

```shell
docker images distroless-demo-php
```

```output
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
distroless-demo-php   latest    8691d09f56ca   2 minutes ago   37.9MB
```

For comparison, the `php:cli-alpine` image is almost 3 times bigger:

```shell
❯ docker images php:cli-alpine
REPOSITORY   TAG          IMAGE ID       CREATED      SIZE
php          cli-alpine   7879e816aba0   6 days ago   104MB
```

## Final considerations

Distroless images offer a compelling approach to creating minimal and secure container images by stripping away system components that are unnecessary at execution time, such as package managers and shells. While such images offer many advantages, they might require some adjustments in your existing development and deployment workflows. In this guide we demonstrated how to use multi stage builds to create final distroless images that include additional components, such as static binaries and application-level dependencies.

You can find more examples in our [Getting started guides](/chainguard/containers/getting-started/) page. Check also our article on [Debugging distroless images](/chainguard/containers/debugging-distroless-images/) for important tips when you run into issues and need to debug containers running distroless images.

---

### glibc vs. musl
_Path: chainguard/containers/concepts/glibc-vs-musl.md_

Over the years, various implementations of the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) — such as the [GNU C library](https://www.gnu.org/software/libc/), [musl](https://musl.libc.org/about.html), [uClibc-ng](https://www.uclibc-ng.org/), and many others — have emerged with different goals and characteristics. These various implementations exist because the C standard library defines the required functionality for operating system services (such as file input/output and memory management) but does not specify implementation details. Among these implementations, the GNU C Library ([glibc](https://www.gnu.org/software/libc/)) and [musl](https://musl.libc.org/about.html) are among the most popular.

When developing [Wolfi](/open-source/wolfi/overview/), the "undistro" on which all Chainguard Containers are built, Chainguard elected to have it use glibc instead of another implementation like musl. This conceptual article aims to highlight the differences between these two implementations within the context of Chainguard's choice of using glibc over musl as the default implementation for the Wolfi undistro.

> **Note**: Several sections of this guide present data about the differences between glibc and musl across various categories. You can recreate some of these examples used to find this data with the Dockerfiles and C program files hosted in the `glibc-vs-musl` directory of the [Chainguard Academy Containers Demos repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl).

## High-level differences between glibc and musl

The GNU C Library ([glibc](https://www.gnu.org/software/libc/)), driven by the [GNU Project](https://www.gnu.org/gnu/thegnuproject.en.html), was first released in 1988. glibc aims to provide a consistent interface for developers to help them write software that will work across multiple platforms. Today, glibc has become the default implementation of the C standard library across the majority of Linux distributions, including Ubuntu, Debian, Fedora, and even Chainguard's Wolfi.

[musl](https://musl.libc.org/about.html) (pronounced "muscle") was first released in 2011 as an alternative to glibc. The goal of musl is to strive for "simplicity, resource efficiency, attention to correctness, safety, ease of deployment, and support for UTF-8/multilingual text." While not as widely used as glibc, some Linux distributions are [based on musl](https://wiki.musl-libc.org/projects-using-musl), the most notable being Alpine Linux.

The following table highlights some of the main differences between glibc and musl.

| Criteria         | glibc                                                       | musl                                                                |
| ------------------- | -------------------------------------------------------------- | ---------------------------------------------------------------------- |
| First Release    | 1988                                                        | 2011                                                                |
| License          | GNU Lesser General Public License (LGPL)                    | MIT License (more permissive)                                       |
| Binary Size      | Larger Binaries                                             | Smaller Binaries                                                    |
| Runtime Performance | Optimized for performance                                   | Slower performance                                                  |
| Build Performance   | Slower                                                      | Faster                                                              |
| Compatibility | POSIX Compliant + GNU Extensions | POSIX Compliant
| Memory Usage     | Efficient, higher memory usage                              | Potential performance issues with large memory allocations (e.g. Rust) |
| Dynamic Linking  | Supports lazy binding, unloads libraries                    | No lazy binding, libraries loaded permanently                       |
| Portability Issues  | Fewer portability issues, widely used                       | Potential issues due to different system call behaviors             |
| Python Support   | Fast build times, supports precompiled wheels               | Slower build times, often requires source compilation               |
| NVIDIA Support   | Supported by NVIDIA for CUDA                                | Not supported by NVIDIA for CUDA                                    |

Be aware that binaries are not compatible between Alpine and Wolfi. You **should not** attempt to copy Alpine binaries into a Wolfi-based container image.

> **Note**: As mentioned previously, several of the remaining sections in this guide present data about the differences between glibc and musl across various categories. You can recreate some of these examples by following the same procedure of setting creating and testing container images based on the Dockerfiles and program files relevant to the example you're exploring. You can find the appropriate files in the `glibc-vs-musl` directory of the [Chainguard Academy Containers Demos repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl).

## Library and binary size

musl is significantly smaller than glibc. A primary reason for this is due to the differing approaches adhering to the Portable Operating System Interface ([POSIX](https://en.wikipedia.org/wiki/POSIX)). POSIX is a family of standards specified by the IEEE Computer Society to ensure consistent application behavior across different systems. musl adheres strictly to POSIX standards without incorporating additional extensions.

glibc, while adhering to the POSIX standards, includes additional GNU-specific extensions and features. These extensions provide enhanced functionality and convenience, offering developers comprehensive tools. As an example, glibc provides support for Intel Control Enforcement Technology (CET) when running on compatible hardware, providing control flow security guarantees at runtime — a feature that doesn't exist on musl. However, this extensive functionality results in larger library sizes for glibc, with glibc's [function index](https://www.gnu.org/software/libc/manual/html_node/Function-Index.html) listing over 1700 functions.

You might notice the decreased binary size for musl in a simple `hello world` program, whether linked statically or dynamically. As we can observe, since musl is much smaller than glibc, the statically linked binary is much smaller on Alpine. In the case of dynamic linking, the binary size is smaller for musl compared to glibc because of its simplified implementation of the dynamic linker as outlined in [musl project's design philosophy](https://wiki.musl-libc.org/design-concepts).

The following table shows the difference in binary size of statically and dynamically linked `hello world` programs:

| Distro                 | Static linking | Dynamic linking |
| ------------------------- | -------------- | --------------- |
| Alpine (musl) binary size | 132K        | 12K          |
| Wolfi (glibc) binary size | 892K        | 16K          |

The smaller the binary size, the better the system is at debloating. You can find the Dockerfiles used in this setup in the [`binary-bloat` directory of this guide's example's repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl/binary-bloat).

## Portability of applications

The *portability* of an application refers to its ability to run on various hardware or software environments without requiring significant modifications. In practice, many developers target glibc specifically rather than a generic POSIX C library, much like writing scripts for bash rather than a POSIX-compliant shell. Consequently, developers can encounter portability issues when moving an application from one libc implementation to another. That said, [Hyrum's Law](https://www.hyrumslaw.com/) reminds us that achieving perfect portability is tough. Even when you design an application to be portable, it might still unintentionally depend on certain quirks of the environment or libc implementation.

## Building from source performance

We've compared the build from source performance for individual projects using the [musl-gcc compiler](https://wiki.musl-libc.org/getting-started.html) toolchain used in Alpine and [gcc compiler](https://gcc.gnu.org/) toolchain used in [Chainguard Wolfi](https://github.com/wolfi-dev/os/blob/main/gcc.yaml). We compare the build from source times of both ecosystems.

The following table highlights the results of this comparison by highlighting the compilation times between Wolfi (glibc) and musl-gcc. The shorter the build time, the better the system's performance.

| Repository   | Wolfi compilation time | musl-gcc compilation | Build successful with musl?  |
| ------------ | ---------------------- | -------------------- | ------------------------------- |
| binutils-gdb | 18m 3.11s           | *   <br>          | No - C++17 features unsupported |
| Little-CMS   | 29.44s              | 24.13s            | Yes                          |
| zlib      | 11.48s              | 9.37s             | Yes                          |
| libpcap   | 8.19s               | 5.61s             | Yes                          |
| gmp       | 98.91s              | 99.38s            | Yes                          |
| openssl   | 849.08s             | 671.92s           | Yes                          |
| curl      | 92.33s              | 79.15s            | Yes                          |
| usrsctp   | 55.39s              | 48.38s            | Yes                          |

You can find the Dockerfiles used in this setup in the [`build-comparison` directory of this guide's example's repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl/build-comparison).

This table shows that musl-gcc has **a lower compilation time** than gcc on Wolfi for these projects **if it can build the project successfully.**

musl-gcc fails to compile binutils-gdb because it conforms to POSIX standards, and binutils-gdb uses certain code features that are not conformant to these standards.

## Python builds

A common way to use existing Python packages is through precompiled binary wheels distributed from the Python Package Index ([PyPI](https://pypi.org/)). Python wheels are typically built against glibc; because musl and glibc are different implementations of the C standard library, binaries compiled against glibc may not work correctly or at all on systems using musl. Due to this incompatibility, PyPI defaults to compiling from source on Alpine Linux. This implies you need to **compile all the C source code** required for every Python package.

This also means you must determine every system library dependency needed to build the Python package from the source. For example, you have to install the dependencies beforehand, using `apk add <long list of dependencies>` before you perform `pip install X`.

The following table shows PIP install times across Alpine (musl) and Wolfi (glibc). You can find the Dockerfiles used in this setup in the [`python-build-comparison` directory of this guide's example's repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl/python-build-comparison).

| Python Package  | Alpine (musl) | Wolfi (glibc) |
| ------------------ | ------------- | ------------- |
| Matplotlib, pandas | 21m 30.196s   | 0m 24.3s   |
| tensorflow      | 104m 21.904s  | 2m  54.5s  |
| pwntools        | 29m 45.952s   | 21.5s      |

As this table shows, this results in long build times whenever you want to use Python-based applications with musl.

Take the example of `pwntools`, a Python package that allows for the construction of exploits in software. When using glibc-based distros, the installation would be in the form `pip3 install pwntools`. To install `pwntools` on a musl-based distro (such as Alpine), the [Dockerfile](https://github.com/chainguard-dev/edu-images-demos/blob/main/glibc-vs-musl/python-build-comparison/alpine/alpine-pwntools/Dockerfile) is much more complicated:

```dockerfile
FROM alpine:latest

# Prebuilt Alpine packages required to build from source
RUN apk add --no-cache musl-dev gcc python3 python3-dev libffi-dev libcap-dev make curl git pkgconfig openssl-dev bash alpine-sdk py3-pip
RUN python -m venv my-venv
RUN my-venv/bin/python -m pip install --upgrade pip

# Build from source cmake for latest version
RUN git clone https://github.com/Kitware/CMake.git && cd CMake && ./bootstrap && make && make install
ENV PATH=$PATH:/usr/local/bin

# Build from source Rust for latest version
RUN curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf > setup-rust.sh
RUN bash setup-rust.sh -y
ENV PATH=$PATH:/root/.cargo/bin

# Finally install pwntools
RUN pip3 install pwn
```

As this Dockerfile shows, `pwntools` requires a set of other packages. These in turn require the most up-to-date versions of Rust and cmake, which are not available in the default prebuilt packages in Alpine. You would have to build both from source before installing the Python dependencies and, finally, `pwntools`. Such dependencies will have to be identified iteratively through a process of trial and error while building from source.

## Runtime performance

Time is critical. One common bottleneck occurs when allocating large chunks of memory repeatedly. We compare this memory allocation performance between Wolfi and the latest Alpine [this benchmark script](https://github.com/chainguard-dev/edu-images-demos/blob/main/glibc-vs-musl/musl-performance-issues/allocations-slowdown.sh). The benchmark uses JSON dumping, a highly memory intensive operation.

| Runtime                   | Alpine (musl) | Wolfi (glibc) |
| ---------------------------- | ------------- | ------------- |
| Memory Allocations Benchmark | 102.25 sec | 51.01 sec  |

This table highlights how excessive memory allocations can cause musl (used by Alpine) to perform up to **2x slower** than glibc (used by Wolfi). A memory-intensive application needs to be wary of performance issues when migrating to the musl-alpine ecosystem.

Apart from memory allocations, multi-threading has also been problematic for musl, as shown in various [GitHub issues](https://github.com/rust-lang/rust/issues/70108). glibc provides a thread-safe system, while musl is not thread-safe. The POSIX standard only requires stream operations to be atomic; there are no requirements on thread safety, so musl does not provide additional thread-safe features. This means unexpected behavior or race conditions can occur during multiple threads.

We used a Rust script (referenced from the [GitHub issue](https://github.com/rust-lang/rust/issues/70108)) to test single-thread and multi-thread performance on Alpine (musl) and Wolfi (glibc). The next table shows performance benchmarks across single-threaded and multi-threaded Rust applications.

| Runtime                    | Alpine (musl) | Wolfi (glibc) |
| ----------------------------- | ------------- | ------------- |
| Single-thread (avg of 5 runs) | 1735 ms    | 1300 ms    |
| Multi-thread (avg of 5 runs)  | 1178 ms    | 293 ms     |

Alpine (musl) has the worse performance out of the two, taking around 4x more time for multi-thread when compared to Wolfi (glibc). As discussed previously, the real source of thread contention is in the `malloc` implementation of musl. Multiple threads may allocate memory at once, or free memory may be allocated to other threads. Therefore, the thread synchronization logic is a bottleneck for performance.

## Conclusion

glibc and musl both serve well as C implementations. Our goal for this article is to explain Chainguard's rationale for choosing to use glibc for Wolfi. We believe that's what made the most sense for our project, but you should continue your own research to determine if one C implementation would suit your needs better than another.

If you spot anything we've overlooked regarding glibc or musl or have additional insights to contribute, please feel free to raise the issue in [chainguard-dev/edu](https://github.com/chainguard-dev/edu). We welcome further discussion on weaknesses in glibc, such as its larger codebase and complexity compared to musl. Additionally, insights into the intricacies of compiler toolchains for cross-compilation are welcomed, especially when dealing with glibc and musl.

## Additional references

For more information, we recommend the following resources:

* [Understanding thread stack sizes and how Alpine is different](https://ariadne.space/2021/06/24/understanding-thread-stack-sizes-and.html): Explains why applications built for glibc can encounter issues on musl.
* [The tragedy of gethostbyname](https://ariadne.space/2022/03/26/the-tragedy-of-gethostbyname.html): Details why legacy libc DNS APIs are often unreliable across systems.

---

### How Chainguard creates container images with low-to-no CVEs
_Path: chainguard/containers/concepts/zerocve.md_

Chainguard Containers typically report few or no CVEs when scanned, which raises a fair question about whether those findings are being suppressed. They are not. Scanners read Chainguard Containers exactly as they read any other container, and they report whatever they find. The low counts are instead the product of three practices: shipping less software, rebuilding nightly, and publishing security advisories that tell scanners what a given finding means.

This article explains each practice, and describes how to verify the results independently.

## Scanners do report CVEs in Chainguard Containers

Scanning a current container usually returns a short list of findings, or none at all:

```sh
grype cgr.dev/chainguard/jre:latest
```

Scanning an older build of the same container returns considerably more. Any digest works for this comparison, including whichever one your own Dockerfiles pin today. The following example uses a build published in October 2024:

```sh
grype cgr.dev/chainguard/jre@sha256:43afe3cb7331f517eff19667939fb84c1e7aed283608e752007cfbbf9b4252d1
```

```output
NAME                    INSTALLED  FIXED-IN   TYPE  VULNERABILITY        SEVERITY
. . .
openjdk-23-jre          23.0.1-r0  23.0.2-r0  apk   GHSA-46mv-5cpj-wjxv  Unknown
zlib                    1.3.1-r4   1.3.2-r0   apk   GHSA-h858-mf2m-8jf4  Unknown
```

The key point is that CVE counts on Chainguard Containers are a function of how recently the container was built. Vulnerabilities are disclosed against software that has already been published, so any given build accumulates findings as it ages. The `FIXED-IN` column records the practical consequence — most of what a scanner finds in an old build has a newer package version that resolves it.

A pinned digest never changes. That is the purpose of pinning, and also its cost. Pair it with tooling that moves the pin, such as [Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/), and refer to [Considerations for image updates](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/) for guidance on planning the cadence.

For current CVE data on a specific container and tag, refer to that container's entry in the [Chainguard Containers directory](https://images.chainguard.dev/directory?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-containers-concepts-zerocve).

## Practice 1: shipping less software

Software that isn't in the container cannot carry a vulnerability. Most Chainguard containers are [distroless](/chainguard/containers/concepts/getting-started-distroless/): they hold the application, its runtime dependencies, and little else. Most do not include a shell, a package manager, or the general-purpose utilities that a conventional base image carries in case they are needed.

That default is not absolute. Some containers do ship a shell or additional packages, either because the application requires them or for compatibility with common workflows. The standard Node.js container includes `busybox` and `npm` for that reason, whereas the Python container has no shell at all. Chainguard's slim variants pare those compatibility packages back.

Shipping fewer packages is what makes the other two practices manageable. A container with a few dozen packages leaves only a few dozen to track, patch, and triage.

Two related pages cover the tradeoffs this creates. [Chainguard Container variants](/chainguard/containers/concepts/container-variants/) explains both the development variants, which add a shell and package manager for build stages and debugging, and the slim variants. [Debugging distroless container images](/chainguard/containers/troubleshooting/debugging-distroless-images/) covers working with a container that has no shell.

## Practice 2: rebuilding nightly

Chainguard tracks upstream releases and rebuilds its containers nightly, so a patched package reaches a published container without waiting for a release cycle. Keeping software current is unglamorous work, and it accounts for most of the effort involved: the majority of known vulnerabilities in a running system have already been fixed upstream and have not been picked up.

The practical consequence is that each fix arrives as a new build. Pulling the same digest for six months means running six-month-old software regardless of how quickly Chainguard patched it, which is why the [container lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/) and update tooling matter as much as the container contents do.

## Practice 3: publishing security advisories

The first two practices address most findings. The third handles the remainder: findings that are genuine but already resolved, and findings that were never applicable to begin with.

A Chainguard security advisory is a machine-readable record, issued per package and per CVE, that scanners read alongside their own vulnerability data. Each advisory records one of several determinations: the CVE is fixed as of a given package version; the package is not affected, for instance because the vulnerability only reaches Windows code paths and the package is built for Linux; a fix is pending upstream; or a fix is not planned. Scanners that consume these records filter their output accordingly and report more accurate results.

Advisories are published in several places:

- The [Security Advisories page](https://images.chainguard.dev/security/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-containers-concepts-zerocve) in the Containers directory, for browsing by CVE or container.
- [`wolfi-dev/advisories`](https://github.com/wolfi-dev/advisories) on GitHub, where each package's advisories live as YAML.
- Alpine-style `secdb` JSON feeds, for scanners and automation.

[How to use Chainguard Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-to-use/) covers reading and consuming them, and [How Chainguard issues Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/) walks through an advisory's life from disclosure to remediation, including the feed URLs.

An advisory is not a mechanism for dismissing a finding. It records a determination about a specific package version, and scanners remain free to disagree. [False positives and false negatives with container image scanners](/chainguard/containers/security-and-compliance/working-with-scanners/false-results/) explains how both arise and how to tell them apart.

## What this means in practice

- Scan the build you are actually running, by digest, rather than a tag that may have moved.
- Expect findings to accumulate on any container you pin and stop updating. This reflects the software aging rather than any change in the scan.
- Consult the advisory before triaging a finding. It may already record the CVE as fixed or not applicable.

The following video demonstrates the same three practices, including a scan of an old container image against a current one:

{{< youtube Fuw9lYX6Ne8 >}}

{{< blurb/free-tier-message >}}

## Related reading

- [How Chainguard issues Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/) — the stages of an advisory, and where to get the feeds.
- [Getting started with distroless containers](/chainguard/containers/concepts/getting-started-distroless/) — what minimal containers leave out, and what that changes.
- [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/) — which versions Chainguard actively patches.
- [Keeping containers updated](/chainguard/containers/security-and-compliance/updating-containers/) — tooling that moves your pins as new builds ship.

---

### Understanding Chainguard's container image categories
_Path: chainguard/containers/concepts/container-categories.md_

Chainguard Containers are a collection of curated, distroless container images designed with a focus on software supply chain security. Chainguard's container images are designed to be slim runtimes for production environments, emphasizing security and efficiency by removing unnecessary elements. Additionally, the images are designed to be easily integrated into existing workflows, helping organizations to build better, more secure software.

Within the [Chainguard Containers Directory](https://images.chainguard.dev/), Chainguard Containers are organized into five general categories (with some falling into multiple categories):

* **Free**
* **Base**
* **Application**
* **FIPS**
* **AI**

This conceptual article will outline each of these categories in turn, including their uses as well as examples of images from each category. It will also highlight important considerations one should make when using images from these categories.

## Free containers

Chainguard offers a set of container images that are publicly available and don’t require authentication for download and use; they are free to use for everyone. We refer to these as our *Free Containers*, and they cover several use cases for different language ecosystems. Free Containers are limited to the latest build of a given image, and are always tagged as `latest` and `latest-dev`.

You can access these images directly from Chainguard's registry from the `chainguard` repository. For example, to download the cURL Free image, you could run a command like the following:

```shell
docker pull cgr.dev/chainguard/curl
```

To access any other image, you will need to do so through your organization's private Chainguard repository. The following example will pull the `chainguard-base` image from the `chainguard.edu` organization's repository:

```shell
docker pull cgr.dev/chainguard.edu/chainguard-base
```

Note that you won't have access to the organization's repository used in this example, but if your organization has access to the `chainguard-base` image you will be able to pull this image using your organization's repository name in place of `chainguard.edu`. Chainguard's registry provides public access to all Free images, and provides customer access for Production images after logging in and authenticating.

For a complete list of Free images that are currently available, check out the [**Free** category on Chainguard Containers Directory](https://images.chainguard.dev/?category=free). Registered users can also access all Free and available Production images in the [Chainguard Console](https://console.chainguard.dev/overview). After logging in you will be able to find all the currently available Free Containers in the **Public images** tab.

### Production containers

The rest of Chainguard Containers, those that **are not** Free images and not included in the free tier of images, are referred to as *Production Containers*. Production images are enterprise-ready images that come with patch SLAs and features such as Federal Information Processing Standard (FIPS) readiness and unique time-stamped tags. Unlike Free images, which are typically paired with only the latest version of an upstream package, Production images offer specific major and minor versions of open source software.

As with the Free Container category, any container image considered a Production image will also fall into at least one of the other categories listed in this guide. To view the Production container images that your organization has access to, select the appropriate organization in the drop-down menu above the left-hand navigation and then click the **Organization images** tab.

## Base containers

Base Containers are meant to be extended by users with their own packages and applications. Examples include [chainguard-base](https://images.chainguard.dev/directory/image/chainguard-base/overview), [Go](https://images.chainguard.dev/directory/image/go/overview), and [Python](https://images.chainguard.dev/directory/image/python/overview).

Chainguard is responsible for releasing fully-patched toolchains and Base Containers, while customers are responsible for patching any applications and dependencies they add to a Chainguard Container. It is recommended to use a fully-patched Chainguard toolchain image to build the application, and a fully-patched Chainguard Base container image to layer the final application on.

When migrating to a Chainguard Base container image you should first check the images’s overview page on the Containers Directory for usage details and any compatibility notes. You should understand the libraries, runtime requirements, and operating system dependencies of the applications you plan to have running on the Base container image.

It is a best practice to use the same versions of any languages or applications that will be running on the Chainguard Base container image as what is currently running in your environment. Do not upgrade language or application versions at the same time that you migrate. Following the migration, you should thoroughly test and monitor your application.

If you need a package to use with your Chainguard Base Container, Wolfi packages are available using `apk`. Ensure you only use Wolfi packages, as Alpine APK’s are not compatible with Wolfi. Additionally, it is important to note that vendor-provided packages need to be glibc-based and their functionality should be fully tested along with the application. For additional tips, please refer to our guide on [Troubleshooting apko builds](/open-source/build-tools/apko/troubleshooting/).

> **Note**: Base Containers often require more customization by the user. Be aware that Chainguard offers a customization platform called [Custom Assembly](/chainguard/containers/custom-assembly/overview/) to streamline this requirement without customers having to stand up their own custom pipelines.

## Application containers

In contrast with Base container images, which are intended to be built upon, Application Containers are designed to be used directly, often by plugging into systems like Helm. Some examples of Chainguard's Application images include [nginx](https://images.chainguard.dev/directory/image/nginx/overview), [Fulcio](https://images.chainguard.dev/directory/image/fulcio/overview), and [apko](https://images.chainguard.dev/directory/image/apko/overview).

When it comes to maintaining Application container images, Chainguard is responsible for rebuilding the upstream project with the latest toolchain and patching static and dynamic dependencies where such a change is non-breaking. Customers are responsible for tracking a supported version of the Chainguard Container.

When migrating to a Chainguard Application container image you should first check the image’s overview page on the Containers Directory for usage details and any compatibility notes. There may be user ID, permissions, or volume path differences with the Chainguard image that you should be aware of. It is a best practice to use the same version of the Chainguard Application container image as what is currently running in your environment.

## AI container

Artificial intelligence and machine learning (AI/ML) systems are used in a wide variety of high-stakes applications, including information retrieval, medical research, fraud identification, military operations, autonomous vehicle navigation, and more. If compromised by malicious actors, the consequences could be disastrous and far reaching.

Due to their unique features and uses, these systems often pose a greater risk than traditional software systems. Chainguard offers a suite of CPU- and GPU-enabled AI Containers which can help to mitigate these risks. Some of these AI container images include [NeMo](https://images.chainguard.dev/directory/image/nemo/overview), [PyTorch](https://images.chainguard.dev/directory/image/pytorch/overview), and [TensorFlow](https://images.chainguard.dev/directory/image/tensorflow/overview).

These images are hardened, minimal, and optimized for efficient AI development and deployment. By leveraging Chainguard AI Containers, organizations can confidently secure their AI infrastructure, streamline vulnerability management, and maintain high performance with low-to-zero vulnerabilities. Rather than starting with tens, dozens, or hundreds of CVEs in your application or pipeline, you start with a clean slate.

To learn more about Chainguard's AI Containers and their uses, we encourage you to check out our course on [Securing the AI/ML Supply Chain](https://courses.chainguard.dev/securing-ai).

## FIPS containers

FIPS — or, Federal Information Processing Standards — are publicly announced standards developed by the National Institute of Standards and Technology (NIST). Chainguard offers images that use FIPS-validated cryptographic software modules to help users ensure that their applications meet FIPS standards.

Chainguard offers FIPS versions of many of its container images, so FIPS Containers will fall into more than one category. Some Chainguard container images with FIPS variants are [nginx](https://images.chainguard.dev/directory/image/tensorflow/overview), [PHP](https://images.chainguard.dev/directory/image/php-fips/overview), and [PyTorch](https://images.chainguard.dev/directory/image/pytorch-fips/overview).

For more information, please refer to our conceptual article on [FIPS Chainguard Containers](/platform/fips/fips-images/).

## Container image type considerations

There is some overlap between the different container image categories outlined in this guide. For example, the [PyTorch](https://images.chainguard.dev/directory/image/pytorch/overview) image is an AI image, but it is also part of our free tier, meaning it's also a Free image.

Many customers use both Application and Base Containers. Note that it often takes more time to migrate your applications to a Base container image in comparison to an Application image due to the complexity of coordinating multiple teams, testing, and release schedules. We recommend starting with and migrating to Application container images first while your teams get trained and onboarded with Base container images.

A common requirement for many customers is to add a company-specific certificate or other security related content. The three most common ways to accomplish this are:

1. Using [incert](/chainguard/containers/custom-assembly/incert-custom-certs/)
2. Running the `update-ca-certificates` utility within a Dockerfile
3. Using the Java `keytool` utility within a Dockerfile

The process of adding or updating certificates, configuring APK repositories, and implementing other organization-specific customizations into an image is commonly known as creating a "Golden Image". This approach enables these standard modifications to be applied once and then distributed across all teams, thereby reducing the risk of errors and minimizing friction during the migration process.

## Learn more

By reading this guide, you should have a better understanding of how Chainguard categorizes its container images and what these categories mean. To recap:

* **Free**: Chainguard's free tier of container images
* **Base**: Containers meant to be built upon
* **Application**: Containers meant to be run directly
* **FIPS**: Contain FIPS-validated cryptographic modules
* **AI**: Containers for running AI/ML workloads securely

For more information on Chainguard Containers, please refer to the other resources in the [About section](/chainguard/containers/concepts/). In particular, you may find our conceptual article on [Chainguard's Shared Responsibility Model](/chainguard/containers/concepts/shared-responsibility-model/) to be of interest.

---

### Choosing a base container for your compiled programs
_Path: chainguard/containers/concepts/choosing-a-base-container.md_

When selecting the right base image for your application, there are a variety of factors to take into consideration. For starters, it is critical that your application has all of the dependencies it needs to run. The ideal base image will contain the essential packages you need, while leaving out the ones you don’t. However, in practice, you will need to build upon your container images so they meet your specific needs, making it all the more important that you have a strong foundation.

In this guide, we will explore a variety of Chainguard Containers which are suitable for different compiled applications. We will take a look at their availability and use-case differences so you can move closer to settling on the best base image for your specific needs.

## Available containers

### wolfi-base

The [`wolfi-base`](https://images.chainguard.dev/directory/image/wolfi-base/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) Chainguard Container is a minimal container image based on the [Wolfi *un-distro*](https://github.com/wolfi-dev/), a community-oriented Linux distribution created by Chainguard to facilitate image builds. The `wolfi-base` image contains `busybox` and `apk-tools` so that you can build your own packages for a custom image. It also supports `glibc`.

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

The following packages are included in the `wolfi-base:latest` Chainguard Containers:

- `apk-tools`
- `busybox`
- `ca-certificates-bundle`
- `chainguard-baselayout`
- `glibc`
- `glibc-locale-posix`
- `ld-linux`

### chainguard-base

*Paid Container* \
In addition to the functionality of the `wolfi-base` Chainguard Container, [`chainguard-base`](https://images.chainguard.dev/directory/image/chainguard-base/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) reports as being a Chainguard Container, which scanners use to determine what security feeds to reference for vulnerabilities. Additionally, the `chainguard-base` container image provides access to vulnerability remediation SLAs to ensure your containers are always up-to-date with the latest releases and patches.

The following packages are included in the `chainguard-base:latest` Chainguard Container:

- `apk-tools`
- `busybox`
- `ca-certificates-bundle`
- `chainguard-baselayout`
- `glibc`
- `glibc-locale-posix`
- `ld-linux`

You can find the complete inventory of packages for the `chainguard-base` Chainguard Container at [its listing on Chainguard's registry](https://images.chainguard.dev/directory/image/chainguard-base/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

### static

The Chainguard [`static`](https://images.chainguard.dev/directory/image/static/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) base image is a Wolfi-based image available in one variant with the `:latest` tag. The `static` image is extremely minimal and is not intended to be run directly. It is used to host stand-alone, static binaries, like those produced by compilers such as `gcc`, `go`, and `rust`. It does not contain any programs you can run out-of-the-box. You must add your own static binaries to the image, for example using a Dockerfile multi-stage build.

The following packages are included in the `static:latest` Chainguard Container:

- `ca-certificates-bundle`
- `chainguard-baselayout`
- `glibc-locale-posix`
- `tzdata`
- `wolfi-baselayout`

You can find more information about the `static` Chainguard Container at [its listing on the Chainguard's registry](https://images.chainguard.dev/directory/image/static/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

### glibc-dynamic

The [`glibc-dynamic`](https://images.chainguard.dev/directory/image/glibc-dynamic/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) Chainguard Container is best suited for when you need to host dynamically linked binaries that depend on the C standard library. Like the `static` image, `glibc-dynamic` is intended to be used as a base image only, and you must add your own binaries to the image.

The `glibc-dynamic` image is freely available in two variants: `:latest` and `:latest-dev`. The `:latest-dev` image adds additional packages which are not present in `:latest` to help facilitate application development. It is suggested to use the `:latest` image for production-facing purposes because of its smaller footprint.

The following packages are included in the `glibc-dynamic:latest` Chainguard Container:

- `ca-certificates-bundle`
- `chainguard-baselayout`
- `glibc`
- `glibc-locale-posix`
- `ld-linux`
- `libgcc`
- `libstdc++`
- `wolfi-baselayout`

You can find more information about the `glibc-dynamic` Chainguard Container at [its listing on  Chainguard's registry](https://images.chainguard.dev/directory/image/glibc-dynamic/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

### cc-dynamic

The [`cc-dynamic`](https://images.chainguard.dev/directory/image/cc-dynamic/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) Chainguard Container is deprecated. It is suggested that you use the `glibc-dynamic` image instead, as it is designed to replace `cc-dynamic`. You can find more information about the `cc-dynamic` image, such as its packages and licensing information, on [Chainguard's registry](https://images.chainguard.dev/directory/image/cc-dynamic/advisories?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

### gcc-glibc

The [`gcc-glibc`](https://images.chainguard.dev/directory/image/gcc-glibc/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) Chainguard Container is best suited for building C applications which depend on `glibc`. There are two freely available variants of this image, `:latest` and `:latest-dev`. `:latest-dev` is a developer variant of the image which adds additional packages such as `bash` to facilitate the development process.

In comparison to the `static` and `glibc-dynamic` Chainguard Containers, `gcc-glibc` is intended to be used to develop programs based on the C standard library, instead of simply hosting binaries. Because of this, it contains additional packages such as `make`, `busybox`, as well as `gcc` to compile programs.

The following packages are included in the `gcc-glibc:latest` Chainguard Container:

- `binutils`
- `build-base`
- `busybox`
- `ca-certificates-bundle`
- `gcc`
- `glibc`

You can find the complete inventory of packages for the `gcc-glibc` Chainguard Container at [its listing on Chainguard's registry](https://images.chainguard.dev/directory/image/gcc-glibc/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

### glibc-openssl

*Paid Container* \
The [`glibc-openssl`](https://images.chainguard.dev/directory/image/glibc-openssl/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs) Chainguard Container is designed for C applications which depend on OpenSSL. It contains the `openssl` and `openssl-provider-legacy` packages to support this use-case. It comes in two variants,`latest` and `latest-dev`. As in the aforementioned images, `latest` is designed for deployment, while `latest-dev` contains additional packages to assist in program development such as a shell and package manager.

The following packages are included in the `glibc-openssl:latest` Chainguard Container:

- `ca-certificates-bundle`
- `chainguard-baselayout`
- `glibc`
- `glibc-locale-posix`
- `ld-linux`
- `openssl`
- `openssl-provider-legacy`

You can find the complete inventory of packages for the `glibc-openssl` Chainguard Container at [its listing on Chainguard's registry](https://images.chainguard.dev/directory/image/glibc-openssl/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs).

## What about `musl`?

At the time of this writing, no Chainguard Containers come packaged with `musl`. Chainguard builds `glibc`-based container images because `glibc` is commonly used, which makes it easier for most developers to start consuming Chainguard Containers in their environments. Additionally, `glibc` is widely tested, making it a dependable choice for a C standard library implementation. As `glibc` is a well-established option, choosing to use `glibc` ensures more applications will be compatible with new images.

Though `musl` is sometimes chosen because of its minimal footprint, Chainguard’s distroless approach based on [Wolfi](https://www.chainguard.dev/unchained/introducing-wolfi-the-first-linux-un-distro) often results in a container image of comparable (or smaller) size than official `musl` based images. For more information, please refer to our [glibc vs. musl](/chainguard/containers/concepts/glibc-vs-musl/) article.

## Next steps

Understanding the differences between various Chainguard Containers allows you to make informed decisions about what images to choose for your compiled applications. You can check out our complete suite of Chainguard Containers on [Chainguard's registry](https://images.chainguard.dev/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-compiled-programs-compiled-programs). To learn more about using Chainguard Containers, head to the [Chainguard Academy](/chainguard/containers/), where you can find documentation to help you start incorporating them into your workflow.

Interested in learning more about adopting Chainguard Containers for your organization? [Let’s get in touch!](https://www.chainguard.dev/contact)

---

### Chainguard's container variants
_Path: chainguard/containers/concepts/container-variants.md_

Chainguard Containers follow a distroless philosophy, meaning that only software absolutely necessary for a specific workload is included in an image. Designed to be as minimal as possible, Chainguard's standard container images do not contain package managers such as apk, shells such as b/a/sh, or development utilities such as Git or text editors. However, this distroless approach isn't suitable for every use case. For this reason, most Chainguard Containers have what's called a *development* variant.

These variants are designed for development tasks such as building, testing, or debugging. They can be used to build software artifacts that are then copied into standard images as part of a multi-stage build, or to test workflows interactively in an environment similar to a standard image. Development images contain familiar utilities such as package managers and shells. While our standard images have advantages related to security, development images are also secure and production-ready. Development images are tagged `:latest-dev`.

To benefit from the most minimal potential attack surface, we recommend using a multi-stage build that leverages the development container image as a builder for a distroless standard container image. However, development images are useful as they are throughout the development lifecycle. This article explains some of the key features of development container variants and how they differ from our standard container images and outlines ways these variants come together in creating a secure deployment.

> **Note**: Any time this article mentions Chainguard's "standard" container images, it's referring to our minimal, distroless container images. In the context of this article, any non-development variant is considered a "standard" container image.

## Chainguard Container security

Chainguard's standard container images have the following advantages:

- Our standard container images contain fewer packages. While Chainguard moves quickly to patch CVEs in all images, our standard, distroless images still experience fewer CVEs overall. Reducing the number of packages also reduces the potential number of unknown vulnerabilities that might apply to an image.
- Not all executables are created equal. Shells such as bash, package managers such as apk, and communication-ready utilities such as Git and curl are general-purpose tools that are broadly exploitable.
- A smaller image can use fewer resources and reduce deployment time. In some cases, especially with already-large images, a smaller version can make a deployment more stable or robust.
- Removing unnecessary components increases the observability and transparency of the image. Reducing the number of components can facilitate risk assessment or post-incident reporting.

While our standard images can be considered to have advantages for security, the development variants of Chainguard Containers are also low-to-no CVE, include useful attestations such as SLSA provenance and SBOMs, and follow other security best practices. You should feel comfortable using these secure development images in production if they better fit your use case.

## Using development images

Though using Chainguard's standard container images in your final deployment will give you the benefits of distroless, development images have many use cases. These include:

- **Building**: In many Dockerfile builds, you will need to generate software artifacts such as static binaries or virtual environments as part of the build process. Development images are ideal for this use case, and after these artifacts have been generated they can be copied to a standard image for use. Refer to [How to port a sample application to Chainguard Containers](/chainguard/containers/migration/porting-apps-to-chainguard/) for a detailed example.
- **Debugging**: Our development images contain a number of useful utilities, but are otherwise designed to be as close as possible to the standard variant. This makes them useful for debugging, since you can test out build steps or the build environment using interactive shells and package managers. Refer to [Debugging distroless images](/chainguard/containers/debugging-distroless-images/) for more on this use case.
- **Training**: In the case of AI images, you can use a development variant to train a model, then run the model in inference using a standard image.
- **Deploying**: Development images are low-to-no CVE and are suitable for production.

## Slim container variants

In addition to standard and development variants, some Chainguard Containers also provide slim variants.

Slim variants, whose tags are appended with `-slim`, are a further-reduced subset of our standard container images. As outlined previously, standard Chainguard Containers are already designed to be minimal, distroless runtimes: they omit general-purpose shells, package managers, and development utilities, while still providing everything you need to run the application in production with a low-to-no CVE profile.

Slim variants start from that same security posture and then strip away even more. Where a standard image might still include some compatibility or helper tooling, slim variants remove additional components — such as BusyBox, shells, or language-specific tools like `npm` — so that only the essentials for running the workload remain.

The result is a smaller, more opinionated runtime with the lowest possible footprint and attack surface, at the cost of some convenience and compatibility compared to the corresponding standard variant. In many workflows, you might build or debug using a development image, then deploy with a corresponding slim (or other standard) variant once your application artifacts are ready.

Because slim variants remove general-purpose tools, they can require more deliberate configuration than other variants, particularly around entrypoints, logging, and debugging. When using a slim variant, always review the image documentation to understand its expected entrypoint, available utilities, and any behavioral differences from the corresponding standard or development image.

## Full container variants

Some Chainguard Containers also provide *full* variants, whose tags are appended with `-full`. Where standard images strip away everything but the essentials, full variants aim for parity with their upstream equivalent — typically the Debian-based image on Docker Hub. They include the packages, environment variables, and entrypoint scripts that the standard Chainguard image intentionally omits. We currently offer full variants for 10 images.

Full variants exist primarily to ease migration. When you move a workload onto Chainguard Containers, your build and test pipelines may depend on components from your previous upstream image, even when the application itself doesn't need them to run. These dependencies can cause runtime crashes or pipeline failures during a switch to a more minimal image. Starting with a full variant lets you adopt Chainguard Containers without first untangling every such dependency.

We recommend treating full variants as a starting point rather than a destination. Once you've migrated, review which packages your production pipeline actually requires, then move to a standard or development variant that includes only what you need. Doing so gives you the smaller attack surface and lower CVE count that make Chainguard Containers worth adopting in the first place.

## Special considerations

It’s likely already clear that switching to our standard images requires a few changes in development and deployment. Here are a few additional considerations:

- Since we don’t include general-purpose shells in most standard container images, the entrypoint to these images will vary by each image’s use case. Check the documentation for each image, and note that Dockerfile commands such as `CMD` will be directed to the image-specific entrypoint. Because we aim to keep our development images as close as possible to our standard images, these changes to entrypoint also affect development container images.
- Chainguard Containers use a less privileged user by default. When using our development images, you will need to explicitly access the image with the root user — such as by using the `--user root` option — to perform tasks such as installing packages with apk.

## Resources

- [Blog: Minimal container images: Towards a more secure future](https://www.chainguard.dev/unchained/minimal-container-images-towards-a-more-secure-future)
- [Chainguard Academy: Overview of Chainguard Containers](/chainguard/containers/overview/)
- [Chainguard Academy: Debugging distroless images](/chainguard/containers/debugging-distroless-images/)

---

### How Chainguard Containers are tested
_Path: chainguard/containers/concepts/how-we-build-and-test/images-testing.md_

Chainguard Containers are minimal, distroless container images that you can use to build and run secure applications. Given the importance of secure, highly performant images, Chainguard performs testing to ensure our container images match the functionality of upstream and other external counterparts.

This article provides a high-level overview of Chainguard's approach to testing when building new container images to ensure their security and consistency with comparable container images.

## Build requirements for new container images

Chainguard has a set of requirements in place that new container images must meet in order to be included in our [Containers Directory](https://images.chainguard.dev?utm=docs). These requirements fall into two categories:

* Container image standards
* Comprehensive testing

### Container image standards

When building a new container image, Chainguard will take steps to ensure it meets the following standards:

| **Requirement**    |  **Explanation**     |
| --- | --- |
| **Size**     |  Any new Chainguard Containers should be smaller than their external counterparts, though exceptions may occur.    |
|  **CVEs**     | When scanned with a CVE scanning tool like Grype, new container images should return zero CVEs. If a container image does return CVEs in its scan results it should include an explanation, though some reported CVEs may be false positives. Refer to our [Security Advisories](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-images-testing) for more information.   |
|  **Kubernetes accessibility**     | Containers used for Kubernetes-based deployments must be able to run inside of a Kubernetes cluster.     |
|  **Architecture**     | Chainguard Containers must be built for both the `x86_64` and `aarch64` architectures.      |

Chainguard also performs the following checks on new container images to ensure that the applications contained within them meet the needs of most use cases:

| **Requirement**    |  **Explanation**     |
| --- | --- |
|  **Functionality**     | The application is tested to comply with its upstream counterpart's core feature set.   |
|  **Builder Containers**     | Chainguard's builder containers can in fact build new, functional container images.     |

### Comprehensive testing

Chainguard builds a wide variety of different container images, with differing core functionalities and expected installation methods. This means we must vary our testing across container images to test the right things. It can be helpful to think about the various layers in a container image build process and what would be useful to test for each layer:

| **Layer** | **Test** | **Applies to** |
| --- | --- | --- |
| Deployment | Upstream accepted, documented deployment methods | All services and controllers |
| Runtime security | Non-root, no extra capacities, read-only rootfs | All |
| TLS | Valid chain, hostname, min TLS | Any listener, FIPS |
| Persistence | Correct file and directory permissions, read/write, restarts cleanly | Stateful, such as databases |
| UI | Smoke test and auth | UI apps, such as Argo |
| Metrics and logging | Metrics emitted or exposed if the app exposes them, logs are written to expected locations if they are emitted | Almost all containers intended for production environments |

In addition, Chainguard performs a number of automatic checks for new container images as part of our CI/CD process.

Depending on the container image, Chainguard performs representative tests, such as functional and integration tests. For example, for applications primarily deployed with a Helm chart, the container image is deployed to an ephemeral Kubernetes cluster using the accepted Helm chart, which is validated in various ways.

When applicable, Chainguard will develop functional tests for container images. These tests vary by application, but can generally be thought of as integration tests that run after a container image is built but before it gets tagged.

Our goal for these tests is that they fully evaluate the container image's deployment in a representative environment; for example, container images running Kubernetes applications are tested in a Kubernetes cluster and builder or toolchain applications are tested with a `docker run` command or part of a `docker build` process. This means that our container images work with the existing upstream deployment methods, such as Helm charts or Kustomize manifests, helping us to ensure that a container image is as close to a drop-in replacement as possible.

Additionally, Chainguard performs automated tests on every *package* included in our container images. These tests run on every new package build within an ephemeral container environment before the package build is published. This allows us to validate the representative functionality of each package well before packages are assembled into container images.

## Learn more

Chainguard's rigorous container image testing standards and frequent updates ensure that they will work as expected with few (and often zero) vulnerabilities. If you're having trouble working with a specific Chainguard Container, we encourage you to check out its relevant Overview page in our [Chainguard Containers Directory](https://images.chainguard.dev/directory?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-images-testing).

For general help with using Chainguard Containers, you can refer to our [Debugging distroless container images](/chainguard/containers/debugging-distroless-images/) guide or our [Chainguard Containers FAQs](/chainguard/containers/faq/). For help with specific issues or questions not covered in these resources, please [contact our support team](https://support.chainguard.dev?utm=docs). Refer to [Get support](/get-started/get-support/) for the portal's prerequisites.

---

### Reproducibility and Chainguard Containers
_Path: chainguard/containers/concepts/how-we-build-and-test/repro.md_

A build is reproducible when the same inputs produce the same output, bit for bit, regardless of who runs it and when they run it. Chainguard builds its containers with [apko](https://github.com/chainguard-dev/apko) from a declarative configuration, and publishes that configuration as a signed attestation on every build. You can retrieve the configuration, rebuild the container yourself, and check the digest you get against the one Chainguard published.

## What reproducibility requires

Reproducibility requires more than a build that succeeds twice. Binary identical means every byte matches, so a reproducible build has to control three things:

- **The versions of its inputs.** Not only source code, but every dependency, each pinned to an exact version.
- **The version of the build tooling.** The same inputs run through two versions of a build tool can produce two different results.
- **Anything that varies from run to run.** Timestamps and generated unique IDs are the most common causes. They change on every build, and they change the output along with them.

When a build meets those conditions, anyone can verify its output independently: rather than trusting that a container was built from the configuration it claims, you can rebuild it and compare the digests.

## Reproduce a Chainguard Container

You need [cosign](https://github.com/sigstore/cosign), [apko](https://github.com/chainguard-dev/apko), [crane](https://github.com/google/go-containerregistry/tree/main/cmd/crane), `jq`, and a registry you can push to. cosign and apko are both distributed as signed binaries on their GitHub releases pages, and apko can also run from a container if you would rather not install it. The examples use `cgr.dev/chainguard/nginx`, one of Chainguard's [Free containers](/chainguard/containers/concepts/container-categories/#free-containers), so they run as written.

### Record the digest you want to match

```sh
crane digest cgr.dev/chainguard/nginx:latest
```

```output
sha256:<digest>
```

Chainguard moves the `latest` tag as it publishes rebuilds, so start by pinning down which build you're reproducing. The `<digest>` you get back is the value to match at the end; it differs from the one anyone else gets unless you both pull the same build. [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/) covers digests in more detail.

### Retrieve the build configuration

Every build carries its apko configuration as an attestation. The following command verifies that attestation and writes the configuration to a file:

```shell
cosign verify-attestation \
  --type https://apko.dev/image-configuration \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  cgr.dev/chainguard/nginx:latest | jq -r .payload | base64 -d | jq .predicate > latest.apko.json
```

The two certificate flags are what make that a verification. They tell cosign to accept the attestation only if it was signed by the GitHub Actions workflow that builds Chainguard's containers, using a certificate from that workflow's OIDC issuer. Without them you would be reading an attestation that is present, rather than one that is genuine. The rest of the pipeline unwraps the result: `jq -r .payload` takes the in-toto payload, `base64 -d` decodes it, and `jq .predicate` keeps the apko configuration itself.

Read the configuration back from the file that the configuration was piped into:

```shell
jq . latest.apko.json
```

The following shows this command's abridged output, highlighting a few fields worth calling out:

```json
{
  "contents": {
    "packages": [
      "ca-certificates-bundle=20260611-r1",
      "glibc-2.44-locale-posix=2.44-r6",
      "glibc-2.44=2.44-r6",
      "ld-linux-2.44=2.44-r6",
      "..."
    ],
    "repositories": [
      "https://apk.cgr.dev/chainguard"
    ]
  },
  "accounts": {
    "run-as": "65532",
    "users": [
      { "gid": 65532, "homedir": "/home/nginx", "uid": 65532, "username": "nginx" }
    ]
  },
  "archs": [ "amd64", "arm64" ],
  "entrypoint": { "command": "/usr/sbin/nginx" },
  "stop-signal": "SIGQUIT"
}
```

apko builds are declarative: the configuration names a list of APK packages and some metadata, and nothing more. Two details in it matter. Each package is pinned to an exact version, and the list is complete — `glibc` does not quietly pull in a dependency that the file doesn't name. Everything else in the file is metadata that the build applies to the finished container: the user account to run as, the architectures to build, the entrypoint, the stop signal.

### Rebuild and compare

Point apko at the configuration and give it somewhere to push:

```sh
apko publish latest.apko.json ttl.sh/nginx-repro
```

apko builds one image per architecture in the `archs` list, assembles them into an index, pushes the result, and prints the digest of what it pushed as its final line:

```output
ttl.sh/nginx-repro@sha256:<digest>
```

That digest is the same `<digest>` the first step recorded, which means the rebuild is byte-for-byte identical to the container Chainguard published. The registry it was pushed to has no bearing on the value: a digest covers the content, not where it lives.

To run apko from its container instead of installing it, mount the directory holding the configuration and pass the same arguments:

```shell
docker run --rm -v "$PWD":/work -w /work cgr.dev/chainguard/apko:latest publish latest.apko.json ttl.sh/nginx-repro
```

`apko publish` needs a registry to push to. These examples use [ttl.sh](https://ttl.sh), a free registry whose images expire after a short time, which suits a throwaway comparison. Any registry you can write to works.

### Compare images that don't match

When two digests differ, [diffoci](https://github.com/reproducible-containers/diffoci) reports the specific differences between the images rather than leaving you to compare two hashes:

```sh
diffoci diff cgr.dev/chainguard/nginx:latest ttl.sh/nginx-repro
```

When the images match, the command exits without reporting anything. When they differ, it lists the differing files and where they differ. Add `--ignore-timestamps` to set aside timestamp differences, or `--semantic` to ignore everything diffoci treats as non-substantive, including file ordering and redundant file mode bits.

## What limits reproducibility

Three factors can prevent an exact match, and each is worth understanding before concluding that a rebuild has failed.

- **The version of apko matters.** A change in how a build tool handles something as small as a symbolic link is enough to change a digest. Every Chainguard Container records the version that built it in its SLSA provenance attestation:

  ```shell
  cosign verify-attestation \
    --type https://slsa.dev/provenance/v1 \
    --certificate-oidc-issuer https://token.actions.githubusercontent.com \
    --certificate-identity https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
    cgr.dev/chainguard/nginx:latest | jq -r .payload | base64 -d | jq .predicate.runDetails.builder
  ```

  ```output
  {
    "id": "https://github.com/chainguard-dev/terraform-provider-apko",
    "version": {
      "apko": "v1.2.43",
      "terraform-provider-apko": "v1.2.20"
    }
  }
  ```

  If a rebuild produces a different digest, check that version first.

- **APKs cannot be rebuilt bit for bit from source.** You can build the packages themselves from source, and their contents match, but each APK embeds a signature made with Chainguard's private signing key. Without that key you cannot produce an identical package file.

- **The pinned package versions have to be available.** apko installs the exact versions the configuration names, so reproducing an old container depends on those versions still being served from the repository it points at.

## Correction to the video

The following video says that Chainguard keeps older package versions only for a short time, and that reproducing an older container therefore means holding your own copies of the APKs. That statement is not accurate. Chainguard retains every package version it has issued, so you can rebuild containers from months ago without arranging your own storage. Chainguard may age older versions out in the future to keep the package index manageable, and only the latest versions are serviced with fixes, but retention today is indefinite.

{{< youtube 0Qn2J89UEvI >}}

## Related reading

- [How to retrieve SBOMs and attestations for Chainguard Containers](/chainguard/containers/security-and-compliance/retrieve-image-sboms/) — the other attestation types published alongside the apko configuration, and how to fetch them.
- [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/) — identifying a build by digest, and reading the software versions inside it.
- [Verifying Chainguard Containers and metadata signatures with Cosign](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/) — verifying signatures and provenance more generally.
- [How Chainguard Containers are tested](/chainguard/containers/concepts/how-we-build-and-test/images-testing/) — what happens to a container before it's published.

---

### Chainguard criteria for determining whether to build a container image
_Path: chainguard/containers/concepts/how-we-build-and-test/what-chainguard-will-build.md_

There are currently over [2,000 Chainguard Containers](https://images.chainguard.dev/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) and that number is always growing as we add more to our expanding catalog.

If you would like a Chainguard Container that is not yet available, or inquire about whether we would build a given container image, Chainguard will endeavor to perform an analysis on the request. Chainguard aims to build new container images that are relevant to our customers and to support broader software security goals. However, it is not always feasible to package and build software. Please note that we have the following general criteria when considering requests.

* The source code is freely available in a Source Code Manager (SCM) system such as GitHub or GitLab.
* The project is licensed under a FOSS license. Non-FOSS licenses are reviewed on a case-by-case basis.
* The project is actively maintained with supported versions. That is:
    * There are recent commits and releases.
    * The project has not reached its end of life (EOL).
    * The project has maintained active versions.
    * The project does not rely on outdated or unmaintained dependencies; for example, unsupported versions of Python, OpenSSL etc.
    * There is usually a lead or owner.
* There are no technical blockers preventing us from building the container image as we’ve determined as part of an initial analysis process.

If the software project or container image you have in mind meets the above criteria, please [contact us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) for more information.

---

### Chainguard Containers product release lifecycle
_Path: chainguard/containers/concepts/lifecycle-and-eol/versions.md_

[Chainguard
Containers](https://images.chainguard.dev/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)
are able to offer few-to-zero known vulnerabilities because they are updated
frequently. Because of this continuous release cycle, the best way to mitigate
vulnerabilities is to use the newest build of each Chainguard Container
available. Chainguard keeps Containers up to date by doing one or more of the
following:

* Applying new releases from upstream projects
* Rapidly applying upstream patches to current releases — you can read more
  about this in our blog post, “[How Chainguard fixes vulnerabilities before
  they're
  detected](https://www.chainguard.dev/unchained/how-chainguard-fixes-vulnerabilities?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)”
* Applying Chainguard patches to OSS software

Upstream projects are updated frequently for many reasons, including to combat
CVEs, and Chainguard ensures that the most up-to-date software is available in
all Chainguard Containers. Additionally, Chainguard often identifies CVEs and
other issues before scanners can detect them, so Chainguard may offer a patch to
a vulnerable dependency to support Chainguard Containers with few-to-zero
vulnerabilities.

The best way to mitigate vulnerabilities is to continually update to the latest
patched releases of software, but testing and updating can take time and effort.
To support flexibility and user choice, Chainguard aims to offer multiple
versions of a Chainguard Container that provide the lowest number of
vulnerabilities realistically possible.

This document provides an overview of Chainguard’s approach to updates,
releases, and versions within Chainguard Containers. For more specific guidance,
please [contact
us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

This page explains the policy. If you're trying to resolve a specific container
image or version you can't pull, refer to [Troubleshoot container and version
availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).

## How versions are maintained

Chainguard Containers are built on open source software, so understanding how
Chainguard manages releases starts with understanding how open source projects
version and release software. Generally, projects follow one of two approaches:

* **Multiple release track**: Popular open source
projects often provide maintenance for a number of release tracks concurrently.
For example, Java, Go, Postgres, and Kubernetes patch multiple release versions,
each on their own defined maintenance schedule.
    * For these types of projects, Chainguard will maintain every version track of the
upstream software that receives updates from the project.
* **Single release track**: Many open source projects support only a single stream of releases that are
continuously incremented; often, this is simply the latest release. In the case
of a single release track, any security fix that is published will only be
applied to the most recent release of the project, and the project release tags
will be updated to indicate a new version is available.
    * For this type of project, Chainguard only warrants that the latest release of
the software and its corresponding version tags have the most up-to-date patches
available.

In rare cases, a project may not follow a defined release pattern at all.

### Examples of what Chainguard supports and maintains for Chainguard Containers

There are several scenarios that define what Chainguard agrees to maintain
regarding software versions in the [Chainguard Containers
Directory](/platform/console/images-directory/). All
container images that Chainguard currently supports are those with upstream
software that is still supported and maintained, and Chainguard patches and
rebuilds these Containers daily. If you have purchased a container image during
its lifecycle that is no longer being supported upstream, you will still be able
to access this Container, _but_ Chainguard will not be patching or rebuilding
this Container and it will start to accrue CVEs. It is recommended to upgrade to
an actively maintained version.

The table provides some example scenarios to help illustrate our approach.

| **Category** | **Example** | **Maintained Upstream Releases** | **Chainguard Patches** | **Chainguard No Longer Patches** |
| --------------- | ------------- | ---------------------------------- | ------------------------ | ---------------------------------- |
| **Multiple Release Tracks** | [Go](https://images.chainguard.dev/directory/image/go/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | 1.23, 1.22 | `:latest`, 1, 1.23, 1.22 | 1.23.old, 1.22.old, 1.21 and below |
| | [Python](https://images.chainguard.dev/directory/image/python/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | 3.13, 3.12, 3.11, 3.10, 3.9 | `:latest`, 3, 3.9 and above | 3.8 and below, 3.8.old, 3.9.old, 3.10.old, 3.11.old, 3.12.old |
| | [Postgres](https://images.chainguard.dev/directory/image/postgres/version?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | 17, 16, 15, 14, 13 | `:latest`, 17, 16, 15, 14, 13 | 12 (EOL November 21, 2024) and below |
| **Single Release Track** | [Cosign](https://images.chainguard.dev/directory/image/cosign/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | 2 | `:latest`, 2, 2.4 | 2.3, 2.2, 2.1, 2.0, 1.x, 0.x |
| | [Bank-Vaults](https://images.chainguard.dev/directory/image/bank-vaults/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | 1 | `:latest`, 1 | Any previous version tag
| **No Release Track** | [envoyproxy/ratelimit](https://images.chainguard.dev/directory/image/envoy-ratelimit/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) | No versioned releases | `:latest` | Any previous version tag |

> **Note**: The "Maintained Upstream Releases" column is current as of December 2024.

### Daily rebuilds and proactive patching

[Actively maintained](#list-active-tags) Chainguard Containers are rebuilt on a daily
cadence, so you can be sure the container image you are using is up to date.

In some
cases, Chainguard will fix vulnerabilities in tools without waiting for the external
project to release patches. Learn more about this under [Epoch tags](#epoch-tags).

### Maintaining Wolfi packages in Chainguard Containers

Chainguard Containers only contain packages that are either built and maintained
internally by Chainguard or packages from the [Wolfi
Project](https://github.com/wolfi-dev). These packages follow the same
conventions of minimalism and rapid updates as Chainguard Containers.

Starting in March of 2024, Chainguard will maintain one version of each Wolfi
package at a time. These will track the latest version of the upstream software
in the package. Chainguard will end patch support for previous versions of
packages in Wolfi. Existing packages will not be removed from Wolfi and you may
continue to use them, but be aware that older packages will no longer be updated
and will accrue vulnerabilities over time. The tools we use to build packages
and container images remain freely available and open source in Wolfi.

This change ensures that Chainguard can provide the most up-to-date patches to
all packages for our Containers customers. Note that specific package versions
can be made available in Production Containers. If you have a request for a
specific package version, please [contact
support](https://support.chainguard.dev?utm=docs). Refer to [Get
support](/get-started/get-support/) for the portal's prerequisites.

## Versions available by tier

If you use [Chainguard Free
Containers](/chainguard/containers/concepts/container-categories/#free-containers),
you will have access to the `:latest` version of any Container available to the
public. In some cases, you will also have access to the `:latest-dev` version,
which includes a shell and package manager. For example, the Python container
image has both `cgr.dev/chainguard/python:latest` and
`cgr.dev/chainguard/python:latest-dev`. Many of the programming languages have
these options available, including the Java JDK and JRE containers, PHP, Go,
Node, Ruby, and Rust.

If you use enterprise Chainguard Production Containers, you will have access to
more versions. The Chainguard approach is as follows:

* For **multiple-release track projects**, you will have access to major and
  minor versions that are actively maintained.
* For **single-release track projects**, you will receive the `:latest` tag as
  well as every versioned tag that is released over time.

## Floating tags and epoch tags

Chainguard Containers use _floating tags_. This means that a container image's
tag always points to the most recent build or version within a version stream,
rather than a fixed, immutable image. For example, `python:3.13` will always
point to the latest version of that version stream (`3.13.9`, as of this
writing), even if older tags like `3.13.8` and `3.13.7` are available.

### Epoch tags

Epoch tags provide a clear, human-readable way to track incremental updates to a
specific version of a container image, especially when changes are made to the
main package or for security fixes.

When upstream projects are slow to release fixes, Chainguard will sometimes
patch vulnerabilities directly rather than wait. For example, say there's a CVE
in Go 1.21.3 and the Go team is uncharacteristically slow releasing a fix.
Chainguard could patch 1.21.3 directly and release it as 1.21.3-r2, while
continuing to make the original available as 1.21.3-r1. Any further patches to
that version would increment the suffix to -r3, -r4, and so on. This suffix is
called the epoch number.

Chainguard may do this to patch vulnerabilities, remove unnecessary bloat,
rebuild the same source with newer tools, or address bugs in our build configs
and tooling. Epoch tags make it easy to track these incremental updates in a
clear, human-readable way — particularly useful when changes affect the main
package or involve security fixes.

#### How epoch tags work

Once a newer epoch tag is available, the previous one stops being updated. For
example, the tag `1.14.5-r3` will no longer be updated once `1.14.5-r4` is
available. Because Chainguard Containers are rebuilt frequently, this may not
always be apparent; a container image with these tags may show both as being
updated on the same day, when in fact `-r3` was updated only to be replaced
later in the day by `-r4`.

As mentioned previously, Chainguard Containers use floating tags. In the context
of epoch tags, this means that the minor version and patch will both always
point to the latest available epoch tag. For example, if the latest epoch tag
for Chainguard's `python` container image is `python:3.14.0-r6`, then
`python:3`, `python:3.14`, `python:3.14.0`, and `python3.14.0-r6` will all point
to the same container image. However, you could still specify `python:3.14.0-r5`
should you need.

#### How epoch tags affect other packages

Bear in mind that Chainguard's Containers, although minimal, will almost always
contain more than one package. At the time of writing this, the Go image has
more than 60 distinct packages in it, such as bash, busybox, git, glibc, make,
and zlib. When we fix a vulnerability in bash for example, we likewise ensure
that fix gets rolled out to every container image that includes bash, including
the `go:1.21.3` image. The image tagged `1.21.3-r2` will pull in that bash fix,
and fixes for any of the other packages in the image.

Put simply, when you opt in to pulling `go:1.21.3-r2`, you're opting in to a
consistent version of Go, and potentially floating versions of all the other
packages. This means you get CVE fixes as well as patch, and minor, and even
major version releases of bash, and every other package the image contains.

It's important to note that using epoch tags to "lock" to specific images is
discouraged, as even specific epoch tags can change over time and may introduce
breaking or functional changes. For true immutability, use [image
digests](/chainguard/containers/troubleshooting/inspecting-containers/)
instead.

You can learn more about our approach by reviewing our [blog on Chainguard's
container image tagging
philosophy](https://www.chainguard.dev/unchained/chainguards-image-tagging-philosophy-enabling-high-velocity-updates-pt-1-of-3?utm=docs).

## SLAs

A vulnerability and patch service-level agreement (SLA) is available for
Chainguard Production Containers. There are no SLAs available for Chainguard's
free tier of container images, but you will have access to frequently updated
and patched container images with low-to-zero CVEs.

If you are a Chainguard Production Containers user, Chainguard vulnerability and
patch SLAs apply only to supported and maintained versions of upstream projects
as clearly published by the upstream projects or published container images that
can be rebuilt using updated compilers and/or libraries. In the case of
single-release track projects, this means that the Chainguard vulnerability and
patch SLAs apply only to the latest version and corresponding version tags of
the upstream projects. Containers that use open source applications that have
reached their end of life are no longer patched.

## End of life and end of support software

When an open source application version is no longer maintained by the upstream
project or has otherwise met its end of life (EOL), Chainguard will generally no
longer provide patches to that software. While the Chainguard Production
Containers organization directory will continue to have previously purchased
container images available, new builds will no longer be published and
vulnerabilities are expected to accumulate in those Containers over time. It is
recommended to move to an up-to-date, actively maintained version.

If you need a version that has reached EOL, or one Chainguard never built, refer
to [Troubleshoot container and version
availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/)
for the options available to you.

For software applications that maintain multiple concurrent release tracks,
Chainguard will endeavor to provide [reasonable
notice](/chainguard/containers/concepts/lifecycle-and-eol/versions/) when a
particular software release version is expected to reach EOL status, thus no
longer updated.

No EOL notice will be provided for single-release applications where the only
supported release is the `:latest` or corresponding version tag.

### EOL grace period

There are cases where an organization may want to continue using a container
image after it has reached end-of-life. This could be because an image reaches
EOL before the organization's release schedule, or perhaps later image versions
have one or more issues that prevent the organization from upgrading.

To help in situations like this, Chainguard offers an end-of-life grace period
for eligible Containers, allowing customers access to new builds of container
images whose primary package has entered its end-of-life phase for up to six
months after they have reached EOL. Refer to our [overview of the EOL Grace
Period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/) for more
information.

## Inspecting the product release lifecycle

There are a number of ways that you can inspect and understand the version
lifecycle of your Chainguard Containers.

### List active tags

#### Active tags in the Chainguard Console

You can view tag statuses in the Chainguard Console. In the Console under
**Images > Organization**, under the **Status** column, you can see:

* `Active` status for images you are entitled to
* `Expired` status for images you are no longer entitled to

If you use Chainguard Production Containers, it is also possible to view the
statuses of different tag versions for an image. Click into an image to see the
statuses alongside tag versions. If a tag is no longer being actively
maintained, it displays in gray text and an icon appears next to its
name to indicate that it's inactive.

>**Note**: This feature is not applicable to customers who use [Unique
>tags](/chainguard/containers/reference/unique-tags/).

#### List active tags with chainctl

You can use `chainctl` to retrieve the list of tags that are being actively
maintained for a Chainguard container image by running:

```shell
chainctl image repo list
```

For instance, the following command lists the tags that are currently active for
`python`:

```sh
chainctl image repo list --repo=python -o json | jq -r '.items[].activeTags'
```

```output
[
  "3",
  "3-dev",
  "3.10",
  "3.10-dev",
  "3.10.19",
  "3.10.19-dev",
  "3.10.19-r2",
  "3.10.19-r2-dev",
  "3.11",
  "3.11-dev",
  "3.11.14",
  "3.11.14-dev",
  "3.11.14-r2",
  "3.11.14-r2-dev",
  "3.12",
  "3.12-dev",
  "3.12.12",
  "3.12.12-dev",
  "3.12.12-r2",
  "3.12.12-r2-dev",
  "3.13",
  "3.13-dev",
  "3.13.9",
  "3.13.9-dev",
  "3.13.9-r2",
  "3.13.9-r2-dev",
  "3.14",
  "3.14-dev",
  "3.14.0",
  "3.14.0-dev",
  "3.14.0-r8",
  "3.14.0-r8-dev",
  "3.9",
  "3.9-dev",
  "3.9.25",
  "3.9.25-dev",
  "3.9.25-r0",
  "3.9.25-r0-dev",
  "latest",
  "latest-dev"
]
```

### List package version information

You can list the version information for packages that have multiple release
tracks with `chainctl package versions list`, which uses the [List Repos
API](/platform/api/spec/#/operations/Registry_ListRepos/).

The following `chainctl` command lists the active release tracks for the `python`
package:

```sh
chainctl package versions list python --show-active
```

```output
 VERSION |  EOL DATE  | EOL GRACE PERIOD END DATE
---------|------------|---------------------------
 3.10    | 2026-10-31 | 2027-05-01
 3.11    | 2027-10-31 | 2028-05-01
 3.12    | 2028-10-31 | 2029-05-01
 3.13    | 2029-10-31 | 2030-05-01
 3.14    | 2030-10-31 | 2031-05-01
```

This output also includes the date when the version will become EOL, as
well as the date after which it will no longer be covered by the EOL grace
period.

Refer to the [`chainctl`
documentation](/platform/chainctl/chainctl-docs/chainctl_packages_versions_list/)
for the full list of options that can be passed to the command.

### EOL grace period API

The [EOL Grace Period
API](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/#using-the-eol-grace-period-api)
provides lifecycle information about a Chainguard container image's tags.

For instance, the following snippet retrieves EOL data for the `python` image:

```sh
REPO_ID=$(chainctl images repos list --repo=python -o json | jq -r '.items[0].id')

curl -H "Authorization: Bearer $(chainctl auth token)" \
    "https://console-api.enforce.dev/registry/v1/eoltags?uidp.childrenOf=${REPO_ID}" \
    | jq '.'
```

This command will return output like the following:

```output
{
  "items": [
    ...
    {
      "id": "326bcde5903252f3ae2fe01c691b5a50f7046b5d/256c7780003faa0a/f37adb295422587a",
      "name": "3.10.16-r4-dev",
      "mainPackageName": "python",
      "tagStatus": "TAG_INACTIVE",
      "mainPackageVersion": {
        "eolDate": "2026-10-31",
        "exists": true,
        "fips": false,
        "legacyLts": "",
        "lts": false,
        "releaseDate": "2021-10-04",
        "version": "3.10",
        "eolBroken": false,
        "latestVersion": "",
        "versionSource": null
      },
      "graceStatus": "GRACE_ELIGIBLE",
      "gracePeriodExpiryDate": null
    },
    ...
  ]
}
```

This output tells you whether a tag is active, inactive (no longer being rebuilt
by Chainguard) whether it is eligible for an EOL grace period, and whether it is
currently within its grace period.

For full instructions on how to use the API and interpret its output, refer to
[our overview of the EOL grace
period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/#using-the-eol-grace-period-api).

### Refer to endoflife.date

The [endoflife.date](https://endoflife.date) website lists the release tracks
and product lifecycles of many Open Source projects. Generally the information
on this site will align with the lifecycle of the corresponding Chainguard
image.

---

### Chainguard end-of-life grace period for containers
_Path: chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/index.md_

Typically, specific versions of software receive updates on a schedule for a set amount of time. Eventually, though, every version of software will stop receiving support. When project maintainers stop providing updates, it's known as the *End-of-Life* (EOL) stage.

It's recommended that when a software version reaches the EOL phase, users should migrate their projects to a later version, as [EOL software is known to accumulate vulnerabilities](/chainguard/containers/concepts/lifecycle-and-eol/how-eol-software-accumulates-cves/). However, there are cases where an organization may want to continue using a container image after it has reached end-of-life. This could be because an image reaches EOL before the organization's release schedule, or perhaps later image versions have one or more issues that prevent the organization from upgrading.

To help in situations like this, Chainguard offers an end-of-life grace period for eligible Containers to all Chainguard Containers customers. This article provides an overview of Chainguard's EOL grace period, and also includes a brief introduction to using Chainguard's API to retrieve information about an image's EOL grace period status.

## Understanding Chainguard's EOL grace period

Chainguard's EOL grace period gives customers access to new builds of container images whose primary package has entered its end-of-life phase for up to six months after they have reached EOL. During this time, Chainguard will address vulnerabilities and update any non-EOL packages within the container image (other than the image's primary package). Chainguard will continue to rebuild the image a maximum of six months after the primary package enters its EOL phase or until the build fails.

<center><img src="eol-gp-1.png" alt="Diagram representing the lifecycle of an example successful build under the EOL Grace Period. A Ruby image whose primary package has reached EOL goes through an automated remediation and rebuild process, resulting in a successful build. Following that, the package dependencies have been successfully updated, although the image still contains the EOL version of Ruby. Because the build was successful, the EOL grace period continues." style="width:1050px;"></center>
<br />

> **Note**: Chainguard is **not** able to offer any exceptions to the 6 month limit for the EOL grace period.

You will be able to find the end date of a given container image version's grace period in the [Chainguard Console](https://console.chainguard.dev/). From **Images**, select an image on the **Organization** tab. You'll be taken to that container image's **Tags** tab, and the end date of each grace period will be listed under the respective version:

<center><img src="eol-gp-2.png" alt="Screenshot of a portion of an image's 'Tags' tab, showing the Grace Period end dates for several versions of the image." style="width:300px;"></center>
<br />

As of this writing, a container image must meet four key requirements to be eligible for coverage under the EOL grace period:

1. It is listed as part of the current available or EOL versions for a version stream package present in our catalog
2. Has [multiple release tracks](/chainguard/containers/concepts/lifecycle-and-eol/versions/#how-versions-are-maintained)
3. Is within six months of their official EOL date (as declared by upstream project maintainers)
4. Its release and EOL dates are available on the [`endoflife.date`](https://endoflife.date/) website

Be aware that the following are not covered by Chainguard's EOL grace period:

* Updating an image’s EOL primary package.
* Backporting or cherry-picking individual commits or patches to the EOL primary package.
* Installing updated versions of packages in instances where the new package version no longer supports the EOL version of the image's main package (refer to the note).
* Any package labeled end-of-life for more than 6 months by its open-source creators or maintainers.

Additionally, if a container image fails to build because underlying dependencies conflict with the primary package, it will no longer be supported. A failed build signals the end of support for that image.

{{< note >}}
When an image's primary package reaches EOL, newer versions of some dependency packages may no longer support it. In these cases, Chainguard does not update those packages solely to remediate CVEs, because doing so could introduce compatibility issues or result in a broken image. Instead, the existing package versions are retained to preserve image functionality while providing additional time to migrate to a supported image. You can attempt to install newer package versions at your own risk, using `apk upgrade`.
{{< /note >}}

<center><img src="eol-gp-3.png" alt="Diagram representing the lifecycle of an example unsuccessful build under the EOL Grace Period. A Python image whose primary package has reached EOL goes through an automated remediation and rebuild process, resulting in an unsuccessful build because the updated dependencies break the primary package. Because the build was unsuccessful, the EOL grace period ends and the customer should migrate to a newer package version." style="width:1050px;"></center>
<br />

If a dependency conflict prevents an image version from building successfully, the grace period will end immediately for that version. Chainguard will not attempt further updates or CVE remediations after a build failure. Additionally, If a container image fails to build due to dependency conflicts, its grace period ends immediately. This means no further updates or CVE remediations will be provided for that image version.

After a grace period ends, your organization will retain access to the last successful build of the image. Chainguard will stop providing updates and CVE remediations; although the image will remain usable, it won't receive any ongoing security maintenance. Once an image's grace period has ended, we strongly recommend upgrading to a supported version as soon as possible.

### Planning for and managing an EOL grace period lifecycle

To maximize the value of a grace period, we recommend the following:

* **Before the grace period starts**:
    * Identify all dependent applications and services using the container image
    * Create an upgrade plan with realistic timelines
    * Document any known issues or compatibility requirements
    * Set up monitoring for the container images
* **During the grace period**:
    * Test newer versions of the image in a development environment
    * Track and resolve any compatibility issues
    * Begin deploying updated versions to non-critical environments
    * Monitor for any build failures or dependency conflicts
* **Before expiration**:
    * Complete all necessary testing of the new version
    * Schedule the production upgrade
    * Document any configuration changes needed
    * Prepare rollback procedures if needed

## Using the EOL grace period API

Although the Chainguard Console is a useful interface, many customers would prefer to integrate EOL data with their preferred tools for faster, more convenient monitoring. For this reason, Chainguard has developed an API to serve customers with EOL data sufficient for monitoring the lifecycle of their images.

The API endpoint you can reach for EOL data is [`Registry_ListEolTags`](/platform/api/spec/#tag/registry/GET/registry/v1/eoltags). This section outlines how you can use `curl` to make a call to this API endpoint.

To follow along, you'll need to know the unique ID path (UIDP) of the container image repository you'd like to retrieve end-of-life data for. You can find this with the following `chainctl` command:

```shell
chainctl images repos list -o wide
```

This command will return a table showing the UIDPs of every Chainguard Container your organization has access to:

```output
                ID                 |      REGISTRY       |   REPO   |        BUNDLES        |    TIER
-----------------------------------+---------------------+----------+-----------------------+--------------
  ORGANIZATION_ID/165aEXAMPLE5b7ae | cgr.dev/example.com | nginx    | application, featured | APPLICATION
  ORGANIZATION_ID/4408EXAMPLE4131a | cgr.dev/example.com | node     | base                  | UNKNOWN
  ORGANIZATION_ID/37a2EXAMPLE0d419 | cgr.dev/example.com | python   | base, featured        | UNKNOWN

```

With the image repository ID, you can make a request to the API endpoint with a command like the following. Make sure to replace `$ORGANIZATION_ID/4408EXAMPLE4131a` with the container image repository UIDP you just found:

```shell
curl -H "Authorization: Bearer $(chainctl auth token)" 'https://console-api.enforce.dev/registry/v1/eoltags?uidp.childrenOf=$ORGANIZATION_ID/4408EXAMPLE4131a' | jq .
```

Note that this example includes the `-H` argument to pass an authorization header to the API. This header is constructed with the `chainctl auth token` command which prints the local Chainguard token, allowing you to authenticate to the API.

It also pipes the `curl` command's output into `jq`, a lightweight JSON processor, in order to make it easier to read.

This command will return EOL data for each image within the repository, which will be delivered in the following format:

```output
{
  "items": [

. . .

  {
    "id": "ORGANIZATION_ID/4408EXAMPLE4131a/9ef6EXAMPLE6265c",
    "name": "18.20.8-slim",
    "mainPackageName": "nodejs",
    "tagStatus": "TAG_IN_GRACE",
    "mainPackageVersion": {
      "eolDate": "2025-04-30",
      "exists": true,
      "fips": false,
      "lts": "2022-10-25",
      "releaseDate": "2022-04-19",
      "version": "18",
      "eolBroken": false
    },
    "graceStatus": "GRACE_ACTIVE",
    "gracePeriodExpiryDate": "2025-10-30T00:00:00Z"
  },

. . .

  ]
}
```

This example output is derived from an API call made on a `node` image repository, and the data returned presents a lot of useful information, some of which is highlighted here:

* `id`: this is the UID of the specific image this block of data represents
* `name`: the given container image's tag
* `tagStatus`: whether the tag can support a grace period, with the following possible statuses:
    * `TAG_ACTIVE`: the tag is continuing to be built, but is not in a grace period
    * `TAG_IN_GRACE`: tag is in a grace period
    * `TAG_INACTIVE`: the tag is not in a grace period and no longer being built
* `mainPackageVersion`: this section shows some information about the main package itself:
    * `eolDate`: the date on which the image's main package reached EOL
    * `lts`: the date on which this version of the main package entered its long-term support period
    * `releaseDate`: the date on which the main package's version was released
* `graceStatus`: the status of whether or not the given container image is in an active grace period
    * `GRACE_ACTIVE`, as shown in this example, indicates the image is in an active grace period
    * any images that are not currently in a grace period but may be in the future will show `GRACE_ELIGIBLE`
    * any container images that will never enter a grace period will show `GRACE_NOT_ELIGIBLE`
* `gracePeriodExpiryDate`: the date on which the image's grace period will end

Of course, you won't use `curl` to interact with the Chainguard API in most scenarios. Instead, you'll likely have some kind of application that can ingest and process this EOL data. For example, your organization could create a Slackbot that fetches data from the Chainguard EOL grace period API and posts messages about EOL tags approaching their grace period expiration to a specified Slack channel. Chainguard's [API documentation](/chainguard/api/spec/) includes request samples for many languages and platforms, including Go, Python, and Java.

## Learn more

Chainguard's EOL grace period gives customers the opportunity to continue to receive best-effort CVE remediated updates on EOL images, while they work on transitioning to a newer upstream version.

For more information on the EOL grace period, [please contact us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement). Additionally, our doc outlining the [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/) can be helpful for understanding Chainguard’s approach to updates, releases, and versions within Chainguard Containers. Finally, our conceptual article on [How end-of-life software accumulates vulnerabilities](/chainguard/containers/concepts/lifecycle-and-eol/how-eol-software-accumulates-cves/) is helpful for understanding the risk involved with using end-of-life software by outlining how EOL images accrue vulnerabilities and where they accumulate.

---

### How end-of-life software accumulates vulnerabilities
_Path: chainguard/containers/concepts/lifecycle-and-eol/how-eol-software-accumulates-cves/index.md_

Typically, specific versions of software receive updates on a schedule for a set amount of time. Eventually, though, every version of software will stop receiving support. When project maintainers stop providing updates, it's known as the *End-of-Life* (EOL) stage.

Because it's no longer being actively maintained, software begins to collect vulnerabilities when it reaches EOL. This problem can become compounded when using container images, as they often come with extra components from underlying base images which are all prone to accruing vulnerabilities. This can lead to images with hundreds of components, each collecting vulnerabilities and forming part of the attack surface.

This conceptual article highlights the risk involved with using end-of-life software by outlining how EOL images accrue vulnerabilities and where they accumulate.

## Findings

Chainguard's internal research team came to the following conclusions after scanning a set of official Docker images that had reached EOL:

- **Takeaway 1**: The longer a project has been EOL, the more vulnerabilities that image will have. On average, an EOL image will accumulate 218 vulnerabilities every six months.
- **Takeaway 2**: 98.4% of these vulnerabilities accumulate within a given image's components, 1.4% in the application dependencies, and only 0.2% of vulnerability accumulation every six months are directly within the application.

With these takeaways in mind, it's clear that images with EOL software can quickly develop serious security risks. Not only does the target application accumulate vulnerabilities, but so do the dependencies and additional image components, and at a much faster pace.

When a vulnerability appears directly in the source code of the application, that application isn’t going to receive a patch from upstream. This means you'll be forced to update the software or even move on from EOL projects or risk compromising your application's security.

## Vulnerability accumulation in EOL images

To perform this analysis, Chainguard's researchers reviewed a set of software projects listed on [endoflife.date](https://endoflife.date/), a website that keeps track of when products are no longer supported. We matched these projects directly with their official Docker Hub images, finding 38 projects across 237 EOL version releases from 2020–2024. This included popular images such as Traefik, nginx, Rust, and Python. Each version is the last within the project lifecycle right before the EOL date, representing the final updates to the project before it goes EOL. We then used [Grype](https://github.com/anchore/grype) to scan each release to determine where vulnerabilities are appearing in the projects.

When scanning an image for vulnerabilities, our researchers would classify a vulnerability as being in one of three locations:

- **Application:** The core software intended for execution, fulfilling the container's primary purpose. Think of images such as Traefik, Consul, or nginx.
- **Application dependencies:** Software or libraries the application requires to function and are dependent on the core application source code. For example, Traefik [depends on a TOML parser for Golang](https://github.com/traefik/traefik/blob/master/go.mod#L6C2-L6C28).
- **Image components:** Additional packages or libraries included within the image, often influenced by the base image. For example, Traefik uses the base Alpine image and thus includes many of its packages.

Within this dataset, the support lifespan for these projects was almost two years, with the median support duration being one year. By aggregating vulnerability counts in six-month intervals based on the EOL date, we calculated the average number of vulnerabilities per project. We noted these versions as the last version prior to the EOL date, representing the final updates for that project lifecycle.

The number of vulnerabilities between older EOL versions and recent EOL versions drastically differ, as shown in the following diagram. For example, the average number of vulnerabilities of an image that went EOL in early 2020 contained 2,065 by 2024, compared to images that reached EOL in 2024 containing 323 vulnerabilities. On average, this equates to an accumulation rate of 218 vulnerabilities every six months in EOL images.

<center><img src="EOL_1.png" alt="Chart aggregating vulnerabilities every six months to depict the accumulation of vulnerabilities based on the application EOL date. As the chart moves right along the x-axis (meaning newer versions) the number of vulnerabilities decreases." style="width:950px;"></center>
<br />

## Where are the vulnerabilities?

| Time since EOL | Application Vulns | Application Dependency Vulns | Image Component Vulns |
| :---------- | ---------: | ----------: | ----------: |
| 0-6 months | <1 CVE | 3 CVEs | 351 CVEs |
| 6-12 months | 1 CVE | 11 CVEs | 542 CVEs |
| 12+ months | 3 CVEs | 33 CVEs | 1,601 CVEs |

### Application vulnerabilities

Less than 1% of vulnerability accumulation occurs directly in an image's application, and we found that only 14% of versions that contained a vulnerability included a vulnerability directly within the application in the first six months post-EOL.

Project maintainers won't patch these CVEs, and updating to a newer version or patching it yourself in the source code are the only options for addressing these vulnerabilities.

### Dependency vulnerabilities

In the first six months after an image reaches the EOL stage, 40% of versions contain a vulnerability in the application dependencies. The following table outlines how many vulnerabilities, on average, a dependency will accumulate over time:

| Time span | Number of CVEs |
| ---------- | ---------- |
| 0-6 months | 3 |
| 6-12 months | 11 |
| 12+ months | 32 |

Fixing these would involve upgrading dependencies and rebuilding the target application, a difficult and labor-intensive task.

### Image component vulnerabilities

As mentioned previously, more than 98% of vulnerability accumulation occurs within the components of the image:

| Time span | Number of CVEs |
| ---------- | ---------- |
| 0-6 months | 340 |
| 6-12 months | 501 |
| 12+ months | 1,552 |

Ninety-seven percent of these vulnerabilities are within Debian packages. Per [this blog post](https://www.chainguard.dev/unchained/the-zero-cve-challenge-can-official-docker-hub-images-pass-the-test?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) many of these vulnerabilities are found in the latest stable versions of these Debian packages, meaning that you can't make them go away with just an `apt upgrade`.

## A deeper look at Traefik

<center><img src="EOL_3.png" alt="Chart highlighting vulnerability counts across the latest cycle release version of Traefik and the associated EOL date for each cycle. The chart shows older versions have significantly more vulnerabilities than newer ones." style="width:950px;"></center>
<br />

When scanning the official [Alpine-based image for Traefik](https://github.com/traefik/traefik-library-image/tree/master/tmpl/alpine) with Grype, Chainguard's researchers found that the image versions generally accumulated fewer vulnerabilities than typical, with an average of 25 vulnerabilities identified every six months, as shown in the previous table.

Take version 2.9 of Traefik as an example. It was released on October 3, 2022, with security support provided until April 24, 2023, which is roughly six months. The final update for this version, 2.9.10, was made available on April 6, 2023, just three weeks before the end of its support lifecycle.

Following the release of version 2.9.10, 55 vulnerabilities were reported: four within Traefik itself, 31 associated with its application dependencies, and 20 related to the Docker image components. Below are example CVEs within the various locations of 2.9.10 of the official Traefik Docker image.

### Example CVE within Traefik

- ‍[CVE-2023-47633](https://github.com/advisories/GHSA-6fwg-jrfw-ff7p): Traefik docker container using 100% CPU. This issue was addressed in versions 2.10.6 and 3.0.0-beta5. There are no known workarounds for this vulnerability; your only option is to upgrade.

### Example CVE within a dependency (Docker) of Traefik

- ‍[CVE-2023-28840](https://github.com/advisories/GHSA-232p-vwff-86mp): Docker Swarm encrypted overlay network may be unauthenticated. The affected project is `github.com/docker/docker`, a [dependency](https://github.com/traefik/traefik/blob/v2.10/go.mod#L18) of Traefik. We [fixed this vulnerability](https://github.com/wolfi-dev/os/pull/1779/commits/024b165f14ddad03290ef504c3c46730e596668c) in the Chainguard Container of the Traefik 2.10 cycle.

### Example CVE within an image component of Traefik

- ‍[CVE-2023-5363](https://nvd.nist.gov/vuln/detail/CVE-2023-5363): An out-of-bounds write within OpenSSL, a dependency of the base image [Alpine 3.17](https://github.com/traefik/traefik-library-image/blob/v2.9.10/alpine/Dockerfile#L1) used by Traefik (impacts `libcrypto3` and `libssl3`). The Chainguard Container of Trafeik uses the [wolfi-base image](https://github.com/chainguard-images/images/tree/main/images/wolfi-base), which runs the updated versions of libcrypto3 and libssl3.

## Learn more

End-of-life software represents a significant security risk. This issue becomes particularly critical when vulnerabilities are found directly in the target application of the image.

The only option when that occurs is to update. However, the vast majority of vulnerabilities that appear in an EOL image will come from its additional components, meaning that updating just the application software may not significantly reduce the overall number of vulnerabilities. Thus the best option is to have a plan to keep your software updated to the latest versions promptly.

To learn more about keeping container images up to date, we encourage you to check out our article on [Considerations for keeping containers up to date](/chainguard/containers/recommended-practices/considerations-for-image-updates/) as well as our overview of [Strategies and tooling for updating containers](/chainguard/containers/recommended-practices/strategies-tools-updating-images/).

---

### Chainguard shared responsibility model
_Path: chainguard/containers/concepts/shared-responsibility-model/index.md_

Chainguard’s mission is to be the safe source for open source. As part of this mission, Chainguard builds all of our packages and images from upstream open source code and delivers the resulting artifacts to our customers. There are three distinct parties involved here: **Upstream** projects, **Chainguard**, and **Customers**; each of these parties share some measure of responsibility across a few dimensions.

<center><img src="csrm-1.png" alt="Diagram representing the Chainguard-based open source software supply chain" style="width:1050px;"></center>
<br />

This guide is an overview of Chainguard's Shared Responsibility Model: a framework that outlines the security responsibilities of upstream open source software projects, Chainguard, and its customers. The dimensions of shared responsibility this guide covers are:

* **Releases**: defining and tracking what is and is not supported
* **Patching**: defining which parties are responsible for patching each element of what goes into a container image
* **Testing**: defining which parties are responsible for testing what scope of functionality

## Releases

Upstream projects are responsible for cutting releases and documenting its supported release policy, including any rules it adheres to around quality or breaking changes, and (in the case of more mature projects) a release cadence or schedule. Chainguard is responsible for building all of the upstream-supported versions of a piece of software. Customers are responsible for staying on one of the upstream-supported versions of a piece of software.

A common pitfall we see, which drives an enormous incidence of CVEs across our prospects, is the use of "end-of-life" (or "EOL") software. The following diagram, taken from the [Risk section of Sonatype's 2024 State of the Software Supply Chain report](https://www.sonatype.com/state-of-the-software-supply-chain/2024/risk), highlights how more EOL components per application tends to lead to more security vulnerabilities:

<center><img src="csrm-2.png" alt="Chart from Sonatype's 2024 State of the Software Supply Chain report. This chart is a scatter plot with two axes, with the y-axis labeled 'Vulnerabilities' and the x-axis labeled 'Number of EOL Packages per Application.' The far left of the x-axis represents a lower number of EOL packages per application and the far right represents a higher number. There is a dotted line showing an upward trend of more vulnerabilities as the number of EOL packages per application increases." style="width:600px;"></center>
<br />

It is a customer’s responsibility to stay on a supported version of the software, and the responsibility of Chainguard to ensure that the customer receives builds of that version of the software to consume in their private registry on `cgr.dev`.

## Patching

Upstream projects are responsible for staying on supported releases of their own dependencies, such as with an automatic dependency update tool like [dependabot](https://github.com/dependabot) or [Renovate](https://docs.renovatebot.com/). Upstream projects are also, at a minimum, responsible for staying on an API-compatible version of libraries they depend on transitively.

Chainguard is responsible for assembling container images from fully patched upstream software. You can find more details on this in our [SLA for CVEs](https://www.chainguard.dev/cve-sla). Chainguard will also attempt to rebuild upstream software with [the latest toolchain](https://www.chainguard.dev/unchained/chainguard-patches-3-silent-golang-cves-in-under-24-hours) and their dependencies updated where that can be done without breaking changes (refer to the following [Testing section](#testing)).

Customers are responsible for building on or with fully patched Chainguard Container Images, and for patching any components they add to the Chainguard Container Image.

There are generally two form-factors of Chainguard Container Images: **Application** and **Base** images, so let’s go over the patching responsibilities through these respective lenses.

### Application container images

These are Chainguard Container Images that users generally just take and run (for example, by plugging into Helm). We created the following diagram to help customers understand where the division of responsibility is generally drawn for this class of images:

<center><img src="csrm-3.png" alt="Diagram representing Chainguard's shared responsibility model for Application Images. This diagram shows a pyramid structure with 4 tiers: Apps, LangLibs (go mod, pom, …), Toolchains (go, java, php, …), and System (glibc, openssl). To the left of the pyramid there are two brackets showing that CVE management is performed by the Upstream Open Source project at the Apps level and by Chainguard at the Toolchains and System level, with responsibility being split at the Language Libraries level. To the right of the pyramid are two smaller brackets showing that if updating a dependency is breaking, the CVE management falls to the Upstream project; if it's successful, then CVE management falls to Chainguard." style="width:904px;"></center>
<br />

Upstream projects are responsible for staying on API-compatible versions of libraries. Chainguard is responsible for rebuilding the upstream project [with the latest toolchain](https://www.chainguard.dev/unchained/chainguard-patches-3-silent-golang-cves-in-under-24-hours), and patching static and dynamic dependencies where such a change is non-breaking. Customers are responsible for tracking a supported version of the Chainguard image. Please refer to our [Product release lifecycle documentation](/chainguard/containers/versions/) for more information on what versions are supported.

### Base container images

These are Chainguard Container Images that users extend with their own packages and applications (such as with a Dockerfile). We created the following diagram to clarify where the division of responsibility is drawn for these images:

<center><img src="csrm-4.png" alt="Diagram representing Chainguard's shared responsibility model for Base Images. The diagram takes the shape of a pyramid with 3 tiers: User App, Toolchains (go, java, php, …), and System (glibc, openssl, …). To the left of this pyramid are two brackets, showing that user apps (the custom code level) are serviced by customers and the Toolchains and System levels are serviced by Chainguard." style="width:821px;"></center>
<br />

Upstream projects are responsible for patching supported releases in a timely manner. Chainguard is responsible for releasing fully patched toolchain and base images. Customers are responsible for patching any applications and dependencies they add to a Chainguard image. We recommend using a fully patched Chainguard toolchain image to build the application, and using a fully patched Chainguard base image to layer the final application on.

## Testing

Upstream projects are responsible for defining conformance criteria and establishing conformance benchmarks (such as [Java TCK](https://www.chainguard.dev/unchained/chainguards-openjdk-java-images-are-now-jck-conformant), [Kubernetes Conformance](https://github.com/cncf/k8s-conformance/blob/master/instructions.md), [Knative Conformance](https://github.com/knative/specs)) that clearly outline the criteria for a downstream distribution to represent itself as a "conformant" distribution of the software.

Chainguard is responsible for producing conformant distributions of upstream applications; where the upstream project does not define conformance criteria Chainguard is responsible for using its discretion in validating the functionality of the application and (within reason) accepting scenarios from Customers to run as part of the Chainguard qualification process. Refer to our conceptual article on [How Chainguard container images are tested](/chainguard/containers/images-testing/) for more information.

Customers are responsible for ensuring that Chainguard-provided images cover all of their desired functionality, and partnering with Chainguard to ensure the requisite coverage is part of our qualification process if gaps are identified. Customers are responsible for testing all of their modifications to Chainguard Container Images and for responsibly rolling out Chainguard Container Images to ensure there are no regressions specific to their environment or usage.

Given the highly subjective nature of performance testing to environment and configuration, Customers are responsible for ensuring that Chainguard Container Images satisfy performance requirements as part of the responsible rollout process. Chainguard is committed to making our customers successful, and will partner with Customers (within reason) to investigate performance anomalies, but the Customer is responsible for ensuring Chainguard can reproduce the issue. Please refer to our [support policy](https://www.chainguard.dev/legal/support-policy) for more information on how Chainguard will partner with customers.

By their minimal nature, some Chainguard Container Images may not include certain functionalities by default, so it is important that Customers ensure that Chainguard Container Images drop-in to their environments safely. Again, Chainguard is committed to making our customers successful, and will partner with Customers to ensure that images support the core scenarios in which an image is used.

Following [the principle of immutability](https://www.chainguard.dev/unchained/the-principle-of-immutability), Chainguard recommends that customers pin Chainguard Container Images and make use of tooling such as [Dependabot](/chainguard/containers/security-and-compliance/updating-containers/dependabot/), [Renovate](/chainguard/containers/security-and-compliance/updating-containers/renovate/), or [our own Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/) to qualify image updates through the customers’ CI/CD processes covering in-scope usage scenarios. This is key to responsibly rolling out changes because the reality is that upstream, Chainguard, and customers are all fallible and regressions can happen; but this pattern enables folks to have a clear rollback story.

## Learn more

We encourage you to check out our other resources on recommended practices to ensure that your Chainguard Container Images are effectively maximizing your organization's security posture. As example, you can read through our conceptual articles on [Strategies for minimizing your CVE risk](/chainguard/containers/security-and-compliance/vulnerability-management/cve-risk/) or [Considerations for keeping container images up to date](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/).

---

### Using GitOps to manage Custom Assembly resources
_Path: chainguard/containers/custom-assembly/custom-assembly-gitops.md_

Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) is a tool that lets customers create customized container images with extra packages and annotations added. This enables customers to reduce their risk exposure by creating container images that are tailored to their internal organization and application requirements while still having few-to-zero CVEs. It can be managed in the [Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/), [with `chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/), [with the API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/), or from a CI/CD pipeline.

This guide shows how to use Chainguard Custom Assembly as code from a CI/CD pipeline, storing your configuration in Git and using automation to apply changes and trigger builds. The examples in this guide focus on GitHub Actions, and are adapted from [Chainguard's custom-assembly-as-code demo repository](https://github.com/chainguard-demo/custom-assembly-as-code).

> **NOTE**: `chainctl` is an API client that handles common tasks like authentication and applying configuration files. You can manage Custom Assembly [interactively using `chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#editing-packages-interactively). Running `chainctl` non-interactively is a common pattern for implementing GitOps workflows.

## Prerequisites

Before getting started, you need the following:

* A Chainguard organization with access to Custom Assembly, as well as permission to manage Custom Assembly for your organization
* A CI/CD platform in place. This guide uses GitHub Actions as an example
    * Custom Assembly builds need no GitHub credentials beyond the token `actions/checkout` uses by default, so the example workflow in this guide does not authenticate to the GitHub API.
* A Git repository to host your apko configuration files
* A configured assumable identity for your CI workload
    * If you have not yet set up CI identities, refer to [Chainguard's tutorials for creating and assuming identities](/chainguard/administration/assumable-ids/identity-examples/).
* The full IDs for your [image-syncer and custom-image-builder identities](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/#chainguards-signing-identities), named `catalog_syncer` and `apko_builder` in older organizations

### Understanding apko overlay files

Custom Assembly uses apko overlay YAML files to customize images. You can use them to define changes such as additional packages to install, environment variables, and annotations.

This example overlay file shows the configuration options available for customizing Chainguard images:

```yaml
contents:
  packages:
    - curl
    - jq

environment:
  APP_ENV: production
  LOG_LEVEL: info

annotations:
  org.opencontainers.image.title: "Python App with Tools"
  org.opencontainers.image.description: "Custom Python image with curl and jq"

accounts:
   run-as: "appuser"
   users:
     - username: "appuser"
       uid: 65532
       gid: 65532
       homedir: "/home/appuser"
   groups:
     - groupname: "appgroup"
       gid: 65532
       members:
         - "appuser"

certificates:
   additional:
     - name: "certificate name"
       content: |
          -----BEGIN CERTIFICATE-----
         ...
         -----END CERTIFICATE-----
```

### Repository structure

Chainguard recommends organizing your configuration YAML files in a dedicated directory, as in the following example repository structure:

```
<github-repository>/
├── .github/
│   └── workflows/
│       └── build-custom-images.yaml
├── ca-images-iac/
│   ├── python-app.yaml
│   ├── nginx-custom.yaml
│   └── node-api.yaml
└── README.md
```

In this example, the `ca-images-iac/` directory contains the apko overlay files, while the workflow file defines how and when builds are triggered.

## Step 1: Create an assumable identity

First, create an identity that your CI/CD platform can assume. The process varies by platform; the following example uses GitHub Actions.

```bash
chainctl iam identities create github-actions-identity \
  --description="GitHub Actions identity for Custom Assembly" \
  --identity-issuer=https://token.actions.githubusercontent.com \
  --subject-pattern=".*" \
  --claim-pattern=repository:<github-organization>/<github-repository> \
  --claim-pattern='event_name:^(push|workflow_dispatch)$'
```

Replace `<github-organization>/<github-repository>` with the repository that holds your workflow. This creates an identity that GitHub Actions workflows in that repository can assume, whether triggered by a push or started manually from the Actions tab.

Claim values are patterns, not literal strings, so `^(push|workflow_dispatch)$` matches either event. Match both: the workflow later in this guide triggers on `push` and `workflow_dispatch`, and the testing steps start a run manually. An identity pinned to `event_name:push` alone rejects manual runs with `token has invalid "event_name": workflow_dispatch`. Be sure to quote the pattern so your shell does not interpret the `|` as a pipe.

Repeat `--claim-pattern` once per claim, as shown in this example. Passing several `claim:pattern` pairs as a single comma-separated value does not create separate claims — `chainctl` treats the entire string as one pattern, matching a `repository` claim whose literal value is `<github-organization>/<github-repository>,event_name:push`. This fails silently, producing an identity that no workflow can assume.

This example matches on the `repository` and `event_name` claims rather than the `sub` claim, so it is unaffected by GitHub's [immutable subject claims](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers), which change only the `sub` claim. The `repository` claim carries the repository name, and names can be reassigned. For stronger protection against namespace reuse, pin the identity to the repository's numeric ID by adding `--claim-pattern=repository_id:<github-repository-id>`.

## Step 2: Grant permissions

The identity needs permission to build Custom Assembly images. You can create a [least-privilege custom role](/chainguard/containers/custom-assembly/overview/#custom-assembly-permissions-requirements) that contains the `repo.update` and `repo.create` permissions, then grant the necessary permission using `chainctl`.

After creating the custom role, set an environment variable named `IDENTITY_ID` to the UIDP of the `github-actions-identity` identity you just created:

```shell
IDENTITY_ID=$(chainctl iam identities list -o json | jq -r '.items[] | select(.name=="github-actions-identity") | .id')
```

Then use this variable to create a role binding that grants the custom role to the identity:

```shell
chainctl iam role-bindings create \
  --identity=$IDENTITY_ID \
  --role=<custom-role>
```

Be sure to replace `<custom-role>` with the name of the custom role you created. If you have access to more than one organization, add `--parent <chainguard-org>` to choose where the role binding is created.

## Step 3: Note your identity ID

You'll need your identity ID for your CI/CD workflow configuration. Save it for use in the next section:

```bash
chainctl iam identities list -o table
```

## Trigger builds with `chainctl` in CI/CD workflows

Regardless of which CI/CD platform you use, you trigger Custom Assembly builds with the same `chainctl images repos build apply` command:

```bash
chainctl images repos build apply --file ca-images-iac/custom-jre.yaml \
  --parent <chainguard-org> \
  --repo <image-name> \
  --yes
```

This command follows the example repo structure that appears earlier on this page, where `ca-images-iac` is the directory that contains the apko overlay files.

This command:

* Reads your apko overlay configuration from the YAML file
* Applies it to build a custom image
* Pushes the result to your Chainguard registry
* Skips the interactive confirmation when you pass `--yes`, making it suitable for automated workflows

### GitHub Actions example

This section provides a complete example for automating Custom Assembly builds with GitHub Actions.

Create `.github/workflows/build-custom-images.yaml` in your repository. This example is based on Chainguard's [custom-assembly-as-code demo](https://github.com/chainguard-demo/custom-assembly-as-code):

```yaml
# Trigger builds automatically when the specified file changes. Only runs on pushes to the main branch. Use a wildcard to trigger on any file in a specified directory.
name: build
on:
  push:
    branches: [main]
    paths:
      - 'ca-images-iac/custom-jre.yaml'
  workflow_dispatch:

# Images are signed by either the image-syncer or custom-image-builder identity in
# your organization. Find these values under "Assumed Identities" in your
# organization settings. They are defined here, at workflow level, so every step can
# read them.
env:
  CUSTOM_IMAGE: "cgr.dev/<chainguard-org>/<image-name>"
  IMAGE_SYNCER: "<chainguard-org-id>/<image-syncer-id>"
  CUSTOM_IMAGE_BUILDER: "<chainguard-org-id>/<custom-image-builder-id>"

# Top-level permissions follow the principle of least privilege. Job-level permissions grant only what's needed.
permissions: {}

jobs:
  build-custom-image-as-code:
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      id-token: write
    steps:
      - name: Harden the runner (Audit all outbound calls)
        uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
        with:
          egress-policy: audit

      # Nothing after this step uses git or the GitHub API, so there is no reason to
      # leave the checkout token behind in .git/config.
      - name: Checkout repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          ref: main
          persist-credentials: false

      - name: Setup Go environment
        uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
        with:
          cache: false

      # Pin Crane to a release rather than @latest so a run cannot pick up an
      # unreviewed version. Check for newer releases periodically.
      - name: Install Crane
        run: go install github.com/google/go-containerregistry/cmd/crane@v0.21.9

      - name: Install Cosign
        uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

      # Authenticate to Chainguard using assumable identity
      - uses: chainguard-dev/setup-chainctl@8d93dcbef466d3cf3533f67084f52eb74ef9d262 # v0.2.4
        with:
          identity: "<chainguard-org-id>/<chainguard-identity-id>"

      - name: 'Auth to Registry'
        run: |
          chainctl auth configure-docker
          chainctl auth status

      # Verify existing image signature before rebuilding.
      - name: Verify signature && pull existing image
        id: cosign-verify
        continue-on-error: false
        run: |
          cosign verify \
            --certificate-oidc-issuer=https://issuer.enforce.dev \
            --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
            "$CUSTOM_IMAGE:latest" | jq

      # Extract and display packages from the SBOM attestation.
      - name: Print created time and list packages
        id: crane-config
        continue-on-error: false
        run: |
          echo "Created time: $(crane config "$CUSTOM_IMAGE:latest" | jq -r .created)"
          crane manifest "$CUSTOM_IMAGE:latest" |
            jq -r '.manifests[]
              | select(.platform.architecture=="amd64")
              | .digest' |
            xargs -I {} cosign verify-attestation --type=spdx \
              --certificate-oidc-issuer=https://issuer.enforce.dev \
              --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
              "$CUSTOM_IMAGE@{}" 2> /dev/null |
            jq -r .payload | base64 -d | jq '.predicate' |
            jq '.packages[]
              | select(.externalRefs[]?.referenceCategory == "PACKAGE_MANAGER")
              | .externalRefs[]
              | select(.referenceCategory == "PACKAGE_MANAGER")
              | .referenceLocator'

      # Apply the apko configuration file to trigger the build. The --yes flag skips the confirmation prompt.
      - name: Trigger custom build
        id: start-custom-build
        continue-on-error: false
        run: |
          chainctl images repos build apply -f ca-images-iac/custom-jre.yaml \
            --parent <chainguard-org> --repo <image-name> --yes
```

#### Extending the workflow with GitHub API access

Some extensions to this workflow do need GitHub credentials, such as committing an updated overlay file, opening a pull request that reports which CVEs a rebuild fixed, or commenting build results on an existing pull request.

Rather than storing a long-lived Personal Access Token, add an [Octo STS](https://github.com/apps/octo-sts) step. Octo STS exchanges the workflow's OIDC token for a GitHub token that is scoped to the permissions you declare and expires with the run:

```yaml
      - uses: octo-sts/action@6177b4481c00308b3839969c3eca88c96a91775f # v1.0.0
        id: octo-sts
        with:
          scope: <github-organization>/<github-repository>
          identity: build
```

Pass the result to whichever step needs it as `${{ steps.octo-sts.outputs.token }}`. Using Octo STS also requires installing its GitHub App on your organization and committing a trust policy to `.github/chainguard/build.sts.yaml`, where `build` matches the `identity` input. Refer to the [Octo STS overview](/open-source/octo-sts/overview/) for more information.

## Testing your workflow

Before deploying your CI/CD workflow to production, test it thoroughly to ensure builds complete successfully and authentication works correctly. Start by triggering a manual build and reviewing the logs for each step. Verify that images are built with the expected packages and configurations, and confirm that signatures and attestations are properly generated. Testing in a non-production environment or with a dedicated test repository helps catch configuration issues early without impacting your production image builds.

### Testing the GitHub Action example

Before using the GitHub action in this guide, make sure to update the placeholders:

* `<chainguard-org-id>/<chainguard-identity-id>`: The full ID of the identity you created in Step 1
* `CUSTOM_IMAGE: "cgr.dev/<chainguard-org>/<image-name>"`: Your image registry path
* `IMAGE_SYNCER: "<chainguard-org-id>/<image-syncer-id>"`: Your `image-syncer` identity
* `CUSTOM_IMAGE_BUILDER: "<chainguard-org-id>/<custom-image-builder-id>"`: Your `custom-image-builder` identity
* `--parent <chainguard-org> --repo <image-name>`: Your Chainguard organization and image repository names
* `ca-images-iac/custom-jre.yaml`: The directory in your GitHub repository that holds the apko overlay files, and the overlay file name

{{< note >}}
Older Chainguard organizations name the `image-syncer` and `custom-image-builder` identities `catalog_syncer` and `apko_builder` instead. The names are interchangeable: each pair points at the same account association, so the signatures verify the same way. The workflow's environment variable names are arbitrary — only the identity IDs they hold matter.
{{< /note >}}

To test your GitHub Action:

1. In GitHub, go to the **Actions** tab, select your workflow, then click **Run workflow**.
2. Check the detailed logs for each step.
3. Confirm that the images appear in your Chainguard registry.

## Additional resources

* [Custom Assembly overview](/chainguard/containers/custom-assembly/overview/)
* [apko overview](/open-source/build-tools/apko/overview/)
* [Assumable identity documentation](/chainguard/administration/assumable-ids/assumable-ids/)
* [Demo Repository: custom-assembly-as-code](https://github.com/chainguard-demo/custom-assembly-as-code)
* [Get support](/get-started/get-support/)

---

### Custom Assembly FAQs
_Path: chainguard/containers/custom-assembly/faq.md_

## What is Chainguard’s Custom Assembly?

Custom Assembly is a tool from Chainguard that allows users to build customized container images by assembling packages from a curated, secure set of base images provided by Chainguard.

## How does Custom Assembly help with container image security?

While no system is perfectly secure, Custom Assembly is designed to help you build container images with a strong security posture. By using only guarded packages from Chainguard’s curated and actively maintained images, you benefit from daily CVE scanning and Chainguard’s CVE remediation SLA. This helps minimize risk and provides a clear path for responding to vulnerabilities.

## Can I remove base packages from an image?

No. Base packages such as glibc, busybox, and others included in your selected starting image cannot be removed. You can think of them as the "crust"—you can add toppings, but not change the crust.

## Can I include any package I want in a custom image?

Not exactly. You can only include packages from images you’re entitled to through your Chainguard subscription to stay covered by the SLA.

If you add packages from the general Wolfi OSS repository (not part of a paid image), those packages are not covered by Chainguard’s SLA and may contain unpatched CVEs.

## Is runtime support included for my application?

No. Chainguard supports the Custom Assembly tooling itself but does not debug runtime behavior. For example, if your app crashes due to misconfiguration or conflicting dependencies, you’re responsible for resolving it.

## Can I build FIPS-compliant custom images?

FIPS packages can be used with Custom Assembly, but there is no guarantee that your resulting image will operate in FIPS mode. The FIPS Commitment does not apply to custom images.

## Will I know what’s in my custom image?

Yes. Each image comes with:

* Full build logs
* Software Bill of Materials (SBOMs)
* Provenance metadata

These tools help you understand exactly what's inside your container.

## Is Custom Assembly covered by an SLA?

Today, Chainguard delivers an [SLA for CVE remediation](https://www.chainguard.dev/legal/cve-sla?utm_source=docs) for all our container images.

However, when you re-configure Chainguard’s standard, off-the-shelf images, we cannot extend our SLA to packages you add on because we do not have control over the build. You’re thus responsible for maintaining these added packages or run the risk of accruing CVEs.

Customized images built using Custom Assembly will maintain the same engineering and security best practices as Chainguard’s standard containers, with all packages guarded under our CVE remediation SLA.

One bit of nuance in all this is that the SLA doesn’t directly apply to the images customized with Custom Assembly; it only directly applies to the source image. BUT — **as long as you include only _guarded package-versions_ from images that your organization is entitled to**, which are scanned daily for CVEs, you will benefit from the SLA.

When you use Custom Assembly, you’re not just randomly sticking together packages from anywhere. You’re assembling from the curated, protected library of packages that your organization has been granted access to by Chainguard. And if a vulnerability crops up in an entitled package? We’re already on it.

## What isn’t covered by an SLA?

So customized images benefit from Chainguard’s CVE SLA — that’s great! But what isn’t supported?

The following is a list of things that our SLA **won’t** cover:

### You can’t remove base packages

At the moment, base packages included in the starting image — like `glibc`, `busybox`, or core utilities — are **locked in**. So if you select mysql as the base image, any customized images built from it will include the mysql container image's base packages.

Let’s put it like this: you can add toppings, but you can’t change the crust.

### You can’t pull in just any package

With Custom Assembly, you can **only use packages** from the images you’re entitled to through your Chainguard subscription and still be covered by our SLA.

For example, if you add packages from sources like Wolfi (OSS packages), those additions are not covered by the SLA.  The main reason is that a Wolfi package that’s in a paid image is supported and actively maintained. There isn’t a guarantee that free Wolfi packages will be supported and may include CVEs, so we can’t guarantee that the CVE SLA will hold.

It’s important to understand what is included in your Custom Assembly, as unsupported packages added from external sources may leave you exposed to untracked vulnerabilities. Like we said before, you can pick your own toppings, but you can’t bring your own pepperoni from home.

### We don’t debug your app

You’ll get full **build logs, SBOMs, and provenance** for each image. But if your app throws a `Segmentation fault (core dumped)` after adding 6 versions of `openssl`… yeah, that one’s on you.

Along these same lines, Chainguard cannot guarantee FIPS compliance for container images built with Custom Assembly. You’re of course allowed to use Custom Assembly with FIPS container images, but this use may result in the custom image not being compliant with FIPS requirements.

Specifically, the SLA states that “in no event shall the FIPS Commitment apply to any Images used with Custom Assembly.” This indicates that while FIPS packages can be used in a custom image, there is no guarantee that the final custom image will operate in FIPS mode.

To sum this point up: Chainguard supports the Custom Assembly tooling, not the runtime behavior of what you build. It’s your party — we're just delivering the pizza!

## What can I do to maintain a strong security posture with Custom Assembly?

While you can't eliminate risk entirely, there are several best practices that help you maintain a secure custom image:
Use only packages from Chainguard images you’re entitled to, which are covered by the CVE remediation SLA.

* Avoid adding external or unsupported packages unless you’re prepared to monitor and patch them independently.
* Rebuild regularly to incorporate upstream fixes and updates.
* Review SBOMs and provenance metadata to verify what's in your image.

Custom Assembly provides the tools and defaults for secure image creation — but ongoing vigilance is key.

## Why not use `apk add` to add packages?

{{< blurb/why_ca >}}

## How do tags work for a Custom Assembly image (base image vs. added packages)?

For a Custom Assembly image, the semantic tag (for example, `vX.Y.Z`) always reflects the version of the Chainguard container image on which it is based. Any added packages do not get their own version tags.

When an added package is updated and available, your Custom Assembly image is rebuilt automatically and the new build that includes the updated package becomes the `latest` image. The semantic tag remains tied to the same base image digest until the base image itself is updated and a new semantic tag is created.

## Custom Assembly troubleshooting

Build failures can occur for a number of reasons, including the following:

* It’s possible for you to select packages that conflict with each other. For example, if two packages install the same files, Custom Assembly may not be able to resolve the conflict and result in a failed build. One example is trying to add newer packages to older bases causing a mismatch because the newer package turned out to be built using a newer version of `glibc`.
* Large images taking longer than 1 hour to build will fail with a timeout error.
* When using Custom Assembly through `chainctl`, you choose to add a package which you don't have access to.

In any case, you won’t know whether a container image build fails until after it’s complete. If you need assistance troubleshooting, please [reach out](https://www.chainguard.dev/contact?utm=docs).

---

### Using the Chainguard API to manage Custom Assembly resources
_Path: chainguard/containers/custom-assembly/custom-assembly-api-demo.md_

Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/) is a tool that allows customers to create customized containers with extra packages added. This enables customers to reduce their risk exposure by creating container images that are tailored to their internal organization and application requirements while still having few-to-zero CVEs.

You can use the Chainguard API to further customize your Custom Assembly builds and retrieve information about them. This tutorial highlights a demo application (which can be found in [Chainguard Academy's Demo Applications repository](https://github.com/chainguard-dev/edu-images-demos/tree/main)) which, when run, updates a Custom Assembly container's configuration based on a provided YAML file.

> **Note**: This tutorial highlights using the Chainguard API to interact with Custom Assembly resources. However, you can also interact with Custom Assembly using [`chainctl`, Chainguard's command-line interface tool](/chainguard/containers/custom-assembly/custom-assembly-chainctl/), as well as [the Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/).

## Prerequisites

In order to follow along with this guide, you will need the following:

* Access to a Custom Assembly container image. If your organization doesn't yet have access to Custom Assembly, reach out to your account team to start the process.
* The demo application used in this guide is written in Go, so you will need Go installed on your local machine. Refer to the [official Go documentation](https://go.dev/doc/install) for instructions on downloading and installing Go.
* You will also need [`chainctl` installed](/chainguard/chainctl-usage/how-to-install-chainctl/) on your local machine to create a Chainguard token and authenticate to the Chainguard API.

## Downloading the demo application

This step involves downloading the demo application code to your local machine. To ensure that the application files don't remain on your system, navigate to a temporary directory like `/tmp/`:

```shell
cd /tmp/
```

Your system will automatically delete the `/tmp/` directory's contents the next time it shuts down or reboots.

The code that comprises this demo application is hosted in a public GitHub repository managed by Chainguard. Pull down the example application files from GitHub with the following command:

```shell
git clone --sparse https://github.com/chainguard-dev/edu-images-demos.git
```

Because this guide's demo application code is stored in a repository with other examples, we don't need to pull down every file from this repository. For this reason, this command includes the `--sparse` option. This initializes a sparse-checkout file, causing the working directory to contain only the files in the root of the repository until the sparse-checkout configuration is modified.

Navigate into this new directory and list its contents to confirm this:

```shell
cd edu-images-demos/ && ls
```

For now, this directory only contains the repository's `LICENSE` and `README` files:

```
LICENSE  README.md
```

To retrieve the files you need for this tutorial's sample application, run the following `git` command:

```shell
git sparse-checkout set custom-assembly-go
```

This modifies the sparse-checkout configuration initialized in the previous `git clone` command so that the checkout only consists of the repo's `custom-assembly-go` directory.

Navigate into this new directory:

```shell
cd custom-assembly-go/
```

From here, you can run the application and use it to update the packages built into a Custom Assembly container. First though, let's go through the `main.go` file where the executable application code is written In order to understand how it works.

## Understanding the demo application

Before outlining how to run the demo application to update a Custom Assembly container image, it's important that you have a general understanding of how the application works.

This section will only provide a general overview of the application. We encourage you to read through the complete application, as it includes comments that explain what each portion of the code does.

### Imports

The demo application uses the following packages:

```main.go
import (
 "context"
 "flag"
 "fmt"
 "log"
 "os"
 "strings"
 "time"

. . .
)
```

The application also uses the Chainguard SDK to interact with the Chainguard API and demonstrates proper patterns for authentication, error handling, and resource management. For this reason, the `import` section also brings in a number of protos from [`github.com/chainguard-dev/sdk`](https://github.com/chainguard-dev/sdk), the GitHub repository that stores Chainguard's public SDK for integrating with the Chainguard platform:

```main.go
import (

 . . .

 "chainguard.dev/sdk/auth"
 "chainguard.dev/sdk/proto/platform"
 commonv1 "chainguard.dev/sdk/proto/platform/common/v1"
 "chainguard.dev/sdk/proto/platform/iam/v1"
 registryv1 "chainguard.dev/sdk/proto/platform/registry/v1"
 "gopkg.in/yaml.v2"
)
```

Note that the `imports` block also contains `gopkg.in/yaml.v2`, the import path for the `yaml` package. This will allow the application to decode YAML values.

### Constants

Immediately below the imports, the application creates a few constants used throughout the code:

```main.go
const (
 defaultAPIURL = "https://console-api.enforce.dev"
 tokenEnvVariable = "TOK"
 defaultGroupName = "ORGANIZATION"
 demoRepoName  = "CUSTOM-IMAGE-NAME"
 buildConfigFile = "build.yaml"
)
```

* `defaultAPIURL`: This points to the Chainguard API's URL, which the application will reach in order to interact with the API.
* `tokenEnvVariable`: In order to use the Chainguard API, you must authenticate to prove that you have access to the resources you want to interact with. This constant defines an environment variable `TOK` that the application will expect to be present in order to function. This variable must hold a Chainguard authentication token; the next section describes how to create this environment variable.
* `defaultGroupName`: This constant points to the Chainguard organization whose Custom Assembly resources you would like to manage.
* `demoRepoName`: This constant points to the name of the Custom Assembly container image that you'd like to update with this demo application.
* `buildConfigFile`: This last constant points to the `build.yaml` file, which you'll use to configure the Custom Assembly container image.

### Functions

Following the list of constants, the application declares a series of functions:

* `listRepositories`: This function lists repositories in a group with optional name filtering.
* `listBuildReports`: Lists build reports for a repository. Build reports provide information about image builds, including status, timestamps, and digests of the resulting images. This function shows how to query build reports for a specific repository.
* `printBuildReports`: This helper function displays build reports in a user-friendly format, showing the start time, result status, and image digest for each report.
* `applyCustomization`: This function demonstrates the pattern for updating a repository with a custom overlay that defines the packages to include in the image. The overlay is applied to the repository, which triggers a new build.
* `createClient`: This function creates a new Chainguard API client using a token from the environment.
* `confirmAction`: This utility function handles user confirmation for potentially destructive actions.

These functions come together in the `main()` function, which performs five main steps:

1. Create a Chainguard API client and authenticate
2. List repositories with optional filtering
3. List existing build reports for the repository
4. Apply image customizations using a build.yaml file
5. List and monitor new build reports

To accomplish all this, the application's functions perform the following API calls:

* [ListBuildReports](/platform/api/spec/#tag/registry/GET/registry/v1/buildreports)
* [ListRepos](/platform/api/spec/#tag/registry/GET/registry/v1/repos)
* [UpdateRepo](/platform/api/spec/#tag/registry/PUT/registry/v1/repos/{id})
* [Groups_List](/platform/api/spec/#tag/groups/GET/iam/v1/groups)

For a deeper understanding of what each function does and how the application works overall, we encourage you to closely review the `main.go` file before running it. You may also benefit from reviewing our [OpenAPI specification reference document](/chainguard/api/spec/).

Once you feel you have a grasp on how the demo application works, move on to the next section which outlines how to run it.

## Running the demo application

Before you can run the demo application, there are a few steps you need to take in order for it to work properly.

First, run the following `go` commands:

```shell
go mod init github.com/chainguard-dev/sdk && go mod tidy
```

The `go mod init` command will initialize a new `go.mod` file in the current directory. Including the `github.com/chainguard-dev/sdk` URL tells Go to use that as the module path. The `go mod tidy` command ensures that the new `go.mod` file matches the source code in the module.

As mentioned previously, you must authenticate before you can interact with the Chainguard API. For this reason, this demo application expects an environment variable named `TOK` to be present when it's run. Create this environment variable with the following command:

```shell
export TOK=$(chainctl auth token)
```

Following that, open up `main.go` with your preferred text editor. This example uses `nano`:

```shell
nano main.go
```

From there, edit the following lines:

```
     // Group and repository settings
     defaultGroupName = "ORGANIZATION"
     demoRepoName  = "CUSTOM-IMAGE-NAME"
```

Replace `ORGANIZATION` with the name of your organization's repository within the Chainguard registry. This usually takes the form of a domain name, such as `example.com`. Additionally, replace `CUSTOM-IMAGE-NAME` with the name of the Chainguard Container you want to customize. For example, you may want to customize an `nginx` or `python` container image.

Save and close the `main.go` file. If you used `nano`, you can do so by pressing `CTRL+X`, `Y`, and then `ENTER`.

Next, open up the `build.yaml` file:

```shell
nano build.yaml
```

This file will have the following content:

```
contents:
  packages:
 - wolfi-base
 - go
```

Here, replace `wolfi-base` and `go` with whatever packages you'd like to be included in the customized container image. Note that you can only add packages that your organization already has access to, based on the Chainguard Containers your organization has access to. Refer to the [Custom Assembly overview](/chainguard/containers/custom-assembly/overview/#limitations) for more details on the limitations of what packages you can add to a Custom Assembly image.

Save and close the `build.yaml` file. Finally, you can run the application to apply the configuration listed in the `build.yaml` file to your organization's Custom Assembly image:

```shell
go run main.go
```

The application will start by listing the information outlined previously, including the specified organization's repositories and build reports for the chosen Custom Assembly image:

```
Group: example.com (ID: 45a0cEXAMPLE977f050c5fb9aEXAMPLEed764595)

All repositories in example.com:
- custom-assembly
- nginx
- curl

Repository: custom-assembly (ID: 45a0cEXAMPLE977f050c5fb9aEXAMPLEed764595/c375EXAMPLEb500c)

Build Reports for custom-node repository:

. . .

```

It will then prompt you to confirm that you want to apply the customization configuration listed in the `build.yaml` file:

```
About to apply customization using configuration file: build.yaml
Are you sure you want to update repository custom-node? (y/n): y
```

Enter `y` to confirm. Then, if everything was configured correctly, the application output will show successful build reports:

```
. . .

- Started: Mon, 28 Apr 2025 00:28:44 UTC, Result: Success, Digest: . . .
```

### Troubleshooting

Although the demo application has been tested to ensure that it works properly, there are several pitfalls one may encounter when they attempt to run it.

For example, you may run into an error like the following:

```
Failed to list groups: rpc error: code = Internal desc = stream terminated by RST_STREAM with error code: PROTOCOL_ERROR
```

This may indicate that there is an issue with your Chainguard authentication token. To resolve this, try recreating the environment variable that holds the token:

```shell
export TOK=$(chainctl auth token)
```

You may also encounter errors like the following:

```
cannot find package "chainguard.dev/sdk/auth" . . .
```

This may indicate that the Chainguard SDK wasn't imported correctly. Be sure that you run the following commands to set this up:

```shell
go mod init github.com/chainguard-dev/sdk && go mod tidy
```

Again, the `main.go` file contains many comments that explain each portion of the code. If you encounter any errors, we encourage you to review the file closely to better understand how the application works and what might be going wrong.

## Learn more

The example application highlighted in this guide is intended to show how you can manage Custom Assembly resources with the Chainguard API.

To learn more about Custom Assembly, you can refer to the [Custom Assembly overview](/chainguard/containers/custom-assembly/overview/). Be aware that it's also possible to edit a Custom Assembly container's configuration using `chainctl`. Check out our [documentation on the subject](/chainguard/containers/custom-assembly/custom-assembly-chainctl/) for more information.

---

### How to use incert to create container images with built-in custom certificates
_Path: chainguard/containers/custom-assembly/incert-custom-certs.md_

> NOTE: If you are looking for a way to add certificates to existing Chainguard images, check out our doc on [adding custom certificates with Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/).

In many enterprise settings, an organization will have its own certificate authority which it uses to issue certificates for its internal services. This is often for security or control reasons but could also be related to regulatory requirements.

If you're using a container that needs to communicate with your organization's services and your organization has its own certificate authority, you'll need to add a valid certificate into your container. One way to do this is to mount the certificate as a [volume](https://docs.docker.com/storage/volumes/) at runtime. This works, but it means that everyone who uses the container has to go through the process of mounting the certificate.

Another solution is to build the certificate directly into the container. This tutorial outlines how to use [`incert`](https://github.com/chainguard-dev/incert) — a Go tool from Chainguard that builds container images with certificates inserted into them.

## Prerequisites

To follow along with this tutorial, you will need to have the following tools installed.

* `incert`, a Go program that appends CA certificates to Docker images and pushes the modified image to a specified registry. You can install this by following [the instructions](https://github.com/chainguard-dev/incert#installation) listed in the project's GitHub repository.
* Docker, the open-source containerization platform. Set this up by following [the platform-specific instructions](https://docs.docker.com/get-docker/) on the project's website.
* A tool for creating a self-signed certificate. This guide highlights using `cfssl`, a public key infrastructure toolkit from CloudFlare, but alternatives like `openssl` could also be used for this purpose. Follow [the `cfssl` installation instructions](https://github.com/cloudflare/cfssl#installation) to set this up.
    * Note that if you use `cfssl`, you will also need the `cfssljson` utility installed as well.

## Creating a self-signed certificate

First, let's create a directory to hold your certificate infrastructure.

```sh
mkdir ~/incert-example/ && cd $_
```

In the new directory, create a certificate signing request (CSR) by running the following command.

```sh
cat > csr.json <<EOF
{
 "hosts": [
     "example.com",
     "www.example.com"
 ],
 "CN": "www.example.com",
 "key": {
     "algo": "rsa",
     "size": 2048
 },
 "names": [{
     "C": "US",
     "L": "San Francisco",
     "O": "Example Company, LLC",
     "OU": "Operations",
     "ST": "California"
 }]
}
EOF
```

We want to create some certificates for `example.com` and `www.example.com`, so we include these here in a list for the CSR's `hosts` value. This means the certificates will only be valid for these domains.

Next, create your certificates by running the following `cfssl selfsign` command.

```sh
cfssl selfsign www.example.com csr.json | cfssljson -bare selfsigned
```

Here we include the hostname we specified previously (`www.example.com`) as well as the CSR file. We then pipe the command's output into a `cfssljson` command; this will process the `.json` files output by the `cfssl selfsign` command into the `.pem` files we need.

This command will return a warning that self-signed certificates are insecure. This is the expected behavior for `cfssl`, and since we are only using these certificates to demonstrate how `incert` works there won't be any security concerns.

```
. . .

*** WARNING ***

Self-signed certificates are dangerous. Use this self-signed
certificate at your own risk.

It is strongly recommended that these certificates NOT be used
in production.

*** WARNING ***
```

Following that, if you check the contents of your working directory you will find the self-signed CSR, the key, and the certificate.

```sh
ls
```

```
csr.json  selfsigned.csr  selfsigned-key.pem  selfsigned.pem
```

With these files in place you can move on to creating an nginx container that uses these certificates to provide TLS.

## Create an nginx container that uses self-signed certificates for TLS

Now that you've created the certificate infrastructure, you can create an nginx container that uses them to provide TLS. Later on, we will attempt to reach this nginx container with a `curl` container we built using `incert`, testing that `incert` correctly installed the `selfsigned.pem` certificate into it.

First run the following command to create an nginx configuration file named `nginx.default.conf`. This example is a fairly barebones configuration but will be adequate for the purposes of this guide. Note that it specifies the server should listen on port `8443` and will serve requests for `example.com` and `www.example.com`. It also specifies the location of the certificate and key to be used by the container, namely the `/etc/nginx/conf.d/` directory.

```sh
cat > nginx.default.conf <<EOF
server {
 listen    8443 ssl;
 server_name  example.com www.example.com;
 ssl_certificate /etc/nginx/conf.d/cert.pem;
 ssl_certificate_key /etc/nginx/conf.d/key.pem;
 location / {
     root   /usr/share/nginx/html;
     index  index.html index.htm;
 }
 error_page   500 502 503 504  /50x.html;
 location = /50x.html {
     root   /usr/share/nginx/html;
 }
}
EOF
```

Then run the following command to create the nginx container. This command uses Chainguard's public nginx image and mounts the `cert.pem`, `key.pem`, and `nginx.default.conf` files we've created into the `/etc/nginx/conf.d` directory within the container. It also includes the `-p` option, allowing you to forward requests on your host's port `8443` to the container's port `8443`.

```sh
docker run -p 8443:8443 -d \
-v ./nginx.default.conf:/etc/nginx/conf.d/nginx.default.conf \
-v ./selfsigned.pem:/etc/nginx/conf.d/cert.pem \
-v ./selfsigned-key.pem:/etc/nginx/conf.d/key.pem \
cgr.dev/chainguard/nginx
```

> **Note**: You may encounter permissions errors relating to the `selfsigned.pem` and `selfsigned-key.pem` files after running this command. In these cases, you can update their permissions by running `sudo chmod 644 *.pem`.

## Test connections to the nginx service with `curl`

At this point, if you tried to use `curl` to access the running nginx container, the command will fail because `curl` disallows insecure connections by default.

```sh
curl https://localhost:8443
```

```
curl: (60) SSL certificate problem: self-signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
```

You can force `curl` to ignore the self-signed certificate by passing it the `-k` argument, as in `curl -k https://localhost:8443`. However, our goal is to connect to the service securely using the certificate infrastructure created previously.

In the next section we will use `incert` to create a new container image (using Chainguard's `curl` image as the foundation) with your `selfsigned.pem` certificate built into it. Before doing this, though, let's attempt to reach the nginx service with a `curl` container that does not have the certificate included.

To do this you'll need to find the nginx container's IP address. First, find the name of the container with `docker ps`.

```sh
docker ps
```

```
CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
9e211033635b   cgr.dev/chainguard/nginx   "/usr/sbin/nginx -c …"   2 minutes ago   Up 2 minutes   0.0.0.0:8443->8443/tcp, :::8443->8443/tcp   agitated_jones
```

As this output shows, the name of the nginx container in this example is `agitated_jones`. Replace this with the name of your own container in the following command:

```sh
docker inspect --format '{{ .NetworkSettings.IPAddress }}' agitated_jones
```

This will return the container's IP address:

```
172.17.0.2
```

Next, use Chainguard's `curl` image to attempt to reach the container. Be sure to replace `172.17.0.2` with your nginx container's actual IP address, if different.

```sh
docker run -it --add-host example.com:172.17.0.2 cgr.dev/chainguard/curl:latest-dev https://example.com:8443
```

> **Note**: You might have noticed that [example.com](https://example.com) is a real website. Instead of using the `curl` container to reach the actual `example.com`, this command includes the `--add-host` option to map the hostname `example.com` to the local IP address currently being used by the nginx container.

However, the public Chainguard `curl` image doesn't have the certificate inside it, so this command will fail.

```
curl: (60) rustls_connection_process_new_packets: invalid peer certificate: UnknownIssuer
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
```

The next step is to create an image that has our self-signed certificate built into it. For that, we'll use `incert`.

## Using `incert` to insert a custom certificate into an image

`incert` is a Go program from Chainguard that appends CA certificates to Docker images and pushes the modified image to a specified registry. This tool is still in active development, so feedback is welcome.

Run the following command to build a new image using Chainguard's `curl` image as its base and insert the `selfsigned.pem` certificate into it.

```sh
incert -ca-certs-file selfsigned.pem -platform linux/arm64 -image-url cgr.dev/chainguard/curl:latest -dest-image-url ttl.sh/curl-with-cert:1h
```

This command uses the `-ca-certs-file` option to specify that `incert` should use the `selfisgned.pem` certificate file and the `-platform` option to specify that it wants to build an image for `linux/arm64`. Be aware that you should change the value passed to the `-platform` argument to reflect that of the host platform. It also includes the `-image-url` option to specify the image we want to build on as our base image (here we specify Chainguard's `curl` image) and the `-dest-image-url` to pass the registry where we want the resulting image to be uploaded to.

For this final option, this example specifies [`ttl.sh`](http://ttl.sh/), an ephemeral Docker image registry. `ttl.sh` is free to use and does not require a login, making it useful for testing. However, it's also public, so be sure that you **do not** upload any important private certificates there.

This command will take a few moments to complete, but once it finishes you will receive output showing the image that was created and uploaded to the destination repo.

```
ttl.sh/curl-with-cert:1h@sha256:877762fdd511a3df8aa24faf6a6209036370b7cfc1638e16b81098143c2a0215
```

Following that, you can re-execute the `docker run` command from the previous section, but replace the standard Chainguard `curl` image with the image you just built.

```sh
docker run -it --add-host example.com:[ipaddress] ttl.sh/curl-with-cert:1h https://example.com:8443
```

This time, the `curl` container is able to reach the running nginx container.

```
. . .
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

This shows that `incert` built the certificate into the `curl` container as expected and it was able to reach the nginx container.

## Learn more

If you'd like to learn more about how you can use Chainguard Containers effectively, we encourage you to check out all of our resources on [Working with Chainguard Containers](/chainguard/containers/using-and-deploying/). Additionally, our [Recommended practices](/chainguard/containers/recommended-practices/) resources can be useful for ensuring the security of your container images.

---

### Overview of Chainguard Custom Assembly
_Path: chainguard/containers/custom-assembly/overview.md_

Chainguard Custom Assembly enables organizations to build container images
tailored to their internal requirements and application dependencies, without
sacrificing security. By extending Chainguard's hardened base images with
additional packages, environment variables, user accounts, and certificates,
teams can reduce CVE exposure while maintaining the flexibility their workflows
demand.

This overview of Custom Assembly outlines how it works, its limitations, and how you can use container images customized with Custom Assembly.

You can drive Custom Assembly through any of the following interfaces. They produce the same result, so pick the one that matches how you work:

| Interface | Use it when |
| --- | --- |
| [The Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/) | You want to browse the packages your organization can add and apply the change in a few clicks. |
| [`chainctl`, interactively](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#editing-packages-interactively) | You work from a terminal and want to review a diff before it applies. |
| [`chainctl`, non-interactively](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#applying-packages-non-interactively) | You keep image configuration in version control or apply it from CI/CD. |
| [GitOps](/chainguard/containers/custom-assembly/custom-assembly-gitops/) | You want a pipeline that applies configuration changes as they merge. |
| [Chainguard's API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/) | You're building your own tooling around Custom Assembly. |

If you're adding a package for the first time, [Adding a package to a Chainguard Container](/chainguard/containers/building-and-modifying/adding-packages/) walks the whole task end to end, from finding the package name to confirming it reached the finished image.

With Custom Assembly, you can add the following to your container images:

* [Packages](#installing-packages-from-a-chainguard-private-apk-repository) — Add extra APK packages from Chainguard's repository (limited to packages your organization is entitled to).
* [Custom certificates](/chainguard/containers/custom-assembly/custom-assembly-certs/) — Embed PEM-encoded x509v3 certificates (such as internal CA certificates) directly into the image's truststore. These are merged with the default certificate bundle at /etc/ssl/certs/ca-certificates.crt and the Java truststore.
* [Chainguard-managed certificate bundles](/chainguard/containers/custom-assembly/custom-assembly-certs/#chainguard-managed-certificate-bundles) — Pre-packaged certificate bundles for regulated environments, such as commercial AWS or AWS GovCloud.
* [Environment variables and annotations](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#adding-custom-annotations-and-environment-variables) — Set custom runtime environment variables and custom metadata annotations.
* [Custom user accounts and groups](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_apply/) — Use `chainctl images repos build apply` or `chainctl images repos build edit` to define custom users with specific UIDs/GIDs, home directories, group memberships, and specify which user the image runs as.
* [Custom runtime repositories](#custom-runtime-repositories) — Replace the default APK repository URLs in the assembled image with your own internal mirror URLs, so that runtime `apk add` commands resolve against your infrastructure instead of Chainguard's default endpoints.
* [Custom runtime keys](#custom-runtime-keys) — Embed your mirror's APK signing public keys in the assembled image, so that runtime `apk add` commands can verify packages from mirrors that re-sign them.

Note: You cannot remove base packages that come with the source image — you can only add to them.

## About Custom Assembly

Custom Assembly is only available to customers that have access to Production Chainguard Containers.

In order to use the Custom Assembly tool, you will need to choose an appropriate source image from your organization's collection of Production Chainguard Containers to serve as the base for your customized container image. Say, for example, you want to build a custom base for a Python application. In this case, you would likely choose to use the [Python Chainguard Container](https://images.chainguard.dev/directory/image/python/versions) as the source for your customized image.

After selecting the packages for your customized container image, Chainguard will kick off a build on Chainguard's infrastructure. Once a customized image is built successfully (this normally takes less than 20 minutes), Chainguard will take care of its maintenance and rebuild it as necessary, such as when any of the packages in the image are updated.

### Limitations

Custom Assembly only allows you to add packages into a given container image; you cannot remove the packages included in the source application image by default. For example, Chainguard's Node.js container image comes with packages like `nodejs-23`, `npm`, and `glibc` by default. These packages can't be removed from a Node.js image using the Custom Assembly tool but you can add other packages into it, and you can remove these added packages in later builds.

The packages you can add to a container image are those that your organization already has access to, based on the Chainguard Containers that your organization is entitled to. Additionally, you can only add supported versions of packages to a customized image.

The changes you make to your customized container image may affect its functional behavior when deployed. Chainguard doesn’t test your final customized image and therefore doesn't guarantee its functional behavior. Please test your customized images extensively to ensure they meet your requirements.

## Why use Custom Assembly for adding packages

When you add packages to Chainguard Containers using `apk add` commands without pinning to specific package versions and image digests, you expose yourself to version compatibility conflicts that can break their builds. Chainguard continuously updates its APK repository with the latest package versions to ensure customers receive the most recent security patches. This creates problems when a newly-updated package has conflicts with older dependencies installed in an image. These conflicts will be resolved when a new version of the image is released, but until then it's possible there will be a window where builds will break.

Chainguard's Custom Assembly tool solves this problem by building customized images on Chainguard's infrastructure, where the build pipeline automatically ensures all packages (both those included in the base image and those being added) remain on compatible versions. Custom Assembly treats package additions as a declarative configuration that Chainguard builds, maintains, and automatically rebuilds as packages are updated. The alternative approach — manually pinning packages to specific versions when using `apk add` and pinning images to digests — requires ongoing maintenance to update images and pins.

Custom Assembly is the officially supported method for extending Chainguard Containers with additional packages. It leverages Chainguard's build infrastructure to produce tailored container images without requiring customers to maintain their own build pipelines. Because Chainguard automatically rebuilds Custom Assembly images when constituent packages are updated, customers receive timely security patches without manual intervention while avoiding the version conflicts inherent in ad hoc `apk add` usage.

## Custom Assembly permissions requirements

In order to build customized container images, you must have the appropriate permissions in relation to your Chainguard organization. Specifically, a Chainguard user must have a role with the `repo.update` capability to customize an existing image repository in place, and must have the `repo.create` capability to create a net new image repository with the `--save-as` feature. If you find yourself unable to customize container images with Custom Assembly, it may be that you don't have adequate permissions within your organization to do so.

As of this writing, only one of Chainguard's three main default roles (`viewer`, `editor`, and `owner`) has these capabilities: the `owner` role.

This means that in order to use Custom Assembly (including `--save-as`), your account must be bound to the `owner` role, or to a custom role that also has the `repo.update` and `repo.create` capabilities.

To create such a custom role, you can use the `chainctl iam roles create` command. The following example creates a custom role named `ca-role` with all the same capabilities as the `viewer` role, but with the added `repo.update` and `repo.create` capabilities:

```shell
chainctl iam roles create ca-role --capabilities=repo.create,repo.update,build_report.list,account_associations.list,apk.list,group_invites.list,groups.list,identity.list,identity_providers.list,libraries.artifacts.list,libraries.entitlements.list,manifest.list,manifest.metadata.list,record_signatures.list,registry.entitlements.list,repo.list,roles.list,sboms.list,subscriptions.list,tag.list,version.list,vuln_report.list,vuln_reports.list
```

After creating this custom role, you would need to bind it to any identities in your organization that you want to be able to manage Custom Assembly resources. Check out our [Overview of roles and role-bindings in Chainguard](/platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) to learn more.

## Using customized containers

You can use Docker to download the customized container image for testing or use, like this:

```shell
docker pull cgr.dev/$ORGANIZATION/$CUSTOMIZED-CONTAINER:latest
```

Be sure to change `$ORGANIZATION` to reflect the name used for your organization's private repository within the Chainguard registry and replace `$CUSTOMIZED-CONTAINER` with the actual name of your customized container image.

Additionally, replace `latest` with your chosen tag, if different. You can find a list of all the available tags for your customized container in its **Tags** tab in the Console.

Note that you can also download specific builds of an container image by referencing the build's unique digest, as in this example:

```shell
docker pull cgr.dev/$ORGANIZATION/$CUSTOMIZED-CONTAINER@sha256:e24d3X4MPL338cb75b3X4MPL3674bd908681fca3X4MPL31e3d0321b892b9611d
```

Pulling container images by digest can [improve reproducibility](/chainguard/containers/troubleshooting/inspecting-containers/).

> If you run into any issues with your customized container images or with using the Custom Assembly tool, please reach out to your account team for assistance.

### Installing packages from a Chainguard private APK repository

Chainguard offers [Private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) which you can use to access the apk packages available to your organization. You can use your organization's private APK repository to further customize your Custom Assembly containers.

> Note: [Chainguard OS Packages](https://edu.chainguard.dev/chainguard/containers/building-and-modifying/packages/private-apk-repos/#chainguard-os-packages)&mdash;available to larger customers who already build their own images from packages using tools like Bazel, Dockerfiles, and `rules_apko`&mdash;is not currently available for use with Chainguard Custom Assembly.

As an example, run a container with a Custom Assembly container image that has a shell and package manager, such as a `-dev` variant of a customized container image:

```shell
docker run -it --entrypoint /bin/sh --user root  \
-e "HTTP_AUTH=basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)" \
cgr.dev/$ORGANIZATION/$CUSTOMIZED-CONTAINER:latest-dev
```

Note that this command injects an `HTTP_AUTH` environment variable directly into the container by calling `chainctl` from the host machine to obtain an ephemeral token. This is necessary to authenticate to the private repository.

By default, your organization's private APK repository will be listed in the container's list of APK repositories:

```container
cat /etc/apk/repositories
```

```Output
https://apk.cgr.dev/45a0c3X4MPL3977f03X4MPL3ac06a63X4MPL3595
```

The repository address in this file (which includes a long unpronounceable string) will differ from the one shown in the Console (which reflects the organization name). The string shown in the `repositories` file is the ID number of the organization. You can confirm this by running the `chainctl iam organizations ls -o table` command.

To search for and install packages from the private APK repository, first update the package index:

```container
apk update
```

```Output
fetch https://apk.cgr.dev/45a0c3X4MPL3977f03X4MPL3ac06a63X4MPL3595/x86_64/APKINDEX.tar.gz
 [https://apk.cgr.dev/45a0c3X4MPL3977f03X4MPL3ac06a63X4MPL3595]
OK: 1019 distinct packages available
```

Then you can search for packages available in your private repo. The following example searches for packages named "mongo":

```container
apk search mongo
```

```Output
mongo-5.0-5.0.31-r0
mongo-6.0-6.0.20-r0
mongo-7.0-7.0.16-r0
mongo-8.0-8.0.4-r1
mongod-5.0-5.0.31-r0
mongod-6.0-6.0.20-r0
mongod-7.0-7.0.16-r0
mongod-8.0-8.0.4-r1
```

Finally, you can install a package with `apk`:

```container
apk add mongo
```

```Output
(1/1) Installing mongo-8.0 (8.0.4-r1)
Executing busybox-1.37.0-r0.trigger
OK: 719 MiB in 78 packages
```

To learn more, refer to our [Private APK repositories documentation](/chainguard/containers/building-and-modifying/packages/private-apk-repos/).

## Custom runtime repositories

{{< beta feature="Custom runtime repositories" enroll="true" >}}

By default, Custom Assembly images have `/etc/apk/repositories` pointing to Chainguard's `virtualapk.cgr.dev` tracking proxy. Some organizations mirror Chainguard's APK feed to internal registries — for example, to satisfy internal security policies that require all package sources to resolve to internal infrastructure.

Custom Assembly lets you specify custom APK repository URLs that replace the default `virtualapk.cgr.dev` entries in `/etc/apk/repositories`. This means runtime `apk add` commands inside the container resolve packages from your internal mirror instead of Chainguard's endpoints, without requiring Dockerfile modifications.

This setting doesn't affect build-time package resolution. Packages are always fetched from `apk.cgr.dev` during the Custom Assembly build, preserving Chainguard's supply-chain guarantees. The custom repository URLs are only written to the image's `/etc/apk/repositories` file for use at runtime.

To learn how to configure custom runtime repositories using `chainctl`, refer to the [Custom runtime repositories section](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#custom-runtime-repositories) of the `chainctl` Custom Assembly guide.

### Custom runtime keys

By default, Custom Assembly images trust only the Chainguard signing key, which is embedded in the image at build time. If your mirror re-signs packages with its own key, `apk` inside the container rejects those packages because it can't verify the new signature.

Custom runtime keys let you embed your mirror's public signing key in the image's `/etc/apk/keys` directory alongside the Chainguard key. With the key in place, runtime `apk add` commands can verify packages from mirrors that re-sign them.

To learn how to configure custom runtime keys using `chainctl`, refer to the [Custom runtime keys section](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#custom-runtime-keys) of the `chainctl` Custom Assembly guide.

### Limitations and compatibility

Whether a mirror requires a custom runtime key depends on how it signs packages:

* **Mirrors that preserve Chainguard signatures work without additional configuration.** For example, remote repositories in [JFrog Artifactory](/chainguard/containers/registry/pull-through-guides/artifactory-packages-pull-through/) act as pull-through caches and serve packages with their original signatures intact, so the embedded Chainguard signing key verifies them.
* **Mirrors that re-sign packages with their own key require a custom runtime key.** Artifactory virtual repositories add their own signing key to packages, and Sonatype Nexus requires its own signing key for Alpine repositories. To use these mirrors, embed the mirror's public signing key in the image as a custom runtime key.

> **Note**: Custom runtime repository URLs must use HTTPS. Chainguard does not validate the reachability of custom repository URLs at configuration time. A misconfigured URL will not cause build failures, but will cause runtime `apk add` failures inside the container.

## Troubleshooting

Build failures can occur for a number of reason, including the following:

* It's possible for users to select packages that conflict with each other. For example, if two packages install the same files, Custom Assembly may not be able to resolve the conflict and result in a failed build.
* Large images taking longer than 1 hour to build will fail with a timeout error.

In any case, you won't know whether a container image build fails until after it's complete. If you need assistance troubleshooting, please [reach out to our Customer Support team](https://www.chainguard.dev/contact?utm=docs).

## Learn more

This article provided a high-level overview of Custom Assembly. As a next step, we encourage you to checkout our guide on [managing Custom Assembly resources through the Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/). You can also interact with Custom Assembly using [`chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/) as well as [the Chainguard API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/).

You can also add custom certificates to Custom Assembly images. Refer to our guide on [Adding custom certificates with Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/) for more information.

We encourage you to check out our resources on our other [Chainguard Containers features](/chainguard/containers/), including the following:

* [Unique tags](/chainguard/containers/reference/unique-tags/)
* [CVE visualizations](/chainguard/containers/security-and-compliance/vulnerability-management/cve-visualizations/)

Additionally, for more information on working with Chainguard Containers, refer to our docs on [How to use Chainguard Containers](/chainguard/containers/using-and-deploying/).

---

### Using chainctl to manage Custom Assembly resources
_Path: chainguard/containers/custom-assembly/custom-assembly-chainctl.md_

Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) is a tool that allows customers to create customized containers with extra packages and annotations added. This enables customers to reduce their risk exposure by creating container images that are tailored to their internal organization and application requirements while still having few-to-zero CVEs.

You can use [`chainctl`, Chainguard's command-line interface tool](/platform/chainctl/), to further customize your Custom Assembly builds and retrieve information about them. This guide provides an overview of the relevant `chainctl` commands and outlines how you can edit the configuration of Custom Assembly containers, as well as retrieve a list of a customized image's builds and its build logs.

> **Note**: This tutorial highlights using `chainctl` to interact with Custom Assembly resources. However, you can also interact with Custom Assembly using [the Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/), as well as [the Chainguard API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/).

## Adding packages to a customized container image

`chainctl` offers two ways to change the packages in a Custom Assembly container image. The `edit` subcommand opens the build configuration in your text editor, and the `apply` subcommand takes a configuration file you've already written. Both produce the same result, and both start a build once you confirm the change.

For a shorter, task-first version of these procedures, along with how to find a package name and how to confirm the package reached the finished image, see [Adding a package to a Chainguard Container](/chainguard/containers/building-and-modifying/adding-packages/).

### Editing packages interactively

To edit one of your organization's Custom Assembly container images, you can run the `chainctl images repos build edit` command:

```shell
chainctl images repos build edit --repo $CONTAINER
```

This example includes the `--repo` argument, which points to the name of the image you want to customize. If you omit it, `chainctl` prompts you to select a container image interactively. It also prompts for the organization when you have access to more than one; pass `--parent=<organization>` to skip that prompt.

This command will open up a file with your machine's default text editor. This file will contain a structure like the following:

```yaml
contents:
  packages:
  - yarn
  - wget
```

Edit this file by adding or removing any packages you like. Then, save and close the file. Note that you can undo all the customization and return the image to its original state by removing every entry listed under `packages:`.

Before applying the change, `chainctl` will outline the changes you made and prompt you to confirm that you want to move forward with the change:

```output
/tmp/3352123767.yaml (-deletion / +addition):

 contents:
   packages:
   - yarn
-  - wget
+  - bash

Applying build config to $CONTAINER
Are you sure?
Do you want to continue? [y,N]:
```

Enter `y` to apply the changes.

Following that, you'll be able to see the updated builds in the Chainguard Console, though it may take a few minutes for these changes to populate.

### Applying packages non-interactively

To edit a customized container image without any interactivity, you can use the `apply` subcommand. This method requires you to have a YAML file listing the desired packages, like the example created with this command:

```shell
cat > build.yaml <<EOF
contents:
  packages:
    - bash
    - curl
    - mysql
EOF
```

Then include this file in the `apply` command by adding the `-f` argument:

```shell
chainctl images repos build apply -f build.yaml --repo $CONTAINER --yes
```

This command will again ask you to confirm that you want to apply the new configuration. To make this example completely declarative, this example includes `--yes` to automatically confirm the changes:

```output
Applying build config to custom-assembly
  (*v1.CustomOverlay)(Inverse(protocmp.Transform, protocmp.Message{
      "@type": s"chainguard.platform.registry.CustomOverlay",
      "contents": protocmp.Message{
          "@type": s"chainguard.platform.registry.ImageContents",
          "packages": []string{
-             "wolfi-base",
+             "bash",
-             "go",
+             "curl",
+             "mysql",
          },
      },
  }))

Are you sure?
Do you want to continue? [y,N]:
```

This approach is useful in cases where you would prefer to avoid any kind of interactivity, as in a CI/CD or other automation system.

To see what a configuration file would change without changing anything, replace `--yes` with `--dry-run`. The command prints the same diff and then exits with a non-zero status if there's anything to apply, which makes it usable as a drift check in a pipeline:

```shell
chainctl images repos build apply -f build.yaml --repo $CONTAINER --dry-run
```

The `edit` subcommand also accepts a configuration file through its own `-f` argument. Passing a file to `edit` skips the text editor but still prompts you to confirm the diff:

```shell
chainctl images repos build edit -f build.yaml --repo $CONTAINER
```

### Using the `--save-as` option

When customizing a Chainguard Container with Custom Assembly, you have the option to either customize the image itself or create a new image based on the original with your customizations applied to it.

For example, say your organization has access to Chainguard's [`node` container image](https://images.chainguard.dev/directory/image/node/versions). If you use Custom Assembly to customize the `node` image without creating a new image, then the customizations applied to it will also apply to any users in your organization that are already consuming the image. Anyone who runs `docker pull cgr.dev/example.com/node` will download the customized image instead of the original, uncustomized one.

By creating a new image with Custom Assembly, you can customize the image without impacting any of the users or workflows already consuming it. You could also create multiple customized images based on the `node` container image to support specific functions.

To use `chainctl` to create new customized container images with Custom Assembly, you must include the `--save-as` option, like this:

```shell
chainctl images repos build edit --repo $CONTAINER --save-as $NEW_NAME
```

The following example command creates a new image named `custom-node` after applying the customizations:

```shell
chainctl images repos build edit --repo node --save-as custom-node
```

Once you run this example, the new container image would be accessible from the following URL:

```url
cgr.dev/example.com/custom-node
```

The `apply` subcommand accepts `--save-as` as well, so you can create a new image without any interactivity:

```shell
chainctl images repos build apply -f build.yaml --repo node --save-as custom-node --yes
```

Note that you **must** pass the new image's name when using the `--save-as` option; `chainctl` will return an error if you don't include a new name. Additionally, `--save-as` applies to a single source repository. It isn't available when you target several repositories at once, either by passing `--repo` more than once or by using a wildcard.

## Adding custom annotations and environment variables

Custom Assembly lets you extend Chainguard Containers with your own metadata and runtime defaults by adding custom annotations and environment variables through `chainctl`.

### Custom annotations

Chainguard Containers include metadata in the form of *annotations*. These annotations provide important information about the container image's origin, contents, and characteristics.

With Custom Assembly, you can add custom annotations to your Chainguard Containers using `chainctl`. The process is the same as the one outlined previously for adding packages. First run a command like the following:

```shell
chainctl images repos build edit --repo $CONTAINER
```

In the text editor, add an `annotations` section to the bottom of the file like the following example:

```yaml
contents:
  packages:
    - jq
    - git
    - curl

annotations:
  "com.example.team": "platform-team"
  "com.example.build-timestamp": "2025-10-15T10:30:00Z"
```

After saving and confirming these changes, Custom Assembly will add two custom annotations to the container image.

You can also apply custom annotations declaratively using the `apply` subcommand, as outlined previously.

Note that Custom Assembly blocks `org.opencontainers` and `dev.chainguard` annotations from being changed.

### Custom environment variables

Chainguard Containers often come with a set of predefined environment variables. These are useful for setting certain configuration details that are available to the container at runtime.

You can follow the same procedure for adding custom annotations to add custom environment variables to your Custom Assembly container images. Start by running a `chainctl images repos build edit` command:

```shell
chainctl images repos build edit --repo $CONTAINER
```

In the text editor, add an `environment` section like the following example:

```yaml
contents:
  packages:
    - jq
    - git
    - curl

environment:
  NODE_ENV: production
  API_URL: https://api.example.com
  PORT: "3000"
  LOG_LEVEL: info
  CACHE_TTL: "300"
```

After saving and confirming these changes, Custom Assembly will add these five custom environment variables to the container image. As with packages and annotations, you can also apply custom environment variables declaratively using the `apply` subcommand, as outlined previously.

Be aware that Custom Assembly blocks any environment variable that begins with `CHAINGUARD_` from being added or changed. This is to prevent conflicts with configuration details managed by Chainguard.

## Custom runtime repositories

Custom Assembly lets you replace the default APK repository URLs written to `/etc/apk/repositories` in your assembled images. This is useful if your organization mirrors Chainguard's APK feed to an internal registry and requires containers to resolve packages from internal infrastructure at runtime.

> **Note**: This feature only affects which repository URLs are written into the image for runtime use. Build-time package resolution always uses Chainguard's `apk.cgr.dev` repositories. For more details on limitations and compatibility, refer to the [Custom runtime repositories overview](/chainguard/containers/custom-assembly/overview/#custom-runtime-repositories).

To add custom runtime repositories, use `chainctl images repos build edit` as with other customizations:

```shell
chainctl images repos build edit --repo $CONTAINER
```

In the text editor, add a `runtime_repositories` field under `contents`:

```yaml
contents:
  packages:
    - curl
    - jq
  runtime_repositories:
    - https://apk-mirror.example.com/chainguard
    - https://apk-mirror.example.com/extras
```

After saving and confirming the changes, the resulting image's `/etc/apk/repositories` will contain only your custom URLs:

```
https://apk-mirror.example.com/chainguard
https://apk-mirror.example.com/extras
```

The default `virtualapk.cgr.dev` entries aren't present in the image.

You can also apply custom runtime repositories declaratively using the `apply` subcommand:

```shell
cat > build.yaml <<EOF
contents:
  packages:
    - curl
    - jq
  runtime_repositories:
    - https://apk-mirror.example.com/chainguard
    - https://apk-mirror.example.com/extras
EOF
```

```shell
chainctl images repos build apply -f build.yaml --repo $CONTAINER --yes
```

To remove custom runtime repositories and revert to the default `virtualapk.cgr.dev` URLs, edit the configuration and remove the `runtime_repositories` field entirely.

### Validation rules

Custom runtime repository URLs are validated when the configuration is applied. URLs that do not pass validation will be rejected. The following rules apply:

* Each URL must use HTTPS (`https://`). HTTP, `file://`, and other schemes aren't allowed.
* At least one URL must be provided if the `runtime_repositories` field is set.
* Duplicate URLs aren't allowed.
* Loopback addresses (`127.0.0.0/8`, `::1`) aren't allowed.
* Private network addresses (RFC 1918: `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) aren't allowed.
* Link-local addresses (`169.254.0.0/16`, `fe80::/10`) aren't allowed.
* Hostnames ending in `.internal`, `.local`, or `.svc.cluster.local` aren't allowed.
* `localhost` isn't allowed.
* Hostnames that resolve to any of the blocked IP ranges listed earlier aren't allowed either.

### Custom runtime keys

Custom Assembly images trust only Chainguard's APK signing key by default. If your mirror re-signs packages with its own key — as Artifactory virtual repositories and Sonatype Nexus Alpine repositories do — runtime `apk add` commands reject packages from that mirror. Custom runtime keys let you embed your mirror's public signing key in the image's `/etc/apk/keys` directory so that `apk` can verify re-signed packages.

To add a runtime key, pass the public key file to the `--with-runtime-keys` option:

```shell
chainctl images repos build edit --repo $CONTAINER --with-runtime-keys=key-ee8fa0a3.rsa.pub
```

Each file becomes a key in `/etc/apk/keys` named after the file's basename. The name must match the filename referenced by your repository's APKINDEX signature (`.SIGN.RSA256.<name>`), because `apk` looks up the key by that name during verification. `chainctl` uses filenames verbatim and returns an error if two files share the same basename.

You can also define runtime keys in the editor or in a YAML manifest by adding a `runtime_keyring` field under `contents`. Each entry has a `name` and the key's PEM `content`:

```yaml
contents:
  packages:
    - curl
    - jq
  runtime_repositories:
    - https://apk-mirror.example.com/chainguard
  runtime_keyring:
    - name: key-ee8fa0a3.rsa.pub
      content: |
        -----BEGIN PUBLIC KEY-----
        ...
        -----END PUBLIC KEY-----
```

Apply the manifest with the `apply` subcommand as with other customizations. In the confirmation diff, each key appears as the SHA-256 digest of its content rather than the raw PEM text. To confirm that a digest matches a local key file, run `sha256sum <keyfile>`.

When you run the `edit` subcommand, the editor buffer includes any existing runtime keys. Keep the `runtime_keyring` section to preserve the keys, edit an entry to replace a key, or delete the field to remove all custom keys from the image.

#### Key validation rules

Runtime keys are validated when the configuration is applied. The following rules apply:

* Each entry must contain exactly one PEM-encoded RSA public key: a single `PUBLIC KEY` block with no other content before or after it. Certificates, OpenSSH keys, and EC keys aren't accepted.
* Key names must be unique.
* Key names can't be empty, begin with a dot, or contain path separators.
* Key names can't begin with `chainguard` or `wolfi`; these prefixes are reserved.
* The combined size of all keys can't exceed 512 KB.

## Retrieving information about Custom Assembly containers

You can also use the `list` subcommand to retrieve every one of a customized image's builds from the past 24 hours:

```shell
chainctl images repos build list --repo $REPO
```

This command is useful for quickly determining which builds were successful or failed:

```
           START TIME           |        COMPLETION TIME        | RESULT  |                    TAGS
--------------------------------+-------------------------------+---------+---------------------------------------------
  Thu, 01 May 2025 10:10:40 PDT | Thu, 01 May 2025 10:10:45 PDT | Success | 20, 20.19, 20.19.1
  Thu, 01 May 2025 10:10:34 PDT | Thu, 01 May 2025 10:10:46 PDT | Success | 22-slim, 22.15-slim, 22.15.0-slim
  Thu, 01 May 2025 10:10:33 PDT | Thu, 01 May 2025 10:10:41 PDT | Success | 23, 23.11, 23.11.0, latest

. . .
```

Lastly, you can also retrieve the logs for a given build with the `logs` subcommand:

```shell
chainctl images repos build logs --repo $REPO
```

This command will prompt you to select the build report you want to view. These are organized in reverse chronological order by the time of each build:

```output
    Select a build report to view logs:

    Wed, 16 Apr 2025 16:36:52 PDT - Wed, 16 Apr 2025 16:37:08 PDT Success (18-dev, 18.20-dev, 18.20.8-dev)
  > Wed, 16 Apr 2025 16:36:45 PDT - Wed, 16 Apr 2025 16:37:00 PDT Success (20-dev, 20.19-dev, 20.19.0-dev)
    Wed, 16 Apr 2025 16:36:42 PDT - Wed, 16 Apr 2025 16:36:52 PDT Success (18, 18.20, 18.20.8)
    Wed, 16 Apr 2025 16:36:41 PDT - Wed, 16 Apr 2025 16:36:51 PDT Success (22-slim, 22.14-slim, 22.14.0-slim)
    Wed, 16 Apr 2025 16:36:32 PDT - Wed, 16 Apr 2025 16:36:57 PDT Success (22-dev, 22.14-dev, 22.14.0-dev)
    Wed, 16 Apr 2025 16:36:32 PDT - Wed, 16 Apr 2025 16:36:44 PDT Success (20-slim, 20.19-slim, 20.19.0-slim)
    Wed, 16 Apr 2025 16:36:29 PDT - Wed, 16 Apr 2025 16:36:41 PDT Success (23-slim, 23.11-slim, 23.11.0-slim)
    Wed, 16 Apr 2025 16:36:19 PDT - Wed, 16 Apr 2025 16:36:29 PDT Success (23, 23.11, 23.11.0, latest)
    Wed, 16 Apr 2025 16:36:09 PDT - Wed, 16 Apr 2025 16:36:42 PDT Success (23-dev, 23.11-dev, 23.11.0-dev, latest-dev)
    Wed, 16 Apr 2025 16:36:09 PDT - Wed, 16 Apr 2025 16:36:31 PDT Success (20, 20.19, 20.19.0)
    Wed, 16 Apr 2025 16:36:09 PDT - Wed, 16 Apr 2025 16:36:31 PDT Success (22, 22.14, 22.14.0)
    Wed, 16 Apr 2025 16:36:09 PDT - Wed, 16 Apr 2025 16:36:18 PDT Success (18-slim, 18.20-slim, 18.20.8-slim)
    Wed, 16 Apr 2025 16:35:35 PDT - Wed, 16 Apr 2025 16:35:47 PDT Success

    ••••••••••••••

    ↑/k up • ↓/j down • / filter • q quit • ? more

```

Highlight your chosen build report and select it by pressing `ENTER`. This will open up the build's logs:

```output
2025-04-17T16:00:08-07:00[INFO]Building image with locked configuration: {Contents:{BuildRepositories:[] RuntimeRepositories:[https://apk.cgr.dev/45a0c61eEXAMPLEf050c5fb9ac06a69eed764595]
```

## Making bulk changes across repos

You are not required to make changes to custom assembly repos one at a time. Instead, you can make bulk changes to customize across multiple repos at the same time.

For example, if you wanted to apply custom certs at scale across every repo you own with "kubernetes-*" you could use this:

```shell
chainctl images repos build apply \
  --repo="kubernetes-*" \
  --with-certificates=ca.pem
```

You can use `chainctl images repos build apply` to do things like:

* Pass `--repo` multiple times: `--repo=python --repo=nginx --repo=node`
* Use wildcards: `--repo="python-*"` or `--repo="*"` (all repos under the parent)
* Combine with `--dry-run` to see which repos would change (drift detection) without actually updating anything.

For more information, refer to [chainctl images repos build apply](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_apply/).

## Learn more

You can also use `chainctl` to add custom certificates to your Custom Assembly images. Refer to our guide on [Adding custom certificates with Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/#using-chainctl-to-add-custom-certificates-using-custom-assembly) for more information.

Additionally, you can interact with Custom Assembly with the [Chainguard API](/platform/api/spec/). Our tutorial on [Using the Chainguard API to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-api-demo/) outlines how to run a demo application that updates the configuration of a Custom Assembly container through the Chainguard API.

---

### Adding custom certificates with Custom Assembly
_Path: chainguard/containers/custom-assembly/custom-assembly-certs.md_

Many enterprise environments use internal certificate authorities (CAs) to issue certificates for internal services. These custom certificates need to be trusted by containers that communicate with the internal services. Custom Assembly allows you to build custom certificates directly into your container images, ensuring they trust your organization's internal services without requiring manual certificate mounting at runtime.

> **Note**: If you are looking for a way to embed certificates at build time, refer to our guide on [How to use incert to create container images with built-in custom certificates](/chainguard/containers/custom-assembly/incert-custom-certs/).

## Prerequisites and limitations

Before getting started, you'll need the following:

* Access to Chainguard's Custom Assembly tool, which is available to any organization with access to Production Chainguard Containers.
* Permissions in your Chainguard organization to use Custom Assembly.
    * Review the [Custom Assembly permissions requirements](https://edu.chainguard.dev/chainguard/containers/custom-assembly/overview/#custom-assembly-permissions-requirements) for more information
* [`chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) installed and configured.
* One or more PEM-encoded certificate files that you want to add to your container.
    * Each certificate must be a PEM-encoded string of an x509v3 certificate.
    * Private keys must not be passed as a certificate, and will be rejected.
    * The total size of all inlined certificates must not exceed 50 KB. Please reach out to your account team if there are any issues with this limit.

Additionally, be aware of the following limitations when adding custom certificates:

* Adding new certificates is currently only available through the API and `chainctl`.
* Custom certificates are included in the image's provenance attestation but are not currently listed in the SBOM. They will appear in the apko configuration attestation.

## Using `chainctl` to add custom certificates using Custom Assembly

With Custom Assembly, you can add custom certificates to your Chainguard Containers using `chainctl images repos build edit` or `chainctl images repos build apply`. The process is similar to the process for [using Custom Assembly to add packages with `chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/).

### Interactive usage

You can add certificates interactively by running a command like the following:

```shell
chainctl images repos build edit --repo $CONTAINER
```

This will open your default text editor with the current configuration. This example includes the `--repo` argument, which points to the name of the image you want to customize. If you omit it, `chainctl` prompts you to select a container image interactively. It also prompts for the organization when you have access to more than one; pass `--parent=<organization>` to skip that prompt.

In the editor, add one or more `certificates` sections with your custom certificates. Note that each entry must contain exactly one PEM block (`BEGIN CERTIFICATE` to `END CERTIFICATE`):

```yaml
contents:
  packages:
    - jq
    - git
    - curl

certificates:
  additional:
    - name: internal-ca
      content: |
        -----BEGIN CERTIFICATE-----
        BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
        ... (certificate content continues)
        -----END CERTIFICATE-----
    - name: partner-ca
      content: |
        Some descriptive text about this certificate's purpose
        -----BEGIN CERTIFICATE-----
        MIIDZTCCAk2gAwIBAgIJALT1VH+nSlnTMA0GCSqGSIb3DQEBCwUAMEYxCzAJBgNV
        ... (certificate content continues)
        -----END CERTIFICATE-----

```

Note that each certificate entry requires:

* `name`: A descriptive name for the certificate (used for the filename).
* `content`: The certificate in PEM format, including the `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----` markers.

Optionally, you can also include descriptive text before the certificate block to document its purpose.

Save your changes and close the editor. `chainctl` will display the changes and prompt for confirmation before applying them.

This adds (concatenates) the provided inline certificates to the default truststore of the image in `/etc/ssl/certs/ca-certificates.crt`. It also writes them individually to `/usr/local/share/ca-certificates`, making them available for workflows that involve manually running `update-ca-certificates`.

Alternatively, you can use the `--with-certificates` flag to pre-populate the `certificates.additional` section from a selected `.pem` file. Here is an example invocation that uses a `.pem` file named `certificates.pem`:

```shell
chainctl images repos build edit --with-certificates certificate.pem --repo $CONTAINER
```

As with the previous example, this will open up the configuration in your default editor. After saving and closing the editor, `chainctl` will prompt you to confirm the changes before applying them.

### Non-interactive usage

To add certificates without any interactivity, you can use the `apply` subcommand. This requires you to supply a YAML configuration file listing the certificates, like the example created with this command:

```shell
cat > cert.yaml <<EOF
certificates:
  additional:
  - name: ca1
    content: |
      -----BEGIN CERTIFICATE-----
      <certificate contents>
      -----END CERTIFICATE-----
EOF
```

Then include this file in the `apply` command by adding the `-f` argument:

```shell
chainctl image repos build apply --repo $CONTAINER -f cert.yaml --yes
```

This command will again ask you to confirm that you want to apply the new configuration. To make this example completely declarative, this example includes `--yes` to automatically confirm the changes:

```output
Image configuration changes:
Legend: + to add, ~ to change, - to remove

certificates.additional (+1, ~0, -0, final: 1):
  + Name: ca1
      Fingerprint:      CA:2F:ED:41:E8:A2:C9:D0:25:A2:8E:E5:0C:95:9B:E2
                        15:10:F4:1E:72:B7:31:AA:B0:51:CD:AC:E9:F2:0C:51
      SANs:             (none)
      Issuer:           O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
      Expires:          2036-03-08 19:10:43 UTC
      PublicKey:        RSA 2048-bit (ee878ed5)
      Serial:           53:99:5e:47:8c:27:39:60:7b:fb:2b:17:77:ae:a2:01:03:1c:93:31
      ExtKeyUsage:      (none)
      KeyUsage:         (none)
      BasicConstraints: CA:TRUE
      Subject:          O=Internet Widgits Pty Ltd,ST=Some-State,C=AU

Plan: 1 to add, 0 to change, 0 to remove
```

The non-interactive approach is particularly useful for CI/CD pipelines and automation. You can also perform bulk operations across multiple repos. Refer to [Making bulk changes across repos](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#making-bulk-changes-across-repos) to learn more.

## Verifying that certificates were added

Before following the steps below, ensure you have [`crane` installed](https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md#installation).

You can verify that your certificates are present in the system trust bundle by using `crane` to export the image filesystem, extract the system CA bundle from the archive, and write it to a local file for inspection:

```shell
crane export cgr.dev/my-org/my-custom-image:latest - | tar -xOf - etc/ssl/certs/ca-certificates.crt > ca-certificates.crt
```

After running this command, inspect the copied file locally to confirm that your certificate is present.

## Chainguard-managed certificate bundles

Customers have the ability to add Chainguard-managed certificate bundles for certain regulated environments to their Custom Assembly images. These certificates are bundled into discrete packages that you can apply to customized images in bulk. You can add them to a customized image the same way you would add any other package with Custom Assembly, including with [`chainctl`](/chainguard/containers/custom-assembly/custom-assembly-chainctl/) or in the [Chainguard Console](/chainguard/containers/custom-assembly/custom-assembly-console/).

The following example YAML configuration shows two certificate bundle packages added to an image:

```yaml
contents:
  packages:
  - ca-certificates-aws-rds-global
  - ca-certificates-dod-wcf

. . .
```

As of this writing, Chainguard offers the following certificate bundle packages for DoD and AWS environments:

* `ca-certificates-aws-rds-global` — Any commercial AWS Region
* `ca-certificates-aws-rds-govcloud-global` — AWS US GovCloud
* `ca-certificates-dod-eca` — US DoD External Certificate Authority (ECA) PKI certificates
* `ca-certificates-dod-wcf` — US DoD Web Content Filtering (WCF) PKI certificates
* `ca-certificates-mozilla-eol-20251003` — [Obsolete CA certificates](https://wiki.mozilla.org/CA/Root_CA_Lifecycles) removed by Mozilla in 2026

## Custom Assembly and Java truststores

In addition to the system truststore, Custom Assembly’s custom certificates update Java truststores automatically.

As outlined previously, when you define `certificates.additional` in a Custom Assembly config, the certificates are appended to the system bundle at `/etc/ssl/certs/ca-certificates.crt`. The same certificates are also added to the Java truststore at `/etc/ssl/certs/java/cacerts`, if that file exists in the image (for example, because the image includes Chainguard’s Java truststore package or a JDK/JRE that exposes it there).

There is no extra configuration flag for Java: the build looks for a Java truststore in that location and, if found, appends the custom certificates to it in the same way it does for the OS store. This works even if you add Java to a non-Java base image with Custom Assembly; once the Java truststore file is present, it gets updated.

## Troubleshooting

### Certificate validation errors

If you receive validation errors when adding certificates:

* Verify that your certificate file contains only valid PEM-encoded certificate data
* Check that there is no private key material in the file
* Ensure the certificate has not expired
* Verify that the total size of all certificates added is under 50KB

### Applications not trusting custom certificates

If applications within your container are not trusting your custom certificates:

* Verify the certificate was added successfully by checking `/etc/ssl/certs/ca-certificates.crt`
* Check that the certificate file exists in `/usr/local/share/ca-certificates/`
* Ensure your application is configured to use the system truststore

## Alternative: Using `incert` for certificate injection

For scenarios where you need to add certificates to an existing image without using Custom Assembly, you can use [`incert`](/chainguard/containers/custom-assembly/incert-custom-certs/), an open-source tool from Chainguard. However, we recommend using Custom Assembly over `incert` whenever possible, as this approach provides:

* Automatic rebuilds when the base image is updated
* Integration with Chainguard's security patching lifecycle
* Provenance attestation for audit and compliance
* No need to maintain your own build pipeline

---

### Using the Chainguard Console to manage Custom Assembly resources
_Path: chainguard/containers/custom-assembly/custom-assembly-console/index.md_

Chainguard's [Custom Assembly feature](/chainguard/containers/custom-assembly/overview/) allows you to build customized container images that include only the packages your application needs. This tutorial will walk you through using the [Chainguard console's web interface](https://console.chainguard.dev) to manage Custom Assembly resources, including selecting packages, building customized containers, and monitoring build status.

By the end of this guide, you'll be able to create, customize, and manage your own container images through the Chainguard console, giving you full control over your container dependencies while maintaining Chainguard's security and compliance standards.

> **Note**: This overview highlights using the Chainguard console's UI to interact with Custom Assembly resources. However, you can also interact with Custom Assembly using [`chainctl`, Chainguard's command-line interface tool](/chainguard/containers/custom-assembly/custom-assembly-chainctl/), as well as [the Chainguard API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/).

## Selecting packages and building a customized container

After logging in to the [Chainguard console](https://console.chainguard.dev/auth/login), you will be greeted with your account overview page. If you belong to more than one organization, be sure to select an organization with access to Custom Assembly from the drop-down menu in the top-left corner.

Click on **Images** and scroll or search for the container image that you want to customize. Note that you can use Custom Assembly to customize any Chainguard Container that your organization has access to.

Clicking on your chosen container image will take you to its entry in the console. In the upper right corner of this page, you'll find three buttons, one of which says **Customize image**.

Click on this button to open a window displaying a list of all of the packages available to be added or removed from your selected container image. This list of packages includes all the packages your organization is entitled to. If there's a package you'd like to include in your image but it isn't available in this list, please open a Chainguard support ticket.

You can scroll through the list and select or deselect packages to tailor the image to your needs by checking their respective boxes. Alternatively, you can use the search box to filter for the packages you're looking for.

After selecting your chosen packages, click the **Continue** button. After doing so, Custom Assembly will prompt you to select one of the two following options for how you want to apply the customizations:

* **Create a new image**: This option will create a new container image, based on the current image you've chosen to customize.
    * This option requires you to select a new name for the container image. Note that whatever name you select can only contain lowercase alphanumeric characters, `-`, or `_`.
* **Customize current image**: This option overrides the existing container image with your customizations. Note that any customizations applied to this image will also apply to any users in your organization that are already consuming it.

After selecting one of these options, click the **Preview changes** button to view all the packages you've selected for the customized image.

If you'd like to make further changes, click the **Back** button to return to the package selection.

If you're satisfied with the selection of packages, click the **Apply changes** button to build the new customized image. If you opted to create a new image, this button will instead say **Create $IMAGE_NAME**. You will receive a confirmation message at the top of the Customize Container display letting you know that the image was successfully customized.

If a build fails, you'll need to make the appropriate changes before attempting another build. You can check the build's logs for information about what went wrong and what to fix.

## Listing builds and viewing logs

You can view a list of all the available builds of your customized container image by clicking the customized image's **Builds** tab in the console.

The table in the Builds tab has six columns:

* **Status**: The status of the given build. When a build is successful, this column will show a green check inside of a circle. When a build has failed, this column will display a red exclamation mark in a triangle.
* **ID**: A unique identifier representing a specific customized container image build.
* **Tag**: The container image version the build represents.
* **Digest**: A unique, content-based hash representing the given container image build.
* **Duration**: The amount of time it took to build the container image.
* **Created**: How long it's been since the build was created.

Note that if you only recently customized the container image it may take a few minutes for the latest builds to populate.

Additionally, builds will only stay listed in the console for 24 hours. This is because Chainguard Containers, including Custom Assembly container images, are rebuilt frequently and would quickly congest the user interface.

You can click on the row of any build listed in the Builds tab to access its logs. This will cause a window to appear from the right where you can get more details about the build, including build failures.

## Making changes to a customized container image

If you need to make further modifications to a customized image, or revert changes you've already made, you can do so with just a few clicks in the Chainguard console.

Going back to the container image you just customized, click once again on the **Customize Image**. In the panel where you added packages, there will be a list of the packages added to the customized image below the **Filter packages** search box.

You can add more packages to the customized image by following the process outlined previously. To remove a package from the container image, click its **X** symbol.

To remove all of the container image's customizations, click the **More Actions** button at the top right then select **Remove customizations**. Removing all the added packages will return the image to its original state.

Note that you can also edit the packages in a customized image [using the `chainctl images repos build edit` command](/chainguard/containers/custom-assembly/custom-assembly-chainctl/#adding-packages-to-a-customized-container-image).

If you elected to create a new container image with Custom Assembly, you can rename it by clicking the **Rename** button (next to the **Customize image** button) and entering a new name for the image. Note that after renaming the customized image, any references to the previous name will no longer work.

You can also delete new container images that you've created with Custom Assembly. To do so, click the **More** button and select **Delete**. This will open a window prompting you to enter the name of the container image to confirm that you want to delete it.

## Learn more

You can also use the Chainguard Console to add Chainguard-managed certificates to Custom Assembly images. Refer to our guide on [Adding custom certificates with Custom Assembly](/chainguard/containers/custom-assembly/custom-assembly-certs/#chainguard-managed-certificate-bundles) for more information.

For more advanced workflows or automation, consider exploring the [`chainctl` CLI tool](/chainguard/containers/custom-assembly/custom-assembly-chainctl/) or the [Chainguard API](/chainguard/containers/custom-assembly/custom-assembly-api-demo/) for programmatic access to Custom Assembly features.

---

### STIGs for Chainguard Containers
_Path: chainguard/containers/security-and-compliance/stigs.md_

Security Technical Implementation Guides (STIGs) trace their origin to the United States Department of Defense (DoD). They work in two layers. The Defense Information Systems Agency (DISA) publishes Security Requirements Guides (SRGs) — category-level security baselines covering technology types such as databases, web servers, or general purpose operating systems, written without vendor participation. Vendors then collaborate with DISA to produce a product-specific STIG — a formally reviewed configuration guide for a particular product, derived from the relevant SRG. If an organization runs software like MySQL 8.0 in a DoD environment, it must be configured to meet that product's STIG. Beyond the DoD, compliance frameworks such as FedRAMP and CMMC have come to recognize STIGs as accepted security baselines.

[Chainguard has published](https://www.chainguard.dev/unchained/stig-hardening-container-images) a hardening profile based on the [General Purpose Operating System (GPOS) SRG](https://stigviewer.com/stigs/general_purpose_operating_system_security_requirements_guide), the DISA framework that covers security requirements for general purpose operating systems in a networked environment. Because DISA has never published a container-specific SRG, no formally approved container-only STIG exists from any vendor today. Applying the GPOS SRG to containers is the established industry approach for closing this gap, consistent with how other Linux-based container vendors address container security requirements. Throughout this documentation, "STIG" refers to this GPOS SRG-based hardening profile. The goal is to help customers in compliance-sensitive environments confidently validate Chainguard Containers against recognized security requirements and integrate them into DoD and related workflows.

The Chainguard GPOS SRG profile applies to all Chainguard Containers — including both FIPS and non-FIPS images. The Getting Started (#getting-started) section demonstrates how to use OpenSCAP to validate hardening checks against any Chainguard Container.

## Getting started

The instructions below use OpenSCAP. For an InSpec-based alternative using cinc-auditor, Chainguard also maintains [chainguard-inspec](https://github.com/chainguard-dev/chainguard-inspec), which is a good fit for teams already using InSpec for compliance automation or working with distroless and short-lived containers.

The recommended way to get started with Chainguard's STIG for the GPOS SRG is to use the Chainguard [`openscap`](https://images.chainguard.dev/directory/image/openscap/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-image-stigs) Container. This includes the `openscap` tool itself, the `oscap-docker` libraries, and the Chainguard GPOS STIG profile. This image is built with the same capabilities and low-to-zero CVEs as every other Chainguard Container, and makes the `openscap` tool — which can be difficult to set up — more portable.

The following instructions assume that you have `docker` installed and running on your system, and are intended to be performed on a non-production system, similar to the process outlined in [DISA's Container Hardening Whitepaper](https://dl.dod.cyber.mil/wp-content/uploads/devsecops/pdf/Final_DevSecOps_Enterprise_Container_Hardening_Guide_1.2.pdf).

For ease of use, we'll use [the datastream file](https://raw.githubusercontent.com/chainguard-dev/stigs/main/gpos/xml/scap/ssg/content/ssg-chainguard-gpos-ds.xml) sourced from [the Chainguard STIGs repository](https://github.com/chainguard-dev/stigs/tree/main/gpos/xml/scap/ssg/content), and available within Chainguard's `openscap` container image. This file serves as a sort of checklist, outlining each of the requirements that must be met in order to conform with the STIG.

Download the datastream file — named `ssg-chainguard-gpos-ds.xml` — with the following command:

```bash
curl -fsSLO https://raw.githubusercontent.com/chainguard-dev/stigs/main/gpos/xml/scap/ssg/content/ssg-chainguard-gpos-ds.xml
```

The `-O` option redirects the file's contents into a local file of the same name in your working directory. You can then view the checklist locally.

We'll refer to Chainguard's `openscap` container image as the `scan` image, and the `target` image we'll be scanning will be: `cgr.dev/chainguard/wolfi-base:latest`. This is a non-FIPS image and is used as an example; you can substitute any Chainguard Container image as the target.

You can scan either a registry image or a running container.

### Scanning a registry image

First, ensure the target image is present in your local Docker daemon.

```bash
docker pull cgr.dev/chainguard/wolfi-base:latest
```

Next, run the scan image against the target image.

```bash
docker run -i --rm -u 0:0 --pid=host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/out:/out \
  --entrypoint sh \
  cgr.dev/chainguard/openscap:latest-dev <<_END_DOCKER_RUN
oscap-docker image cgr.dev/chainguard/wolfi-base:latest xccdf eval \
  --profile "xccdf_basic_profile_.check" \
  --report /out/report.html \
  --results /out/results.xml \
  /usr/share/xml/scap/ssg/content/ssg-chainguard-gpos-ds.xml
_END_DOCKER_RUN
```

### Scanning a running container

First, start the target image:

```bash
docker run --name target -d cgr.dev/chainguard/wolfi-base:latest tail -f /dev/null
```

Next, run the scan image against the target image.

```bash
docker run -i --rm -u 0:0 --pid=host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/out:/out \
  --entrypoint sh \
  cgr.dev/chainguard/openscap:latest-dev <<_END_DOCKER_RUN
oscap-docker container target xccdf eval \
  --profile "xccdf_basic_profile_.check" \
  --report /out/report.html \
  --results /out/results.xml \
  /usr/share/xml/scap/ssg/content/ssg-chainguard-gpos-ds.xml
_END_DOCKER_RUN
```

> **Warning:** This is a highly privileged container because it scans a container running under the host Docker daemon.

Results are written to a new `out/` subdirectory in the current working directory. The `report.html` file contains a human-readable report of the scan results; `results.xml` contains the raw results.

## What are STIGs?

"STIG" stands for Security Technical Implementation Guide. A STIG is a technology-specific implementation of a Security Requirements Guide (SRG) that a security administrator follows to ensure that a given piece of software has been hardened against cybersecurity threats.

A STIG is typically written by the developer or vendor of the given piece of software against a published DOD Security Requirements Guide (SRG). STIGs are presented in the XCCDF (Extensible Configuration Checklist Description Format), allowing them to be ingested into a SCAP-validated tool to validate that a given target is in compliance with them.

After drafting the STIG, the vendor will submit it to the [Defense Information Systems Agency (DISA)](https://www.disa.mil/), an agency within the DoD. One of DISA's responsibilities is publishing and maintaining STIGs on the [DoD Cyber Exchange website](https://www.cyber.mil/stigs/downloads/), and the process from a STIG being submitting to it being published by DISA can take years. As of this writing, DISA has published over 450 STIGs for a wide variety of software applications.

## How STIGs can be used to harden container images

STIGs are typically published for hardware, firmware, and specific applications. However, in recent years containerization has grown in popularity and is now the modern way to deploy applications. This has resulted in there being a gap in terms of clear instructions on how to securely deploy containerized applications.

Chainguard produces hardened, minimal container images containing few to zero CVEs. Because of this, they adhere to many compliance standards where there's a control for vulnerability or risk management, including [FedRAMP](https://www.fedramp.gov/) and [PCI DSS v4.0](https://www.pcisecuritystandards.org/document_library/?category=pcidss).

For many risk management frameworks, the system categorization will result in varying levels of hardening guidelines. Using FedRAMP as an example, FIPS-199 defines the security categorization which will result in a baseline set of controls (defined in NIST 800-53) that must be implemented.

Because the NIST 800-53 controls are technology-neutral, the STIGs published by DISA provide technology-specific configurations on how to satisfy the applicable NIST 800-53 control set. As stated in the CM-6 (a) Requirement 1 of the FedRAMP System Security Plan:

_"The service provider shall use the DoD STIGs to establish configuration settings; Center for Internet Security up to Level 2 (CIS Level 2) guidelines shall be used if STIGs are not available; Custom baselines shall be used if CIS is not available."_

However, the requirements for how a STIG applies to a container image are rather unclear. For example, some controls apply to the host operating system instead of the image. Similarly, other controls apply to the container runtime instead of the container itself. Knowing what controls are relevant for containers and how to check for them in a STIG are key to achieving and maintaining FedRAMP compliance.

DISA understands that containers have different requirements than traditional operating systems. In an effort to highlight these differences, the DOD DevSecOps Initiative released the [Container Hardening Process Guide](https://dl.dod.cyber.mil/wp-content/uploads/devsecops/pdf/Final_DevSecOps_Enterprise_Container_Hardening_Guide_1.2.pdf) which describes the Initiative's approach to hardening images and how other agencies should handle applying STIGs to containers.

[Appendix C](https://dl.dod.cyber.mil/wp-content/uploads/devsecops/pdf/Final_DevSecOps_Enterprise_Container_Hardening_Guide_1.2.pdf#%5B%7B%22num%22%3A65%2C%22gen%22%3A0%7D%2C%7B%22name%22%3A%22XYZ%22%7D%2C70%2C720%2C0%5D) of the Hardening Process Guide highlights an important point about STIG compliance for containers:

_"With a properly locked down hosting environment, containers inherit most of the security
controls and benefits from infrastructure to host OS-level remediation requirements."_

Deploying containers on a STIG hardened host provides many of the security features that are difficult or sometimes impossible to implement inside a container. What's left then is the application-level security configuration — in particular vulnerability remediation — which Chainguard provides through our guaranteed vulnerability remediation SLAs.

## False positives and the General Purpose OS STIG

Here we've assembled several explanations for requirements from Chainguard's General Purpose Operating System STIG that are likely to cause false positives when scanning containers, as well as the rationale for those requirements. By disambiguating these false positives, the following sections should be helpful to any administrators deploying containers in environments where STIG hardening is necessary both as a means to understand where to expend effort performing hardening and for discussions with assessors and compliance personnel.

### Auditing

Auditing capabilities for Linux containers are implemented by the underlying host's audit configuration. In Linux, the auditing program `auditd` leverages multiple functions in the running kernel through the Linux Auditing System to capture runtime information such as starting and stopping processes, opening sockets, and accessing files.

Linux containers use their host's kernel, making it impossible to install and operate a separate auditing package inside the container itself. Instead, auditing information must be configured and collected through the auditing configuration of the host.

Once configured, logs of container actions are written to the host's audit log files and are readable only by the host superuser account. These logs must be collected from the host for incident response and reporting. Storage capacity limits, audit process monitoring, remote upload of logs, and associated alerts are the responsibility of the host where the containers are running.

### Isolation

Containers provide process isolation by executing their applications in a constrained environment using the Linux Namespace and cgroup subsystems. Inside the namespace, container processes are only permitted to access a limited set of system resources defined when the container is launched. Processes are further restricted by limits imposed through the cgroup for access to system resources such as system memory or CPU use.

Together, namespaces and cgroups isolate security functions of the host operating system from non-security functions of applications running inside the container. This separation makes it possible for container failures to not directly impact the operation of the host and its security functions when caused through processing of invalid inputs or other runtime errors. In the event of a container failure during initialization or shutdown, for example, the host operating system's security capabilities will continue to function as configured.

### Minimal container images

Chainguard Containers contain only the minimal software needed for the container to perform its intended function. Nonessential capabilities such as package managers, shell environments, executables, and process launching functions have been removed from many Chainguard Containers and may not be installed once the container is running.

This limited implementation means that only the necessary software to operate can run on the container and restricts the installation of additional software on the image during operation. Be sure to have fixed permissions on libraries and executable files in place so that any software installed can't be modified.

The host's container execution environment further reduces the risk of unauthorized modification of software through Linux container isolation capabilities including namespaces and cgroups. These restrictions prevent unauthorized modification of the host operating system environment.

### Address space layout randomization (ASLR)

ASLR configuration is the responsibility of the host operating system on which containers run. Applications running within a container on a host that has ASLR enabled will automatically be protected by the configuration. No additional action is needed to ensure that container-based applications are protected.

### Host firewall

Linux containers inherit the firewall configuration of their host operating system which dictates which ports on the container can be accessed from the network. Selection of which ports to make accessible on the applications running on the container is the responsibility of the host firewall configuration — an additional application-level firewall inside the container is not necessary.

### Host filesystem

Linux containers use the host's filesystem for storage of their files and configuration. To protect data at rest inside containers from unauthorized access or modification, you must modify the host operating system's configuration. As an example, you might set up encrypted virtual filesystems. The host filesystem is also responsible for the size, utilization, and capacity of the physical disks that are used by containers running on that host.

### Vulnerability scanning

The team deploying the container is also responsible for scanning it for vulnerabilities. This scanning can be executed from the host operating system or against the container image when it is stored in a registry. Continuous scanning can be used to detect vulnerabilities that have been identified / announced since the previous scan and determine when updated images should be built and deployed in the environment.

### Time

Linux containers inherit the system time from the underlying host; likewise, containers don't operate their own separate time services. The host owner is responsible for configuring the host's time service to generate the timestamp used by its auditing system, perform periodic synchronization, and ensure that only authorized time servers are used as the authoritative source. Time synchronization of the host clock is automatically reflected in the time used by the container.

### STIGs

These containers can be validated against the General Purpose Operating System STIG and other applicable STIGs using the [OpenSCAP toolset](http://www.open-scap.org/tools/). OpenSCAP can validate configuration of container images by reviewing the configuration of the image filesystem and can perform interactive checks by executing commands against running containers.

## Learn more

You can use OpenSCAP to validate hardening checks against any Chainguard Container, including both FIPS and non-FIPS images, using the process described in [Getting started](#getting-started). Chainguard's STIG hardened FIPS Containers are also generally available. You can check out our [STIG repo](https://github.com/chainguard-dev/stigs?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) or [contact us](https://get.chainguard.dev/simplify-fedramp-compliance-5?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) for more information. If you'd like to learn more about how Chainguard Containers can help you meet FedRAMP compliance, we encourage you to refer to our overview of [Chainguard's FIPS-ready container images](/chainguard/containers/working-with-images/fips-images/).

---

### Strategies for minimizing your CVE risk
_Path: chainguard/containers/security-and-compliance/vulnerability-management/cve-risk.md_

[Common vulnerabilities and exposures](/software-security/cves/cve-intro/#what-is-a-cve) (CVEs) are an increasing concern for developers and organizations, which is why Chainguard developed its minimal container images that reduce the attack surface. A new CVE in a widely-used application or a vulnerability scan with numerous positive results can significantly impact security posture, compliance requirements, and development timelines.

Chances are, your software has already been impacted by a CVE. It's likely there are active CVEs in software you are using. After all, there are software vulnerabilities currently in existence that haven't even been discovered (known as [zero-day vulnerabilities](/software-security/glossary/#zero-day)). With that said, this conceptual article aims to highlight a few practices and strategies you and your team can use to reduce the risk of CVEs on your software. It also includes a section on [tools recommended by Chainguard](#recommended-tools) that can help to reduce your attack surface area and minimize your risk of CVEs.

## Understanding potential risks

An important step to minimizing your CVE risk is to understand the potential impacts and develop a sense of how CVEs can make their way into your applications.

One way you can do this is to familiarize yourself with the various databases that list known CVEs and their exploitations, including the [CVE Program](https://www.cve.org/About/Overview) and the [Known Exploited Vulnerabilities (KEV) Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog). It also might be helpful to stay up to date with industry news. Software vulnerabilities and attacks have gained more attention from technology journalists. For example, the [Heartbleed](https://www.cve.org/CVERecord?id=CVE-2014-0160) vulnerability received widespread coverage when it was discovered in 2014, as did the [Log4Shell](https://www.cve.org/CVERecord?id=CVE-2021-44228) vulnerability in 2021.

Bear in mind, just keeping up to date with industry news and recent CVEs won't prevent vulnerabilities from encroaching on your projects. After all, malicious actors could be exploiting a vulnerability in your code long before the CVE is discovered and reported. Having said that, understanding how vulnerabilities are discovered, categorized, and exploited can be useful when thinking about how to harden your system's defenses.

Another way to prepare yourself for the potential risks associated with CVEs is to have a plan in place for what you should do if new vulnerabilities affecting your software arise. It's becoming more common for organizations to develop a playbook built out ahead of time. The Cybersecurity & Infrastructure Security Agency (CISA) recently published a [Vulnerability Response Playbook](https://www.cisa.gov/sites/default/files/publications/Federal_Government_Cybersecurity_Incident_and_Vulnerability_Response_Playbooks_508C.pdf). The goal of this playbook is to provide a framework for Federal Civilian Executive Branch agencies to identify and mitigate vulnerabilities. Although this playbook is meant specifically for organizations working with the federal government, the idea of having a plan in place ahead of a vulnerability is a great way to minimize the risk.

## Maintaining dependency hygiene

Dependency hygiene is the practice of ensuring that the dependencies you introduce into your project do not contain vulnerabilities. We've found that many popular container images, when not updated, [will accumulate about one known vulnerability per day](https://www.chainguard.dev/unchained/enforce-against-vulnerability-sprawl-with-up-to-date-images). Many of the most widely used container images aren't updated regularly and [past academic software engineering research](https://arxiv.org/pdf/1811.12874.pdf) has found that most images on Docker Hub, the most widely used container registry, have not been updated for over 120 days.

Some teams go so far as to actively avoid using dependencies, working under the belief that taking a "roll-your-own" approach to all their tooling is an effective way to reduce CVEs. Although first-party tools may report fewer CVEs when scanned, they won't be battle-tested like widely used open-source software, meaning there are drawbacks to this approach.

## Recommended tools

This section outlines a few categories of tools that can be useful for minimizing CVEs, and provides a few examples for each.

### Scanners

There are a number of tools available that allow you to scan your third party code for CVEs.

At Chainguard, we use [**Grype**](https://www.chainguard.dev/unchained/why-chainguard-uses-grype-as-its-first-line-of-defense-for-cves) to scan our own Chainguard Containers, as it's open-source and it can scan Software Bills of Materials (or SBOMs). Additionally, Grype biases towards [false positives](/chainguard/containers/scanners/false-results/) over false negatives. Looking into a vulnerability in an image that turns out to be a false positive can be preferable to overlooking a real vulnerability that impacts end users.

Another open-source scanning option is [**Falco**](https://falco.org/). Falco works with environments running in individual containers, hosts, Kubernetes, and the cloud. Falco works by collecting data from various sources — including Linux kernel syscalls, Kubernetes audit logs, and events from systems like GitHub or Okta — and compares them with a set of rules. Falco comes with a list of rules by default, but you can also create your own rules to suit the needs of your project. If any of the collected data breaks one of the rules, Falco will identify it as a security issue.

Be aware that the results of a vulnerability scan can only tell you part of the story. Say, for example, that Project A has only a few dependencies while Project B has many. Logically, a vulnerability scan of Project A will likely return fewer results than one for Project B, but that doesn't mean that Project A is at any less of a risk. Although its results might show only a few CVEs, one of these vulnerabilities could still have a serious impact on Project A. Conversely, Project B's scan results might show a large number of CVEs, but most or all of these could be false positives.

[**Scorecard**](https://securityscorecards.dev/) is another scanning tool, though it isn't specifically a vulnerability scanner. Scorecard is an automated tool from the Open Source Security Foundation that performs a variety of security checks on software, returning a score between 1 and 10 for each one. These scores can help you understand what you need to work on to improve your project's security, and can also help you assess the security of your dependencies.

For a more in-depth discussion of how scanners may fail to collect certain information, we encourage you to check out our [blog post on "Software Dark Matter"](https://www.chainguard.dev/unchained/software-dark-matter-is-the-enemy-of-software-transparency?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

### Automating updates

As stated in the preceding section on dependency hygiene, out-of-date dependencies pose a serious risk to software projects. The older and more out of date a given dependency is, the more likely it is to contain vulnerabilities. Automating updates for your projects can help avoid the problems associated with outdated dependencies

One tool that's useful for automating updates for your dependencies is [**Dependabot**](https://docs.github.com/en/code-security/dependabot). Dependabot is a free tool offered by GitHub that sends alerts to repositories affected by new vulnerabilities and — if possible — raises a pull request to update the affected dependencies.

If you'd like to automate updates outside of GitHub repositories, [**Snyk**](https://snyk.io/) is another tool that enables automatic updates. Synk can integrate into IDEs as well as repositories, allowing you to continuously scan for vulnerabilities. Like Dependabot, Snyk will automatically submit a pull request when it encounters a vulnerability and it can recommend a solution.

There are a number of important considerations one should make when keeping container images up to date. Please check out our [conceptual article on the subject](/chainguard/containers/considerations-for-images-updates/).

### Minimal container images

As mentioned previously, the fewer dependencies a given piece of software uses, the lower likelihood that it will be impacted by CVEs. To this end, Chainguard provides a library of minimal container images that can minimize your CVE risk.

[**Chainguard Containers**](https://www.chainguard.dev/chainguard-images) are distroless, meaning they contain only an application and its runtime dependencies. These images do not even contain a shell or package manager. Because Chainguard Containers minimize the number of dependencies in this manner and thus reduce the potential attack surface, they inherently contain few to zero CVEs. Also, Chainguard Containers are rebuilt nightly to ensure images are completely up-to-date and contain all available security patches, and the engineering team [often fixes vulnerabilities before they're detected](https://www.chainguard.dev/unchained/how-chainguard-fixes-vulnerabilities).

If you're looking for a certain image that isn't included in Chainguard's library, you can build your own minimal container images with [**Wolfi**](https://github.com/wolfi-dev), a community Linux distribution designed by Chainguard for the container and cloud-native era. Chainguard started the Wolfi project to enable building Chainguard Containers, which required a Linux distribution with components at the appropriate granularity and with support for [glibc](https://www.gnu.org/software/libc/).

Wolfi includes a fully declarative build system and provides a high-quality, build-time SBOM as standard for all packages. Its packages are designed to be granular and independent — in order to support minimal images — and uses the proven and reliable `apk` package format.

Please note that as of March of 2024, Chainguard will maintain one version of each Wolfi package at a time. These track the latest version of the upstream software in the package. Chainguard does not provide patch support for previous versions of packages in Wolfi. Existing packages will not be removed from Wolfi and you may continue to use them, but be aware that older packages will no longer be updated and will accrue vulnerabilities over time. This change ensures that Chainguard can provide the most up-to-date patches to all packages for our container images users. Note that specific package versions can be made available in Production Containers, if you have a request for a specific package version, please [contact support](https://support.chainguard.dev?utm=docs). Refer to [Get support](/get-started/get-support/) for the portal's prerequisites.

## Learn more

As mentioned in the introduction, there's no way to guarantee that no CVEs will affect your software. However, we hope that by reading this article you'll have learned some practical tips you can use to help minimize your exposure to vulnerabilities and keep your software secure.

If you'd like to learn more about CVEs, and strategies for remediating them, we encourage you to check out the following resources:

* [What are software vulnerabilities and CVEs?](/software-security/cves/cve-intro/#what-is-a-cve)
* [False positives and false negatives with container scanners](/chainguard/containers/scanners/false-results/)
* [Considerations for keeping containers up to date](/chainguard/containers/considerations-for-images-updates/)

---

### Check whether a reported CVE affects your container
_Path: chainguard/containers/security-and-compliance/vulnerability-management/cve-status.md_

Use `chainctl images advisories list` to compare the advisories for the APK packages in an image with the CVEs reported by your scanner.

> **Note:** This command checks **APK packages only**. It does not determine whether a CVE affects a Go module, Java dependency, or another non-APK component in the image.

## FIPS variants

FIPS variants use the same package-level advisory process as other Chainguard images. `chainctl images advisories list` does not determine coverage from the image name or the `-fips` suffix. It reads the APK package names and versions in the image SBOM, then looks up advisories for those APK packages. This means:

- If a FIPS image contains the same APK package and version as a non-FIPS image, the same package advisory can apply.
- If a FIPS image contains a FIPS-specific package name or version, that package needs a corresponding advisory record.
- A FIPS image may have a different advisory result from its non-FIPS counterpart because its package set or versions differ.
- An empty result does not by itself mean that the FIPS image is not affected or that the CVE is not covered.

For a FIPS finding, use the exact image digest and platform, then compare the scanner’s package name and version with the APK package data in the image SBOM. Search the Security Advisories page for the exact package and CVE. If the APK package is present but no matching advisory exists, treat the result as an advisory-coverage question and include the image digest, package name and version, CVE, scanner and database versions, and scan output when contacting Support.

## Prerequisites

You need:

- `chainctl` installed and authenticated.
- An image reference with an SBOM attestation attached.
- The image digest or the exact tag scanned by your scanner. A digest is preferred because tags can move.
- The platform that matches the scanner result. The default platform is `linux/amd64`.

## List advisories for the image

Run the command against the same image reference and platform that your scanner analyzed:

```bash
chainctl images advisories list \
  cgr.dev/chainguard/<image>@sha256:<digest> \
  --platform=linux/amd64 \
  -o wide
```

The output includes the APK package, package version, advisory ID, CVE aliases, status, and advisory type. Compare the package name and version—not only the CVE alias—with the scanner's finding.

If the image has no SBOM attestation, or the requested platform does not have one, the command cannot use that image to perform the lookup. If no matching advisory is shown, do not treat that alone as proof that the scanner finding is a false positive; first verify the image digest, platform, package ecosystem, package version, and scanner database.

## Triage a long scanner report with `--status`

Use `--status` to narrow the output to the advisory states you need to review. You can provide multiple values as a comma-separated list, or by repeating the flag:

```bash
# Findings that still need attention or confirmation
chainctl images advisories list "$IMAGE" \
  --status=detected,true-positive,pending-upstream

# Findings with a recorded fix or backported patch
chainctl images advisories list "$IMAGE" \
  --status=fixed,patched

# The same filter using repeated flags
chainctl images advisories list "$IMAGE" \
  --status=detected \
  --status=pending-upstream
```

To inspect one CVE from the table output, filter the displayed aliases after retrieving the results:

```bash
chainctl images advisories list "$IMAGE" -o wide | grep 'CVE-2026-42151'
```

The command filters advisories by their current status. It does not accept a CVE as the primary lookup key, and it does not replace the scanner's analysis of non-APK components.

## Status values

The command reports the status derived from the advisory's most recent event:

| Status | Meaning | How to use it when triaging |
|---|---|---|
| `detected` | The advisory has a recorded detection event. | Treat it as a finding that still needs validation or remediation. |
| `true-positive` | The advisory has been confirmed as applicable. | Prioritize it as an applicable vulnerability. |
| `fixed:<version>` | A fix is recorded in the specified package version. | Compare the fixed version with the package version in your image and rebuild or upgrade if needed. Filtering with `--status=fixed` matches version-qualified values. |
| `false-positive` | The advisory has been marked as not applicable. | Use the advisory record as context, but keep the scanner finding separate until you understand why the scanner reported it. |
| `analysis-not-planned` | No applicability analysis is planned for the advisory. | Do not interpret this as "not vulnerable." Use independent evidence for your risk decision. |
| `fix-not-planned` | No fix is planned for the advisory. | Review the advisory context and choose a mitigation, exception, or replacement according to your policy. |
| `pending-upstream` | Chainguard is waiting for an upstream fix. | This explains why a fixed package may not yet be available; it is not confirmation that the finding is absent. |
| `patched:<version>` | The vulnerability is patched in the specified package version, typically by backporting the fix. | Compare the patched version with the package version in your image. Filtering with `--status=patched` matches version-qualified values. |
| `unknown` | The advisory has no recognized status event. | Investigate the advisory and scanner evidence rather than assuming either presence or absence. |

### What a missing result means

A missing result can have several explanations:

- The reported component is not an APK package.
- The image reference, digest, or platform differs from the image that was scanned.
- The image does not have an SBOM attestation available to the command.
- The advisory database does not contain a matching advisory for that package and version.
- The scanner and advisory database use different package or version metadata.

A missing result is therefore a prompt to reconcile the two data sources, not a standalone false-positive determination.

## When the finding is a Go module or Java dependency

`chainctl images advisories list` is not the right validation tool for language-level dependencies. Use the scanner's language-package evidence and the relevant upstream vulnerability data instead.

### Go modules

For a Go-module finding:

1. Confirm the module path and version in the image's SBOM and, where available, in `go.mod` or `go.sum`.
2. Confirm that the scanner identified a Go module rather than an APK package with a similar name.
3. Check the module's upstream advisory and the scanner's reachability or affected-symbol evidence.
4. Rebuild with a non-vulnerable module version when one is available, then rescan the resulting image.

Do not use an APK advisory result—or the absence of one—to declare a Go-module CVE a false positive.

### Java dependencies

For a Java finding:

1. Confirm the Maven or Gradle coordinates and version in the SBOM.
2. Check whether the finding is in a standalone dependency, a shaded JAR, or an application layer.
3. Consult the dependency's upstream advisory and the scanner's evidence for the affected class or code path.
4. Upgrade, replace, or otherwise mitigate the dependency, then rebuild and rescan.

A Java dependency finding is distinct from an APK finding in the base image. Use `chainctl images advisories list` only for the APK portion of the image.

## Further troubleshooting

If a result is still unclear, you can [contact support](/get-started/get-support/). When contacting support, include:

- The image digest and platform.
- The scanner name and database version.
- The CVE and advisory identifiers.
- The detected ecosystem, package/module coordinates, and version.
- The relevant `chainctl images advisories list` output, preferably in `-o wide` or JSON form.

---

### Using CVE visualizations
_Path: chainguard/containers/security-and-compliance/vulnerability-management/cve-visualizations/index.md_

Chainguard provides CVE Visualizations for all of its container images. This feature creates reports with CVE comparisons between Chainguard Containers and popular alternatives, as well as historical CVE remediation metrics. CVE Visualizations provide insight into image health and can help teams measure the engineering, security, and economic benefits gained from using Chainguard Containers.

This guide outlines how you can access a container image's CVE Visualization in both the Chainguard Console and in the Containers Directory.

## Accessing CVE visualizations in the Console

You can find CVE Visualizations and reports two separate places in the [Chainguard Console](https://console.chainguard.dev): in the **Reports** section of the left-hand navigation menu and in the **Comparison** tab of an individual Container's overview.

### Reports section

Visualizations can be found under the [**Reports**](https://console.chainguard.dev/reports) section in the left-hand navigation bar.

At the top of the Reports page will be two tabs: **Compare Containers** and **Historical CVEs**. Let's first review the Compare Containers tab.

At the top left of the Compare Containers tab is a drop-down menu which you can use to select the Chainguard Container you want to compare. The contents of this menu are organized in alphabetical order, starting with Organization Containers at the top (if your selected organization has access to specific Chainguard Containers) followed by free-tier Chainguard Containers.

After you select a container image, a second drop-down will appear. This will be populated with data on "alternative" images which (if available) you can compare against the selected Chainguard Container. In some cases there will be more than one alternative available, in which case you can select between them using the drop-down. To the right of the alternatives menu you can select a time range for the report.

Below the controls, you will find several boxes with statistics and graphs:

* An overview section showing the current and average CVE counts as well as container image size for the images.
* A **CVEs by Severity** section with bar graphs showing the CVE count per day for both images, broken down by severity.

> **Note**: Be aware that this section also includes an **Export** button you can use to download this data as a JSON file.

* A **Total CVEs Over Time** section showing a line graph with the total number of CVEs for any given day for each container image. This provides a visual comparison of the difference in CVE count between the images.
* A **Cumulative CVEs Identified** section,  with a line graph showing the total number of newly identified CVEs since the beginning of the time range selected, for each image. This provides a visual comparison of the CVE accumulation rate between the images.

<center><img src="cve-viz-3.png" alt="Screenshot showing CVEs Over Time and Cumulative CVEs Identified graphs. The CVEs Over Time graph shows that the Chainguard Container regularly has few or zero CVEs while the alternative jumps between 10 and 80 CVEs. The Cumulative CVEs Identified graph ends with nearly zero CVEs for the Chainguard Container and over 80 for the alternative." style="width:1100px;"></center>
<br />

The **Historical CVEs** tab shows data relating to CVEs that have appeared over the past three months in container images that your organization has access to. Be aware that the totals shown only represent your Organization Containers, and not free-tier images.

> **Note**: If you are a member of more than one organization you can switch to another organization by clicking the drop-down menu in the top left corner of the Console.

The **Historical CVEs** tab has two boxes. The first box is labeled **Resolved CVEs in Organization Containers** and shows a bar chart displaying the number of resolved CVEs by date over the last three months. The second box is labeled **Total Resolved CVEs by Severity** and shows a horizontal bar chart showing all the resolved CVEs from the past three months. In both graphs, the CVEs are color-coded by severity.

### Comparison tab

You can find this same comparison data when navigating to a specific container image from **Images**, on either the **Organization** or **Chainguard catalog** tab. After navigating to either tab, click on or search for any image you like.

By default, you will be taken to the container image's **Tags** tab. Click on the **Comparison** tab at the far right. There, you'll be presented with the same comparison information found in the **Reports** section. At the top are some control menus, allowing you to select the date range for the comparison and, if available, the alternative you'd like to compare the Chainguard Container against.

## Accessing CVE visualizations in the Containers Directory

Similar to the CVE reports found under **Images** in the Chainguard Console, you can find CVE reports for every one of Chainguard's container images in the [Containers Directory](https://images.chainguard.dev/).

After navigating to the directory, click on or search for any container image you like. Again, you will be taken to the image's **Tags** tab by default. Click on the **Comparison** tab at the right to view the CVE Comparison data.

## Limitations

Some container images do not currently have a comparative alternative. In these cases, the Comparison report will only show data for the Chainguard Container.

## Learn more

The CVE data used in these reports is from the [Grype vulnerability scanner](/chainguard/containers/security-and-compliance/working-with-scanners/grype-tutorial/). Vulnerability data is constantly evolving, so we scan container images each day and store the results. The results shown are the vulnerabilities found on the day in question; scanning the container images again with a newer database will show different results.

For more information on CVEs refer to [What are software vulnerabilities and CVEs](/software-security/cves/cve-intro/). You may also find our guide on [Using the Chainguard Directory and Console](/platform/console/images-directory/) to be of interest.

---

### How to retrieve SBOMs and attestations for Chainguard Containers
_Path: chainguard/containers/security-and-compliance/retrieve-image-sboms/index.md_

Chainguard provides a Software Bill of Materials (SBOM) with every container image, enabling complete transparency about package contents and dependencies for security and compliance requirements. These SBOMs are cryptographically signed and attached as attestations, making them retrievable and verifiable. By including only the minimum packages needed, Chainguard Containers reduce attack surface while the SBOM ensures you can verify exactly what's in each image.

Even though they contain the minimum number of packages, there may come a time when you want to know exactly what's running inside of a certain Chainguard Container. For this reason, Chainguard includes a signed SBOM with each image in the form of a [software attestation](https://slsa.dev/attestation-model), allowing you to verify the contents and meet compliance requirements. Chainguard publishes several different types of attestations; refer to the options under the [Available attestation types](#available-attestation-types) section on this page.

## Retrieve a container image's attestation

You can retrieve a container image's attestation in two ways:

- [Using Cosign](#retrieve-a-container-image-attestation-using-cosign)
    - [Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/) — a part of the Sigstore project — supports software artifact signing, verification, and storage in an [OCI (Open Container Initiative)](/open-source/oci/what-is-the-oci/) registry, as well as the retrieval of said artifacts.
- [In the Chainguard Console](#retrieve-a-container-image-attestation-in-the-chainguard-console)

### Prerequisites

To retrieve an attestation via Cosign, you'll need the following installed on your local machine:

- **Cosign**: Follow [our guide on installing Cosign](/open-source/sigstore/cosign/how-to-install-cosign/) to configure it.
- **jq**: Follow instructions on the [jq downloads page](https://jqlang.github.io/jq/download/) to set it up.

### Retrieve a container image attestation using Cosign

Cosign includes a `download attestation` command that allows you to retrieve a Chainguard Container's attestation over the command line. Different types of attestations are referenced by their **predicate type**. To authenticate these statements and verify the authenticity of the software producer, you can use [`cosign verify-attestation`](/open-source/sigstore/cosign/how-to-verify-file-signatures-with-cosign/).

This example command downloads the SPDX attestation for Chainguard's [php image](https://images.chainguard.dev/directory/image/php/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-retrieve-image-sboms):

```shell
cosign download attestation \
  --platform linux/amd64 \
  --predicate-type https://spdx.dev/Document \
  cgr.dev/chainguard/php | jq -r '.payload' | base64 -d | jq -r '.predicate'
```

Cosign returns the attestation in a signed envelope, with the SBOM stored as a base64-encoded payload. The command pipes the output through jq to extract the payload, decodes it with base64, and then uses jq again to print the attestation’s predicate, which contains the SBOM.

You can include the following flags when retrieving attestations:

- The `--platform` flag, which selects the target platform for the image, such as `linux/amd64` or `linux/arm64`.
    - This flag requires Cosign version 2.2.1 or newer.
- The `--predicate-type` flag, required to specify which type of attestation to retrieve. You can use the full URI or the shorthand version as the value of the flag. Refer to the [Available attestation types](#available-attestation-types) section for a list of options.

### Retrieve a container image attestation in the Chainguard Console

You can also find container image SBOMs in the [Chainguard Console](https://console.chainguard.dev). After signing in to the Console and clicking either the **Public images** or, if available, **Organization images** you'll be presented with a list of images. Click on any of these to navigate that image's landing page. From there, navigate to the [**SBOM** tab](/platform/console/images-directory/#sbom) to find and download the SBOM for the given image.

You can use the drop-down menus above the table to select which version and architecture of the image you want to view. You can also use the search box to find specific packages in the SBOM or use the button to the right of the search box to download the SBOM to your machine.

Clicking **Download** reveals a drop-down menu where you can choose to download the image's SBOM in either the SPDX or CycloneDX SBOM formats.

Check out our guide on [using the Chainguard Containers Directory](/platform/console/images-directory/) for more details.

## Available attestation types

Chainguard publishes several different types of attestations. Not every image will have every predicate type; availability depends on the image and its build process. Available predicate types include:

- **SLSA**: `https://slsa.dev/provenance/v1` (`slsaprovenance1`)
    - The [SLSA 1.0](https://slsa.dev/spec/v1.0/provenance) provenance attestation contains information about the image build environment.
    - Available on all images.
- **apko**: `https://apko.dev/image-configuration`
    - Contains the configuration used by that particular image build, including direct dependencies, user accounts, and entry point.
    - Available on all images.
- **SPDX**: `https://spdx.dev/Document` (`spdx`,`spdxjson`)
    - Contains the image SBOM in SPDX format.
    - Available on all images.
- **Chainguard EOL**: `https://chainguard.dev/end-of-life`
    - End-of-life status.
    - Only available on EOL images in grace period.
- **CycloneDX**: `https://cyclonedx.org/bom` (`cyclonedx`)
    - Contains the image SBOM in CycloneDX format.
    - Only available to customers, on new builds or rebuilds after January 29, 2026.
- **Chainguard Helm values**: `https://chainguard.dev/helm-values/v1`
    - Contains Helm values for images with vetted upstream Helm charts.
    - Only images that are tested with Helm and have a corresponding upstream Helm chart have this attestation.
- **Chainguard Helm chart-lock**: `https://chainguard.dev/attestation/chart-lock/v1`
    - Contains Helm chart-lock data for relevant images.
    - Only present for images where Helm chart locking is relevant.
- **Syft**: `https://chainguard.dev/attestation/syft/v1`
    - Contains Syft-based SBOM attestation.
    - Not available on all images; this predicate is less common.

## License information and source code references

The SBOM downloaded using either Cosign or Console methods described previously contain identical information. It lists binary packages present in the image, their licensing information using [SPDX license](https://spdx.org/licenses/) and [exceptions lists](https://spdx.org/licenses/exceptions-index.html), and external source code references.

These source code references are encoded in the [external references](https://spdx.github.io/spdx-spec/v2.3/package-information/#721-external-reference-field) field, using [external repository identifiers](https://spdx.github.io/spdx-spec/v2.3/external-repository-identifiers/#f35-purl) in the package URL (purl) format. The [purl specification](https://github.com/package-url/purl-spec/blob/master/PURL-SPECIFICATION.rst) allows for various different schemes and types.

The following purls are used in Chainguard SPDX SBOM:

- `pkg:apk` denotes binary package origin, name, full version number with epoch, and architecture:

```
pkg:apk/wolfi/ca-certificates-bundle@20240315-r4?arch=x86_64
```

- `pkg:github` is used for upstream source code reference for packages built from GitHub repositories. These purls always include a fixed commit hash and, when available, also include a tag-version:

```
pkg:github/openssl/openssl.git@openssl-3.3.1
pkg:github/openssl/openssl.git@db2ac4f6ebd8f3d7b2a60882992fbea1269114e2
```

- Note that `pkg:github` is also used to reference melange packaging files from Wolfi and Chainguard. These are provided with a subpath component and a fixed commit hash:

```
pkg:github/wolfi-dev/os@f18ff825f94b9177cf603c6e3d72936683a504d2#glibc.yaml
```

- `pkg:generic` is used to reference any other upstream download locations, most commonly tarballs:

```
pkg:generic/gcc@13.2.0?
checksum=sha256%3A8cb4be3796651976f94b9356fa08d833524f62420d6292c5033a9a26af315078&
download_url=https%3A%2F%2Fftp.gnu.org%2Fgnu%2Fgcc%2Fgcc-13.2.0%2Fgcc-13.2.0.tar.gz
```

- Also note that `pkg:generic` is used to reference upstream git repositories, outside of GitHub:

```
pkg:generic/ca-certificates@20240315?
vcs_url=git%2Bhttps%3A%2F%2Fgitlab.alpinelinux.org%2Falpine%2Fca-certificates%4009e5e43336e532ec8217ae3bfc912bcb7048f65a
```

purls are human-readable, but various programming and scripting languages have [implementations](https://github.com/package-url/purl-spec?tab=readme-ov-file#known-implementations) that can parse them.

Because SPDX SBOMs are distributed within the Chainguard Containers repository alongside each image hash, you can achieve source code access compliance by ensuring all attestations are mirrored together with each image.

As an example, a snippet of a binary package SPDX stanza with license, version, and source code references is shown here:

```json
    {
      "SPDXID": "SPDXRef-Package-glibc-locale-posix-2.39-r6",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE_MANAGER",
          "referenceLocator": "pkg:apk/wolfi/glibc-locale-posix@2.39-r6?arch=x86_64",
          "referenceType": "purl"
        },
        {
          "referenceCategory": "PACKAGE_MANAGER",
          "referenceLocator": "pkg:generic/glibc@2.39?checksum=sha256%3Af77bd47cf8170c57365ae7bf86696c118adb3b120d3259c64c502d3dc1e2d926&download_url=http%3A%2F%2Fftp.gnu.org%2Fgnu%2Flibc%2Fglibc-2.39.tar.xz",
          "referenceType": "purl"
        },
        {
          "referenceCategory": "PACKAGE_MANAGER",
          "referenceLocator": "pkg:github/wolfi-dev/os@f18ff825f94b9177cf603c6e3d72936683a504d2#glibc.yaml",
          "referenceType": "purl"
        }
      ],
      "licenseDeclared": "LGPL-2.1-or-later",
      "name": "glibc-locale-posix",
      "originator": "Organization: Wolfi",
      "supplier": "Organization: Wolfi",
      "versionInfo": "2.39-r6"
    }
```

This snippet shows that the `glibc-locale-posix` binary package is distributed under LGPL license, built from the `glibc-2.39.tar.xz` upstream tarball, using the `glibc.yaml` file from the `wolfi-dev/os` repository.

### Source code references in CycloneDX SBOMs

CycloneDX SBOMs contain the same package, license, and source code information as their SPDX counterparts, arranged to follow the [CycloneDX specification](https://cyclonedx.org/specification/overview/). The structure differs from SPDX in a few ways:

- Installed packages appear as top-level `library` components instead of being nested inside container or directory wrapper components.
- A dependency tree links the image to each installed package, and links each package to any modules bundled within it, such as Go modules.
- Build and source provenance appears in the top-level `externalReferences` field on the BOM rather than as components. The melange build definitions use the `build-meta` reference type, and upstream source code references use `source-distribution`. SPDX records this same provenance in each package's `externalRefs` field.

Because packages appear as standard components and provenance is kept in external references, these CycloneDX SBOMs import cleanly into software composition analysis (SCA) tools such as Mend.

## Learn more

We provide provenance information for every Chainguard Container in their respective [details pages](https://images.chainguard.dev/directory?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-retrieve-image-sboms). After reaching the **Overview** for the image of your choice, navigate to the **Provenance** tab for information on how to retrieve the image's attestations, as well as how to verify the image's attestations and signatures.

For example, if you're looking for the provenance information of the Python image, you can navigate to the [Python provenance information page](https://images.chainguard.dev/directory/image/python/provenance?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-retrieve-image-sboms).

---

### Considerations for keeping containers up to date
_Path: chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates.md_

Chainguard rebuilds container images daily to ensure the latest security patches are always included, addressing a critical challenge in container security. While keeping images up-to-date is essential for receiving security updates and new features, updates must be balanced with stability concerns since any code change can potentially introduce breaking changes or impact dependent systems.

Due to the complexity involved in modern containerized applications, there is no one-size-fits-all approach to keeping your container images up to date. With these conflicting approaches in mind, this article will explore how best to keep container images up-to-date.

## Understanding image versioning and naming conventions

Before discussing image updates, it's helpful to have a baseline understanding of how images are typically versioned and named.

[*Semantic versioning*](https://semver.org/) — also known as "semver" — is a system for determining how version numbers are assigned to a given piece of software. Software using semver has versions numbered in the format of `X.Y.Z`. `X` is reserved for major versions that are backwards incompatible, `Y` is used for minor versions that are backward compatible, and `Z` is used for patches and bug fixes. As an example, for a piece of software with the version number `3.5.2`, `3` is the major version, `5` is the minor version, and `2` is the patch number.

Semantic versioning is intended to improve problems associated with having a large number of dependencies. Although semver has become a common practice throughout the software industry, it isn't used universally.

When referencing an image, it's important to know exactly what image you are working with. Docker uses the following format for image names.

```image
[host]/[repository][image_name][:tag]
```

For example, the full name for the [Go Chainguard Container](https://images.chainguard.dev/directory/image/go/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-recommended-practices-considerations-for-image-updates), is `cgr.dev/chainguard/go:latest`.

Certain elements of this name format are optional in many cases. For instance, if you omit the hostname portion of an image name in either Docker or Kubernetes, both will default to using the public Docker registry.

## Automating updates

One solution to avoiding out-of-date container images would be to automate the process of updating images. This may be a system that scans a container registry for new versions of a given image and updates the application any time a new version of an image is released.

However, you will need to consider a few specific details around your particular software and organization's situation prior to fully automating container image updates, as you may run into issues with breaking changes upstream. You’ll want to think through the following:

* What is your risk appetite: is your software part of critical infrastructure or is its function of less urgent importance?
* What tests do you have in place? If you have confidence in your test suite, you may have a higher risk tolerance as you’ll trust that tests will fail and prevent broken images from going live.

You’ll also want to consider what exact version of an image you are updating, whether you are pinning to a digest to guarantee reproducibility, defaulting to a tag, or automating minor or patch version updates.

Even with safeguards in place, there is still a risk that at some point your application will use a version of an image it’s no longer fully compatible with, and you’ll need to have a plan in place to remedy this.

There are some tools that can automate some or all of the process of updating your images. One such example is [watchtower](https://github.com/containrrr/watchtower), which will update the running version of your app when an appropriately tagged image is pushed to a relevant registry. Additionally, there are [FluxCD](https://fluxcd.io/flux/guides/image-update/) and [Argo CD's Image Update tool](https://argocd-image-updater.readthedocs.io/en/stable/).

If you're going to use tools like these to automate image updates, it is a recommended that you have testing and monitoring in place. Monitoring, alerting, and logging support you and your organization in making the information you need for debugging, security-related analysis, and compliance requirements available while also keeping a history of relevant data.

## Be mindful about tagging practices

Developers will often create multiple variations of the same image. Sometimes these different images may represent distinct numbered versions of the image, or they may contain unique sets of packages. Typically, these different images in the same series will share a name and be stored in the same repository, but the developer will differentiate them by giving them different *tags*.

In the context of containers, a tag is a human-readable identifier associated with an image. These make it easier to distinguish between different versions of images within the same repository. Oftentimes, developers will pin their project to a specific tag. As an example, imagine a project that uses an image named `example_image` and it is pinned to version `1.9`, as in `cgr.dev/chainguard/example_image:1.9`. One day, version `2.0` is released, but the project developers choose not to upgrade, as doing so would introduce breaking changes.

There may be situations where different tags point to the same image. For example, the first version of an image named `sample_image` is released with the tag `1`. Later on, a minor version is released with the tag `1.2`, and then even later  patch is released with the tag `1.2.3`. In this case, the images tagged `1` and `1.2` would point to the same image as the one tagged `1.2.3`, since `1.2.3` is the latest patch of both these major and minor versions. Conversely, if the developer later decides to patch version `1.1` of the `sample_image` and tags it as `1.1.4`, the image tagged `1` will still point to `1.2.3`, as that's the latest iteration of the most recent minor version.

Many systems will default to using the `latest` tag in certain cases if you don't specify one. For example, if you use Docker to build an image but don't specify a tag, it will always default to tagging it with `latest`. There's a misconception that the `latest` tag always represents the most recent stable version of a given image. The normal convention is for the latest tag to point to the most up-to-date stable version of the image, but it is only a convention and not an enforced rule.

One of the most important features of container builds is their *reproducibility* as you would like to ensure that you are using the same image each time. However, container tags are mutable, meaning that they can change over time. If you pin your application to a specific image tag and then the image associated with that tag gets updated and you redeploy or pull the image again, your application will be using a different image than it was before. Eventually, the image could change to the point that it no longer works with your application.

When it comes to container versions, pinning an application to a major version is usually an acceptable practice since minor version increases typically won't break things. That being said, the potential for "jumping” across minor or major versions without warning means that pinning an application to a major or minor tag isn't suitable for many production workflows. To avoid this problem, it's recommended to pin projects to an *image digest*. A digest is a content-based hash of the image contents and is guaranteed to be immutable. Because a digest will always point to the same image, its reproducibility is guaranteed. To find the digest for an image, users can run a command like the following.

```sh
docker images --digests cgr.dev/chainguard/wolfi-base
```

```output
REPOSITORY                   TAG    DIGEST                                                                 IMAGE ID    CREATED   SIZE
cgr.dev/chainguard/wolfi-base   latest sha256:490977f0fd3d8596d173839dbb314153797312553b43f6a24b0e341cf2e8d473   2606ed78c658   9 days ago   10.9MB
```

To clarify, using tags to keep your images may work for you and your organization. However, if you're concerned about ensuring reproducibility — or you just want more control over what images you're running — using digests can be a better approach for your situation.

## Recommendations

As mentioned in the previous section, image digests guarantee full reproducibility. For that reason, it's generally recommended that projects update their container images by digest whenever possible.

Of course, digests do come with their own drawbacks. Image digests are not human readable; unlike tags, you can't always tell the difference between two image digests with a quick visual scan. Digests also don't make it clear whether a digest represents an older version, or whether one digest is older than another. Combined, these factors mean that digests can make it more difficult to know whether an image is up to date.

[Chainguard Containers](/chainguard/containers/) are rebuilt daily in order to ensure that they're kept up to date and include all the latest available security patches. We recommend adopting a development pattern where digests are used to identify Chainguard Containers and are regularly updated by a bot, ensuring that the project and its downstream users benefit from reduced vulnerability counts, bug fixes, and new features. We do this ourselves with [Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/), our own GitHub Action for keeping digest-pinned references current.

As with the recommendation stated previously, Chainguard requires a human to approve the digestabot's update before it's deployed. Technically, we could set up an automatic approval for the bot's updates, but requiring a human approval combines the stability and reproducibility of using a digest with the good security hygiene of keeping images regularly updated.

There are many factors to consider when developing a process for keeping your images up to date, so you're unlikely to find useful advice on the subject beyond the general strategies outlined in this guide. Of course, different update strategies will work for different circumstances. Ultimately, whatever process you or your organization land on for keeping images up to date should suit the needs of your users without becoming a burden to you or your organization.

## Learn more

To reiterate, there's no one-size-fits-all approach to keeping one's images up to date. Our goal for this article is to introduce some of the important factors one should consider when developing a container image update plan for their application. If you'd like to learn more about the subjects touched on in this guide, we encourage you to check out the following resources.

* [How to use Chainguard Containers](/chainguard/containers/using-and-deploying/using-containers/)
* [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/)
* [How to compare Chainguard Containers with chainctl](/platform/chainctl-usage/comparing-images/)

---

### Using Renovate with Chainguard Containers
_Path: chainguard/containers/security-and-compliance/updating-containers/renovate/index.md_

[Renovate](https://github.com/renovatebot/renovate) can be used to alert on updates to Chainguard Containers. This can be an effective way to keep your images up-to-date and free of CVEs. This article explains how to configure Renovate to support Chainguard Containers.

> **NOTE**: This article describes using Renovate to alert on new versions of Chainguard Containers. It is not about alerts for Wolfi packages (which is unsupported at the time of writing).

## Prerequisites

To follow this guide, you need:

* Renovate installed and configured. Refer to Renovate's [installation instructions](https://docs.renovatebot.com/getting-started/installing-onboarding/) if you haven't set this up.
* `chainctl`, Chainguard's command-line interface, installed on your local machine. Several examples in this guide use it. Refer to [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you haven't set this up.

## Set up credentials for Renovate

In order to support versioned images from a private repository, you must provide Renovate with credentials to access the [Chainguard registry](/chainguard/containers/registry/overview/) at `cgr.dev`. You can do this by creating a token with `chainctl`, as in this example:

```shell
chainctl auth configure-docker --pull-token
```

This command responds with output such as:

```shell
To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

By default, this credential is good for 30 days.

You can now configure `hostRules` in Renovate to support the Chainguard registry. Depending on how Renovate was set up, you can add this to your Renovate configuration with a setting such as:

```json
{
...
   "hostRules": [
    {
      "hostType": "docker",
      "matchHost": "cgr.dev",
      "username": "<identity-id>",
      "password": "<pull-token>"
     }]
}
```

Be aware that you **SHOULD NOT** check this file into source control with the exposed secret. Instead, you can use environment variables that you pass in at runtime if you use a `config.js` file:

```json
module.exports = {
...
   "hostRules": [
    {
      "hostType": "docker",
      "matchHost": "cgr.dev",
      "username": process.env.CGR_USERNAME,
      "password": process.env.CGR_PASSWORD,
     }]
};
```

But an even more secure solution would be to create a script that automatically updates the configuration with the correct values by calling `chainctl`. If you do this, you should also set the credential lifetime to a much shorter period with the `--ttl` flag:

```shell
chainctl auth configure-docker --pull-token --ttl 10m
```

This sets the pull token's lifetime to 10 minutes, which limits the risk posed if the token leaks. You can also set the lifetime to a longer period for more manual configurations.

## Update versioned container images

By default, Renovate will now open pull requests for any out-of-date versions of images it finds. For example, you can run Renovate by pushing the following Dockerfile to a repository overseen by Renovate:

```dockerfile
FROM cgr.dev/chainguard.edu/python:3.11-dev AS builder
...

FROM cgr.dev/chainguard.edu/python:3.11
...
```

At the time of writing, version 3.12 was the current version of the Python image, so Renovate opened a pull request to update the reference.

Not all images use semantic versioning. Refer to the [Renovate documentation](https://docs.renovatebot.com/) for details on how to support different schemes.

Ideally, image references should also be pinned to a digest, as shown in the following section.

## Update `:latest` container images

Renovate also supports updating image references that are pinned to digests. This lets you keep mutable tags such as `:latest` in sync with the most up-to-date version.

As an example, the following Dockerfile prompts Renovate to open two similar pull requests:

```dockerfile
FROM cgr.dev/chainguard/go:latest-dev@sha256:ff187ecd4bb5b45b65d680550eed302545e69ec4ed45f276f385e1b4ff0c6231 AS builder

WORKDIR /work

COPY go.mod /work/
COPY cmd /work/cmd
COPY internal /work/internal

RUN CGO_ENABLED=0 go build -o hello ./cmd/server

FROM cgr.dev/chainguard/static:latest@sha256:5e9c88174a28c259c349f308dd661a6ec61ed5f8c72ecfaefb46cceb811b55a1
COPY --from=builder /work/hello /hello

ENTRYPOINT ["/hello"]
```

## Pin digests

The `pinDigests` option configures Renovate to add digests to image references that don't contain them.

The following example Renovate configuration includes this option:

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended"
  ],
  "packageRules": [
    {
      "matchDatasources": ["docker"],
      "pinDigests": true
    }
  ]
}
```

This configures Renovate to open pull requests that pin a reference like `cgr.dev/chainguard/python:3.12` to a digest like the following:

```
cgr.dev/chainguard/python:3.12@sha256:e3b524a97c37c32ba590aae0ebcebe3a983c1f69a5093b670fdba980f97a09b3
```

You can also use the `matchUpdateTypes` option to disable updates for any types other than `digest`.

Here is an example Renovate configuration that does this:

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended"
  ],
  "packageRules": [
    {
      "matchDatasources": ["docker"],
      "matchUpdateTypes": [
        "major",
        "minor",
        "patch"
      ],
      "enabled": false
    }
  ]
}
```

This configures Renovate to update the digest for a reference but not the tag.

The benefit of this approach is that it lets you define your update strategy for each image reference through a mutable tag, rather than having separate rules for different images in your Renovate configuration, similar to Chainguard's [Digestabot](https://github.com/chainguard-dev/digestabot) GitHub Action.

## Update Chainguard Helm charts in Helmfiles

Renovate supports updating [Helmfile](https://helmfile.readthedocs.io/) releases with its [built-in `helmfile` manager](https://docs.renovatebot.com/modules/manager/helmfile/). However, it doesn't presently support updating [digest references](/chainguard/containers/troubleshooting/inspecting-containers/) for OCI chart URLs, which is a [recommended practice when deploying Chainguard Helm charts](/chainguard/containers/using-and-deploying/helm-charts/use-chainguard-helm-charts/#pin-to-digest). See [renovatebot/renovate#45054](https://github.com/renovatebot/renovate/discussions/45054) for more details.

To pin Chainguard Helm charts to digests and update them with Renovate, you can use a [custom `jsonata` manager](https://docs.renovatebot.com/modules/manager/jsonata/) as a workaround.

Given a `helmfile.yaml` such as:

```yaml
releases:
  - name: kube-prometheus-stack
    chart: oci://cgr.dev/<org>/charts/kube-prometheus-stack@sha256:833bd55297054df0afdbe47750013b8e2eff930059c63c0746447fa8d0b729d3
    version: 87.4.0
    namespace: monitoring
  - name: nginx
    chart: oci://cgr.dev/<org>/iamguarded-charts/nginx@sha256:7b88d44da254fc764171da809471d10c6cf15b9ab0ddcb4b475b9a8f380aeb79
    version: 22.1.0
    namespace: nginx
```

Configure Renovate with the following example, replacing every instance of `cgr.dev/<org>` with your Chainguard organization or internal mirror or proxy.

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "packageRules": [
    {
      "matchManagers": ["helmfile"],
      "matchPackagePatterns": [
        "^cgr\\.dev/<org>/(charts|iamguarded-charts)/"
      ],
      "enabled": false
    }
  ],
  "customManagers": [
    {
      "customType": "jsonata",
      "fileFormat": "yaml",
      "fileMatch": ["(^|/)helmfile\\.ya?ml$"],
      "matchStrings": [
        "releases[$contains(chart, 'cgr.dev/<org>/charts/')].($n := $substringAfter($substringBefore(chart & '@', '@'), 'charts/'); $exists(version) ? { 'depName': $n, 'packageName': 'cgr.dev/<org>/charts/' & $n, 'currentValue': version, 'currentDigest': $substringAfter(chart, '@') } : { 'depName': $n, 'packageName': 'cgr.dev/<org>/charts/' & $n, 'currentDigest': $substringAfter(chart, '@') })"
      ],
      "datasourceTemplate": "docker"
    },
    {
      "customType": "jsonata",
      "fileFormat": "yaml",
      "fileMatch": ["(^|/)helmfile\\.ya?ml$"],
      "matchStrings": [
        "releases[$contains(chart, 'cgr.dev/<org>/iamguarded-charts/')].($n := $substringAfter($substringBefore(chart & '@', '@'), 'iamguarded-charts/'); $exists(version) ? { 'depName': $n, 'packageName': 'cgr.dev/<org>/iamguarded-charts/' & $n, 'currentValue': version, 'currentDigest': $substringAfter(chart, '@') } : { 'depName': $n, 'packageName': 'cgr.dev/<org>/iamguarded-charts/' & $n, 'currentDigest': $substringAfter(chart, '@') })"
      ],
      "datasourceTemplate": "docker"
    }
  ]
}
```

## Update Chainguard Helm charts in ArgoCD applications

Renovate supports updating [ArgoCD](https://argo-cd.readthedocs.io/) `Application` manifests with its [built-in `argocd` manager](https://docs.renovatebot.com/modules/manager/argocd/). However, it doesn't presently support updating [digest references](/chainguard/containers/troubleshooting/inspecting-containers/) for OCI chart URLs, which is a [recommended practice when deploying Chainguard Helm charts](/chainguard/containers/using-and-deploying/helm-charts/use-chainguard-helm-charts/#pin-to-digest). See [renovatebot/renovate#45055](https://github.com/renovatebot/renovate/discussions/45055) for more details.

To pin Chainguard Helm charts to digests and update them with Renovate, you can use a [custom `jsonata` manager](https://docs.renovatebot.com/modules/manager/jsonata/) as a workaround.

Given `Application` manifests such as:

```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: kube-prometheus-stack
spec:
  source:
    repoURL: oci://cgr.dev/<org>/charts
    chart: kube-prometheus-stack
    targetRevision: 87.4.0@sha256:833bd55297054df0afdbe47750013b8e2eff930059c63c0746447fa8d0b729d3
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nginx
spec:
  source:
    repoURL: oci://cgr.dev/<org>/iamguarded-charts
    chart: nginx
    targetRevision: 22.1.0@sha256:7b88d44da254fc764171da809471d10c6cf15b9ab0ddcb4b475b9a8f380aeb79
```

Configure Renovate as in the following example, replacing every instance of `cgr.dev/<org>` with your Chainguard organization or internal mirror or proxy.

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "packageRules": [
    {
      "matchManagers": ["argocd"],
      "matchPackagePatterns": [
        "^cgr\\.dev/<org>/(charts|iamguarded-charts)/"
      ],
      "enabled": false
    }
  ],
  "customManagers": [
    {
      "customType": "jsonata",
      "fileFormat": "yaml",
      "fileMatch": ["\\.ya?ml$"],
      "matchStrings": [
        "spec.source[$contains(repoURL, 'cgr.dev/<org>/charts')].($tr := targetRevision; $substring($tr, 0, 7) = 'sha256:' ? { 'depName': chart, 'packageName': 'cgr.dev/<org>/charts/' & chart, 'currentDigest': $tr } : { 'depName': chart, 'packageName': 'cgr.dev/<org>/charts/' & chart, 'currentValue': $substringBefore($tr & '@', '@'), 'currentDigest': $substringAfter($tr, '@') })"
      ],
      "datasourceTemplate": "docker"
    },
    {
      "customType": "jsonata",
      "fileFormat": "yaml",
      "fileMatch": ["\\.ya?ml$"],
      "matchStrings": [
        "spec.source[$contains(repoURL, 'cgr.dev/<org>/iamguarded-charts')].($tr := targetRevision; $substring($tr, 0, 7) = 'sha256:' ? { 'depName': chart, 'packageName': 'cgr.dev/<org>/iamguarded-charts/' & chart, 'currentDigest': $tr } : { 'depName': chart, 'packageName': 'cgr.dev/<org>/iamguarded-charts/' & chart, 'currentValue': $substringBefore($tr & '@', '@'), 'currentDigest': $substringAfter($tr, '@') })"
      ],
      "datasourceTemplate": "docker"
    }
  ]
}
```

## Update Chainguard Helm charts in Flux

Renovate natively supports updating [Flux](https://fluxcd.io/) `OCIRepository` resources with its [built-in `flux` manager](https://docs.renovatebot.com/modules/manager/flux/).

Given a Flux manifest such as:

```yaml
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: OCIRepository
metadata:
  name: kube-prometheus-stack
  namespace: monitoring
spec:
  interval: 5m
  url: oci://cgr.dev/<org>/charts/kube-prometheus-stack
  ref:
    tag: 87.4.0
    digest: sha256:833bd55297054df0afdbe47750013b8e2eff930059c63c0746447fa8d0b729d3
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: kube-prometheus-stack
  namespace: monitoring
spec:
  interval: 5m
  chartRef:
    kind: OCIRepository
    name: kube-prometheus-stack
```

Configure Renovate with the following example, adjusting the `flux.fileMatch` patterns to cover your repository layout. The `pinDigests` rule enforces the [recommended practice of pinning charts to a digest](/chainguard/containers/using-and-deploying/helm-charts/use-chainguard-helm-charts/#pin-to-digest): if an `OCIRepository` has a `tag` but no `digest`, Renovate opens a pull request to add one.

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "flux": {
    "fileMatch": [
      "(^|/)flux\\.ya?ml$",
      "(^|/)gotk-components\\.ya?ml$"
    ]
  },
  "packageRules": [
    {
      "matchManagers": ["flux"],
      "matchDatasources": ["docker"],
      "matchPackagePatterns": [
        "^cgr\\.dev/<org>/(charts|iamguarded-charts)/"
      ],
      "pinDigests": true
    }
  ]
}
```

## Run Renovate in GitHub Actions

You can use [`renovatebot/github-action`](https://github.com/renovatebot/github-action) to run Renovate from a GitHub Actions workflow. This can be combined with an [assumable identity](/platform/administration/assumable-ids/assumable-ids/) to authenticate to `cgr.dev` and update references to Chainguard container images in your repository.

> **Note**: This section assumes you have permissions to create identities in your Chainguard organization.

First, create a Renovate configuration file at the root of your GitHub repository. Refer to the [official documentation](https://docs.renovatebot.com/configuration-options/) for all the supported options.

This is an example of a minimal configuration:

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json"
}
```

Push this file to the `main` branch of your repository.

Next, create an assumable identity for your GitHub repository. The `--github-repo` value embeds GitHub's immutable numeric owner and repository IDs; refer to [Finding your repository's numeric identifiers](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers) for how to retrieve them and when the format applies.

```shell
chainctl iam identities create github <identity-name> \
  --github-repo=<github-org>@<owner-id>/<github-repo-name>@<repo-id> \
  --github-ref=refs/heads/main \
  --role=registry.pull
```

Create a workflow file named `.github/workflows/renovate.yaml` with the following content. Replace `<identity-id>` with the ID returned by the previous command.

```yaml
name: Renovate

on:
  workflow_dispatch:
  schedule:
    - cron: "0 3 * * *"

permissions:
  contents: read

jobs:
  renovate:
    name: Renovate
    runs-on: ubuntu-latest

    permissions:
      contents: write
      pull-requests: write
      issues: write
      id-token: write

    steps:
    - uses: chainguard-dev/setup-chainctl@be0acd273acf04bfdf91f51198327e719f6af978 # v0.4.0
      with:
        identity: "<identity-id>"

    - shell: bash
      run: |
        RENOVATE_DOCKER_CGR_DEV_PASSWORD=$(chainctl auth token --audience=cgr.dev)
        echo "::add-mask::$RENOVATE_DOCKER_CGR_DEV_PASSWORD"
        echo "RENOVATE_DOCKER_CGR_DEV_PASSWORD=$RENOVATE_DOCKER_CGR_DEV_PASSWORD" >> $GITHUB_ENV

    - name: Run Renovate
      uses: renovatebot/github-action@6927a58a017ee9ac468a34a5b0d2a9a9bd45cac3 # v43.0.11
      env:
        RENOVATE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        RENOVATE_REPOSITORIES: ${{ github.repository }}
        RENOVATE_DETECT_HOST_RULES_FROM_ENV: "true"
        RENOVATE_DOCKER_CGR_DEV_USERNAME: "_token"
```

This workflow performs the following steps:

* Installs chainctl and logs in as the assumable identity you created.
* Exports a short-lived token for cgr.dev as `RENOVATE_DOCKER_CGR_DEV_PASSWORD`.
* Runs Renovate with `RENOVATE_DETECT_HOST_RULES_FROM_ENV=true` so that it uses the password exported by the previous step.

Push this file to your repository's `main` branch.

This workflow is scheduled to run at 3:00 a.m. every morning. You can trigger it manually by navigating to **Actions > Renovate** and selecting **Run workflow**.

Once the workflow has run successfully, you'll find pull requests in your repository for any image references that need to be updated.

## Run Renovate with Docker

Chainguard provides [an image for Renovate](https://images.chainguard.dev/directory/image/renovate/overview). This is an example of how you can run this image to keep references to Chainguard images up to date in a GitHub repository.

> **Note**: To follow along with this section, you must have access to Chainguard's `renovate` container image.

To begin, generate a Personal Access Token for your GitHub user as described in Renovate's [official documentation](https://docs.renovatebot.com/modules/platform/github/#authentication).

Export the token as an environment variable named `RENOVATE_TOKEN`:

```shell
export RENOVATE_TOKEN=ghp_XXXXXXXXXXXXXXXXXX
```

Next, create a Renovate configuration file at the root of any GitHub repositories you want to target with Renovate. Refer to the [official documentation](https://docs.renovatebot.com/configuration-options/) for all the supported options.

This is an example of a minimal configuration:

```json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json"
}
```

Then, log in with `chainctl`:

```shell
chainctl auth login
```

Finally, run Renovate. Substitute `<org-name>` with the name of your Chainguard organization and provide any GitHub repositories that you want to target as arguments in the form `<github-org>/<github-repo-name>`:

```shell
docker run \
  -it \
  --rm \
  -e RENOVATE_TOKEN="${RENOVATE_TOKEN}" \
  -e RENOVATE_DETECT_HOST_RULES_FROM_ENV=true \
  -e RENOVATE_DOCKER_CGR_DEV_USERNAME=_token \
  -e RENOVATE_DOCKER_CGR_DEV_PASSWORD=$(chainctl auth token --audience cgr.dev) \
  cgr.dev/<org-name>/renovate \
  <github-org>/<github-repo-name>
```

This example passes a short-lived token for `cgr.dev` using the `RENOVATE_DOCKER_CGR_DEV_PASSWORD` environment variable.

## Troubleshooting

### Renovate doesn't behave as expected

Run Renovate in debug mode and dump the resolved configuration to understand how it interpreted your settings.

For example:

```
LOG_LEVEL=debug renovate --print-config
...
       "hostRules": [
         {
           "hostType": "docker",
           "matchHost": "cgr.dev",
           "username": "<identity-id>",
           "password": "***********",
           "resolvedHost": "cgr.dev"
         },
         {"matchHost": null, "hostType": "local"}
       ]
...
DEBUG: hostRules: basic auth for https://cgr.dev (repository=local)
DEBUG: getLabels(https://cgr.dev, ORGANIZATION/static, latest) (repository=local)
DEBUG: getManifestResponse(https://cgr.dev, ORGANIZATION/static, latest, get) (repository=local)
DEBUG: getManifestResponse(https://cgr.dev, ORGANIZATION/static, sha256:76d71eb53b1b44ec955529ece91c6da222a54fed660ca6b25124935bdd96e133, get) (repository=local)
DEBUG: found labels in manifest (repository=local)
       "labels": {
         "dev.chainguard.package.main": "static",
         "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/",
         "org.opencontainers.image.created": "2024-12-04T19:55:37Z",
         "org.opencontainers.image.source": "https://github.com/chainguard-images/images-private/tree/main/images/static",
         "org.opencontainers.image.url": "https://images.chainguard.dev/directory/image/static/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-renovate",
         "org.opencontainers.image.vendor": "Chainguard"
       }
```

### Connections to `cgr.dev` fail

If you have problems getting Renovate to monitor `cgr.dev`, double-check the connection details. Make sure the token is still valid (you can verify with `chainctl iam identities list`) and it has access to the repository you are referring to. You can test these credentials by running a `docker login` and `docker pull` in a clean environment.

### The log shows a `getReleaseList` error

You may encounter errors such as the following:

```
DEBUG: getReleaseList error (repository=chainguard-images/images-private, branch=renovate/cgr.dev-chainguard.edu-python-3.x)
       "type": "github",
       "apiBaseUrl": "https://api.github.com/",
       "err": {
         "message": "`chainguard-images` forbids access via a personal access token (classic). Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.",
         "stack": "Error: `chainguard-images` forbids access via a personal access token (classic). Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.\n    at
…
```

These can be safely ignored. They are caused by Renovate using the `org.opencontainers.image.source` label on our images to look for a changelog. As this source is set to the private `images-private` GitHub repository, this request fails.

## Learn more

* [Using Digestabot with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/digestabot/) covers Chainguard's own GitHub Action for keeping digest-pinned references current.
* [Using Dependabot with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/dependabot/) covers the equivalent setup for teams already using Dependabot.
* [Strategies and tooling for updating containers](/chainguard/containers/security-and-compliance/updating-containers/strategies-tools-updating-images/) compares the wider range of update tools.
* [Considerations for keeping containers up to date](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/) covers the tradeoffs behind an update policy.
* [Authenticating to the Chainguard registry](/chainguard/containers/registry/authenticating/) documents pull tokens and the other authentication options in full.

---

### Strategies and tooling for updating containers
_Path: chainguard/containers/security-and-compliance/updating-containers/strategies-tools-updating-images/index.md_

When it comes to keeping a system secure, one of the most important measures you can take is to regularly apply updates. In modern, containerized infrastructures, this normally means updating containers to use only the latest container images that are still maintained. A casual observer might expect such a standard and important task to have agreed-on best practices and standardized tooling, but they might be surprised by the wide variety of different solutions and opinions on this problem.

This conceptual article will delve into some of the options and offer guidance on which might work best for readers. This article assumes that you are familiar with [semantic versioning](https://semver.org/) (SemVer) and image tagging. If you aren't acquainted with these concepts, check out this guide on [Considerations for keeping containers up to date](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/).

## Updating means risk

The core issue with applying updates is that it's a fundamentally risky endeavor; any update to software risks a change to behavior and system breakages. It's a common practice to avoid major updates for weeks or even months in order to ensure bugs have been worked out before upgrading.

Larger software projects (like PostgreSQL, Java, and Node.js) often have multiple versions of their project in support at the same time. This means that users can stay on an older version and avoid the more risky updates while still getting security patches. Although this approach is helpful to operations teams, it is only practical on large projects with paid maintainers that can spend time backporting fixes. Smaller projects will often struggle with just keeping the main version up to date.

## Not updating means more risk

End of Life (EOL) software [presents a host of security risks](/chainguard/containers/concepts/lifecycle-and-eol/how-eol-software-accumulates-cves/). Upgrading may require a great deal of work and proper testing, but it's a small price to pay to keep your systems from being at risk and accruing technical debt.

If your application has an automated test suite with good coverage, you can be confident that any breakages caused by upgrades will be caught before deployment to production. Of course, whenever a test failure occurs, there will be work required to address it. Putting off that work by delaying upgrades will only mean that more work is required in the future as further changes pile up.

Another way organizations test and reduce the risk of breaking changes introduced by updates is through the use of staging environments where changes are tried out before being pushed to production. An alternative approach to this is [testing in production](https://increment.com/testing/i-test-in-production/), which usually involves using techniques like [feature flags](https://www.honeycomb.io/blog/what-is-a-feature-flag-best-practices-and-use-cases) and staged updates to verify the effects of changes before they impact the majority of users.

## Knowing when updates are available

The primary way of knowing when a new image is available is through the registry itself. Many registries will offer a webhook callback service ([Docker Hub](https://docs.docker.com/docker-hub/webhooks/), for example), but this is typically only for your own repositories. If you want to get notified when a public repository is updated, you'll generally have to use a third-party service like [NewReleases](https://newreleases.io/).

If you're trying to find out how outdated the images in your Kubernetes cluster are, you might find the [version-checker](https://github.com/jetstack/version-checker) project to be useful. This is a Kubernetes utility that will create an inventory of your current images and produce a chart showing how out of date they are. The dashboard can form part of a full solution with notifications for outdated software being sent to cluster administrators for mitigation.

## Updating solutions

This section outlines some commonly employed solutions for keeping images up to date. We'll only consider solutions that involve automation — you could argue that `kubectl set image` is an updating solution, but it would only be scalable as part of an automated pipeline.

### Using `latest` or major version tags

One common strategy is to only use the `latest` tag or major version tags. This means having something like the following in your Dockerfile:

``` Dockerfile
FROM cgr.dev/chainguard/redis:3
```

Or, if you're using a  Kubernetes manifest, you might have a line like this:

``` Kubernetes
image: cgr.dev/chainguard/redis:latest
```

The tag used will determine the jump in the updated version; `latest` will jump major versions so typically a major or minor tag is chosen to limit the size of changes.

The goal for this strategy is to update the image whenever it is rebuilt or redeployed. However, the reality is that this approach is still dependent on caching and configuration (especially the [image pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy)) and it may involve a considerable time to redeployment.

One major issue with this approach is that you lack control and reproducibility over the images that will be deployed. In Kubernetes you can end up with different pods in the same deployment running different versions of the application because nodes pulled the image at slightly different times. Debugging can become difficult, as you can't easily recreate the system. You can't even say for sure what is running in the cluster, which will be a big problem when you need to respond to a security situation.

The advantage of this approach is that it is relatively simple, requires little maintenance, and will keep up to date with changes over time, meaning it's often appropriate for simple projects, or example code. However, it's recommended that you don't deploy the `latest` tag  to production, as doing so can present its own risks.

### Keel

[Keel](https://keel.sh/) is a Kubernetes Operator that will automatically update Kubernetes manifests and Helm charts. It has multiple options for finding updates — typically using webhooks from registries and falling back to polling for new versions. Updates are controlled through [policies](https://keel.sh/docs/#policies) which cover the normal cases.

### GitOps: Flux and ArgoCD

[GitOps](https://medium.com/weaveworks/what-is-gitops-really-e77329f23416) is a set of practices that leverage Git as a single source of truth for infrastructure automation. The two leading GitOps solutions for updating images are Flux and ArgoCD (though there are also newer solutions gaining traction including [fleet](https://github.com/rancher/fleet) and [kluctl](https://kluctl.io/)).

#### Flux

[Flux](https://fluxcd.io/flux/guides/image-update/) uses an [`ImageRepository` custom
resource](https://fluxcd.io/flux/components/image/imagerepositories/) that polls repositories for updates. There is also support for webhooks via the [Notification Controller](https://fluxcd.io/flux/components/notification/). An [`ImagePolicy` custom
resource](https://fluxcd.io/flux/components/image/imagepolicies/) defines what tags we're interested in — typically you will use a SemVer policy, such as `range: 5.0.x`, to get minor updates.

An [`ImageUpdateAutomation` resource](https://fluxcd.io/flux/components/image/imageupdateautomations/) then defines how to handle updates, such as by checking an update commit directly or committing to a new branch and opening a GitHub pull request for manual approval. There is also support for reverting updates and suspending automation to support incident response.

#### ArgoCD

ArgoCD has a separate [Image Updater](https://github.com/argoproj-labs/argocd-image-updater) project that can be used to automate updates. Rather than creating new resources, ArgoCD relies on annotations being added to existing manifests. Update strategies are similar to Flux, with support for SemVer and regular expressions to filter tags. Unlike Flux, there is currently no support for webhooks, but this could change in the future.

### ImageStreams

OpenShift has the concept of [ImageStreams](https://docs.openshift.com/container-platform/4.15/openshift_images/image-streams-manage.html) for handling updates. ImageStreams are a "virtual view" on top of images. Deployments and builds can listen for ImageStream notifications to automatically update for new versions.

The underlying data for an ImageStream comes from registries, but decoupling this data means it is possible to have different versions in the ImageStream and on the registry. This in turn allows for processes such as rolling back a deployment without retagging images on the registry. The ImageStream itself is represented as a custom resource which contains a history of previous digests, ensuring that rollbacks are possible even when tags are overwritten (assuming the image isn't deleted).

### Frizbee and digestabot

A best practice in supply chain security is to specify GitHub actions and container images by their *digest*. The digest is a content-based SHA of the image that is guaranteed to always refer to exactly the same version of the action or code, and it is also guaranteed to not have changed. In other words, digests are *immutable*, meaning that they can't be changed to point to something else. The disadvantages are that digests aren't human-readable and you need to keep updating them to stay up to date.

However, It is possible to get something human-readable as well as immutable. The following are valid image references which specify both a meaningful tag and an immutable digest:

```
cgr.dev/chainguard/wolfi-base:latest@sha256:3eff851ab805966c768d2a8107545a96218426cee1e5cc805865505edbe6ce92
```

```
redis:7@sha256:01afb31d6d633451d84475ff3eb95f8c48bf0ee59ec9c948b161adb4da882053
```

[Frizbee](https://github.com/stacklok/frizbee), a tool from Stacklok, will update image references to the most up-to-date digest. For the above example, it will ask the registry for the digest of the `cgr.dev/chainguard/wolfi-base:latest` image and update it if it doesn't match.

At Chainguard, we take a similar approach with [Digestabot](https://github.com/chainguard-dev/digestabot), a GitHub Action that looks up digests in this format and opens a pull request to update them.

Digestabot authenticates to your private `cgr.dev` registry with an assumable identity. Refer to [Using Digestabot with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/digestabot/) for configuration details.

### Dependabot

Dependabot is GitHub's tool for monitoring dependencies. It can be used with GitHub, but [can also be self-hosted](https://github.com/dependabot/dependabot-core?tab=readme-ov-file#how-to-run-dependabot).

Dependabot is designed to work with a variety of different package ecosystems, as well as container images referenced in Dockerfiles and Kubernetes manifests. Dependabot runs on a schedule and will open pull requests to update dependencies when it finds outdated versions.

Dependabot authenticates to your private `cgr.dev` registry with a pull token. Refer to [Using Dependabot with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/dependabot/) for configuration details.

### Renovate

[Renovate](https://github.com/renovatebot/renovate) is a similar solution to Dependabot and opens pull requests to update out-of-date dependencies. The major difference is that Renovate is a self-hosted application that supports multiple repositories, like GitLab, Azure, and Bitbucket, instead of just GitHub.

Refer to [Using Renovate with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/renovate/) for configuration details.

## Conclusion

Something as important as keeping packages up to date has more approaches and tooling than one might expect. This article has shied away from offering any clear recommendations, but this is a matter where every organization will need to choose a solution that suits its own needs.

We encourage you to check out each of the solutions listed in this article and judge them on their own merits. We also suggest you read our other articles on handling EOL software, including [Considerations for keeping containers up to date](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/).

---

### Using Dependabot with Chainguard Containers
_Path: chainguard/containers/security-and-compliance/updating-containers/dependabot/index.md_

[Dependabot](https://docs.github.com/en/code-security/dependabot) is GitHub's dependency update tool. It reads the container image references in your Dockerfiles and Kubernetes manifests, checks the registry for newer tags, and opens pull requests to update them.

This guide explains how to configure Dependabot to authenticate to your organization's private registry at `cgr.dev` so it can keep your references to Chainguard Containers current.

## Choosing between Dependabot and Digestabot

Dependabot and [Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/) solve different halves of the same problem, and many teams run both:

* **Dependabot** opens a pull request when a newer *tag* is available — for example, moving a reference from `go:1.22` to `go:1.26`. Use it to move between version streams.
* **Digestabot** opens a pull request when the *digest* behind a fixed tag changes. Chainguard rebuilds container images daily, so the digest behind a tag such as `latest` or `3.14` changes often. Use Digestabot to pick up those rebuilds.

Dependabot acts on the tag string in your reference. If you pin to a mutable tag and never change that string, Dependabot has nothing to update, and Digestabot is the better fit.

## Prerequisites

To follow this guide, you need:

* A GitHub repository containing at least one reference to a Chainguard container image.
* Access to a Chainguard organization, with permission to create pull tokens.
* `chainctl` installed on your local machine. Refer to [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you haven't set this up.

## Create a pull token

Dependabot authenticates to private container registries with a static username and password. It doesn't support [Chainguard assumable identities](/platform/administration/assumable-ids/assumable-ids/), so you need to create a [pull token](/chainguard/containers/registry/authenticating/#authenticating-with-a-pull-token).

Create one with `chainctl`:

```shell
chainctl auth configure-docker --pull-token --ttl 2160h
```

This command responds with output such as the following:

```shell
To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

The username has the form `<organization ID>/<pull token ID>`. Record both values; you'll store them as secrets in the next section.

The `--ttl` flag sets how long the token stays valid. The example uses `2160h`, or 90 days. The default is `720h` (30 days) and the maximum is `8760h` (one year). Dependabot's authentication fails once the token expires, so choose a lifetime you can commit to rotating, and set a reminder to replace the token before it lapses.

One pull token can serve every repository in your GitHub organization. Storing it as an organization-level secret, rather than creating a token for each repository, leaves you with a single credential to rotate.

## Store the credentials as Dependabot secrets

GitHub keeps Dependabot secrets in a separate store from Actions secrets. A token added to Actions secrets is invisible to Dependabot, and the update job fails to authenticate without a clear explanation.

To add the secrets to a single repository:

1. In your repository on GitHub, go to **Settings > Secrets and variables > Dependabot**.
2. Select **New repository secret**.
3. Name the secret `CHAINGUARD_PULL_TOKEN_USERNAME` and enter the username from the previous section.
4. Select **Add secret**.
5. Repeat these steps to create `CHAINGUARD_PULL_TOKEN_PASSWORD` with the password value.

To share one token across every repository in your GitHub organization, add the secrets at **Settings > Secrets and variables > Dependabot** in the organization's settings instead, and grant access to the repositories that need them.

## Configure Dependabot

Create a file named `.github/dependabot.yml` at the root of your repository with the following content:

```yaml
version: 2

registries:
  chainguard:
    type: docker-registry
    url: cgr.dev
    username: ${{secrets.CHAINGUARD_PULL_TOKEN_USERNAME}}
    password: ${{secrets.CHAINGUARD_PULL_TOKEN_PASSWORD}}
    replaces-base: true

updates:
  - package-ecosystem: "docker"
    directory: "/"
    registries:
      - chainguard
    schedule:
      interval: "daily"
```

This configuration defines a registry named `chainguard`, points it at `cgr.dev`, and authenticates with the secrets you created. The `updates` section tells Dependabot to check the Dockerfiles in the repository root once a day, using that registry.

Adjust `directory` to match where your manifests live, and `interval` to match how often you want pull requests. Refer to GitHub's [Dependabot options reference](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference) for the full set of options.

Commit this file to your repository's default branch.

### Understanding `replaces-base`

Setting `replaces-base: true` tells Dependabot to resolve container image references against `cgr.dev` instead of Docker Hub, the default registry for the Docker ecosystem.

This setting doesn't affect fully qualified references such as `cgr.dev/example.com/go:1.22`, which Dependabot matches by hostname either way. It changes how Dependabot resolves *unqualified* references such as `FROM python:3.13`, which it sends to `cgr.dev` rather than Docker Hub.

Keep `replaces-base: true` when every container image in the repository comes from Chainguard. If the repository also pulls images from other registries, omit the setting so Dependabot resolves each reference against the registry that hosts it:

```yaml
registries:
  chainguard:
    type: docker-registry
    url: cgr.dev
    username: ${{secrets.CHAINGUARD_PULL_TOKEN_USERNAME}}
    password: ${{secrets.CHAINGUARD_PULL_TOKEN_PASSWORD}}
```

{{< alert context="warning" >}}
Omitting `replaces-base` keeps Dependabot working across a mix of registries, but the images it resolves elsewhere remain outside Chainguard's hardening and rebuild process. Container images from other registries are not covered by [Chainguard's CVE SLA](https://www.chainguard.dev/legal/cve-policy). Where a Chainguard equivalent exists, replacing those references and keeping `replaces-base: true` gives you broader coverage.
{{< /alert >}}

## Verify the configuration

Dependabot runs on the schedule you set, but you can trigger a run immediately to confirm that authentication works:

1. In your repository on GitHub, go to **Insights > Dependency graph > Dependabot**.
2. Find the entry for the `docker` ecosystem.
3. Select **Check for updates**.

Select **Last checked** to open the job log. A successful run lists the tags Dependabot found for each image, then opens a pull request for any reference it can update, with a title such as `Bump example.com/go from 1.22 to 1.26`.

## Update digest-pinned references

Chainguard recommends pinning image references to a [digest](/chainguard/containers/troubleshooting/inspecting-containers/) while keeping the tag as a version hint, in the form `cgr.dev/example.com/go:1.22@sha256:...`. Dependabot updates both parts of a reference that's already in this form, as described in [Unique tags](/chainguard/containers/reference/unique-tags/).

Two limits are worth knowing before you rely on this:

* Dependabot updates a digest that's already present, but it won't add one to a reference that has only a tag. Pin the digest yourself the first time. Adding digests automatically is an [open feature request](https://github.com/dependabot/dependabot-core/issues/14065).
* When a reference carries both a tag and a digest, Dependabot [doesn't supersede an open pull request](https://github.com/dependabot/dependabot-core/issues/7387) as newer digests are published. Because Chainguard rebuilds container images daily, use Digestabot for references pinned to a fixed tag.

## Limitations

* **Assumable identities aren't supported.** Dependabot's OIDC authentication covers a fixed set of registries that doesn't include Chainguard, so a pull token is the only option. Refer to GitHub's documentation on [configuring access to private registries](https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/manage-your-dependency-security/configure-access-to-private-registries) for the current list.
* **GitHub-hosted Dependabot only.** Chainguard tests this configuration against Dependabot as hosted by GitHub. Self-hosted and third-party runners may handle credentials differently.

## Troubleshooting

### Authentication fails with `private_source_authentication_failure`

This error means Dependabot reached `cgr.dev` but couldn't authenticate. Check the following, in order:

1. Confirm the secrets are stored under **Dependabot**, not **Actions**. This is the most common cause.
2. Confirm the pull token is still valid. Run `chainctl auth pull-token list` to see the tokens in your organization and when they expire.
3. Confirm the username is the complete `<organization ID>/<pull token ID>` string, including the slash.
4. Test the credentials outside of Dependabot with `docker login cgr.dev --username <identity-id> --password <pull-token>`, followed by a `docker pull` of one of the images in your repository.

### No pull requests appear

If the job log shows a successful run but no pull requests, check the following:

* Dependabot acts on the tag string. A reference pinned to a mutable tag such as `latest` produces no pull requests, because the tag never changes. Use Digestabot for those references.
* Dependabot opens at most five pull requests per ecosystem by default. Raise the `open-pull-requests-limit` option if existing pull requests are holding the queue.
* Unqualified references such as `FROM python:3.13` reach `cgr.dev` only when `replaces-base: true` is set. Otherwise, fully qualify the reference.

## Learn more

* [Using Renovate with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/renovate/) covers the equivalent setup for teams outside GitHub, or teams that want short-lived credentials through an assumable identity.
* [Strategies and tooling for updating containers](/chainguard/containers/security-and-compliance/updating-containers/strategies-tools-updating-images/) compares the wider range of update tools.
* [Authenticating to the Chainguard registry](/chainguard/containers/registry/authenticating/) documents pull tokens and the other authentication options in full.

---

### Using Digestabot with Chainguard Containers
_Path: chainguard/containers/security-and-compliance/updating-containers/digestabot/index.md_

[Digestabot](https://github.com/chainguard-dev/digestabot) is a GitHub Action that keeps digest-pinned container image references current. It reads the references in your repository, looks up the current digest for each tag in the registry, and opens a pull request when a digest has changed.

Chainguard rebuilds container images daily, so the digest behind a tag such as `latest` or `3.14` changes often. Digestabot lets you pin a reference to an exact digest for reproducibility and still pick up each rebuild, with a pull request as the place to test the change before it ships.

This guide explains how Digestabot matches references, how to authenticate it to your organization's private registry at `cgr.dev`, and how to control which files it scans.

## Choosing between Digestabot, Dependabot, and Renovate

These three tools solve different parts of the same problem:

* **Digestabot** opens a pull request when the digest behind a fixed tag changes. Use it to pick up Chainguard's daily rebuilds without changing the tag you depend on.
* **[Dependabot](/chainguard/containers/security-and-compliance/updating-containers/dependabot/)** opens a pull request when a newer *tag* is available, moving a reference from `go:1.22` to `go:1.26`. Use it to move between version streams.
* **[Renovate](/chainguard/containers/security-and-compliance/updating-containers/renovate/)** does both, and it runs outside GitHub as well as inside it.

Many teams run Digestabot alongside one of the others: Dependabot or Renovate moves the tag when a new version stream appears, and Digestabot keeps the digest current in between. Digestabot is also the better fit for a reference pinned to a mutable tag, where the tag string never changes and Dependabot has nothing to act on.

## How Digestabot matches references

Digestabot updates a reference only when it contains both a tag and a digest:

```
cgr.dev/example.com/go:1.22@sha256:0d0e0f5e9b7f8ee0dbcbb6d1c40ad1bbd0da5b2bb56de2b26dfd8ceb8ed69dbb
```

Both parts are required:

* Digestabot never matches a reference with a tag and no digest. It updates a digest that's already there; it doesn't add one.
* Digestabot skips a reference with a digest and no tag, because it has no tag to look up. The job log records `Image <name> in file <file> does not have a tag, ignoring...`.

This is the most common reason a Digestabot run reports nothing to do.

To add digests to references that carry only a tag, use [Frizbee](https://github.com/stacklok/frizbee), as shown in [Reproducible Dockerfiles with Frizbee and Digestabot](https://www.youtube.com/watch?v=FfZZVZ-V5ho). Renovate's `pinDigests` option does the same job; refer to [Pin digests](/chainguard/containers/security-and-compliance/updating-containers/renovate/#pin-digests).

Digestabot also skips two categories of reference regardless of their form:

* Any reference in a file whose path contains `testdata`.
* Any reference whose registry address contains `.local:`, such as `registry.local:5000/example`.

## Prerequisites

To follow this guide, you need:

* A GitHub repository with at least one reference to a Chainguard container image pinned in the `tag@digest` form described in the previous section.
* Access to a Chainguard organization, with permission to create identities, if the images come from a private repository in `cgr.dev`.
* `chainctl` installed on your local machine. Refer to [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you haven't set this up.

Digestabot opens its pull requests with the workflow's `GITHUB_TOKEN`. For that to work, go to **Settings > Actions > General** in your repository and confirm that **Allow GitHub Actions to create and approve pull requests** is selected. If your organization turns this setting off, pass a token from a GitHub App or a `repo`-scoped personal access token through the `token` input instead.

## Authenticate to a private registry

Digestabot reads digests with [crane](https://github.com/google/go-containerregistry), which uses the Docker credential store on the runner. Digestabot has no registry credential input of its own, so it inherits whatever credentials an earlier step configured.

For a private repository in `cgr.dev`, add a [`setup-chainctl`](https://github.com/chainguard-dev/setup-chainctl) step before the Digestabot step. That action authenticates as a [Chainguard assumable identity](/platform/administration/assumable-ids/assumable-ids/) and registers a Docker credential helper for `cgr.dev`, which crane then uses without further configuration.

Digestabot needs no static pull token, which is where it differs most from Dependabot. The identity mints a short-lived token for each run, so there is no credential to store or rotate.

Create an identity for your repository. The `--github-repo` value embeds GitHub's immutable numeric owner and repository IDs; refer to [Finding your repository's numeric identifiers](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers) for how to retrieve them and when the format applies.

```shell
chainctl iam identities create github digestabot \
  --github-repo=<github-org>@<owner-id>/<github-repo-name>@<repo-id> \
  --github-ref=refs/heads/main \
  --role=registry.pull
```

The command returns an identity ID. Record it for the workflow in the next section.

Digestabot only reads image digests, so the `registry.pull` role covers everything it does on its own. [Annotating pull requests with `chainctl images diff`](#annotate-pull-requests-with-chainctl-images-diff) needs a broader role.

## Create the workflow

Create a file named `.github/workflows/digestabot.yaml` with the following content, replacing `<identity-id>` with the ID from the previous section:

```yaml
name: Digestabot

on:
  workflow_dispatch:
  schedule:
    - cron: "0 1 * * *"

permissions:
  contents: read

jobs:
  digestabot:
    name: Digestabot
    runs-on: ubuntu-latest

    permissions:
      contents: write      # Push the branch holding the digest updates
      pull-requests: write # Open the pull request
      id-token: write      # Assume the Chainguard identity and sign commits

    steps:
    - uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
      with:
        egress-policy: audit

    - uses: chainguard-dev/setup-chainctl@2cddd35a2f120d9973e58094dc6878c93cf58c28 # v0.5.1
      with:
        identity: "<identity-id>"

    - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

    - uses: chainguard-dev/digestabot@33d0b78e580aa0c83fe188eb3dfad6611b662479 # v1.3.2
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        labels-for-pr: ''
```

Commit this file to your repository's default branch.

This workflow runs at 1:00 a.m. every day and on demand from **Actions > Digestabot > Run workflow**. Each run authenticates to `cgr.dev` as the identity you created, scans the repository, and opens a pull request titled `Update images digests` on a branch named `update-digests` if any digest has changed.

The example clears `labels-for-pr`, because the default value applies Chainguard's own repository labels — `automated pr`, `kind/cleanup`, and `release-note-none` — which probably don't exist in your repository. Set it to labels you use, or leave it empty.

If your images come from a public repository such as `cgr.dev/chainguard`, drop the `setup-chainctl` step. Digestabot reads public digests without credentials.

### How Digestabot handles repeat runs

Digestabot maintains one pull request rather than opening a new one per run. Each run resets the `update-digests` branch to the base branch, applies the current set of updates, and force-pushes, so an open pull request always reflects the latest digests. If you merge or close that pull request, the next run with pending updates opens a fresh one.

This is worth knowing if you also use Dependabot, which [leaves an open pull request in place](/chainguard/containers/security-and-compliance/updating-containers/dependabot/#update-digest-pinned-references) as newer digests are published.

### Commit signing

Digestabot signs its commits with [gitsign](https://github.com/sigstore/gitsign) by default, which is why the job needs the `id-token: write` permission. GitHub labels these commits as unverified. Refer to [Digestabot's commits show as unverified](#digestabots-commits-show-as-unverified) if a branch protection rule in your repository requires signed commits.

## Choose which files to scan

By default, Digestabot scans files matching `*.yaml`, `*.yml`, `Dockerfile*`, `Makefile*`, `*.sh`, `*.tf`, and `*.tfvars`. It updates digests in Terraform configurations, Makefiles, shell scripts, `ko` configurations, and Kubernetes manifests, not only in Dockerfiles. Any file in the repository that holds a `tag@digest` reference and matches one of these patterns is in scope.

Patterns match file names rather than paths. Digestabot passes each pattern to `find -name`, which compares against the base name of each file, so a pattern such as `manifests/*.yaml` matches nothing. To narrow Digestabot to part of a repository, set `working-dir` to a path relative to the repository root:

```yaml
    - uses: chainguard-dev/digestabot@33d0b78e580aa0c83fe188eb3dfad6611b662479 # v1.3.2
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        working-dir: manifests
        include-files: '*.yaml,Dockerfile*'
```

## Resolve digests through a registry proxy

If you pull Chainguard Containers through a registry proxy, such as a remote repository in Artifact Registry, the proxy can return a stale digest for a tag. The `registry-map` input maps a proxy prefix to the registry behind it, so Digestabot resolves digests against `cgr.dev` while leaving the proxy address in your files:

```yaml
    - uses: chainguard-dev/digestabot@33d0b78e580aa0c83fe188eb3dfad6611b662479 # v1.3.2
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        registry-map: 'us-docker.pkg.dev/my-project/cgr/=cgr.dev/'
```

Provide mappings as comma-separated `proxy=upstream` pairs. Digestabot rewrites the address it looks up, not the reference it writes back, so your files keep pulling through the proxy.

Because the lookups go to `cgr.dev`, the credentials on the runner must grant access there. Keep the `setup-chainctl` step in the workflow even when every reference in your files points at the proxy.

## Extend Digestabot with its outputs

Digestabot reports what it changed in two outputs: `json` describes each update, and `changed_files` lists the files it modified. Combined with `create-pr: false`, which applies the changes in the workspace without opening a pull request, these let you act on an update before it reaches a reviewer:

```yaml
    - uses: chainguard-dev/digestabot@33d0b78e580aa0c83fe188eb3dfad6611b662479 # v1.3.2
      id: digestabot
      with:
        token: ${{ secrets.GITHUB_TOKEN }}

    - shell: bash
      run: |
        while read -r update; do
          updated_image=$(jq -r '.image + "@" + .updated_digest' <<<"${update}")

          echo "Do something with ${updated_image} here."
        done < <(jq -c '.updates // [] | .[]' <<<'${{ steps.digestabot.outputs.json }}')
```

### Annotate pull requests with `chainctl images diff`

[`chainctl images diff`](/platform/chainctl-usage/comparing-images/) compares two container images and reports the packages and vulnerabilities that differ between them. Running it over Digestabot's `json` output turns "test the update before merging" into a summary in the pull request itself: which vulnerabilities the rebuild resolves, which packages changed, and whether the update is worth merging at all.

The [`digestabot-examples`](https://github.com/chainguard-demo/digestabot-examples) repository holds a complete workflow for this in `.github/workflows/chainctl-image-diff.yaml`. It runs Digestabot with `create-pr: false`, verifies that each image is signed by Chainguard, diffs the old and new digests, and discards updates that resolve no vulnerabilities. The same repository has a second workflow that scans each updated image with [Grype](https://github.com/anchore/grype) and comments the results on the pull request.

`chainctl images diff` needs `grype` available on the runner and an identity with a broader role than `registry.pull`; the example workflow uses `viewer`.

## Configuration reference

### Inputs

| Input | Description | Default |
|-------|-------------|---------|
| `working-dir` | Directory to scan, relative to the repository root. | `.` |
| `include-files` | Comma-separated file name patterns to scan. Patterns match base names, not paths. | `*.yaml,*.yml,Dockerfile*,Makefile*,*.sh,*.tf,*.tfvars` |
| `token` | Token used to push the branch and open the pull request. | `${{ github.token }}` |
| `registry-map` | Comma-separated `proxy=upstream` prefix mappings for digest lookups. | None |
| `create-pr` | Whether to open a pull request. Set to `false` to leave the changes in the workspace. | `true` |
| `use-gitsign` | Whether to sign commits with gitsign. | `true` |
| `signoff` | Whether to add a `Signed-off-by` line to the commit message. | `false` |
| `author` | Commit author, in the form `Display Name <email@address.com>`. | The user who triggered the run |
| `committer` | Committer, in the form `Display Name <email@address.com>`. | `github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>` |
| `branch-for-pr` | Branch that carries the updates. | `update-digests` |
| `title-for-pr` | Pull request title. | `Update images digests` |
| `description-for-pr` | Pull request body. Digestabot appends the diff to whatever you set. | `Update images digests` |
| `labels-for-pr` | Comma- or newline-separated labels to apply to the pull request. | `automated pr, kind/cleanup, release-note-none` |
| `commit-message` | Commit message. | `Update images digests` |

### Outputs

| Output | Description |
|--------|-------------|
| `json` | The updates Digestabot made. Each entry in `updates` has a `file`, `image`, `digest`, and `updated_digest`. |
| `changed_files` | Newline-separated list of the files Digestabot modified. |
| `pull_request_number` | Number of the pull request Digestabot opened or updated. |

## Troubleshooting

### Digestabot's commits show as unverified

Digestabot signs its commits with gitsign, which uses Sigstore's certificate authority. GitHub doesn't recognize that authority, so it marks the commits **Unverified**. The signature is valid; the badge reflects GitHub's trust configuration rather than a problem with the commit.

This matters when a branch protection rule requires signed commits, because the rule then blocks Digestabot's pull requests from merging. You have two options:

* Sign the commits with a GPG key that GitHub recognizes. Set `create-pr: false` so that Digestabot only edits the files, then import a key and create the pull request in later steps. Chainguard recommends [keyless signing](/open-source/sigstore/cosign/an-introduction-to-cosign/) where you have the choice, so treat this as a way to satisfy the branch protection rule rather than an improvement.
* Set `use-gitsign: false` to leave the commits unsigned, if your repository doesn't require signed commits and you'd rather not carry signatures GitHub can't verify.

### Digestabot opens no pull requests

If the job succeeds but no pull request appears, check the following:

* **The form of the reference.** Digestabot updates only references carrying both a tag and a digest. Refer to [How Digestabot matches references](#how-digestabot-matches-references).
* **The file name.** `include-files` patterns match base names, so Digestabot never reads a reference in a file the patterns don't cover. Refer to [Choose which files to scan](#choose-which-files-to-scan).
* **The repository setting.** Confirm that **Allow GitHub Actions to create and approve pull requests** is selected, as described in [Prerequisites](#prerequisites).
* **An existing pull request.** Digestabot updates an open `update-digests` pull request in place instead of opening a second one.

### Digest lookups fail

The job summary records `Failed to retrieve digest info for <image>` for each reference Digestabot couldn't resolve, followed by the error from the registry. Check the following, in order:

1. Confirm that the `setup-chainctl` step runs before the Digestabot step and completes successfully.
2. Confirm the identity has the `registry.pull` role and access to the repository holding the image. Run `chainctl iam identities list` to review the identities in your organization.
3. Test the reference outside the workflow. Run `chainctl auth configure-docker`, then `crane digest <reference>` or `docker pull <reference>`.
4. If you pull through a registry proxy, confirm whether the lookups need [`registry-map`](#resolve-digests-through-a-registry-proxy).

## Video overview

This 2024 video introduces the problem Digestabot solves, using a digest-pinned multi-stage Python build as the example. The configuration in this guide has moved on since the recording, but the reasoning holds.

{{< youtube 7WvzkwS9yms >}}

{{< details "Transcript" >}}
Today, I'd like to talk about a common question I get asked.

How can you keep images up to date while avoiding breaking changes?

The basic issue is that we'd like to make sure we're getting the latest security updates and features for our software.

But we really don't want our applications and infrastructure to break unexpectedly.

So there's a tension between updating all the time, which gives you the latest code and limits unexpected breakages.

In this example, we have a multi-stage Python build using Chainguard Container which are pinned to Digest.

Now, Digests are content-based hashes of images.

So if you reference an image by Digest, you will always get exactly the same image every time.

Now, this is fantastic for reproducibility.

As I know, if anybody uses this Dockerfile, they will get exactly the same images that I was using.

And this is especially important in Python, where if the version changes, so we go from Python 3.12 to Python 3.13, you might find that various libraries don't work until they're updated.

Now, how do you do updates then?

Well, you could manually go in and change, bump this Digest yourself.

But we've got a better solution for you that I want to talk about briefly today, and it's called Digestabot.

Digestabot is a GitHub action that can be set to run on a cron job and will open a PR when it detects there's a newer version of the image available.

You can then test the image to make sure it works with your application before merging the PR.

So for my example, it would check the Chainguard registry for the current digest of the latest tag and open a PR if it doesn't match the digest in the file.

We use Digestabot internally at Chainguard, and this pattern nicely balances the tension between keeping images up to date and vulnerability-free with the need to test and verify changes before shipping to production.

So please try it out and let me know if you have any questions.
{{< /details >}}

## Learn more

* [Using Dependabot with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/dependabot/) covers the tool to pair with Digestabot for moving between version streams.
* [Using Renovate with Chainguard Containers](/chainguard/containers/security-and-compliance/updating-containers/renovate/) covers the equivalent setup for teams outside GitHub.
* [Strategies and tooling for updating containers](/chainguard/containers/security-and-compliance/updating-containers/strategies-tools-updating-images/) compares the wider range of update tools.
* [Considerations for keeping containers up to date](/chainguard/containers/security-and-compliance/updating-containers/considerations-for-image-updates/) covers the tradeoffs behind an update policy.
* [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/) explains what a digest is and why pinning to one matters.

---

### FedRAMP technical considerations and risk factors
_Path: chainguard/containers/security-and-compliance/fedramp-considerations/index.md_

Many frequently asked questions revolve around how organizations are meant to stay on top of the changing landscape for FedRAMP, PMOS, Revisions, and Certificates. This article outlines various considerations and risk factors that organizations should keep in mind when working to become and stay FedRAMP authorized.

## Important considerations for PMO revision trends

There are a number of things one should keep in mind when analyzing revision trends from the FedRAMP Program Management Office (PMO) — which oversees the development of the FedRAMP program — and the changes in [FIPS 140-3](https://csrc.nist.gov/projects/fips-140-3-transition-effort). The following are of particular importance:

* FedRAMP authorization has tended to only include external customer communication under scope. Now, though, the FedRAMP PMO is expecting both external and internal communications in scope.
* Customers will be now be required to provide an authorization boundary diagram with an associated network diagram that shows all FIPS encrypted flows:
    * Anything that isn’t encrypted needs to be explicitly highlighted.
    * Auditors will ask that these diagrams and flows not just show this but, in some cases, to prove this during the audit with observed testing scenarios.
* Notable Revision 5 Changes ([Rev 5 - appendix queue](https://web.archive.org/web/20250214120456/https://www.fedramp.gov/blog/2023-05-30-rev-5-baselines-have-been-approved-and-released/):
    * Customers must list every client and server communication in the infrastructure and which FIPS module is being used.
    * DoD Security Technical Implementation Guides (STIGs) can be required, although CIS Level 2 benchmarks are accepted if a STIG does not exist, marking a change from Revision 4 which only required CIS Level 1 benchmarks.
* In order to get FIPS validated, libraries need to be assessed by one of thirteen authorized labs:
    * National Institute of Standards and Technology ([NIST](https://www.nist.gov/)) labs are overwhelmed, as there is a large influx of 140-2 demand but limited supply for approval on certification.

While FIPS 140-3 is not immediately on the horizon for 2025, it will become the law of the land in 2026. As organizations begin analyzing their requirements and architecture constraints this year, it will be crucial to review and plan for the upcoming changes that are outlined in this section.

## Ongoing FIPS maintenance risks (and how Chainguard can help)

An organization's upfront FIPS configuration is important, but the real difficulties often come later on. While organizations frequently pass an audit with their initial configuration, there is a high level of risk associated with ongoing maintenance. This section highlights some of the risks associated with ongoing FIPS maintenance and how Chainguard can resolve them.

### Initial configuration vs continued maintenance risk

The need to maintain FIPS across updates and versions with the dynamically changing nature of applications built on open source software within containers places a heavy burden on engineers. Likewise, the need to continuously validate cryptographic operations across various base images can pose significant risk to applications breaking or products going down across version updates and new releases. Additionally, certificates often expire and it is difficult to keep track of this at scale and update FIPS modules accordingly, presenting a heavy workload for compliance teams.

Critical vulnerabilities often present themselves in the critical path for the organizations requiring a detailed Plan of Action and Milestones (POAM) and remediation efforts beyond the initial FIPS configuration. With Chainguard, there is a single partner to hold accountable, as we offer enterprise SLAS that can take the place of expensive and costly operations to do this manually. This includes 7 days for Critical, and 14 days for High, Medium, Low. This allows the initial CVE count to remain close to 0 during auditing events, but also accounts for any future CVEs that might show up within the ATO boundary.

### FIPS expertise and resource challenges

Typically, an organization must oversee several key resources with advanced expertise to manage the ongoing configuration and maintenance of a FIPS or FedRAMP Authorization to Operate (ATO). However, this is not always translated across developers, application owners, and security teams. This problem scales with more images and boundaries under consideration. For a fixed fee per image, Chainguard will solve this problem by being directly responsible for the build and maintenance of all FIPS images in use, leveraging in-house expertise across a broad set of domains

### Quality testing for immediate use of Chainguard-provided FIPS images

One of the hardest things to consider when moving an images program to leverage a CMVP-certified FIPS module is to accommodate all of the differences across programming languages and image types.

To solve this, Chainguard provides not only the initial configuration, but the ongoing quality and functional testing across programming languages and application specific requirements for FIPS, to ensure that organizations only have to worry about running their services on these images. This includes a broad test suite across version updates while balancing the trade-offs between CVE fixes and limiting breaking changes to the running applications.

### Application-specific open source software

While FIPS modules can be easier to implement within the base layer of an image, application-specific projects within the open source community are entirely maintained by the respective community maintainers and project owners. This means that FIPS considerations vary dramatically across these projects. Building these application images on top of existing FIPS-base images presents significant risk and additional cost associated with ensuring it is compliant through FTE efforts.

Furthermore, many open source projects, such as Cassandra, cannot even support FIPS validation in their current state until they change the architecture and source code to be able to support this. Knowing which projects can support FIPS and which cannot is very useful in analyzing images within scope. Since Chainguard’s catalog consists of 100s of FIPS validated images, we have done the heavy lifting of this analysis, and continue to do so for new requests from our customers.

## Revision 5 key requirements solved with Chainguard container images

Using Chainguard Containers eliminates the manual toil of container security hassles. Hardened and low CVE images save you time and money by making sure you always meet the security standards needed for government work.

The following table highlights the features of Chainguard Containers as mapped to FedRAMP Revision 5's baselines:

<table>
  <thead>
    <tr>
      <th scope="col">Features</th>
      <th scope="col">Rev 5 control</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <strong>Continuous vulnerability management and automation</strong>
        <ul>
          <li><strong>Almost no vulnerabilities:</strong> We start with images that have very few to no known vulnerabilities, helping to pass security checks easily.</li>
          <li><strong>Automatic fixes:</strong> Our system automatically finds and fixes vulnerabilities, providing a 7 day SLA on critical severity CVEs, 14 for High/Medium/Low.</li>
          <li><strong>Security advisories:</strong> We keep our users updated with the latest security advice, helping them stay informed about any risks.</li>
        </ul>
      </td>
      <td>
        <ul>
          <li>RA-5 Vulnerability Scanning</li>
          <li>CA-7 Continuous Monitoring</li>
          <li>SI-2 Flaw Remediation</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>
        <strong>Secure by default</strong>
        <ul>
          <li><strong>Minimal images:</strong> built to be safe from the start. We include only what is required to run the application.</li>
          <li><strong>Strong encryption:</strong> We use FIPS validated cryptography providers OpenSSL and Bouncy Castle, which are what the government requires to keep data safe.</li>
          <li><strong>Hardened</strong> to container security best practices with an associated STIG.</li>
        </ul>
      </td>
      <td>
        <ul>
          <li>SA-10 Developer Configuration Management</li>
          <li>SA-11 Developer Security Testing and Evaluation</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>
        <strong>Asset management best practices</strong>
        <ul>
          <li><strong>Build time SBOMs for each image:</strong> For every image we build, we provide a detailed list with all components inside, making it easy to understand and check.</li>
          <li><strong>OCI standard images:</strong> Our images are built following OCI specifications, ensuring they work well in any standard environment.</li>
          <li><strong>Signed with Sigstore:</strong> Our images, attestations, and SBOMs are signed using Sigstore, proving they haven't been tampered with from the time we built them.</li>
        </ul>
      </td>
      <td>
        <ul>
          <li>SC-8 Protection of Information in Transit</li>
          <li>SC-28 Protection of Information at Rest</li>
        </ul>
      </td>
    </tr>
  </tbody>
</table>
<br />

Additionally, Chainguard helps support CM-6 configuration settings requirements. Chainguard announced the release of a STIG for the General Purpose Operating System (GPOS) SRG which specifies security requirements for general purpose operating systems running in a network. The goal for this STIG is that it will help customers confidently and securely integrate Chainguard Containers into their workflows. Please refer to our [STIGs overview](https://edu.chainguard.dev/chainguard/containers/working-with-images/image-stigs/#how-stigs-can-be-used-to-harden-images) for more information.

## Kernel-independent FIPS container images

Cryptographic protection relies on the secure implementation of a trusted algorithm and a random bit generator that cannot be reasonably predicted at any greater accuracy than random chance. To certify these implementations, NIST operates a cryptographic certification program called the Cryptographic Module Validation Program ([CMVP](https://csrc.nist.gov/projects/cryptographic-module-validation-program)). CMVP validates that implementation is compliant with the relevant standards:

* For algorithm implementation, CMVP requires strict compliance with [FIPS standards](https://csrc.nist.gov/publications/fips). Thus FIPS modules must sit inside a self-verified cryptographic boundary.
* For random bit generators, CMVP requires strict compliance with [SP 800-90B](https://csrc.nist.gov/pubs/sp/800/90/b/final) recommendations and permits entropy sources to sit either inside or outside the FIPS cryptographic boundary.
Traditionally, to meet these compliance requirements, containers would access an SP 800-90B compliant entropy source provided by a certified kernel, as in this diagram:

<center><img src="fedramp-considerations-2.png" alt="Diagram labeled 'FIPS Module + SP 800-90B Entropy Source'. The diagram shows two boxes labeled 'Container Image' and 'Host OS Linux Kernel.' The 'Container Image' box holds two boxes within it labeled 'Application' and 'FIPS Module,' with 'FIPS Module' surrounded by a rectangle labeled 'FIPS Cryptographic Boundary.' The 'Host OS Linux Kernel' box contains a box labeled 'Kernel FIPS Module' and a cylinder labeled 'SP 800-90B Entropy Source,' both of which are surrounded by a rectangle labeled 'FIPS Cryptographic Boundary.' An arrow points from the 'Application' to the 'FIPS Module' and from the 'FIPS Module' to the 'Entropy Source.'" style="width:1050px;"></center>
<br />

This architecture drives significant friction for vendors delivering FIPS compliant workloads for  modern cloud-native applications. First, very few versions of the Linux Kernel are certified. Second, Linux Kernel certification timelines are often long and arduous.
Ultimately, this results in a very limited choice of certified runtimes and compatible underlying hardware for developers to build on. In practice, it means that a certified kernel from a given vendor might be over 5 years old. Outdated kernels typically lack support and optimizations for the latest generation of hardware, and are often incompatible with the latest cloud instance types. It also means when sticking to the same vendor, the application runtimes are equally as out of date and vulnerable.
Chainguard's solution has the FIPS module and the SP 800-90B entropy source co-located in the container image userspace. This eliminates the need for a certified Linux kernel for the majority of workloads and streamlines engineering effort for workload deployments. This is why Chainguard FIPS images now ship with a certified userspace SP 800-90B entropy source, as in this design:

<center><img src="fedramp-considerations-3.png" alt="Diagram labeled Kernel Independent FIPS Container Images. The diagram contains a box labeled 'New Chainguard FIPS Container Image' which contains three objects: a box labeled 'Application', a box labeled 'FIPS Module' (which is surrounded by a rectangle labeled 'FIPS Cryptographic Boundary') and a cylinder labeled 'SP 800-90B Entropy Source.' An arrow points from 'Application' to 'FIPS Module,' and another arrow points from 'FIPS Module' to the 'Entropy Source' cylinder." style="width:1050px;"></center>
<br />

This means that the entropy source is now independent of the hardware or cloud environment. Essentially, you can have FIPS on any host OS, kernel, and hardware. You can even have FIPS on managed cloud kubernetes platforms like GKE, EKS, and AKS. Note that this solution has been tested by two NIST labs and [certified with its own CMVP](https://csrc.nist.gov/projects/cryptographic-module-validation-program/entropy-validations/certificate/191).

For more information, please refer to the CMVP entries for Chainguard's FIPS Modules and entropy source:

* OpenSSL FIPS 3.0 Provider Module (CMVP #4856)
* Bouncy Castle FIPS Java API (CMVP #4743 [historical: CMVP #4616])
* Chainguard CPU Time Jitter RNG Entropy Source ([ESV Entropy Certificate #E191](https://csrc.nist.gov/projects/cryptographic-module-validation-program/entropy-validations/certificate/191))

Additionally, check out our blog post on [Kernel-Independent FIPS Containers](https://www.chainguard.dev/unchained/kernel-independent-fips-images).

## Conclusion

While FIPS 140-2 has become relatively familiar to organizations, it still presents a set of complex challenges for those trying to achieve FedRAMP authorization. With the broad adoption of open source development on container images across development teams beginning to accelerate, the problem of configuring and maintaining FIPS modules within a broad suite of images becomes nearly intractable. Skill gaps and resource shortages further exacerbate the ability to keep up with this demand; and this problem will only get worse when 140-3 becomes the law of the land in 2026.

The Rev-5 changes signal a continued trend in the market: as PMOs get better at understanding the state of modernized applications running on containers, and how the architectures interact with the services running, requirements are only becoming more granular.  As a result, further documentation and proof will be required by organizations who are seeking to implement FIPS within their container environments. This puts pressure on organizations to fill skill gaps, increase the spend going towards FedRAMP programs, and de-risk ongoing assessments to maintain compliance.

Chainguard offers an off-the-shelf solution for customers to run their applications on preconfigured and continuously maintained FIPS validated images so that they do not have to incur these costs or associated risks. As a result, Chainguard has helped customers achieve Moderate and High impact levels with very low engineering lift. With this comes the peace of mind knowing that you have a single partner responsible for building and supplying the key images needed to be successful in FedRAMP endeavours.

---

### False positives and false negatives with container image scanners
_Path: chainguard/containers/security-and-compliance/working-with-scanners/false-results.md_

A *vulnerability scanner* is a tool that analyzes your software components and reports any [CVEs](/software-security/cves/cve-intro/) it finds. Using a vulnerability scanner to find CVEs that impact your system is a critical step in [software vulnerability remediation](/software-security/cves/cve-remediation/), but as you begin to triage scanner-reported vulnerabilities, you may find that your scanner's results are not perfectly accurate.

The goal of a vulnerability scanner is to identify the vulnerabilities that impact your container images, which can be considered *true positive vulnerabilities*. Sometimes, a scanner surfaces CVEs which are not actually impacting your images, which are called *false positive vulnerabilities*. Your scanner may even miss some vulnerabilities that are impacting you, termed *false negative vulnerabilities*.

The presence of false positive and negative vulnerabilities can add a tricky layer to the vulnerability remediation process. False positive vulnerabilities can be "noisy" and distract you from remediating the vulnerabilities that are actively impacting your containers. Additionally, false negative vulnerabilities can silently affect you, making them a hidden threat to your container image security.

This article aims to explain the formation of false positive and false negative vulnerabilities, allowing you to better understand what they mean, how they impact you, and how you can use tools to fine-tune your scanner to improve the accuracy of your scan results.

> To learn more about why scan results may differ between your scanner and the Chainguard Console, refer to [the support article "Understanding Vulnerability Scanner Discrepancies with Chainguard Images."](https://support.chainguard.dev/hc/en-us/articles/49564106705819-Understanding-Vulnerability-Scanner-Discrepancies-with-Chainguard-Images)

## How false positives and false negatives occur

Understanding how false positives and negatives occur first requires insight into how scanners operate.

A vulnerability scanner starts by ingesting various *vulnerability databases*. A vulnerability database (such as the [National Vulnerability Database](https://nvd.nist.gov/)) is home to information regarding causes, impacts, and security advisories for software vulnerabilities. A container image scanner will often use multiple vulnerability databases as references for what software components may be vulnerable. Different databases may focus on documenting vulnerabilities for certain software vendors or products. As a result, collecting vulnerability data from numerous sources allows a scanner to identify a more exhaustive selection of vulnerabilities across software components.

When you conduct a vulnerability scan on your container images, the scanner attempts to detect what packages comprise the image. It does so by sifting through the images' source code and files introduced by package managers in search of open source software components. If successful, the scanner collects key metadata (such as package names and versions) that can be referred to later. It will then compare this metadata with the various databases it references in an attempt to determine if any packages in the software are affected by vulnerabilities.

Due to the complexity of cross-referencing image components against databases, scanners are not infallible. Sometimes vulnerabilities are misidentified — or even missed entirely. There are multiple ways in which this can occur throughout the scanning process from start to finish.

### Scanner-level issues

Vulnerability scanners may be unable to consistently detect container components, causing the results of scans to be incomplete or inaccurate. Scanners often rely on package managers and package metadata to catalog the parts of a container. If a scanner cannot collect complete information about package metadata the results of the scan may not reflect the true contents of the image. For example, if a package in a container is not tracked by a package manager, it may go undetected, so vulnerabilities contained within are not reported.

For an in-depth discussion of how scanners fail to collect certain information, we encourage you to check out our [blog post on "Software Dark Matter"](https://www.chainguard.dev/unchained/software-dark-matter-is-the-enemy-of-software-transparency?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

### Program scope

Some reported vulnerabilities may be falsely positive because they are detected outside of the scope of your container images. For example, a container may have packages in it which have vulnerabilities, though the [specific vulnerable functions](https://www.chainguard.dev/unchained/stemming-the-tide-of-false-positive-vulnerabilities?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) may not be called or reachable by your images. As a result, these vulnerabilities may pop up in your scans despite your program not interacting with their vulnerable sources.

It is worth noting that these false positive vulnerabilities could impact you if other vulnerabilities are leveraged to access them, so they are not negligible. However, such a situation arises infrequently as a result of the exploitation of other vulnerabilities, which are first in a line of defense.

### Missing or mismatched information

Inconsistencies in package versioning conventions may cause scanners to fail in detecting the correct versions of your software components. Software vendors choose different version naming schemes for their products, so scanners may not easily detect what package versions are in use. Alternatively, missing or inconsistent data on vulnerable package versions in vulnerability databases can have a similar effect. In both cases, your scanner may struggle in correlating the package version in your container to package versions in vulnerability records, producing false positives and negatives where components are mismatched.

### Go components reported as `(devel)`

Some Go binaries report their module version as `(devel)` instead of a release version. This commonly occurs when a binary is built without release-version metadata. A component catalog can show the pattern like this:

```output
NAME          VERSION  TYPE
cmd/addr2line  (devel)  go-module
cmd/asm        (devel)  go-module
cmd/buildid    (devel)  go-module
cmd/cgo        (devel)  go-module
cmd/compile    (devel)  go-module
...
```

This is component-catalog output, not a list of confirmed vulnerabilities. The important signal is the combination of a Go component type and the literal `(devel)` version.

When a scanner cannot map `(devel)` to a concrete module version, it may be unable to compare the component with fixed-version ranges. The scanner can then report every CVE known for that module, including CVEs that do not apply to the exact source revision or binary being scanned. Treat this pattern as a version-metadata limitation to investigate, not as proof that every reported CVE is present.

#### How to investigate a `(devel)` result

1. Confirm the component name, module path, and component type in the scanner or SBOM output.
2. Confirm that the finding is a Go module or binary component, not an APK package with a similar name.
3. Inspect the binary’s embedded Go build metadata, or the build configuration that produced it, to determine whether a release or commit version is available.
4. Compare the scanner’s affected and fixed-version ranges with the source revision or release used to build the binary.
5. Rebuild with version metadata when possible, then regenerate the SBOM and rescan.
6. If the scanner still reports the CVEs, provide the image digest, binary or module name, reported `(devel)` version, scanner and database versions, and the relevant scan output when requesting support.

Do not use `chainctl images advisories list` to validate this finding; that command checks APK packages only. For a Go-module finding, use the scanner’s language-package evidence and the dependency’s upstream advisory data.

### SCA vs SAST tools

[Software Composition Analysis (SCA)](https://snyk.io/series/open-source-security/software-composition-analysis-sca/) tools focus on the detection and assessment of open source software components, making them ideal for container image scans. SCA tools cross-reference package metadata with vulnerability databases to determine if vulnerabilities are present. However, in situations where SCA tools cannot match a package to its entries in a vulnerability database, false negatives can occur.

[Static Application Security Testing (SAST)](https://owasp.org/www-community/Source_Code_Analysis_Tools) tools scan your proprietary software to search for vulnerabilities. They provide guidance on how to modify code to resolve a given vulnerability. However, SAST tools lack context surrounding the software's behavior at runtime, giving an incomplete analysis of how the software may function. Without a comprehensive view of the software's anatomy and use, many false positive vulnerabilities [occur in SAST scans](https://blog.checkpoint.com/security/avoiding-false-positive-the-silent-sast-killer/).

To learn how to choose the right scanner method for your application, check out [this comparison of SCA and SAST scanning tools](https://github.blog/2022-09-09-sca-vs-sast-what-are-they-and-which-one-is-right-for-you/
).

## Impacts of false positives and false negatives

False positive vulnerabilities are [red herrings](https://en.wikipedia.org/wiki/Red_herring): They look important, but take you away from the vulnerabilities which truly matter. Identifying what vulnerabilities are true and false positives can be difficult, as your false positive results are mixed in with other true positive finds. When dealing with hundreds of vulnerabilities, the [costs of extensive triage and remediation [PDF]](https://media.bitpipe.com/io_15x/io_152272/item_2184126/ponemon-state-of-vulnerability-response-.pdf) can add up fast.

False negative vulnerabilities can have major impacts on a system if they are not discovered. They are a goldmine for attackers if they find them before you do. The successful exploitation of a false negative vulnerability can result in a *zero-day attack*. A [zero-day attack](https://usa.kaspersky.com/resource-center/definitions/zero-day-exploit) occurs when an adversary exploits a vulnerability in software which the maintainer is unaware of. This can cause the attack to go unnoticed or unresolved until the vulnerability is discovered. Many [infamous CVEs](/software-security/cves/infamous-cves/), such as Log4Shell, are examples of incredibly impactful zero-day vulnerabilities.

The presence of false positive and negative vulnerabilities in your scans add another unnecessary layer of complexity to the remediation process. Having an unreliable scanner can increase the amount of time you spend filtering out false positive results, giving you less time to focus on the true positives affecting you. Additionally, an inconsistent scanner reduces your confidence in the completeness and accuracy of your scans, making it difficult to determine if false negatives are lurking among your containers.

## Reducing false results

Unfortunately, there is no single way to stop false positives and false negatives from occurring in your vulnerability scans. Triaging reported vulnerabilities will always be necessary to determine what vulnerabilities need to be addressed based on their severity. However, steps can be taken to reduce the overall number of false positive and negative results that surface.

### SBOMs, purls, and VEX

An SBOM, or [Software bill of materials](/open-source/sbom/what-is-an-sbom/), is a helpful document that catalogs the packages and components of your software in a machine-readable format. Using an SBOM can improve your vulnerability scans as package information is stored in one place, so scanners don't have to hunt down and risk missing component information throughout your software. There are [different ways to generate an SBOM](/open-source/sbom/what-makes-a-good-sbom/) in order to improve their comprehensiveness and utility.

To address the inconsistencies caused by software vendors using proprietary version naming schemes, adopting the [purl specification](https://github.com/package-url/purl-spec) can help. A purl, or package URL, aims to standardize versioning by outlining a convention that incorporates pertinent package information in every identifier. Using purls can [reduce the number of false positives which surface](https://www.chainguard.dev/unchained/a-purl-of-wisdom-on-sboms-and-vulnerabilities?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) by making it easier for scanners to align version information between data sources.

[Vulnerability Exploitability eXchange (VEX) [PDF]](https://www.cisa.gov/sites/default/files/2023-01/VEX_Use_Cases_Aprill2022.pdf) documents can provide helpful insight about the status of software vulnerabilities in a product. VEX documents allow developers to report the exploitability status of a vulnerability in a product through the use of identifiers. Using VEX can streamline the triage and remediation process by making it simpler to determine when action is needed for a given vulnerability.

One way to leverage VEX documents is through [OpenVEX](https://github.com/openvex), an open source implementation of the VEX specification. OpenVEX offers a set of tools to make ingesting and manipulating VEX documents easier. To learn more, check out our article on [getting started with OpenVEX](/open-source/sbom/getting-started-openvex-vexctl/).

### Hardened base images

A primary cause of large vulnerability counts reported in scanners is the dead weight caused by unnecessary dependencies. Many popular container images contain hundreds of packages, each with their own potential to introduce vulnerabilities, both true and false positives. Having so much noise to sift through draws out the vulnerability management process.

[Chainguard Containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement), built on the [Wolfi un-distro](/open-source/wolfi/), can help you reduce your CVE count dramatically by keeping things minimal. By bundling only what is necessary to run the image, Chainguard Containers are hardened and lightweight in comparison to their counterparts. To learn more about how Chainguard Containers can help you achieve low (or zero!) CVEs in your containers, check out our [documentation](/chainguard/containers/overview/).

### Updating and rebuilding images

Updating your container images to utilize recent stable package releases can help reduce the number of vulnerabilities found in your images. Research from [Chainguard Labs](https://www.chainguard.dev/labs?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) has shown that [popular container images accumulate about one CVE per day](https://www.chainguard.dev/unchained/enforce-against-vulnerability-sprawl-with-up-to-date-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) when not updated. In many cases, updating packages and rebuilding your images to incorporate them can readily resolve numerous vulnerabilities with released fixes. This may resolve false positive vulnerabilities outside of your program scope, allowing you to focus on the true positives which still remain.

## Learn more

With false results mixed into your scans, triaging and addressing true positive vulnerabilities can quickly become a time-consuming task. Taking steps to adjust your scanner can help reduce the deluge of false positives and negatives clouding your scans, bringing you closer to securing your software.

In this article, you learned how false results from your vulnerability scanners can occur, and how they can impact your development workflow. Additionally, you explored various ways you can improve the accuracy of your scanner through the application of tools like VEX, rebuilding your images, and choosing a base image suitable for your applications.

To learn more about reducing false positives and negatives in your images, you can check out our [collection of articles on SBOMs and VEX](/open-source/sbom/), read about [selecting a base image](/software-security/selecting-a-base-image/) for your applications, or discover how Chainguard Containers can help you [reach zero CVEs in your containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

---

### Using Grype to scan software artifacts
_Path: chainguard/containers/security-and-compliance/working-with-scanners/grype-tutorial/index.md_

[Grype](https://github.com/anchore/grype) is a vulnerability scanner for container images and filesystems developed and maintained by [Anchore](https://anchore.com/) and written in the Go programming language. Grype can scan from Docker, OCI, Singularity, podman, image archives, and local directory. Grype is compatible with SBOMs generated by [Syft](https://github.com/anchore/syft), and Grype's [vulnerability database](https://github.com/anchore/grype-db) draws from a wide variety of sources.

Grype is appropriate for one-off detection for manual CVE mitigation and in automated use in CI pipelines. Chainguard maintains a [low-to-no CVE Chainguard Image for Grype](https://images.chainguard.dev/directory/image/grype/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-scanners-grype-tutorial) based on our lightweight Wolfi distribution.

## Installation

### Container images

Grype is readily available as a container image. To pull the low-to-no-CVE Chainguard Container for Grype and perform a scan on the official Docker nginx image, run the following:

```bash
docker run -it cgr.dev/chainguard/grype nginx
```

Alternatively, you can scan using the official Grype Docker image:

```bash
docker run -it anchore/grype:latest nginx
```

### Binary installation

Grype provides an installation script. To use it, change the path following the `-b` flag to a preferred installation location on your system path, such as `/usr/bin`.

```bash
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
```

Alternatively, find and download the appropriate package file or binary from the [official releases page](https://github.com/anchore/grype/releases). Place the binary on your system path or install the package using the conventions for your OS and distribution.

### Install via package manager

Grype can be installed using the following commands specific to your OS and distribution:

#### Homebrew

```bash
brew tap anchore/grype
brew install grype
```

#### Chocolatey

```cmd
choco install grype -y
```

## Basic usage

Throughout this tutorial, we'll use the `grype` command to run Grype. If you're running Grype as a container image, replace this command with the appropriate `docker run` command, such as `docker run -it cgr.dev/chainguard/grype`.

### Scan an image in a registry

To run Grype on an image on Docker Hub, pass the image name as an argument:

```bash
grype nginx
```

For images on other registries:

```bash
grype cgr.dev/chainguard/nginx
```

### Scan a .tar file

To scan an image stored to `.tar`, pass the path to the archive file as an argument:

```bash
docker pull cgr.dev/chainguard/nginx
docker save cgr.dev/chainguard/nginx > nginx_chainguard_image.tar.gz
grype nginx_chainguard_image.tar.gz
```

### Scan a local directory

Grype can scan local directories, such as Python virtual environments (venv) or `node_modules` folders.

To try it out, start by creating a Python virtual environment:

```bash
python -m venv venv
```

Add a few out-of-date packages that will show vulnerabilities:

```bash
./venv/bin/pip install WTForms==2.3.3 Werkzeug==2.0.1
```

Scan the virtual environment folder by passing the folder path to Grype as an argument:

```bash
grype venv
```

We can do the same with node modules in a `node_modules` folder. First, create an empty project folder and change the working directory to that folder:

```bash
mkdir node_project && cd node_project
```

Next, initialize npm with a default configuration:

```bash
npm init -y
```

Install a package with known vulnerabilities. The 6.5.2 version of the `qs` query string parser has a known vulnerability [allowing for prototype poisoning](https://security.snyk.io/package/npm/qs/6.5.2).

```bash
npm install qs@6.5.2
```

Finally, use Grype to scan the current working directory:

```bash
grype .
```

### Scan from an SBOM

Grype can read vulnerabilities from SBOMs generated by [Syft](https://github.com/anchore/syft). SBOMs can be piped into Grype using stdin:

```bash
syft -o syft-json python > sbom.json
cat sbom.json | grype
```

You should see Grype results based on the packages itemized in the SBOM.

## Comprehending Grype output

By default, Grype output is divided into two sections: a summary of information on the scanned artifact and an itemized list of CVEs.

 In this section, we'll use an Alpine version of the official Python image as an example. Since we're specifying an older version, you may encounter more CVEs when following the examples than are shown here, as CVEs will accumulate on an image over time.

Scan the image with the following command:

```bash
grype python:3.10.14-alpine3.20
```

You will receive output similar to the following:

```
 ✔ Vulnerability DB                [no update av
 ✔ Parsed image                    sha256:f48490
 ✔ Cataloged contents              09feb83998b9d
   ├── ✔ Packages                        [47 pac
   │     └── ⠹ Linux kernel cataloger
   ├── ✔ File digests                    [659 fi
   ├── ✔ File metadata                   [659 lo
   └── ✔ Executables                     [144 ex
 ✔ Scanned for vulnerabilities     [10 vulnerabi
   ├── by severity: 0 critical, 1 high, 8 medium
   └── by status:   7 fixed, 3 not-fixed, 0 igno
NAME           INSTALLED   FIXED-IN    TYPE    VULNERABILITY        SEVERITY
busybox        1.36.1-r28  1.36.1-r29  apk     CVE-2023-42365       Medium
busybox        1.36.1-r28  1.36.1-r29  apk     CVE-2023-42364       Medium
busybox-binsh  1.36.1-r28  1.36.1-r29  apk     CVE-2023-42365       Medium
busybox-binsh  1.36.1-r28  1.36.1-r29  apk     CVE-2023-42364       Medium
pip            23.0.1      23.3        python  GHSA-mq26-g339-26xf  Medium
python         3.10.14                 binary  CVE-2023-36632       High
python         3.10.14                 binary  CVE-2023-27043       Medium
python         3.10.14                 binary  CVE-2024-4030        Unknown
ssl_client     1.36.1-r28  1.36.1-r29  apk     CVE-2023-42365       Medium
ssl_client     1.36.1-r28  1.36.1-r29  apk     CVE-2023-42364       Medium
```

### Interpreting the summary

In the initial portion of its results output, Grype summarizes information on the scanned artifact and gives an overview of known vulnerabilities. In the case of a scanned image, the output includes the image digest, a unique hash of the image that can be used as an identifier.

Overview output includes the number of packages, files, and executables found in the artifact. Generally speaking, CVEs are detected against packages, but the number of executables detected can also give you an idea of the attack surface of the scanned image or filesystem.

Finally, this portion gives a count of the number of CVEs detected by severity and fixed status. Severity categorization sorts CVEs into four categories based on the Common Vulnerability Scoring System (CVSS).

{{< details "What is CVSS?" >}}
{{< blurb/cvss >}}
{{< /details >}}

In our output, we can see that we have 0 critical, 1 high, and 8 medium CVEs:

```
   ├── by severity: 0 critical, 1 high, 8 medium, 0 low, 0 negligible
```

Grype also counts the number of CVEs by fixed status. If a CVE is marked as fixed, it can be resolved by updating to a newer version of the package. Our output suggests that 7 packages have been fixed and can be remediated with updates:

```
   └── by status:   7 fixed, 3 not-fixed, 0 ignored
```

### Itemized CVEs

In addition to the summary, Grype provides an itemized list of CVEs. By default, these are in table format, and list the package name, current version, severity, and package type (such as `apt`, `apk`, or `binary`). If the package is fixed, Grype will also indicate the package version where the fix was introduced.

Grype writes itemized CVEs to stdout, so you can redirect the report of itemized CVEs to a file:

```bash
grype python:3.10.14-alpine3.20 > report.txt
```

Alternatively, you can use the `--file` flag to write to a file:

```bash
grype --file report.txt python:3.10.14-alpine3.20
```

Redirecting output can also be useful to suppress a long list of CVEs, making the summary more immediately accessible.

## Output formats

### Standard formats

You can use Grype to write itemized CVEs to a number of formats, including the XML- or JSON-based [cyclonedx](https://cyclonedx.org/) SBOM standard and the [SARIF](https://sarifweb.azurewebsites.net/) static analysis format. To maximize the information provided by Grype, use the JSON output type:

```bash
 grype -o json python:3.10.14-alpine3.20 > report.json
```

When using these more detailed formats, Grype provides additional useful fields, such as the data source of the CVE, URLs to information on the CVE, advisories, related vulnerabilities, and details on how the vulnerability was detected.

### Output templates

Additional output formats are available as Hugo templates. These include output templates for HTML and CSV, and a [full list](https://github.com/anchore/grype/tree/main/templates) can be found at the Grype GitHub repository.

To generate a HTML file of the itemized CVEs, first clone the Grype repository from GitHub. Then provide the path to the template file in your `grype` command:

```bash
git clone git@github.com:anchore/grype.git ~/.grype
grype -o template -t ~/.grype/templates/html.tmpl python:3.10.14-alpine3.20 > report.html
```

![Screenshot of rendered HTML generated by the included Grype HTML template](grype_html_output.png)

To generate a CSV:

```bash
git clone git@github.com:anchore/grype.git ~/.grype
grype -o template -t ~/.grype/templates/csv.tmpl python:3.10.14-alpine3.20 > report.csv
```

## `grype explain`

Grype provides an explain subcommand that gives information on the nature of a specific CVE, how it was matched, and the locations of files associated with the vulnerability. The output of this command suggests a useful starting point for remediation.

To use `grype explain`, generate JSON output from Grype and pipe it into the `grype explain` subcommand. Indicate the CVE you'd like information on using the `--id` flag. The `-q` flag in the following example suppresses the summary output.

```bash
 grype -q python:3.10.14-alpine3.20 -o json | grype explain --id CVE-2023-36632
 ```

Grype uses information from the JSON output to generate a human-readable report on the specific CVE that includes match information, file locations, and links to information on the vulnerability.

## Additional Resources

The following resources may also be useful while working with Grype:

### Tools

- [Syft](https://github.com/anchore/syft) - A Grype-compatible tool for generating SBOMs from images and filesystems.
- [Grype-DB](https://github.com/anchore/grype-db) - A tool to build Grype databases from specific upstream vulnerability database providers
- [Vunnel](https://github.com/anchore/vunnel) - A tool for collating vulnerability provider data
- [Grype Chainguard Container](https://images.chainguard.dev/directory/image/grype/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-scanners-grype-tutorial) — A low-to-no CVE container image maintained by Chainguard

### More on Grype

- [Chainguard Deep Dive 🤿: Where Does Grype Data Come From?](https://dev.to/chainguard/deep-dive-where-does-grype-data-come-from-n9e)
- [Grype on the Anchore blog](https://anchore.com/search/?search=grype) - Blog posts from Anchore related to Grype
- [Why Chainguard uses Grype](https://www.chainguard.dev/unchained/why-chainguard-uses-grype-as-its-first-line-of-defense-for-cves) - Why Chainguard contributes to and recommends Grype for vulnerability scanning in container images

---

### Using Trivy to scan software artifacts
_Path: chainguard/containers/security-and-compliance/working-with-scanners/trivy-tutorial/index.md_

[Trivy](https://github.com/aquasecurity/trivy) is a vulnerability scanner for a wide variety of software artifacts and deployments. Trivy is written in the Go programming language and is maintained by [Aqua Security](https://www.aquasec.com/). Trivy targets container images, VMs, filesystems, remote GitHub repositories, and Kubernetes and Amazon Web Services deployments. The tool can be used to detect known vulnerabilities (CVEs), generate SBOMs, analyze licenses, and scan for misconfigurations and exposed secrets. Trivy can be installed from [package managers](#package-managers) or as a [binary](#binary-installation), and can also be run as a [container image](#container-image).

## Installation

### Package managers

For Homebrew, use:

```shell
brew install trivy
```

Aqua Security [maintains sources and packages for a variety of additional operating systems and distributions](https://trivy.dev/docs/latest/getting-started/installation/) on their installation page.

### Binary installation

Aqua Security provides an [installation script for Trivy](https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh). To install Trivy with the script, change the `/usr/local/bin` argument to the desired installation location on your path before running the following command:

```shell
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.52.2
```

On many system configurations, you may need to provide elevated permissions via `sudo`:

```shell
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin v0.52.2
```

You can also manually install Trivy by downloading the binary for your operating system and architecture from the [Trivy releases page](https://github.com/aquasecurity/trivy/releases/tag/v0.52.2) and manually placing the binary on your path.

### Container image

Container images for Trivy are hosted on a variety of registries. When running Trivy as a container image, it is recommended to mount a cache directory as a volume. For scanning container images, it is also recommended to mount `docker.sock`.

The following command will pull Trivy from Docker Hub, mount the two volumes, run the Trivy container, and use the running container to scan the official nginx image on Docker Hub:

```shell
docker run \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $HOME/Library/Caches:/root/.cache/ \
  aquasec/trivy:0.52.2 \
  image nginx
```

## Basic usage

Throughout this tutorial, we'll use the `trivy` command to run Trivy. If you're running Trivy as a container image, replace this command with the [appropriate `docker run` command](#container-image).

To use Trivy, provide a subcommand indicating the type of artifact or deployment to be scanned along with the location of the target. For example, to scan the official Python image on Docker Hub:

```shell
trivy image python
```

Trivy will output a series of informational messages, a short summary of CVEs found, including severity, and an itemized list of CVEs.

### Valid targets

Trivy can scan a wide variety of artifacts, collections, or deployments, collectively called targets. Each type of software artifact has a specific set of Trivy scanners enabled by default. For example, when scanning container images, Trivy will look for vulnerabilities and exposed secrets by default.

### Scanning a container image

To scan a container image on Docker Hub, use the `image` subcommand and the name of the image as an  argument:

```shell
trivy image nginx
```

For images on other registries:

```shell
trivy image cgr.dev/chainguard/nginx:latest
```

### Scanning a filesystem

Trivy can recursively scan directories on a local machine. To start a filesystem scan, run:

```shell
trivy fs <path>
```

where `<path>` indicates the root folder where the scan will begin. Trivy looks out for specific files containing lists of packages, such as Python's `requirements.txt` or `poetry.lock`, PHP's `composer.lock`, or Node's `package-lock.json`.

The following creates a Python project folder with virtual environment, installs a set of older packages, generates a `requirements.txt` file itemizing all transitive dependencies, and scans the project folder using Trivy:

```shell
mkdir python-project && cd python-project
python -m venv venv
./venv/bin/pip install WTForms==2.3.3 Werkzeug==2.0.1
./venv/bin/pip freeze > requirements.txt
trivy fs .
```

The following creates a default Node project, installs an older package with `npm`, and scans the project with Trivy:

```shell
mkdir node_project && cd node_project
npm init -y
npm install qs@6.5.2
trivy fs .
```

You should see a summary and itemized list of CVEs for the outdated Node package.

### Scanning clusters

To scan a Kubernetes cluster:

```shell
trivy k8s --report summary <cluster-name>
```

To try out the above command on a test Kubernetes cluster, First install [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation), a utility allowing Kubernetes to be run on your local machine.

Once Kind is installed and accessible on your path, run the following to create a cluster:

```shell
kind create cluster --name test-cluster
```

Run the following to scan the new cluster with Trivy:

```shell
trivy k8s --report summary kind-test-cluster
```

When scanning clusters, requesting only summary output is recommended, as tables in more verbose output may not display correctly.

### Scanning SBOMs

Trivy can both generate and scan SBOMs.

{{< details "What is an SBOM?" >}}
{{< blurb/sbom >}}
{{< /details >}}

First, generate an SBOM file in CycloneDX format to scan

```shell
trivy image -f cyclonedx -o results.cdx.json nginx
```

Trivy can scan this generated CycloneDX SBOM with the following:

```shell
trivy sbom results.cdx.json
```

By default, the `sbom` subcommand scans only for vulnerabilities. License scanning can be enabled using the `--scanners license` flag.

Some image providers, such as Chainguard, associate images with an [SBOM attestation](https://edu.chainguard.dev/open-source/sbom/sboms-and-attestations/) verifying that the image has not been tampered with since the time of creation. Trivy provides functionality to query attestations registered in the [Rekor transparency log](https://github.com/sigstore/rekor). To retrieve an SBOM attestation from a Rekor transparency log, set the `--sbom-sources` flag to `rekor` and provide the `--rekor-url` flag to the instance of the transparency log you wish to query against. The following will perform a scan using the SBOM attestation for Chainguard's `nginx` image as registered on the [Rekor public server](https://rekor.sigstore.dev/):

```shell
trivy image --sbom-sources rekor --rekor-url https://rekor.sigstore.dev/ cgr.dev/chainguard/nginx
```

Learn more about SBOMs and other output formats in the section on [specifying output formats](#specifying-output-formats).

## Comprehending Trivy output

When run with default output and formatting, Trivy first prints a series of informational messages and warnings, then the name of the image and a one-line summary of the number and severity of issues found, and finally a table itemizing each issue.

 In this section, we'll use an Alpine version of the official Python image as an example. Since we're specifying an older version, you may encounter more CVEs when following the examples than are shown here, as CVEs will accumulate on an image over time.

Scan the image with the following command:

```shell
trivy image python:3.10.14-alpine3.20
```

You will receive output similar to the following:

![Screenshot of Trivy output showing first informational messages on which scanners are enabled, then the name of the image, then a listing of issues by severity, and finally a table formatted with ASCII separator (pipes and underscores) showing itemized issues](trivy_output.png)

### Interpreting Trivy output

The initial logging portion of Trivy's output indicates which [scanners](#scanners) are enabled and shows warnings if Trivy has an issue performing the scan.

In the initial portion of its results output, Trivy summarizes information on the scanned artifact and gives an overview of known vulnerabilities. In the case of a scanned image, the output includes the image digest. This is a unique hash of the image that can be used as an identifier.

Following the log, Trivy shows the name of the image and a count of issues by severity.

```output
Total: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 0, CRITICAL: 0)
```

 When scanning for vulnerabilities, this severity categorization sorts CVEs into four categories based on the Common Vulnerability Scoring System (CVSS).

{{< details "What is CVSS?" >}}
{{< blurb/cvss >}}
{{< /details >}}

In the case of a license scan, Trivy instead uses its own assessment of the business risk posed by specific license clauses. Similarly, explosed secrets and misconfigurations have their own severity mapping as determined by Aqua Security.

### Itemized CVEs

In addition to the log and brief summary, Trivy provides an itemized list of issues. By default, these are in table format, and for a vulnerability scan list the library, vulnerability, severity, status, installed version, and fixed version of each issue. Other types of scan list different data—for example, a license scan lists the package, license, license classification, and perceived severity of business risk.

When scanning for vulnerabilities, information on fixed version can show which CVEs can be resolved by bumping the library version. Trivy also provides a short prose description of the nature of each issue.

By default, Trivy's table output is relatively verbose, and Trivy does not respect the traditional 80-character line limit on terminal output. Refer to [Output formats and verbosity](#output-formats-and-verbosity) for information on more granular control over Trivy's output.

## Scanners

### Specifying scanners

Trivy can scan not only for known vulnerabilities, but also for misconfigurations, exposed secrets, and license risks. When scanning container images or filesystems, Trivy scans for vulnerabilities and exposed secrets by default.

Individual scanners can be selected by passing a comma-separated list after the `--scanners` flag. To add a misconfigurations scan to an analysis of a container image:

```shell
trivy image --scanners vuln,misconfig,secret nginx
```

To recursively scan only for exposed secrets on a filesystem:

```shell
trivy fs --scanners secret .
```

This will perform a recursive scan of all files and folders in the current working directory.

### License scanning

Trivy provides an opinionated license scan that flags license clauses that may pose a business risk. To perform a license scan on a container image:

```shell
trivy image --scanners license nginx
```

By default, the Trivy license scan only looks at packages installed by managers such as `apt` or `apk`. To scan other files, add the `--license-full` flag:

```shell
trivy image --scanners license --license-full nginx
```

Using the `--license-full`flag will also show results for "loose" licenses, such as those provided as text files in project folders.

## Output formats and verbosity

### Specifying output formats

Trivy allows output in JSON, SARIF, CycloneDX, SPDX, SPDX-JSON, and GitHub formats. If no output or format flags are specified, Trivy first prints a series of informative messages and warnings to `stderr` and then prints a table of results to `stdout`.

The `-q` or `--quiet` flag suppresses the logging output normally printed to `stderr`. The following returns just the line summarizing the number and severity of issues:

```shell
trivy image -q nginx | grep Total:
```

```output
Total: 173 (UNKNOWN: 2, LOW: 88, MEDIUM: 59, HIGH: 22, CRITICAL: 2)

```

The `-f` or `--format` flag specifies the output format, and the `-o` or `--output` flag specifies an output file. The following writes a JSON-formatted report to a `results.json` file.

```shell
trivy image -f json -o results.json nginx
```

Similarly, the following would write a report in SARIF format:

```shell
trivy image -f sarif -o results.sarif nginx
```

Other formats can be generated by passing the appropriate format type with the `-f` or `--format` flag.

### Generating SBOMs

The CycloneDX, SPDX, and SPDX-JSON output formats are considered SBOMs, and can be scanned with the `trivy sbom` subcommand. The following command will generate an SBOM in CycloneDX format:

```shell
trivy image -f cyclonedx -o results.cdx.json nginx
```

Refer to [Scanning SBOMs](#scanning-sboms) for more on scanning these output formats.

### Generating a report from a template

Trivy can generate reports in additional formats from user-contributed templates. To use templates, first clone the Trivy GitHub repository to your home folder:

```shell
git clone https://github.com/aquasecurity/trivy.git ~/.trivy
```

To generate a report using the HTML template, specify the path to the template in the cloned repository:

```shell
trivy image --format template --template "@.trivy/contrib/html.tpl" -o report.html nginx
```

This HTML output can be significantly more readable than Trivy's default table output:

![Screenshot of rendered HTML generated by the Trivy HTML template](trivy-html-report.png)

Other template-based output formats can be browsed in the [Trivy contrib directory](https://github.com/aquasecurity/trivy/tree/main/contrib).

## Trivy resources

The following resources may complement your use of Trivy:

- [Trivy Documentation](https://trivy.dev/docs/latest/) — Documentation on the latest version of Trivy
- [Trivy Operator for Kubernetes](https://github.com/aquasecurity/trivy-operator) — An operator to continuous scan a Kubernetes cluster for issues
- [Trivy Announcements](https://github.com/aquasecurity/trivy/discussions/categories/announcements) — News on Trivy from Aqua Security

---

### Verifying Chainguard Containers and metadata signatures with Cosign
_Path: chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/index.md_

Chainguard signs all container images and their attestations (including SBOMs) to ensure supply chain security and enable verification of image authenticity. These cryptographic signatures allow you to confirm that images come from Chainguard and haven't been tampered with, while attestations provide detailed information about image contents and build provenance.

This guide outlines how you can use Cosign to download and verify container image signatures and attestations.

## Prerequisites

The following examples require [Cosign](/open-source/sigstore/cosign/how-to-install-cosign/) and [jq](https://stedolan.github.io/jq/) to be installed on your machine to download and verify image attestations.

## Registry and tags for Chainguard Containers

Attestations are provided per image build, so you'll need to specify the correct tag and registry when pulling attestations from an image with `cosign`. This guide works with Chainguard's public and private registries:

- `cgr.dev/chainguard`: The public registry contains Chainguard's **Free container images**, which only include the `:latest` versions of an image.
- `cgr.dev/YOUR-ORGANIZATION`: A private/dedicated registry contains your organization's **Production container images**, which include all versioned tags of an image and special images that are not available in the public registry (including FIPS images and other custom builds).

The commands listed on this page default to the `:latest` tag, but you can specify a different tag to fetch attestations for.

## Chainguard's signing identities

Chainguard uses an identity associated with its official GitHub account to sign images in the public registry that contains the Free tier of images.

For private images, Chainguard signs all images in your private registry with one of two different identities in your organization:

- The `image-syncer` identity is used to sign images that have been imported directly from the Chainguard Containers catalog.
- The `custom-image-builder` identity is used to sign any images that have been customized for your organization, such as those built with [Custom Assembly](/chainguard/containers/custom-assembly/overview/).

{{< note >}}
Older Chainguard organizations use `catalog_syncer` and `apko_builder` instead of these identities. Each pair is functionally identical, because each references the same account association: `image-syncer` and `catalog_syncer` both reference the `CATALOG_SYNCER` association, while `custom-image-builder` and `apko_builder` both reference the `APKO_BUILDER` association.
{{< /note >}}

These identities are created and added to every [verified Chainguard organization](/chainguard/administration/iam-organizations/verified-orgs/) automatically.

To follow along with the **Private Registry** examples in this guide, you need the *unique identifier paths* (UIDPs) of these Chainguard identities. To this end, create a few environment variables, the first of which should point to the name of your Chainguard organization:

```shell
PARENT=your-organization
```

Next, create two more variables to hold the UIDPs of your organization's `image-syncer` and `custom-image-builder` identities (`catalog_syncer` and `apko_builder` for older organizations), respectively:

```shell
IMAGE_SYNCER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.CATALOG_SYNCER')
CUSTOM_IMAGE_BUILDER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.APKO_BUILDER')
```

The **Private Registry** examples in this guide include these environment variables, letting you verify that Chainguard used those identities to sign the given image.

You can also find these values in the Chainguard Console. After logging in, go to **Settings**, and then **Users**. From there, scroll or search for either `image-syncer` or `custom-image-builder` (or `catalog_syncer` or `apko_builder` for older organizations) and click its row to find the identity's UIDP.

## Verifying container image signatures

Chainguard signs its containers with Sigstore, and you can check the included signatures using `cosign`. The `cosign verify` command pulls detailed information about all signatures found for the provided image.

### Public registry

```shell
IMAGE=go
cosign verify \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  cgr.dev/chainguard/${IMAGE} | jq
```

### Private/dedicated registry

```shell
IMAGE=go
cosign verify \
  --certificate-oidc-issuer=https://issuer.enforce.dev \
  --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
  cgr.dev/${PARENT}/${IMAGE} | jq
```

Be aware that you need to change the `IMAGE` environment variable to reflect a container image your organization is entitled to.

> **Note**: The environment variables used in this command (other than `${IMAGE}`) were created in the previous section.

By default, this command fetches signatures for the `:latest` tag. If you'd like, you can specify the tag you want to fetch signatures for:

```shell
IMAGE=go
TAG=1.23.8
cosign verify \
  --certificate-oidc-issuer=https://issuer.enforce.dev \
  --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
  cgr.dev/${PARENT}/${IMAGE}:${TAG} | jq
```

## Downloading container attestations

Attestations are signed metadata about the artifact, which can include SBOMs, vulnerability scans, or other custom predicates.

The [attestations](https://slsa.dev/attestation-model) for a container image can be obtained and verified using Cosign or directly in the Chainguard Console. Refer to [How to retrieve attestations and SBOMs for Chainguard Containers](/chainguard/containers/security-and-compliance/retrieve-image-sboms/) for more information.

### Public registry

```shell
IMAGE=go
cosign download attestation \
  --predicate-type=https://spdx.dev/Document \
  --platform=linux/amd64 \
  cgr.dev/chainguard/${IMAGE} | jq -r .payload | base64 -d | jq .predicate
```

### Private/dedicated registry

```shell
IMAGE=go
cosign download attestation \
  --predicate-type=https://spdx.dev/Document \
  --platform=linux/amd64 \
  cgr.dev/${PARENT}/${IMAGE} | jq -r .payload | base64 -d | jq .predicate
```

## Verifying container image attestations

You can use the `cosign verify-attestation` command to check the signatures of the desired container image [attestations](https://slsa.dev/attestation-model):

### Public registry

```shell
IMAGE=go
cosign verify-attestation \
  --type https://spdx.dev/Document \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  cgr.dev/chainguard/${IMAGE} | jq
```

This pulls in the signature for the attestation specified by the `--type` parameter, which in this case is the SPDX attestation for SBOMs. The output verifies the SBOM attestation signature in Cosign's transparency log:

```shell
Verification for cgr.dev/chainguard/go --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- The code-signing certificate was verified using trusted certificate authority certificates
Certificate subject:  https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main
Certificate issuer URL:  https://token.actions.githubusercontent.com
GitHub Workflow Trigger: schedule
GitHub Workflow SHA: da283c26829d46c2d2883de5ff98bee672428696
GitHub Workflow Name: .github/workflows/release.yaml
GitHub Workflow Trigger chainguard-images/images
GitHub Workflow Ref: refs/heads/main
...
```

### Private/dedicated registry

```shell
IMAGE=go
cosign verify-attestation \
  --type https://spdx.dev/Document \
  --certificate-oidc-issuer=https://issuer.enforce.dev \
  --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
  cgr.dev/${PARENT}/${IMAGE} | jq
```

## Air-gapped and egress-restricted environments

The commands in this guide reach the public Sigstore infrastructure to fetch the trust root Cosign verifies against. If that infrastructure is unreachable, you can export the trust root on a connected machine and pass it to Cosign as a file. Transparency-log verification still works, because the signature carries its own signed entry timestamp.

The signature is a separate artifact from the image, so mirroring the image alone leaves it behind. For the full procedure, including how to move signatures and attestations across an air gap, see [Verifying signatures in air-gapped environments](/open-source/sigstore/cosign/verifying-in-air-gapped-environments/).

## Note about the examples in this guide

The examples in this guide invariably pass command output through `jq`, a JSON processor. This is helpful, as it makes the output more easily readable.

However, if you're running these commands in a script, this can cause problems if validation fails. For example, if Cosign returns an error but it is passed into `jq`, then `jq` overwrites the exit codes from Cosign, causing them to be silently ignored.

To avoid this problem, you could include either or both of the following `set` options in your script:

- `set -e` ensures that your script exits with an error if any of the commands in your script exit with an error.
- `set -o pipefail` ensures that status codes from Cosign aren't masked when piped to `jq`.

## Learn more

To get up to speed with Sigstore, you can review the [Sigstore](/open-source/sigstore/) section of Chainguard Academy, visit the upstream [Sigstore Docs](https://docs.sigstore.dev/) site, and check out the [Sigstore organization on GitHub](https://github.com/sigstore). You can learn more about verifying software artifacts with Cosign by reading [How to verify file signatures with Cosign](/open-source/sigstore/cosign/how-to-verify-file-signatures-with-cosign/).

Navigate to our [container images](/chainguard/containers/) landing page or [Getting started guides](https://edu.chainguard.dev/chainguard/containers/getting-started/) to understand more about Chainguard Containers and how they offer low-to-zero CVEs.

---

### Kubernetes policy enforcement with OPA Gatekeeper
_Path: chainguard/containers/security-and-compliance/enforcement/opa-gatekeeper/index.md_

[Gatekeeper](https://open-policy-agent.github.io/gatekeeper/website/) is an admission controller that enforces policies in Kubernetes clusters. This
article describes how it can be leveraged to ensure resources follow best practices related to the use of Chainguard Containers.

## Prerequisites

To follow the examples in this guide, you will need the following:

- `kubectl` — the command line interface tool for Kubernetes — installed on your local machine.
- Administrative access to a Kubernetes cluster where [OPA Gatekeeper is already installed](https://open-policy-agent.github.io/gatekeeper/website/docs/install).

## Ensure images are pulled from allowed repositories

You can use the [`K8sAllowedReposV2` constraint](https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/general/allowedreposv2) from the [Gatekeeper Library](https://github.com/open-policy-agent/gatekeeper-library) to ensure that images are only pulled from a list of allowed repositories.

To configure this constraint, add the constraint template to your cluster.

```shell
kubectl create -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/refs/heads/master/library/general/allowedreposv2/template.yaml
```

Then, create a constraint that only allows images hosted in `cgr.dev`. Note that if you are mirroring Chainguard container images into a different registry, then you could replace this with your own URLs:

```shell
kubectl create -f - <<EOF
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedReposv2
metadata:
  name: repo-is-cgr-dev
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
  parameters:
    allowedImages:
      - "cgr.dev/*"
EOF
```

Note that you may not be able to control where images provided by the platform are hosted in certain managed Kubernetes solutions.

To test that this constraint is working correctly, try to create a non-compliant pod:

```shell
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-disallowed
spec:
  containers:
    - name: nginx
      image: nginx
EOF
```

```output
Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [repo-is-cgr-dev] container <nginx> has an invalid image <nginx>, allowed images are ["cgr.dev/*"]
```

This example tries to create a pod using a container image downloaded from the Docker Hub registry, not Chainguard's registry. As this output indicates, attempting to create a non-compliant pod resulted in an error, and the request was denied.

## Ensure images are referenced by digest

Chainguard Containers are updated frequently to incorporate CVE fixes and package updates. The tags for Chainguard's container images are highly mutable, meaning that the underlying image changes frequently, even for very specific tags like `v1.2.3-r1`.

To prevent the risk of updates introducing breaking changes, you can pull by digest to ensure the use of a specific image.

The [`K8sImageDigests` constraint](https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/general/imagedigests) from the [Gatekeeper Library](https://github.com/open-policy-agent/gatekeeper-library) can be used to mandate this practice inside a Kubernetes cluster.

Add the template to your cluster:

```shell
kubectl create -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/refs/heads/master/library/general/imagedigests/template.yaml
```

Then create the constraint:

```shell
kubectl create -f - <<EOF
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sImageDigests
metadata:
  name: container-image-must-have-digest
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - "kube-system"
EOF
```

Be aware that in certain managed Kubernetes solutions, you may not be able to control whether images provided by the platform are referenced by digest.

To test the constraint, try to create a non-compliant pod:

```shell
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-disallowed
spec:
  containers:
    - name: nginx
      image: cgr.dev/chainguard/nginx
EOF
```

```output
Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [container-image-must-have-digest] container <nginx> uses an image without a digest <cgr.dev/chainguard/nginx>
```

This example attempts to create a pod using the `nginx` Chainguard container image, but does not pull the image by its digest as required by the constraint. As the output indicates, the attempt resulted in an error and the request was denied.

## Warn first, deny later

When introducing new constraints into a cluster, it is a good idea to initially configure them with [`enforcementAction: warn`](https://open-policy-agent.github.io/gatekeeper/website/docs/violations/#warn-enforcement-action) so as to avoid blocking existing workloads.

This way, when a user creates a non-compliant resource, they will get a warning like the following example. This gives the user a signal that they should update their configuration.

```output
Warning: [container-image-must-have-digest] container <nginx> uses an image without a digest <cgr.dev/chainguard/nginx>
```

You can also find non-compliant resources that exist in the cluster by reviewing the constraint's violations:

```shell
kubectl get k8simagedigests container-image-must-have-digest -o json | jq -r '.status.violations[]'
```

```output
{
  "enforcementAction": "warn",
  "group": "",
  "kind": "Pod",
  "message": "container <nginx> uses an image without a digest <cgr.dev/chainguard/nginx>",
  "name": "nginx-disallowed",
  "namespace": "default",
  "version": "v1"
}
```

Once all the violations have been addressed, you can remove `enforcementAction: warn` and Gatekeeper will start to block the creation of resources that violate the constraint.

## Ensure images are signed by Chainguard

This will require having [Gatekeeper](https://open-policy-agent.github.io/gatekeeper/website/) external data enabled.

### Install Ratify

```shell
helm repo add ratify https://notaryproject.github.io/ratify
# download the notary verification certificate
curl -sSLO https://raw.githubusercontent.com/deislabs/ratify/main/test/testdata/notation.crt
helm install ratify \
    ratify/ratify \
    --namespace gatekeeper-system \
    --set-file notationCerts={./notation.crt} \
    --set featureFlags.RATIFY_CERT_ROTATION=true \
    --set policy.useRego=true
```

### Create a verifier

The [verifier](https://ratify.dev/docs/reference/custom%20resources/verifiers) will set up the cosign verification. This example uses the public Chainguard images.

> **Note**: If you want to use a private registry, you can follow the identity patterns laid out [for private and dedicated registries](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/#privatededicated-registry)

```yaml
apiVersion: config.ratify.deislabs.io/v1beta1
kind: Verifier
metadata:
  name: verifier-cosign-chainguard
spec:
  name: cosign
  artifactTypes: application/vnd.dev.cosign.artifact.sig.v1+json
  parameters:
    trustPolicies:
      - name: chainguard-public
        scopes:
          - "cgr.dev/chainguard/*"
        tLogVerify: true
        keyless:
          ctLogVerify: true
          certificateOIDCIssuer: "https://token.actions.githubusercontent.com"
          certificateIdentity: "https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main"
```

To use a private registry, you need a couple more steps.

First set a variable for your org

```shell
PARENT=your-organization
```

Next, create two more variables to hold the UIDPs of your organization’s `catalog_syncer` and `apko_builder` identities, respectively:

```shell
CATALOG_SYNCER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.CATALOG_SYNCER')
APKO_BUILDER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.APKO_BUILDER')
```

Then your verifier would use those variables for your `certificateOIDCIssuer` and `certificateIdentityRegexp`. Substitute `${PARENT}`, `${CATALOG_SYNCER}` and `${APKO_BUILDER}` with the literal values.

```yaml
apiVersion: config.ratify.deislabs.io/v1beta1
kind: Verifier
metadata:
  name: verifier-cosign-chainguard
spec:
  name: cosign
  artifactTypes: application/vnd.dev.cosign.artifact.sig.v1+json
  parameters:
    trustPolicies:
      - name: chainguard-private
        scopes:
          - "cgr.dev/${PARENT}/*"
        tLogVerify: true
        keyless:
          ctLogVerify: true
          certificateOIDCIssuer: "https://issuer.enforce.dev"
          certificateIdentityRegExp: "https://issuer.enforce.dev/(${CATALOG_SYNCER}|${APKO_BUILDER})"
```

### Create the policy

Create the Ratify [policy](https://ratify.dev/docs/reference/custom%20resources/policies/#policy). This defines a policy evaluating the verification results for a subject.

```yaml
apiVersion: config.ratify.deislabs.io/v1beta1
kind: Policy
metadata:
  name: ratify-policy
spec:
  type: config-policy
  parameters:
    artifactVerificationPolicies:
      "application/vnd.dev.cosign.artifact.sig.v1+json": "any"
      default: "any"
```

### Create the constraint template

By default, a Gatekeeper [constraint template](https://open-policy-agent.github.io/gatekeeper/website/docs/constrainttemplates) uses Rego v0 syntax. This enables v1 syntax. If you want to use v0 syntax the policy will need to be updated. This example also adds an exempt images array to allow specific non-signed images.

```yaml
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredimagesignatures
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredImageSignatures
      validation:
        openAPIV3Schema:
          type: object
          properties:
            exemptImages:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      code:
        - engine: Rego
          source:
            version: "v1"
            rego: |
              package k8srequiredimagesignatures

              default exemptions := []

              exemptions := input.parameters.exemptImages

              all_images contains val.image if {
                  containers := object.get(input.review.object.spec.template.spec, "containers", [])
                  initContainers := object.get(input.review.object.spec.template.spec, "initContainers", [])
                  ephContainers := object.get(input.review.object.spec.template.spec, "ephemeralContainers", [])

                  vals := array.concat(containers, array.concat(initContainers, ephContainers))
                  some val in vals
              }

              ratify_response(image) = resp if {
                      resp := external_data({
                        "provider": "ratify-provider",
                        "keys": [image],
                      })
              }

              responses contains {"image": resp[0], "data": resp[1]} if {
                some image in all_images
                not image in exemptions

                rat_resp := ratify_response(image)
                resp := rat_resp.responses[_]
              }

              violation contains {"msg": msg} if {
                some resp in responses
               resp.data.system_error != ""
               msg := sprintf("image %q verification system error: %v", [resp.image, resp.data.system_error])
              }

              violation contains {"msg": msg} if {
                some resp in responses
               count(resp.data.responses) == 0
               msg := sprintf("image %q returned no verification response", [resp.image])
              }

              violation contains {"msg": msg} if {
                some resp in responses
                not resp.data.isSuccess
               reason := object.get(resp.data, "message", "verification failed")
               msg := sprintf("image %q is not signed by Chainguard: %v", [resp.image, reason])
              }

              violation contains {"msg": msg} if {
                some resp in responses
               err := resp.data.errors[_]
                err[0] == resp.image
               msg := sprintf("image %q verification error: %v", [resp.image, err[1]])
              }
```

### Create the constraint

The constraint ties the constraint template to the Kubernetes kinds you define.

```yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredImageSignatures
metadata:
  name: require-signed-images
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
      - apiGroups: ["apps"]
        kinds: ["Deployment", "StatefulSet", "DaemonSet", "ReplicaSet"]
  parameters:
    exemptImages:
      - "registry.k8s.io/pause:3.9"

```

### Try deploying a Chainguard image

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-chainguard
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-chainguard
  template:
    metadata:
      labels:
        app: nginx-chainguard
    spec:
      containers:
        - name: nginx
          image: cgr.dev/chainguard/nginx:latest
          ports:
            - containerPort: 8080
```

This should successfully create a deployment.

### Try deploying a non-Chainguard image

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-unsigned
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-unsigned
  template:
    metadata:
      labels:
        app: nginx-unsigned
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

```

You will get an error like this explaining that the deployment was blocked because the image was not signed by Chainguard.

```output
Error from server (Forbidden): error when creating "bad-deployment.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [require-signed-images] image "docker.io/library/nginx@sha256:7150b3a39203cb
5bee612ff4a9d18774f8c7caf6399d6e8985e97e28eb751c18" is not signed by Chainguard: verification failed
```

## Learn more

By combining OPA Gatekeeper with Chainguard container images, you gain a powerful way to enforce security and compliance across your Kubernetes clusters. Gatekeeper ensures that only container images meeting your defined policies are deployed, while Chainguard Containers provide a minimal, hardened foundation to reduce risk from the start. Together, they help teams ship software more securely and confidently, without slowing down development.

If you'd like to learn more about Gatekeeper, we encourage you to refer to the [official documentation](https://open-policy-agent.github.io/gatekeeper/website/docs/).

---

### Kubernetes policy enforcement with Kyverno
_Path: chainguard/containers/security-and-compliance/enforcement/kyverno/index.md_

[Kyverno](https://kyverno.io/) is an admission controller that enforces policies in Kubernetes clusters. This article describes how it can be leveraged to ensure resources follow best practices related to the use of Chainguard Containers.

## Prerequisites

To follow the examples in this guide, you will need the following:

- `kubectl` — the command line interface tool for Kubernetes — installed on your local machine.
- Administrative access to a Kubernetes cluster where [Kyverno is already installed](https://kyverno.io/docs/installation/).

## Ensure images are pulled from allowed repositories

You can use the [`ClusterPolicy` policy type](https://kyverno.io/docs/policy-types/cluster-policy/overview/) to ensure that images are only pulled from a list of allowed repositories.

Create file named `restrict-image-registries.yaml` with the following content:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-image-registries
spec:
  rules:
    - name: validate-registries
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        failureAction: Enforce
        message: "Invalid image registry. Images must be hosted in cgr.dev."
        pattern:
          spec:
            =(ephemeralContainers):
              - image: "cgr.dev/*"
            =(initContainers):
              - image: "cgr.dev/*"
            containers:
              - image: "cgr.dev/*"
```

This defines a policy that only allows images hosted in `cgr.dev`. Note that if you've set up a different registry to function as [a pull-through cache for your Chainguard container images](/chainguard/containers/registry/pull-through-guides/), you could replace this with your own registry.

If you need to support more than one registry, you can define multiple values with a pattern like `cgr.dev/* | your.internal.repo/*`.

Apply the policy with `kubectl`:

```shell
kubectl apply -f restrict-image-registries.yaml
```

To test that the policy works correctly, try to create a non-compliant pod:

```shell
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-disallowed
spec:
  containers:
    - name: nginx
      image: nginx
EOF
```

This example manifest attempts to create a pod using a container image downloaded from the Docker Hub registry, not Chainguard's registry. As this output indicates, attempting to create a non-compliant pod results in an error, and the request is denied:

```output
Error from server: error when creating "STDIN": admission webhook "validate.kyverno.svc-fail" denied the request:

resource Pod/default/nginx-disallowed was blocked due to the following policies

restrict-image-registries:
  validate-registries: 'validation error: Invalid image registry. Images must be hosted
    in cgr.dev. rule validate-registries failed at path /spec/containers/0/image/'
```

To clean up, delete the policy:

```shell
kubectl delete -f restrict-image-registries.yaml
```

## Ensure images are referenced by digest

Chainguard Containers are updated frequently to incorporate CVE fixes and package updates. The tags for Chainguard's container images are highly mutable, meaning that the underlying image changes frequently, even for very specific tags like `v1.2.3-r1`.

To prevent the risk of updates introducing breaking changes, you can [pull by digest](/chainguard/containers/troubleshooting/inspecting-containers/) to ensure the use of a specific image. When using Kyverno, you can use a `ClusterPolicy` policy to ensure that images are only referenced by digest.

Create `require-image-digest.yaml` with this content:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-image-digest
spec:
  rules:
    - name: require-image-digest
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        failureAction: Enforce
        message: "cgr.dev images must use digests."
        foreach:
          - list: "request.object.spec.containers[?starts_with(image, 'cgr.dev')]"
            pattern:
              image: "*@*"
          - list: "request.object.spec.?initContainers[?starts_with(image, 'cgr.dev')] || []"
            pattern:
              image: "*@*"
          - list: "request.object.spec.?ephemeralContainers[?starts_with(image, 'cgr.dev')] || []"
            pattern:
              image: "*@*"
```

This is a slightly more advanced example that only applies the rule to images hosted in `cgr.dev`. If you want to enforce this for any image in the cluster than you could simplify the `validate` section like this:

```yaml
validate:
  failureAction: Enforce
  message: "Images must use digests."
  pattern:
    spec:
      =(ephemeralContainers):
        - image: "*@*"
      =(initContainers):
        - image: "*@*"
      containers:
        - image: "*@*"
```

Apply the policy to the cluster:

```shell
kubectl apply -f require-image-digest.yaml
```

To test the policy, try to create a non-compliant pod:

```shell
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-disallowed
spec:
  containers:
    - name: nginx
      image: cgr.dev/chainguard/nginx
EOF
```

This example attempts to create a pod using the `nginx` Chainguard container image, but does not pull the image by its digest as required by the policy. As the output indicates, the attempt resulted in an error and the request was denied:

```output
Error from server: error when creating "STDIN": admission webhook "validate.kyverno.svc-fail" denied the request:

resource Pod/default/nginx-disallowed was blocked due to the following policies

require-image-digest:
  require-image-digest: 'validation failure: validation error: cgr.dev images must
    use digests. rule require-image-digest failed at path /image/'
```

To clean up, delete the `require-image-digest` policy:

```shell
kubectl delete -f require-image-digest.yaml
```

## Verify image signatures

Chainguard signs all container images to ensure supply chain security and enable verification of image authenticity. These cryptographic signatures allow you to confirm that your container images come from Chainguard and haven’t been tampered with.

You can use a `verifyImages` rule in a `ClusterPolicy` to ensure that images are signed by Chainguard.

To begin, retrieve the IDs of the `image-syncer` and `custom-image-builder` identities for your organization as described [on this page](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/#chainguards-signing-identities).

Next, create `verify-image-signatures.yaml` with this content. Be sure to replace `<catalog-syncer-id>` and `<apko-builder-id>` with the appropriate values:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signatures
spec:
  webhookConfiguration:
    timeoutSeconds: 30
  rules:
    - name: verify-image-signatures
      match:
        any:
          - resources:
              kinds:
                - Pod
      verifyImages:
        - imageReferences:
            - "cgr.dev/*"
          failureAction: Enforce
          attestors:
            - entries:
                - keyless:
                    subjectRegExp: "^https://issuer.enforce.dev/(<catalog-syncer-id>|<apko-builder-id>)$"
                    issuer: "https://issuer.enforce.dev"
                    rekor:
                      url: https://rekor.sigstore.dev
```

Apply the policy to the cluster:

```shell
kubectl apply -f verify-image-signatures.yaml
```

To test the policy, try creating a pod using the public Chainguard `nginx` container image:

```shell
kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx-disallowed
spec:
  containers:
    - name: nginx
      image: cgr.dev/chainguard/nginx
EOF
```

Public images in `cgr.dev/chainguard` are signed by different identities than the images in your organization. Therefore, this operation is blocked:

```output
Error from server: error when creating "STDIN": admission webhook "mutate.kyverno.svc-fail" denied the request:

resource Pod/default/nginx-disallowed was blocked due to the following policies

verify-image-signatures:
  verify-image-signatures: 'failed to verify image cgr.dev/chainguard/nginx:latest:
    .attestors[0].entries[0].keyless: subject mismatch: expected ^https://issuer.enforce.dev/(...|...)$,
    received https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main'
```

To clean up, delete the policy:

```shell
kubectl delete -f verify-image-signatures.yaml
```

## Audit first, enforce later

When introducing new policies into a cluster, it is a good idea to initially configure rules with [`failureAction: Audit`](https://kyverno.io/docs/policy-types/cluster-policy/validate/#failure-action) so as to avoid blocking existing workloads.

If you also set `spec.emitWarning: true`, users will receive a warning when they create a non-compliant resource, like the following example:

```output
Warning: policy require-chainguard-image-vendor.require-chainguard-image-vendor: validation failure: Only Chainguard Containers and images based on Chainguard Containers are allowed.
pod/nginx-disallowed created
```

This gives the user a signal that they should update their configuration without disrupting their deployment.

You can also find non-compliant resources that exist in the cluster by reviewing the [`PolicyReport` resources](https://kyverno.io/docs/policy-reports/) created by Kyverno:

```shell
kubectl get policyreport -o json | jq -r '.items[] | .metadata.ownerReferences as $resource | .results[] | select(.result == "fail") | {resource: $resource, result: .}'
```

```json
{
  "resource": [
    {
      "apiVersion": "v1",
      "kind": "Pod",
      "name": "nginx-disallowed",
      "uid": "56c269d6-3295-4484-9ac8-1969c99e89c0"
    }
  ],
  "result": {
    "message": "validation failure: Only Chainguard Containers and images based on Chainguard Containers are allowed.",
    "policy": "require-chainguard-image-vendor",
    "properties": {
      "process": "background scan"
    },
    "result": "fail",
    "rule": "require-chainguard-image-vendor",
    "scored": true,
    "source": "kyverno",
    "timestamp": {
      "nanos": 0,
      "seconds": 1758879437
    }
  }
}
```

Once all the failures have been addressed, you can switch to `failureAction: Enforce` and Kyverno will start to block the creation of resources that violate the policy.

## Learn more

By combining Kyverno with Chainguard Containers, you gain a powerful way to enforce security and compliance across your Kubernetes clusters. Kyverno ensures that only container images meeting your defined policies are deployed, while Chainguard Containers provide a minimal, hardened foundation to reduce risk from the start. Together, they help teams ship software more securely and confidently, without slowing down development.

If you'd like to learn more about Kyverno, we encourage you to refer to the [official documentation](https://kyverno.io/docs/).

---

### Using wolfictl to manage Security Advisories
_Path: chainguard/containers/security-and-compliance/security-advisories/managing-advisories/index.md_

> **Note**: This document is deprecated as of June 2025.

Chainguard operates its own [Security Advisories](https://images.chainguard.dev/security/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-security-advisories-managing-advisories) page to alert users about the status of vulnerabilities found in Chainguard Containers. To maintain this database, we use [`wolfictl`](https://github.com/wolfi-dev/wolfictl/), a tool developed for working with the [Wolfi un-distro](https://github.com/wolfi-dev/).

In this guide, you will walk through using `wolfictl` to create an advisory for a vulnerable package. You’ll also learn how to update this advisory as more information about the vulnerability is disclosed over time. To follow along, you will need to have [`git`](https://git-scm.com/) and the [Go programming language](https://go.dev/dl/) installed on your machine.

This guide will focus on the packages and advisories issued for Wolfi.

## How to install `wolfictl`

To work with security advisories, you will need to install the `wolfictl` tool onto your machine. First, execute the following command in your terminal to clone the `wolfictl` repository locally, and navigate to it.

```sh
git clone git@github.com:wolfi-dev/wolfictl.git wolfictl && cd $_
```

Then, using `go`, install the `wolfictl` tool:

```sh
go install
```

If you encounter any errors during installation, your installed version of `go` may be out of date. You can check what version of `go` you have installed by running `go version` in your terminal. Check the [`go.mod` file](https://github.com/wolfi-dev/wolfictl/blob/main/go.mod) in the `wolfictl` repository to determine what version of `go` you will need, and be sure to update `go` to this version or a later release to continue. Alternatively, you may need to add the `wolfictl` binary to your `$PATH` after installation if your system does not recognize the command.

You can verify that you have successfully installed `wolfictl` by executing the `wolfictl version` command in your terminal.

```sh
wolfictl version
```

A successful installation of `wolfictl` will display output similar to the following. Note that the exact output will vary over time as new `wolfictl` versions are released.

```Output
 __        __   ___    _       _____   ___    ____   _____   _
 \ \      / /  / _ \  | |     |  ___| |_ _|  / ___| |_   _| | |
  \ \ /\ / /  | | | | | |     | |_     | |  | |       | |   | |
   \ V  V /   | |_| | | |___  |  _|    | |  | |___    | |   | |___
    \_/\_/     \___/  |_____| |_|     |___|  \____|   |_|   |_____|
wolfictl: A CLI helper for developing Wolfi

GitVersion:    devel
GitCommit:     6c98dc69a559192575d085d87fd916d8281dd67d
GitTreeState:  clean
BuildDate:     2024-07-23T01:57:17
GoVersion:     go1.22.5
Compiler:      gc
Platform:      darwin/arm64
```

In the next section, you will complete your local setup so you can begin using the `wolfictl` tool to work with advisories.

## Cloning package and advisory repositories

Before you can interact with security advisories, the  `wolfictl` tool will need access to existing Wolfi package and advisory information.

You will need to clone two additional repositories: the [`wolfi-dev/os`](https://github.com/wolfi-dev/os) repository and the [`wolfi-dev/advisories`](https://github.com/wolfi-dev/advisories) repository. Execute the following commands to clone each of these repositories to your machine and then navigate to the `advisories` directory.

```sh
git clone git@github.com:wolfi-dev/os.git
git clone git@github.com:wolfi-dev/advisories.git && cd advisories
```

With `wolfictl` installed and these two repositories cloned locally, you are now ready to interact with the security advisory database.

## Viewing existing advisories

First we will take a look at the existing advisories issued for packages in Wolfi. Keep in mind that the results shown here, and on your own machine, are snapshots in time. You should regularly check for changes to the upstream repository as new packages and advisories are issued.

You will be using the `wolfictl advisory list` command to view existing advisories. There are a variety of flags which you can append to assist in your search.

* `-p` lists all advisories for a given package name.
* `-V` lists all advisories for a given CVE ID, across all packages.
* `-t` lists all advisories by their most recent event type.
* `-c` lists all advisories by detected component type.
* `--history` reports the full list of events for displayed advisories.

You can combine multiple flags together to conduct a more granular search. For a complete listing of available command options, you can run the `wolfictl advisory list -h` command in your terminal.

For example, let’s say you want to find advisories for the `glibc` package as well as the full history of these advisories.

```sh
wolfictl advisory list -p glibc --history
```

The following shows a small sample of output from this command at the time of this writing. Note that the output of this command may change as vulnerability entries are added and updated over time.

```Output
glibc CGA-49g3-q5cv-7m6g (CVE-2023-4527, GHSA-hmf7-f8gf-8f4p)    2023-09-22T14:14:01Z fixed (2.38-r2)
      CGA-573p-mg38-75fh (CVE-2019-1010024, GHSA-3q29-89cr-qgvj) 2023-03-06T13:22:06Z false positive (vulnerability-record-analysis-contested)
      CGA-57wh-hj4x-5342 (CVE-2023-4911, GHSA-m77w-6vjw-wh2f)    2023-10-03T22:58:32Z fixed (2.38-r5)
      CGA-5vfg-gqch-hcj5 (CVE-2010-4756, GHSA-x2r9-jfjp-jvp9)    2023-03-06T17:47:28Z false positive (vulnerability-record-analysis-contested)
                                                                 2024-07-26T16:49:42Z fixed (2.40-r0)
      CGA-7fr2-v9gg-pg28 (CVE-2024-33600, GHSA-jv3g-6pg3-v9j8)   2024-05-14T11:00:51Z detected (glibc)
                                                                 2024-05-15T04:40:16Z fixed (2.39-r5)
…
```

From this snapshot, you can get an idea of the timeline of a vulnerability’s remediation process. For example, CVE-2024-33600 was detected on May 14th, 2024, and was remediated within the next 24 hours. Similar results are shown for other advisories, including the versions of the package in which the vulnerability was remediated.

We encourage you to experiment with these flags to find what information you can gather from your various searches.

## Creating and updating advisories

To begin creating and updating security advisories, you will need to navigate back to the Wolfi package repository you cloned.

```sh
cd ../os
```

Here, you will run the `wolfictl advisory create` command to begin the process of adding a new advisory. This command will respond with a few prompts in the terminal requesting input of information used to create the advisory.

First, you will be asked to enter the package in which the CVE was found. For this demonstration we will use the `glibc` package. Then, you will be asked for the vulnerability ID that you wish to make an advisory for. This ID must be a CVE, CGA, GHSA, or Go vulnerability ID. Finally, you will be asked what the status for the advisory should be, from one of the following options:

* `detection` (Under investigation)
* `true-positive-determination` (Affected)
* `fixed` (Fixed)
* `false-positive-determination` (Not affected)
* `fix-not-planned` (Fix not planned)
* `pending-upstream-fix` (Pending upstream fix)

To learn more about the meanings of each of these identifiers, please refer to our [documentation on event types](https://github.com/wolfi-dev/advisories/blob/main/docs/event_types.md). The following shows an example of the `wolfictl advisory create` command in action. **Please note that the vulnerability referenced is an arbitrary CVE ID for demonstration purposes and does not reflect an actual vulnerability found in the `glibc` package.**

```sh
Auto-detected distro: Wolfi

Package: glibc
Vulnerability: CVE-2024-57230
Type:
  detection
```

You can now check that your advisory has been successfully added with the `wolfictl advisory diff` command, as follows:

```sh
wolfictl advisory diff
```

From this command, you can see the local addition of your new advisory for the `glibc` package.

```Output
Auto-detected distro: Wolfi

( - removed / ~ modified / + added )

~ document "glibc"
  + advisory "CGA-pwm8-5rj4-phww"
```

Let’s say that you upgrade a vulnerable package to a newer, patched version. You are now ready to update the security advisory so its status is now “Fixed”. You can do so using the `wolfictl advisory update` command. Again, this command will walk you through the steps of updating an advisory by requesting information about the advisory you wish to modify. The following shows an example of this workflow in action.

```sh
Auto-detected distro: Wolfi

Package: glibc
Vulnerability: CVE-2024-57230
Type:
  fixed
Fixed Version: 2.39-r7
```

The same process can be followed for other status updates, whether you wish to mark a vulnerability as “Not affected” in the case of a [false positive finding](/chainguard/containers/security-and-compliance/working-with-scanners/false-results/), “Fix not planned”, or another applicable status.

## Further reading

In this guide, you learned how to use the `wolfictl` tool to interact with Chainguard’s Security Advisories feed. You used `wolfictl` to explore existing advisories, and also created and updated a new security advisory. The steps shown in this guide allowed you to make local changes to your advisory feed. If you wish to contribute to the open-source Wolfi OS advisory feed, please read through our [How To Patch CVEs](
https://github.com/wolfi-dev/os/blob/main/HOW_TO_PATCH_CVES.md) guide and our [How Chainguard issues Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/) article first.

Be sure to routinely check [our Security Advisories page](https://images.chainguard.dev/security/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-security-advisories-managing-advisories) when your scanners pick up new CVEs in your images. If you want to learn more about how you can interpret a security advisory and what its status means for your security, read our [article on using advisories](/chainguard/containers/security-and-compliance/security-advisories/how-to-use/).

---

### How Chainguard issues Security Advisories
_Path: chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/index.md_

When you scan a newly-built Chainguard Container with a vulnerability scanner, typically, no CVEs will be reported. However, as software packages age, more vulnerabilities are reported and CVEs will begin to accumulate in container images. When this happens, Chainguard releases security advisories to communicate these vulnerabilities to downstream images users.

> **Note:** Advisory timestamps represent when updates are made to the advisory page, not when they were first detected and triaged by Chainguard.

In alignment with the [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/#examples-of-what-chainguard-supports-and-maintains-for-chainguard-containers), our vulnerability management strategy focuses on the latest versions of any given release track, as these are the versions we actively maintain and secure. Accordingly, we only publish new CVE advisories for packages that fall within our defined support scope.

We do not actively monitor non-supported versions of a package or image. Our efforts are centered on keeping the latest versions up-to-date and as close to zero CVEs as we can, while encouraging customers to upgrade and stay on supported versions.

On this page, learn about [how to access Security Advisories](#accessing-security-advisories) and [the stages of a Security Advisory](#stages-of-a-security-advisory), from CVE disclosure to remediation.

## Accessing Security Advisories

### In the Chainguard images directory

Chainguard publishes its security advisories to a dedicated [Security Advisories page](https://images.chainguard.dev/security/?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-security-advisories-how-chainguard-issues) on the container images Directory. There, you can find a complete listing of CVEs found in various Chainguard Containers, including their CVE ID, affected packages, and vulnerability status. Each advisory is built from the metadata associated with a security vulnerability.

### Programmatic access

For automated vulnerability monitoring and integration with CI/CD pipelines, Chainguard provides [Alpine-style `secdb`](https://deepwiki.com/aquasecurity/trivy-db/4.2.6-alpine-security-database) security advisory feeds in JSON format:

- [Wolfi OS](https://github.com/wolfi-dev/os) feed: [packages.wolfi.dev/os/security.json](https://packages.wolfi.dev/os/security.json)
- Chainguard Enterprise feed: [packages.cgr.dev/chainguard/security.json](https://packages.cgr.dev/chainguard/security.json)

These machine-readable feeds can be consumed programmatically by vulnerability scanners, security tools, and custom automation scripts. You can find more information regarding these security feeds at our [foundational concepts overview page](https://github.com/chainguard-dev/vulnerability-scanner-support/blob/main/docs/foundational_concepts.md) in our [vulnerability scanner support](https://github.com/chainguard-dev/vulnerability-scanner-support/tree/main) GitHub repository.

## Stages of a security advisory

If you’re wondering how these security advisories are made, you’re in the right place! In this section, we will walk through the life of a security advisory -- starting from a CVE’s disclosure, all the way to its remediation. We’ll also explore what happens after an advisory is released and how its record may be updated over time.

### Stage 1: A CVE is disclosed

All security advisories begin with the disclosure of a security vulnerability. The [CVE Project](https://www.cve.org/) coordinates the processing of reported vulnerabilities through a network of CVE Numbering Authorities (CNAs). CNAs assign CVE IDs to new entries, and they are then added to a CVE Catalog. Each catalog entry contains information such as what packages or components are affected by the vulnerability, their versions, and remediation procedures, if applicable.

### Stage 2: Scanners detect the CVE

The [National Vulnerability Database (NVD)](https://nvd.nist.gov/), the U.S. government vulnerability repository, will pick up these CVE records and review them further. During this secondary review process, the CVE entry is enriched with details that scanners later use to identify affected software. This process can take some time, so there will be issued CVEs that have not yet been analyzed by the NVD. These CVEs pending review will be marked as such by the NVD, as shown in the following image.

![NVD notice stating a vulnerability has not yet been analyzed](nvd-analyze.png)

In addition to the NVD, vulnerability scanners also reference other databases such as the [GitHub Advisory Database](https://github.com/advisories) (GHSA) and the [Go Vulnerability Database](https://vuln.go.dev/).

### Stage 3: Advisory is issued

Once a CVE has been reviewed by the NVD, it will be picked up by vulnerability scanners and reported in any affected container images. Chainguard uses [Grype](https://github.com/anchore/grype), an open-source vulnerability scanner from Anchore, as its primary tool for vulnerability detection.

The newly detected CVE is then moved into the next phase where it waits for a team member to assess it. A security advisory will be issued with the status of "Under Investigation" to alert downstream users that Chainguard is aware of its presence. Security advisories are issued per package, as one CVE may impact different packages in different ways. From there, this security advisory will be updated over time.

### Stage 4: Advisory is updated

With an advisory issued for the package, further investigation is often needed to determine the impact of the CVE. In some cases, it will be determined that the CVE is not truly present in the package, therefore making it a [false positive](/chainguard/containers/security-and-compliance/working-with-scanners/false-results/). The associated security advisory would have its status updated to "Not Affected", and further updates to the advisory would not occur.

If the vulnerability is a true positive finding, then it is present in the package and further action must be taken. When an  upstream fix is available, such as a newer package version which remediates the CVE, then this update will be made and the advisory modified to state the vulnerability is now "Fixed".

Chainguard may even proactively bump a vulnerable dependency to its newer, patched version before upstream projects have done so themselves. Or, patches issued outside of the upstream repository may be applied to remediate the vulnerability when a new package version is not yet available. Note that an end user would need to pull the new version of the container image with the updated fix for the CVE as older versions of the image would still be vulnerable.

In some cases, a fix for the CVE may not yet be available. A package will be marked as having the "Pending upstream fix" status in this situation. Once an upstream fix is released, then it will be applied to the package and the advisory status updated to "Fixed".

Sometimes, a vulnerability may be present in a piece of software, but remediation is not planned. This could be because the package is no longer supported, such as in the case of an outdated package version or because the software is reaching the end of its life. If this is the case, then the security advisory status will be marked as "Fix not planned".

Rarely, a vulnerability is found in a package but there is no current status update on whether it can be remediated, or if plans exist to remediate it. In these few situations, the package is simply marked as being "Affected" by the vulnerability. This status is likely to be updated soon as the next steps towards remediation are established.

### Summary of advisory statuses

<table>
<thead>
<th>Status</th>
<th>Description</th>
<th>Metadata</th>
</thead>
<tr>
<td>Under investigation</td>
<td>A vulnerability has been detected for the package and is awaiting further investigation to determine its impact.</td>
<td>detection</td>
</tr>
<tr>
<td>Affected</td>
<td>A vulnerability finding has been determined to be present and affect the package.</td>
<td>true-positive-determination</td>
</tr>
<tr>
<td>Not affected</td>
<td>The vulnerability was determined to not impact the package, making it a false positive finding.</td>
<td>false-positive-determination</td>
</tr>
<tr>
<td>Pending upstream fix</td>
<td>Remediating the vulnerability is not possible until an upstream fix is made available.</td>
<td>pending-upstream-fix</td>
</tr>
<tr>
<td>Fixed</td>
<td>A patch has been applied to the affected package and the vulnerability is no longer present.</td>
<td>fixed</td>
</tr>
<tr>
<td>Fix not planned</td>
<td>There are no plans to address the vulnerability in the package at this time.</td>
<td>fix-not-planned</td>
</tr>
</table>

## Further reading

Chainguard’s Security Advisory feed is a helpful tool to have at hand when scanning your containers for the presence of vulnerabilities. Though you won’t need it often thanks to the low CVE counts of our container images, it is a useful reference when working with your scans, giving you insight into how you can approach and fix any vulnerabilities which pop up.

For more information on how to use Chainguard’s Security Advisories page to inform your vulnerability remediation, consider reading our article on [How to use Chainguard Security Advisories](
/chainguard/containers/security-and-compliance/security-advisories/how-to-use/).

If you are using Chainguard Containers at your organization or want to learn more about advisories for enterprise container images, please [contact us](https://www.chainguard.dev/contact).

---

### How to use Chainguard Security Advisories
_Path: chainguard/containers/security-and-compliance/security-advisories/how-to-use/index.md_

When using scanners such as [Grype](https://github.com/anchore/grype) or [Docker Scout](https://docs.docker.com/scout/) to scan for vulnerabilities in Chainguard Containers, you'll often find that there are few or no CVEs present. However, CVEs can sometimes be found in Chainguard Containers, and you may also encounter CVEs if you're using older tags. In these cases, you will likely wish to check Chainguard's security advisories for information on which CVEs will cause security issues in your deployment.

To help demystify the nature of CVEs within Chainguard Containers, we've created a self-service [Security Advisories page](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-security-advisories-how-to-use) that lists every security advisory published for Chainguard Containers. Having this information available allows you to view whether Chainguard is aware of a specific vulnerability reported to exist within a Chainguard Container and whether we've mitigated or are planning to mitigate the CVE.

In alignment with the [Chainguard Containers product release lifecycle](/chainguard/containers/concepts/lifecycle-and-eol/versions/#examples-of-what-chainguard-supports-and-maintains-for-chainguard-containers), our vulnerability management strategy focuses on the latest versions of any given release track, as these are the versions we actively maintain and secure. Accordingly, we only publish new CVE advisories for packages that fall within our defined support scope.

We do not actively monitor non-supported versions of a package or image. Our efforts are centered on keeping the latest versions up-to-date and as close to zero CVEs as we can, while encouraging customers to upgrade and stay on supported versions.

This guide outlines how you can use Chainguard's Security Advisories to learn more about the status of a CVE within a given package. It will walk through a practical example of discovering a vulnerability in a Chainguard Container, searching for Security Advisories associated with this vulnerability, and then comparing the original container image with a later version.

## Advisory database scope

Chainguard Security Advisories cover vulnerabilities in APK packages. The advisory lookup does not determine whether a finding affects a Go module, Java dependency, or another non-APK component.

For an APK finding in a Chainguard image, use [Check whether a reported CVE affects your container](/chainguard/containers/security-and-compliance/vulnerability-management/cve-status/) to compare the scanner result with the advisories for the packages in the image. Use the image digest and the platform that the scanner analyzed.

For a Go-module or Java-dependency finding, the absence of an APK advisory does not make it a false positive. Validate these findings against the scanner's language-package evidence and the dependency's upstream advisory data, as described in [When the finding is a Go module or Java dependency](/chainguard/containers/security-and-compliance/vulnerability-management/cve-status/#when-the-finding-is-a-go-module-or-java-dependency).

## Prerequisites

You don't need any special access or software to explore Chainguard's Security Advisories. However, this guide includes a few examples that use specific software tools in order to outline a practical example of how one might navigate and use these Security Advisories.

To follow along with these examples, you'll need the following tools installed.

* A security scanner like [Trivy](https://trivy.dev/docs/latest/getting-started/installation/), [Grype](https://github.com/anchore/grype#installation), or [Docker Scout](https://docs.docker.com/get-docker/) — This guide's examples use Grype to scan container images and identify vulnerabilities. However, you should be able to follow along with any container vulnerability scanning tool.
* [`chainctl`](/platform/chainctl/) — Chainguard's command-line interface tool. To install `chainctl`, follow our [installation guide](/platform/chainctl-usage/how-to-install-chainctl/).
* [`jq`](https://jqlang.github.io/jq/) — `jq` is a command-line JSON processor that allows you to filter and manipulate streaming JSON data. Although it isn’t strictly necessary for the purposes of this guide, this tutorial includes commands that use `jq` to filter command output that would otherwise be difficult to read. You can install `jq` by following the instructions on [the project’s Download jq page](https://jqlang.github.io/jq/download/).

Lastly, note that this guide includes examples involving a sample organization with a private registry provided by Chainguard and named `example.com`. If you would like to follow along with your own private Chainguard Containers, be sure to change this where relevant to reflect your own setup. If you don't have access to a private registry, you can also follow along using Chainguard's public [Free containers](/chainguard/containers/concepts/container-categories/#free-containers), but be aware that these are limited to only the `latest` or `latest-dev` tags. You can download Free Containers from the `cgr.dev/chainguard` registry, as in `cgr.dev/chainguard/go:latest`.

## So you've encountered a CVE in a Chainguard Container

Say you use a vulnerability scanner like Grype or Docker Scout to inspect a certain Chainguard Container. This example uses Grype to scan a Production container image, specifically one tagged with `1.21.2`.

As of this writing, the `go:1.21.2` image points to the image digest `sha256:04ab6905552b54a6977bed40a4105e9c95f78033e1cde67806259efc4beb959d`. Be aware that this tag will be withdrawn in the future, but the digest will remain available.

```sh
grype cgr.dev/example.com/go:1.21.2
```

Because this is the digest for an older version of Chainguard's Go container image, this command's output will show a number of vulnerabilities that have been found to exist within this specific version of the container image.

```
. . .

   ├── by severity: 28 critical, 230 high, 185 medium, 4 low, 0
...
```

This output shows that this particular image has many critical and high vulnerabilities. The Grype output also lists each of the packages affected by CVEs as well as the specific vulnerabilities it found for each.

> Note: All of these vulnerabilities have been addressed in newer versions of the Go Chainguard Container.

Within this output, we find that the package `nghttp2` is referenced.

```sh
grype cgr.dev/example.com/go:1.21.2| grep nghttp2
```

```
...
libnghttp2-14        1.56.0-r0  1.57.0-r0        apk        CVE-2023-44487       High
libnghttp2-14        1.56.0-r0  1.61.0-r0        apk        CVE-2024-28182       Medium
libnghttp2-14        1.56.0-r0  1.57.0-r0        apk        GHSA-qppj-fm5r-hxr3  Unknown
```

We'll use the `HIGH` severity vulnerability listed here as an example when we explore Chainguard's Security Advisories in the next section.

Copy or note down the CVE identifier (`2023-44487` in this case). Additionally, note down the name of the affected package (`nghttp2`). You'll use these details to retrieve more information about the CVE shortly.

## Searching the Security Advisories

After finding a vulnerability in a Chainguard Container, you can navigate to [Chainguard's **Security Advisories** page](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-security-advisories-how-to-use). This is a helpful resource you can use to determine the status for any CVE found within a Chainguard Container.

The Security Advisories page is self-service, allowing you to check whether Chainguard is aware of a specific vulnerability and whether it has been mitigated in a certain package version. You can search the Security Advisories page by entering any CVE identifier to find what packages are affected by that CVE. You can also enter the names of individual packages to find what CVEs have been reported within them.

Enter the CVE identifier you copied previously (`2023-44487`) into the search box at the top of the page. This will immediately filter the list of security advisories to only show packages where that CVE has been reported. It will also show the **Status** of each.

If you click on any row in the filtered list, it will take you to the CVE's specific page. There, you'll find a list of every package where this CVE has been reported.

As with the Security Advisories landing page, you can filter by package name here on the CVE's landing page as well. Enter the name of the package we highlighted previously (`nghttp2`) and the index will immediately filter out any packages that do not mention that string in their metadata.

For CVE-2023-44487, the `nghttp2` package's **Status** is marked as **Fixed** in version `1.57.0-r0` as of October 11, 2023.

## Comparing containers

Chainguard's Security Advisories have told us that the CVE-2023-44487 was fixed and removed from `nghttp2` with a more recent version than the one available in Chainguard's `go:1.21.2` image. However, we don't have to take that report at face value; we can inspect a later version of the same container image and compare it with version `1.21.2` to determine whether the vulnerability is still present in the later version.

If you inspect a later version of the image with Grype, you'll find that this time it does not report the high CVE we noted earlier. This example inspects version `1.21.5` of the image.

```shell
grype cgr.dev/example.com/go:1.21.5 | grep nghttp2
```

You should find that the high CVE fixed in this specific version no longer appears in the output. (You may still see other CVEs fixed in later versions.)

You can go a step further by comparing these two container images directly with the `chainctl images diff` command, as in this example.

```sh
chainctl images diff \
cgr.dev/example.com/go:1.21.2 \
cgr.dev/example.com/go:1.21.5 | jq .
```

This example will return a lot of output, as there are significant differences from version `1.21.2` to `1.21.5` of the Go container image. If you scroll down to the `vulnerabilities` section of this output, you'll find a list of vulnerabilities that are present in version `1.21.2` but have been removed by version `1.21.5`.

```
  "vulnerabilities": {

. . .

{
     "id": "CVE-2023-44487",
     "reference": "chainguard:distro:chainguard:rolling",
     "severity": "High"
   },

 . . .
```

As this output indicates, `CVE-2023-44487` is no longer present in later versions of the Go Chainguard Container. If you were using version `1.21.2`, you should seriously consider upgrading to a later version.

## Learn more

The Security Advisories page serves as a helpful resource for anyone who wants to learn more about CVEs reported within Chainguard Containers. You can search the database of advisories to learn more about any CVEs you encounter as you work with Chainguard Containers.

Additionally, we encourage you to explore the [Chainguard Containers Directory](https://images.chainguard.dev/), the parent site of the Security Advisories page. The Directory allows users to explore the complete inventory of Chainguard Containers. Finally, we encourage you to learn more about [noisy scan results](/chainguard/containers/scanners/false-results/) when scanning Chainguard Containers.

To learn more about why scan results may differ between your scanner and the Chainguard Console, refer to [the support article "Understanding Vulnerability Scanner Discrepancies with Chainguard Images."](https://support.chainguard.dev/hc/en-us/articles/49564106705819-Understanding-Vulnerability-Scanner-Discrepancies-with-Chainguard-Images)

---

### Registry overview
_Path: chainguard/containers/registry/overview.md_

Chainguard Registry hosts more secure container images with two access tiers: public Free images available to everyone, and production images that require authentication for enterprise features like SLAs and version pinning. The registry integrates with standard container tools while providing enhanced security through signed images and comprehensive metadata.

While all public Chainguard Containers are freely available, logging in with a Chainguard account and authenticating when pulling from the registry provides a mechanism for Chainguard to contact you if there are any current or known upcoming issues with images you are pulling.

If you would like to learn more about **Chainguard Containers**, you can review our [documentation](/chainguard/containers/overview/), and you can request further information through our [inquiry form](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

## What your organization can pull

Your organization's registry at `cgr.dev/$ORGANIZATION/` holds only the containers your organization has access to, which is a subset of what the public [Chainguard Containers Directory](https://images.chainguard.dev/) lists. Browsing a container in the Directory doesn't mean you can pull it. Refer to [Onboard your teams](/get-started/onboard-your-teams/#what-your-organization-can-pull) for how your subscription determines what's available, and to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/) when a container you expected is missing.

## Troubleshooting authentication errors

If a login or pull returns a `401`, `403`, or `404`, refer to [Troubleshoot registry authentication errors](/chainguard/containers/troubleshooting/registry-errors/), which maps each error to its cause.

## Status

You can check the status of Chainguard's registry at [https://status.cgr.dev](https://status.cgr.dev/).

## Network requirements

Refer to our [Network requirements](/chainguard/containers/registry/network-requirements/) reference page for details about how to ensure access to Chainguard's registry in environments using firewalls, access control lists, and proxies.

## Using a caching proxy with Chainguard's registry

Chainguard does not offer an SLA for uptime for the Chainguard's registry. In order to minimize production dependency on the Chainguard's registry, we recommend that customers use a pull-through proxy for maximum reliability.

We currently provide documentation on how you can set up a pull-through cache for the Chainguard's registry on the following platforms:

* [Amazon ECR](/chainguard/containers/registry/pull-through-guides/ecr-pull-through/)
* [Google Artifact Registry](/chainguard/containers/registry/pull-through-guides/artifact-registry-pull-through/)
* [JFrog Artifactory](/chainguard/containers/registry/pull-through-guides/artifactory-containers-pull-through/)
* [Sonatype Nexus](/chainguard/containers/registry/pull-through-guides/nexus-pull-through/)
* [Cloudsmith](/chainguard/containers/registry/pull-through-guides/cloudsmith-pull-through/)

---

### Chainguard Containers network requirements
_Path: chainguard/containers/registry/network-requirements.md_

This document provides an overview of network requirements for using [Chainguard Containers](https://www.chainguard.dev/chainguard-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement). To use Chainguard tools and Containers in environments with firewalls, VPNs, and IDS/IPS systems, you will need to add some rules to allow traffic into and out of your networks.

Chainguard Containers do not call Chainguard services while running, so no network changes would be required to the runtime environment. Review the **Notes** column for more info on each Hostname.

## Chainguard Containers hosts

This table lists the DNS hostnames, associated ports, and protocols that will need to be allowed through firewalls and proxies to use Chainguard Containers:

| Hostname                | Port | Protocol | IP      | Notes                                 |
|-------------------------|------|----------|---------|---------------------------------------|
| cgr.dev                 | 443  | HTTPS    | v4      | Main container image registry         |
| console.chainguard.dev  | 443  | HTTPS    | v4      | Chainguard dashboard                  |
| data.chainguard.dev     | 443  | HTTPS    | v4      | Console API endpoint                  |
| console-api.enforce.dev | 443  | HTTPS    | v4      | Registry API endpoint                 |
| enforce.dev             | 443  | HTTPS    | v4      | Registry authentication               |
| dl.enforce.dev          | 443  | HTTPS    | v4      | `chainctl` downloads                  |
| issuer.enforce.dev      | 443  | HTTPS    | v4      | Registry STS (Security Token Service) |
| apk.cgr.dev             | 443  | HTTPS    | v4      | Package repository                    |
| virtualapk.cgr.dev      | 443  | HTTPS    | v4      | Package repository                    |
| packages.cgr.dev        | 443  | HTTPS    | v4      | Package repository (Extra packages)   |
| packages.wolfi.dev      | 443  | HTTPS    | v4 & v6 | Package repository (Free containers)  |
| tarballs.cgr.dev        | 443  | HTTPS    | v4      | Upstream source archives referenced by SBOM `downloadLocation` fields |

Most of these hosts are needed to pull containers and packages. `tarballs.cgr.dev` is the
exception: it is only needed if you resolve the source archives that Chainguard SBOMs point
at. Where an upstream project has no stable, downloadable source archive, Chainguard mirrors
a source tarball and records that URL as the package's SPDX `downloadLocation`. Tooling that
follows those URLs (source-provenance checks, license and compliance scanners, air-gapped
source mirroring) needs egress to this host. Container and package pulls do not.

> If you experience networking issues while trying to use Chainguard Containers, please ensure that your firewall allows traffic to and from these hosts, and that it doesn't have any rules to block `.dev` domains.

## Chainguard Containers third-party hosts

This table lists the third-party DNS hostnames, associated ports, and protocols that will need to be allowed through firewalls and proxies to use Chainguard Containers:

| Hostname                                                  | Port | Protocol | IP      | Notes                                                    |
|-----------------------------------------------------------|------|----------|---------|----------------------------------------------------------|
| 9236a389bd48b984df91adc1bc924620.r2.cloudflarestorage.com | 443  | HTTPS    | v4 & v6 | Blob storage for *.cgr.dev                               |
| support.chainguard.dev                                    | 443  | HTTPS    | v4      | Support access for customers                             |
| tuf-repo-cdn.sigstore.dev                                 | 443  | HTTPS    | v4      | Sigstore trust root for `chainctl` signature verification |

> Note that the `9236a389bd48b984df91adc1bc924620.r2.cloudflarestorage.com` host is used to serve both image data and packages via `*.cgr.dev`.

## Ingress and egress

Connections to the hosts listed on this page are generally initiated as new outbound connections. If you are using stateless firewall rules, then you will need to add symmetric rules to ensure that traffic flows correctly.

You will need egress rules that allow new traffic to the hosts listed here. You will need corresponding ingress rules that allow related and established traffic.

## DNS records and TTLs

Many of the hosts listed on this page use multiple DNS A records or CNAME aliases. Additionally, many A records have a short time to live of 60 seconds, and the majority are less than an hour (3600s).

If your network filters traffic based on IP addresses, ensure that any firewalls update their rules at an appropriate interval to match the TTL for each DNS record.

## Minimum TLS parameters requirements

For guaranteed connectivity, the following TLS requirements must be at
minimum supported by clients and servers communicating with Chainguard
Containers and endpoints:

Protocol Versions:

- TLSv1.3
- TLSv1.2

TLS Cipher Suites:

- TLS_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS Supported Groups:

- X25519MLKEM768
- secp384r1

TLS Signature Schemes:

- ecdsa_secp256r1_sha256
- rsa_pss_pss_sha256

Protocol support:

- Support for encrypted HTTP/2 is required, including by any proxies in use

The requirements can be approximately tested with the following OpenSSL client command:

```shell
openssl s_client -cipher @SECLEVEL=2:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -ciphersuites TLS_AES_256_GCM_SHA384 -groups X25519MLKEM768:secp384r1 -alpn h2 -connect cgr.dev:443 < /dev/null
```

> Note that in the case of TLSv1.2 connectivity you must check the output for `Extended master secret: yes`.

You can replace `cgr.dev:443` with your own deployments.

Many of the endpoints for Chainguard products require support for the encrypted [HTTP/2 protocol](https://http2.github.io/). Some decrypting proxies might not support HTTP/2.

{{< blurb/noproxy >}}

---

### Pull-through guides
_Path: chainguard/containers/registry/pull-through-guides/_index.md_

Documentation and resources explaining how to set-up various third-party registries as pull-through caches
or mirrors of Chainguard's registry.

---

### How to set up pull through from Chainguard's registry to Amazon ECR
_Path: chainguard/containers/registry/pull-through-guides/ecr-pull-through/index.md_

In March 2026, AWS [announced support](https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-ecr-pull-through-cache-chainguard/) for using Amazon Elastic Container Registry (ECR) as a pull through cache for Chainguard's registry. By configuring a pull through cache rule, you can pull Chainguard Containers through your own ECR private registry. ECR caches each image on the first pull and checks the upstream registry for a newer version at most once every 24 hours, which reduces your workloads' direct dependency on Chainguard's registry.

This tutorial outlines how to configure a pull through cache rule for [Chainguard's registry](/chainguard/chainguard-registry/overview/) with [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html). Unlike some other registries, ECR treats Chainguard as an upstream that requires authentication. This means you store a Chainguard pull token in AWS Secrets Manager and reference it from a cache rule. This guide scopes that rule to your organization's private namespace, so it caches your [Production containers](/chainguard/containers/concepts/container-categories/#production-containers) and lets you pull them with short image paths.

## Prerequisites

To complete this tutorial, you need the following:

* An AWS account with permissions to create ECR pull through cache rules and AWS Secrets Manager secrets. Refer to the AWS guide on [IAM permissions for pull through cache](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-iam.html) for details.
* The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed and configured, if you plan to follow the command line examples. You can complete every step in the [Amazon ECR console](https://console.aws.amazon.com/ecr/) instead.
* Docker installed on your local machine. Refer to [the official documentation](https://docs.docker.com/engine/install/) to set this up.
* `chainctl`, Chainguard's command-line interface tool, installed on your local machine. If you haven't already installed it, follow our [`chainctl` installation guide](/chainguard/chainctl-usage/how-to-install-chainctl/).

To pull Production Containers, you also need permissions to pull images from your organization's private Chainguard registry. At minimum, you must be granted the `registry.pull` role, though other built-in roles like `owner`, `editor`, or `viewer` also work. Refer to our [Built-in roles and capabilities reference](/chainguard/administration/iam-organizations/roles-role-bindings/capabilities-reference/#pull-token-creator-roles) for more details. If you don't already have access to Production Containers, you can [contact our sales team](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

## Creating a Chainguard pull token

Because ECR authenticates to Chainguard's registry on your behalf, you must supply it with credentials. Chainguard [pull tokens](/chainguard/chainguard-registry/authenticating/#authenticating-with-a-pull-token) are longer-lived tokens designed for environments that don't support OIDC, such as CI systems, Kubernetes clusters, or registry mirroring tools like ECR.

First, log in with `chainctl`:

```sh
chainctl auth login
```

Then create a pull token:

```sh
chainctl auth configure-docker --pull-token
```

If you belong to more than one organization, this command prompts you to select one. Choose the organization whose Production Containers you want to pull through ECR. By default, the token expires in 30 days; you can adjust this with the `--ttl` flag (for example, `--ttl=8760h` for one year).

This command prints a `docker login` command that includes `--username` and `--password` arguments:

```output
. . .

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

You don't need to run this `docker login` command, but note down the `<identity-id>` and `<pull-token>` values. You'll supply them to AWS Secrets Manager in the next step.

## Storing your pull token in AWS Secrets Manager

ECR reads your Chainguard credentials from an AWS Secrets Manager secret rather than from the cache rule itself. The secret's name must begin with the `ecr-pullthroughcache/` prefix, and it must be in the same account and Region where you'll create the cache rule.

To create the secret with the AWS CLI, run the following command. Replace `<identity-id>` and `<pull-token>` with the values from the previous step, replace `<secret_name>` with a name for your secret, and set `<region>` to the Region where you'll create the cache rule:

```sh
aws secretsmanager create-secret \
    --name ecr-pullthroughcache/<secret_name> \
    --secret-string '{"username":"<identity-id>","accessToken":"<pull-token>"}' \
    --region <region>
```

The secret must use the two keys `username` and `accessToken`, and it must be encrypted with the default `aws/secretsmanager` KMS key. ECR doesn't support customer managed keys for pull through cache secrets. The `create-secret` command uses the default key unless you specify otherwise.

Note down the secret's Amazon Resource Name (ARN) from the command's output, as you'll need it when creating the cache rule with the CLI. The ARN has a format like the following:

```ARN
arn:aws:secretsmanager:<region>:<aws_account_id>:secret:ecr-pullthroughcache/<secret_name>
```

Alternatively, you can create the secret in the [AWS Secrets Manager console](https://console.aws.amazon.com/secretsmanager/). Choose **Store a new secret**, select **Other type of secret**, and add two key/value pairs: `username` set to your pull token ID and `accessToken` set to your pull token password. Keep the default `aws/secretsmanager` encryption key, and give the secret a name beginning with `ecr-pullthroughcache/`. You can also create the secret as part of the cache rule workflow described in the next section.

## Creating a pull through cache rule

With your credentials stored, you can create a pull through cache rule that points at Chainguard's registry.

To create the rule with the AWS CLI, run the following command. Replace `--upstream-repository-prefix` with your organization's name (this guide uses `example.com`), replace the `--credential-arn` value with the ARN of the secret you created, and set `<region>` to the Region where you created the secret:

```sh
aws ecr create-pull-through-cache-rule \
    --ecr-repository-prefix cg-ecr \
    --upstream-registry-url cgr.dev \
    --upstream-repository-prefix example.com \
    --credential-arn arn:aws:secretsmanager:<region>:<aws_account_id>:secret:ecr-pullthroughcache/<secret_name> \
    --region <region>
```

This command creates a rule scoped to a single Chainguard namespace:

* `--upstream-repository-prefix example.com` limits the rule to your organization's private namespace at `cgr.dev/example.com`. Replace `example.com` with your organization's name or ID, which you can find by running `chainctl iam organizations list -o table`. When you pull an image, ECR matches this prefix and drops it from the image path, so you don't repeat the namespace on every pull.
* `--ecr-repository-prefix cg-ecr` sets the local namespace for the repositories ECR creates, following the scheme `cg-ecr/<image-name>`. You can use any prefix you like; this guide uses `cg-ecr` to keep the local prefix distinct from Chainguard's namespaces.
* `--upstream-registry-url` **must** be set to `cgr.dev`.

Alternatively, you can create the rule in the [Amazon ECR console](https://console.aws.amazon.com/ecr/):

1. From the navigation bar, choose the Region in which to configure your private registry.
2. In the navigation pane, click **Private registry**, then select **Pull through cache** under **Features & Settings**.
3. On the **Pull through cache rules** page, click **Add rule**.
4. On the **Specify upstream** page, select **Chainguard**, then click **Next**.
5. On the **Configure authentication** page, choose **Use an existing AWS secret** and select the secret you created. To create the secret here instead, choose **Create an AWS secret** and enter your pull token ID and password. Click **Next**.
6. On the **Specify namespaces** page, set the **Cache namespace** to `cg-ecr`. ECR populates a default of `chainguard`, but this guide uses `cg-ecr` to keep the local prefix distinct from Chainguard's namespaces. For the **Upstream namespace**, select **A specific prefix** and enter your organization's name (this guide uses `example.com`) to scope the rule to your private namespace. Click **Next**.
7. On the **Review and create** page, review the configuration and click **Create**.

After creating the rule, you can [validate it](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-working-validating.html) from the console or CLI. Validation confirms that ECR can reach Chainguard's registry and authenticate with your stored credentials.

{{< note >}}
Scoping the rule to a single namespace keeps pull paths short, but it limits the rule to that one namespace. To cache any repository your credentials can access — including your other private namespaces and [Free containers](/chainguard/containers/concepts/container-categories/#free-containers) from the public `chainguard` namespace — omit `--upstream-repository-prefix` on the CLI, or select **No prefix** for the **Upstream namespace** in the console. ECR then defaults to `ROOT` and caches any repository. With an unscoped rule, include the full upstream namespace in each pull path, such as `cg-ecr/example.com/chainguard-base:latest` or `cg-ecr/chainguard/go:latest`.
{{< /note >}}

## Testing pull through from Chainguard's registry to Amazon ECR

Before pulling an image, authenticate Docker to your ECR private registry. Replace `<aws_account_id>` and `<region>` to match your setup:

```sh
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
```

After logging in, you can pull a Chainguard Container through ECR. Because the rule is scoped to your organization's namespace, ECR drops that namespace from the pull path. Container images pulled through the rule use the following URI format, where the first path element is the repository prefix you configured (`cg-ecr`) and the remainder is the image name:

```
<aws_account_id>.dkr.ecr.<region>.amazonaws.com/cg-ecr/<image-name>:<tag>
```

The following example pulls the `chainguard-base` Production Container from the `example.com` namespace the rule is scoped to:

```sh
docker pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/cg-ecr/chainguard-base:latest
```

Here, `cg-ecr` is your ECR repository prefix and `chainguard-base` is the image name. ECR resolves this to `cgr.dev/example.com/chainguard-base` in Chainguard's registry. You don't include `example.com` in the pull path because the rule is already scoped to it.

On the first pull of an image, ECR creates a repository under the `cg-ecr/` prefix and caches the image. ECR serves subsequent pulls from that cache.

## Debugging pull through from Chainguard's registry to Amazon ECR

If you run into issues when pulling Containers from Chainguard's registry through ECR, check the following:

* Confirm that your environment meets all [Containers network requirements](/chainguard/containers/registry/network-requirements/). The first pull of an image requires a route to the internet, even if you access ECR through a VPC endpoint.
* When creating the cache rule, ensure the upstream registry URL is set to `cgr.dev`. This field **must not** contain additional components.
* Confirm that your Secrets Manager secret uses the `username` and `accessToken` keys, and that its name begins with the `ecr-pullthroughcache/` prefix. The secret must be in the same account and Region as the cache rule.
* Confirm that the pull token stored in the secret has not expired and that its identity has permission to pull the container images you're requesting.
* If you scoped the rule to a namespace, confirm your pull path omits that namespace. For a rule scoped to `example.com`, pull `cg-ecr/chainguard-base:latest`, not `cg-ecr/example.com/chainguard-base:latest`.
* You can troubleshoot by running `docker login` from another machine (using the pull token credentials) and pulling directly from `cgr.dev/example.com/<image name>`, or from `cgr.dev/chainguard/<image name>` for Free Containers.
* Refer to the AWS guide on [troubleshooting pull through cache issues](https://docs.aws.amazon.com/AmazonECR/latest/userguide/error-pullthroughcache.html) for common errors and their resolutions.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by checking out our [Containers documentation](/chainguard/containers/overview/). If you'd like to learn more about Amazon ECR pull through cache rules, refer to the [official AWS documentation](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html).

---

### How to set up pull through from Chainguard's registry to Google Artifact Registry
_Path: chainguard/containers/registry/pull-through-guides/artifact-registry-pull-through/index.md_

Organizations can use Chainguard Containers along with third-party software repositories in order to integrate with current workflows as the single source of truth for software artifacts. In this situation, you can set up a proxy repository to function as a mirror of [Chainguard's registry](/chainguard/chainguard-registry/overview/). This mirror can then serve as a pull through cache for your Chainguard Containers.

This tutorial outlines how to set up a remote repository with [Google Artifact Registry](https://cloud.google.com/artifact-registry/docs/repositories/remote-overview). It will walk you through how to set up an Artifact Registry Repository you can use as a pull through cache for Chainguard's Free containers or Production containers originating from a private Chainguard repository.

## Prerequisites

In order to complete this tutorial, you will need the following:

* Docker installed on your local machine. Follow the [official installation instructions](https://docs.docker.com/engine/install/) to set this up.
* Administrative privileges over a Google Cloud Platform project. This project will also need to have the [Artifact Registry API](https://cloud.google.com/artifact-registry/docs/reference/rest) enabled.
* If you plan to set up an Artifact Registry repository to serve as a pull through cache for Production containers, then you will also need to have privileges to create a pull token from Chainguard.
    * Additionally, you'll need `chainctl` installed to create the pull token. If you haven't already installed this, follow the [installation guide](/chainguard/chainctl-usage/how-to-install-chainctl/).

## Setting up Google Artifact Registry as a pull through for free containers

Chainguard's Free container images are free to use, publicly available, and always represent versions tagged as `:latest`.

To set up a remote repository in Google Artifact Registry from which you can pull Chainguard Free container images, log in to the [Google Cloud Console](https://console.cloud.google.com) and choose your project. Once there, navigate to the [Artifact Registry section](https://console.cloud.google.com/artifacts), click on **Repositories** in the left-hand navigation menu, and click on the **Create Repository** button near the top of the page.

On the **Create Repository** page, enter the following details for your new remote repository:

* **Name** — This is used to refer to your repository. You can choose whatever name you like here, but this guide's examples will use the name `chainguard-pull-through`.
* **Format** — For the purposes of this guide, this must be set to **Docker**.
* **Mode** — Set this to **Remote**.
* **Remote repository source** — Choose **Custom** then enter `https://cgr.dev/` in the **Custom repository** field.

Following that, choose the Location, Encryption and Cleanup policy options for your repository. This guide's examples will use the location `us-central1`, but you can choose the location that best suits your needs. Finally, click the **Create** button to create the repository.

### Testing pull through of a free container image

By default, the Artifact Registry repository requires authentication. Log in with a valid Google Artifact Registry:

```sh
gcloud auth configure-docker us-central1-docker.pkg.dev
```

Be sure to change `us-central1` to reflect the location of your Artifact Registry repository.
Also, after running this command you may be prompted to log in to your Google Cloud account.

After running the command, you will be able to pull a Free container through Google Artifact Registry. The following example pulls the `go` container:

```sh
docker pull us-central1-docker.pkg.dev/<your-project-id>/chainguard-pull-through/chainguard/go:latest
```

This command first specifies the location of the Artifact Registry repository we just created (`us-central1-docker.pkg.dev/<your-project-id>/chainguard-pull-through/`). It then follows that with the name of the Free containers and the remote repository we want to pull it from (`chainguard/go:latest`).

If you run into issues with this command, be sure that it contains the correct Google Artifact Registry URL for your repository, including the location and project ID.

## Setting up Google Artifact Registry as a pull through for production containers

Chainguard's Production container images are enterprise-ready container images that come with patch SLAs and features such as [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) (FIPS) readiness. The process for setting up a Google Artifact Registry repository that you can use as a pull through cache for Chainguard Production container images is similar to the one outlined previously for Free containers, but with a few extra steps.

To get started, you will need to create [a pull token](/chainguard/chainguard-registry/authenticating/#authenticating-with-a-pull-token) for your organization's registry. Pull tokens are longer-lived tokens that can be used to pull container images from other environments that don't support OIDC, such as some CI environments, Kubernetes clusters, or with registry mirroring tools like Google Artifact Registry.

First log in with `chainctl`:

```sh
chainctl auth login
```

Then configure a pull token:

```sh
chainctl auth configure-docker --pull-token
```

This command will prompt you to select an organization. Be sure to select the organization whose Production container images you want to pull through the Artifact Registry repository.

This will create a pull token and print a `docker login` command that can be run in a CI environment to log in with the token. This command includes both `--username` and `--password` arguments.

Note down the `username` value, as you will need it shortly. Then run the following command to create an environment variable named `$PASSWORD` set to the pull token password generated by the previous command:

```sh
export PASSWORD="<pull-token>"
```

Now that you've set up a pull token, you can configure a repository for pulling through Production container images.

You can edit the existing repository and all your users will have access to the private images. Alternatively, you could create a new `chainguard-private` repository exactly as before but with restricted access, though restricting access to repositories in Google Artifact Registry is beyond the scope of this guide.

First, you will need to store the pull token password as a Google Secret Manager secret. This is because Google Artifact Registry does not support storing passwords directly in the repository configuration. To do this, first run the following command:

```sh
gcloud secrets create chainguard-pull-token
```

This command creates an empty secret. Next, you can update the secret with the pull token password using the environment variable you set previously:

```sh
echo -n $PASSWORD | gcloud secrets versions add chainguard-pull-token --data-file=-
```

If you haven't already done so, this command will ask if you want to enable the [Secret Manager API](https://cloud.google.com/secret-manager/docs/configuring-secret-manager?hl=en). Press `y` and then `ENTER` to enable the API and allow the command to finish.

Alternatively, you can also provide the secret using the Google Cloud Console in the [Secret Manager](https://console.cloud.google.com/security/secret-manager) section. To do this, select **Create Secret**, provide a name for the secret, and enter the pull token password in the **Secret value** field. You also have the option to choose a replication policy, rotation policy, expiration policy, notification policy and more for the secret.

Back in the Google Artifact Registry, click on the repository you want to configure for pulling through Production containers and then click on the **Edit** button to edit the repository configuration. In the **Remote repository source** section of the configuration screen, choose **Authenticated**.

Enter the pull token `username` value in the **Username** field. In the **Password** field, select the secret you created in Google Secret Manager.

Click the **Save** button to apply the changes.

### Testing pull through of a production container:

As with testing pull through of a Free container, you'll first need to authenticate to the Artifact Registry:

```sh
gcloud auth configure-docker us-central1-docker.pkg.dev
```

Be sure to change `us-central1` to reflect the location of your Artifact Registry repository.

After running the command, you will be able to pull any Production container images that your organization has access to through Google Artifact Registry. For example, the following command will pull the `chainguard-base` Container if your organization has access to it:

```sh
docker pull us-central1-docker.pkg.dev/<your-project-id>/chainguard-pull-through/<example.com>/chainguard-base:latest
```

Be sure the `docker pull` command you run includes the name of your Chainguard organization's registry.

## Debugging pull through from Chainguard's registry to Google Artifact Registry

If you run into issues when trying to pull Containers from Chainguard's registry to Google Artifact Registry, please ensure the following requirements are met:

* Ensure that all Containers [network requirements](/chainguard/containers/registry/network-requirements/) are met.
* When configuring a remote Google Artifact Registry repository, ensure that the **URL** field is set to `https://cgr.dev/`. This field **must not** contain additional components.
* You can troubleshoot by running `docker login` from another node (using the Google Artifact Registry pull token credentials) and try pulling an image from `cgr.dev/chainguard/<image name>` or `cgr.dev/<company domain>/<image name>`.
* It could be that your Google Artifact Registry repository was misconfigured. In this case, create and configure a new Google Artifact Registry repository to test with.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by checking out our [Containers documentation](/chainguard/containers/overview/). If you'd like to learn more about Google Artifact Registry, we encourage you to refer to the [official Google Artifact Registry documentation](https://cloud.google.com/artifact-registry/docs/overview).

---

### How to set up pull through from Chainguard's registry to Cloudsmith
_Path: chainguard/containers/registry/pull-through-guides/cloudsmith-pull-through/index.md_

Organizations often have their own internal software repositories and registries integrated into their systems. This guide explains how to set up the Cloudsmith artifact repository to ingest [Chainguard Containers](/chainguard/containers/overview/) by acting as a pull-through cache.

This tutorial outlines how to set up a remote repository with [Cloudsmith](https://cloudsmith.com/). It will walk you through how to set up a Cloudsmith repository you can use as a pull through cache for Chainguard's Free containers or for Production containers originating from a private Chainguard repository.

## Prerequisites

In order to complete this tutorial, you will need the following:

* Docker installed on your local machine. Follow the [official installation instructions](https://docs.docker.com/engine/install/) to set this up.
* Administrative privileges over a Cloudsmith project. You can set up an account by visiting the [Cloudsmith website](https://cloudsmith.com/).
* If you plan to set up a Cloudsmith repository to serve as a pull through cache for Production container images, then you will also need to have privileges to create a pull token from Chainguard.
    * Additionally, you'll need `chainctl` installed to create the pull token. If you haven't already installed this, follow the [installation guide](/chainguard/chainctl-usage/how-to-install-chainctl/).

## Setting up Cloudsmith as a pull through for free containers

Chainguard's [Free container images](/chainguard/containers/concepts/container-categories/#free-containers) are free to use, publicly available, and always represent versions tagged as `:latest`.

To set up a remote repository in Cloudsmith through which you can pull Free container images, log in to the [Cloudsmith App](https://cloudsmith.io/user/login/). Once there, navigate to the **Repositories** tab and click **+ Create Repository**.

A window will appear where you can enter the following details for your new remote repository:

* **Name** — This is used to refer to your repository. You can choose whatever name you like here, but this guide's examples will use the name `chainguard-public`.
* **Storage Region** — Here, select the region closest to your location.

Following that, you will need to set an [upstream proxy](https://help.cloudsmith.io/docs/upstream-proxying-caching) for this repository. This is what will let Cloudsmith know where to pull container images from.

In the lower left-hand navigation menu, select **Upstream Proxying**. From there, click **➕ Create Upstream** and select **Docker** as the upstream source. This will open a window where you can enter the details for the upstream source.

This window has a few fields for which you need to enter values. The **Name** field can include any name you'd like for the upstream source, but it can be helpful to choose something descriptive. In our example the name is "Chainguard Public Upstream." Likewise, you can choose whatever **Priority** value you prefer. This dictates the order in which requests are resolved, with `1` being resolved first, `2` second, and so on.

The most important field in this window is the **Proxy URL** value. In order to use Cloudsmith as a pull through cache for Free images, this **must** be set to `https://cgr.dev/chainguard`.

Lastly, be sure that the **Mode** is set to **Cache and Proxy** and the **Verify SSL Certificates** option is selected. Then, click **Create upstream proxy**.

If you entered all the details correctly, then the upstream proxy will be created successfully and you can test pulling a Free container image through Cloudsmith.

### Testing pull through of a free container image

Before testing whether you can pull a Free container through Cloudsmith, you'll need to log in to the Cloudsmith registry with `docker`:

```sh
docker login docker.cloudsmith.io
```

This command will prompt you to enter your Cloudsmith username and password. Your username appears in the top-right corner of the Cloudsmith web app. If you click on this, a drop-down menu will appear. Select **API Settings**; on the resulting page you'll find a field named **API Key** containing a 40-character string. You can use this API key to access Cloudsmith programmatically or, as in the case of this example, use it as a password in a `docker login` command.

After running the command, you will be able to pull a Free container through your new Cloudsmith repository. The following example pulls the `nginx` container image:

```sh
docker pull docker.cloudsmith.io/<cloudsmith-organization>/<cloudsmith-repository>/nginx:latest
```

Be sure to replace `<cloudsmith-organization>` and `<cloudsmith-repository>` with the names of your Cloudsmith organization and repository, respectively.

If everything worked correctly, the image appears in your repository.

If you run into issues pulling images like this, ensure that your `docker pull` command specifies the correct Cloudsmith organization and repository.

## Setting up Cloudsmith as a pull through for production container images

Production Chainguard Containers are enterprise-ready images that come with patch SLAs and features such as [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) (FIPS) readiness. The process for setting up a Cloudsmith repository that you can use as a pull through cache for Production containers is similar to the one outlined previously for Free containers, but with a few extra steps.

You can create a new Cloudsmith repository or use the same repository you used as a pull through cache for Free containers.

Next, you'll need to create [a pull token](/chainguard/chainguard-registry/authenticating/#authenticating-with-a-pull-token) for your organization's registry through Chainguard. Pull tokens are longer-lived tokens that can be used to pull Containers from other environments that don't support OIDC, such as some CI environments, Kubernetes clusters, or with registry mirroring tools like Cloudsmith.

Log in with `chainctl`:

```sh
chainctl auth login
```

Then configure a pull token:

```sh
chainctl auth configure-docker --pull-token
```

By default, this will create a pull token that lasts for 30 days. You can adjust this by appending the command with the `--ttl` flag (for example, `--ttl=24h`).

This command will prompt you to select an organization. Be sure to select the organization whose Production Containers you want to pull through your Cloudsmith repository.

This will create a pull token and print a `docker login` command that can be run in a CI environment to log in with the token. This command includes both `--username` and `--password` arguments. You don't need to run this `docker login` command, but you will need the username and password values in a moment so note them down.

Following that, you'll need to create another upstream source. Return to the Cloudsmith web app and navigate to the **Upstream Proxying** page. Click **➕ Create Upstream** and select **Docker** as the upstream source. Again, set a **Name** and **Priority** level for this source and ensure that the **Mode** is set to **Cache and Proxy**.

When pulling from a private registry through Chainguard, the **Upstream URL** must be set to `https://cgr.dev/`; any other URL here will cause an error.

Lastly, you need to add the username and password you received when you generated the pull token to the upstream source. To do this, expand the **Authentication** section and under **Method** select **Username and Password**. Then enter the username and password you noted down earlier in their respective fields.

Finally, click **Create upstream proxy**. With that, you're ready to test a Chainguard Production Container through Cloudsmith.

### Testing pull through of a Chainguard production container:

As with testing pull through of a Free container image, you'll first need to authenticate to Cloudsmith:

```sh
docker login docker.cloudsmith.io
```

After running the command, you will be able to pull any Production containers that your organization has access to through Cloudsmith. To do so, you would run a command with syntax like the following:

```sh
docker pull docker.cloudsmith.io/<cloudsmith-organization>/<cloudsmith-repository>/<chainguard-registry>/IMAGE
```

As with the `docker pull` command used in the previous section, you will need to change the `<cloudsmith-organization>` and `<cloudsmith-repository>` values to reflect your own Cloudsmith setup. Additionally, be sure to change `<chainguard-registry>` to the name of your organization's Chainguard registry.

As an example, the following command will pull the `python:3.9-dev` image from a Chainguard registry named `chainguard.edu` and through a Cloudsmith repository named `chainguard-private` owned by a Cloudsmith organization named `chainguard-example`:

```sh
docker pull docker.cloudsmith.io/chainguard-example/chainguard-private/chainguard.edu/python:3.9-dev
```

Once this command is completed you will find the Production container you pulled in your Cloudsmith repository.

If you run into issues pulling images like this, be sure that your `docker pull` command specifies the correct Cloudsmith organization and repository as well as the correct Chainguard registry.

## Debugging pull through from Chainguard's registry to Cloudsmith

If you run into issues when trying to pull Containers from Chainguard's registry to Cloudsmith, please make sure the following requirements are met:

* Ensure that all Containers [network requirements](/chainguard/containers/registry/network-requirements/) are met.
* When configuring a remote Cloudsmith repository, ensure that the **URL** field is set correctly. For Free container images, this should be `https://cgr.dev/chainguard`; for Production containers this should be `https://cgr.dev/`. This field **must not** contain any additional components.
* You can troubleshoot by running `docker login` from another node (using the Cloudsmith pull token credentials) and try pulling an image from `cgr.dev/chainguard/<image name>` or `cgr.dev/<example.com>/<image name>`, using your own organization's registry name in place of `<example.com>`.
* It could be that your Cloudsmith repository was misconfigured. In this case, create and configure a new Cloudsmith repository to test with.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by checking out our [Containers documentation](/chainguard/containers/overview/). If you'd like to learn more about Cloudsmith, we encourage you to refer to the [official documentation](https://help.cloudsmith.io/docs/welcome-to-cloudsmith-docs).

---

### How to sync images from Chainguard's registry to Harbor
_Path: chainguard/containers/registry/pull-through-guides/harbor/index.md_

[Harbor](https://goharbor.io) is an open-source artifact registry. It's designed to securely store, manage, and distribute OCI artifacts, including container images and Helm charts by enforcing policies like vulnerability scanning, image signing, and role-based access control. Harbor delivers enterprise-grade compliance, performance, and interoperability across platforms like Kubernetes and Docker, all accessible via a web UI or RESTful API.

This tutorial outlines how to sync images from Chainguard's registry to a Harbor instance. It describes two approaches:

1. A [proxy cache](https://goharbor.io/docs/2.1.0/administration/configure-proxy-cache/), which configures a Harbor project as a pull through cache.
2. A [replication rule](https://goharbor.io/docs/2.1.0/administration/configuring-replication/create-replication-rules/), which copies images to a Harbor project.

## Prerequisites

You need the following in order to complete this tutorial:

* Administrative privileges over a Harbor instance. Refer to the [official Harbor documentation](https://goharbor.io/docs/2.13.0/) to learn how to set this up.
* `chainctl` — Chainguard's command-line interface — installed on your local machine. If you don't have `chainctl` installed, refer to our [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) guide to set this up.
* Access to an account with permissions to pull Chainguard container images from your organization's repository within the Chainguard registry. This is necessary, as you will create a pull token for Harbor to use to access the registry, and you cannot generate a pull token that grants broader access than your own.

## Create a registry endpoint

Before configuring a proxy cache or replication rule, you must create a registry endpoint for the Chainguard registry.

If you don't already have one, generate a pull token in your organization:

```shell
chainctl auth configure-docker --pull-token
```

This returns username and password credentials:

```Output
To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

Take note of these values, as you'll need them shortly.

Next, open up the Harbor UI and perform the following steps:

1. Navigate to **Administration > Registries**
2. Click the **+ NEW ENDPOINT** button.
3. Configure the endpoint with these details:
    * **Provider** — There is no specific integration with the Chainguard registry, so here you must select the generic `Docker Registry` provider type.
    * **Name** — This is used to refer to your repository. You can choose whatever name you like here, but this guide's examples use the name `cgr.dev`.
    * **Endpoint URL** — This value **must** be `https://cgr.dev`.
    * **Access ID** — Enter the username value returned by the `chainctl auth` command you just ran.
    * **Access Secret** — Here, enter the password value returned by the `chainctl auth` command.
4. Click the **TEST CONNECTION** button to ensure that Harbor can reach `cgr.dev` successfully.
5. Click **OK** to create the endpoint.

After creating the endpoint, you can move on to creating a proxy cache.

## Create a proxy cache

A [*proxy* cache](https://goharbor.io/docs/2.1.0/administration/configure-proxy-cache/) allows Harbor to proxy and cache images from the Chainguard registry.

To configure a cache, perform the following steps in the Harbor UI:

1. Navigate to **Projects**.
2. Click the **+ NEW PROJECT** button.
3. Create the project with these details:
    * **Project Name** — This can be whatever you like. This guide uses the name `cgr-proxy`.
    * **Access Level** — Set this as required for your organization. Checking the **Public** box means `docker login` is not required.
    * **Project quota limits** — leave at `-1` for unlimited or set as required.
    * **Proxy Cache** — Toggle this on.
    * **Endpoint** — Choose the endpoint you created in the previous step.
    * **Bandwidth** — leave at `-1` for unlimited or set as required.
4. Click **OK**

Following that, you can pull images from the Harbor project like so:

```shell
docker pull $HARBOR_URL/cgr-proxy/$ORGANIZATION/$IMAGE:$TAG
```

Be sure to replace the placeholder values (`$HARBOR_URL`, `$ORGANIZATION`, `$IMAGE`, and `$TAG`) to reflect your own setup.

## Create a replication rule

A [*replication rule*](https://goharbor.io/docs/2.1.0/administration/configuring-replication/create-replication-rules/) is an alternative approach to a proxy cache. This section outlines how to configure a replication rule that copies images from the Chainguard registry to a Harbor project.

First, create a project:

1. Navigate to **Projects**.
2. Click the **+ NEW PROJECT** button.
3. Create the project with these details:
    * **Project Name** — This can be whatever you like. This guide uses the name `cgr-mirror`.
    * **Access Level** — Set this as required for your organization. Checking the **Public** box means `docker login` is not required.
    * **Project quota limits** — leave at `-1` for unlimited or set as required.
    * **Proxy Cache** — Leave this toggled off.
4. Click **OK**

Then, perform the following steps to create a new replication rule:

1. Navigate to **Administration > Replications**.
2. Click the **+ NEW REPLICATION RULE** button.
3. Create a new rule with these details:
    * **Name** — This can be whatever you like. This guide uses the name  `cgr-mirror`.
    * **Replication mode** — Must be `Pull-based`.
    * **Source registry** — Specify the `cgr.dev` endpoint.
    * **Source resource filter > Name** — (Optional) You can ensure you only select images in your organization by setting this to `<org-name>/*`.
    * **Destination > Namespace** — This should be the project you created before.
    * **Destination > Flattening** — Set to `Flatten All Levels`. This removes the organization name from the path.
    * **Trigger Mode** — Set to `Scheduled` to run the replication regularly or `Manual` to trigger on an ad hoc basis.
    * **Bandwidth** — leave at `-1` for unlimited or set as required.
    * **Override** — Ensure this is enabled so that tags in the destination project are replaced when they change.
4. Click the **Save** button.

To trigger the replication manually, select the `cgr-mirror` rule in the table and click the **REPLICATE** button. Then, navigate to **Projects > cgr-mirror** and observe images populating.

You should be able to pull images from the project like this:

```shell
docker pull $HARBOR_URL/cgr-mirror/$IMAGE:$TAG
```

Again, be sure to replace this command's placeholder values as necessary.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by checking out our [Containers documentation](/chainguard/containers/overview/).

Additionally, if you'd like to learn more about Harbor, we encourage you to refer to the [official Harbor documentation](https://goharbor.io/docs).

---

### How to pull packages from Chainguard package repositories through Artifactory
_Path: chainguard/containers/registry/pull-through-guides/artifactory-packages-pull-through/index.md_

This tutorial details how to set up remote Alpine package (apk) repositories with [JFrog Artifactory](https://jfrog.com/artifactory/), which can provide pull-through caches for Chainguard package repositories. Specifically, this guide walks you through how to set up remote Artifactory repositories to serve as pull-through caches for a [Chainguard private APK repository](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) as well as Chainguard's public package repositories. The guide also outlines how to configure a container image build to pull APK packages from these remote repositories using tokens generated by Artifactory.

## Prerequisites

In order to complete this tutorial, you need the following:

* Administrative privileges over an Artifactory instance.
* [`chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/)
* Administrative privileges within your Chainguard organization to create role-bindings (`role_bindings.create`); this capability is available to users with [the `owner` role](/chainguard/administration/iam-organizations/roles-role-bindings/capabilities-reference/#chainguard-role-capabilities).

## Creating a Chainguard pull token for remote repository authentication

When configuring an Artifactory remote repository to function as a pull-through cache for packages from a Chainguard private APK repository, the remote repository must authenticate to Chainguard. This section outlines the steps necessary to create a Chainguard pull token and configure the required permissions to access your Chainguard organization's private APK repository:

Generate a pull token:

```shell
chainctl auth pull-token --repository=apk -o env
```

This `chainctl` command's `--repository=apk` flag creates a role binding to bind the pull token identity the `apk.pull` role, enabling the identity to download packages from the private APK repository of the parent organization.

This command's output shows the pull token credentials:

```output
Creating new APK registry pull-token in example.org

To use this pull token in another environment, supply the following for Basic authorization:

Username: <identity-id>

Password: <pull-token>
```

Be sure to note down both the `Username` and `Password` values returned by this command, as you will need these when setting up a remote repository on Artifactory.

## Setting up a pull-through cache for a private APK repository

Now that you have an identity with permissions to do so, you can set up a remote Artifactory repository to reach your private APK repository.

To set up the remote repository:

1. Log in to the JFrog platform.
2. Select the **Administration** tab near the top of the screen.
3. Select **Repositories** from the left-hand navigation menu.
4. On the Repositories page, click the **Create a Repository** button.
5. Select the **Remote** option.
6. In the **Select Package Type** window, select **Alpine**.

This takes you to a **Basic** configuration tab where you can enter the following details for the remote repository:

* **Repository Key** — This is a name used to identify your remote repository, for example `cg-private`.
* **URL** — This must be set to `https://apk.cgr.dev/<organization>`, replacing `<organization>` with your organization's name as it appears in the Chainguard Console. For example, if your organization is named `example` use `https://apk.cgr.dev/example`.
* **User Name** — This is used by Artifactory to authenticate to Chainguard and access your private APK repository. Use the pull token `Username` value you generated with `chainctl` in the previous step.
* **Password / Access Token** — This is used along with the user name to authenticate to Chainguard. Here, enter the `Password` value returned by the `chainctl auth pull-token` command in the previous section.

Then, navigate to the **Advanced** configuration tab and enter the following details:

* **Disable URL Normalization** — This must be enabled because, in some cases, the normalization will invalidate the URLs that packages are served from.

Click the **Create Remote Repository** button to create the remote repository and return to the **Repositories** page.

> **Note**: For more information on how to set up a remote repository in Artifactory, refer to [the official documentation](https://jfrog.com/help/r/jfrog-artifactory-documentation/remote-repositories).

### Generating a token for the remote repository

Before testing whether you're able to pull packages through the remote Artifactory repository, you must retrieve a token generated for it by Artifactory.

1. On the Repositories page, find your repository.
2. Hover your cursor over the repository's row and click the ellipsis (**⋯**) all the way to the right.
3. Select **Set me up**.
4. Click the **Generate Token & Create Instructions** button.
5. Copy or take note of the token generated for your repository.

With this token in hand, run the following `export` command to create an environment variable, replacing `my-token` with the token you noted down. You will use this environment variable in the following section as you test out the remote repository:

```shell
export CG_PRIVATE_TOKEN=my-token
```

Additionally, create two more environment variables to hold your Artifactory username and server name:

```shell
export ARTIFACTORY_USERNAME=my-user-profile
export ARTIFACTORY_SERVER_NAME=my-artifactory-hostname
```

If you aren't sure of these values, you can find them in the command from the **Set Up An Alpine Client** window where you retrieved the token:

```shell
sudo sh -c "echo 'https://linky:<TOKEN>@example-server-name.jfrog.io/artifactory/cg-private/<BRANCH>/<REPOSITORY>'" >> /etc/apk/repositories
```

In this example, the Artifactory username is `linky` and the hostname is `example-server-name`.

> **Note**: If your Artifactory username is an email address, you must percent-encode the `@` sign, as in `export ARTIFACTORY_USERNAME=linky%40example.com`. Here, the Artifactory username is `linky@example.com`, but it must be entered into the environment variable as `linky%40example.com`.

### Testing pull-through from private APK repository

This section outlines how to build a container image using a Chainguard image as a base and configure it to pull packages from the private APK repositories through your remote Artifactory repository.

Open a terminal and create a Dockerfile. Note the use of single quotes around `'EOF'` to prevent the shell from expanding the `$` variables — these will be processed by Docker during the build:

```shell
cat > Dockerfile <<'EOF'
FROM cgr.dev/chainguard/python:latest-dev
USER root
ARG ARTIFACTORY_USERNAME
ARG ARTIFACTORY_SERVER_NAME
RUN --mount=type=secret,id=cg_private_token \
    cp /etc/apk/repositories /etc/apk/repositories.disabled && \
    echo "https://${ARTIFACTORY_USERNAME}:$(cat /run/secrets/cg_private_token)@${ARTIFACTORY_SERVER_NAME}.jfrog.io/artifactory/cg-private/" > /etc/apk/repositories && \
    apk add sed && \
    rm /etc/apk/repositories
USER nonroot
EOF
```

This Dockerfile uses the `python:latest-dev` image. You don't have to use this particular image, but because we are using the `apk` command to install a package from `cgr-private` in this Dockerfile, you should use a Chainguard container image that has this package manager available.

Note that this Dockerfile combines the repository configuration, package installation, and cleanup into a single `RUN` instruction. This is important because it ensures the Artifactory token is never stored in an image layer. The `--mount=type=secret` option mounts the token only for the duration of this `RUN` instruction and it is not written to the image or its history. The final `rm` removes the `/etc/apk/repositories` file, which contained the token in plain text for the duration of the step.

Additionally, be aware that there are limitations to what packages are available from your organization's private APK repository. For instance, your organization may not have access to the `sed` package. Refer to our [private APK repository documentation](/chainguard/containers/building-and-modifying/packages/private-apk-repos/#about-private-apk-repositories) for more information.

After creating the Dockerfile, build the image. Here, we tag the image `ar-build` and pass the Artifactory token as a Docker build secret along with the username and server name as build arguments:

```shell
docker build \
  --secret id=cg_private_token,env=CG_PRIVATE_TOKEN \
  --build-arg ARTIFACTORY_USERNAME=$ARTIFACTORY_USERNAME \
  --build-arg ARTIFACTORY_SERVER_NAME=$ARTIFACTORY_SERVER_NAME \
  -t ar-build .
```

The `--secret` flag passes `CG_PRIVATE_TOKEN` as a build secret that is accessible only during the build and is never stored in the image or its history.

This command's output will show that the `sed` package was installed as expected:

```output
. . .
 => [4/4] RUN apk add sed                                                                2.8s
. . .
```

You can confirm that this package was pulled through Artifactory with the [**Artifact Repository Browser**](https://jfrog.com/help/r/jfrog-artifactory-documentation/browsing-artifacts) in the Artifactory dashboard:

1. Navigate to the **Platform** tab.
2. Find **Artifactory** in the left-hand navigation menu.
3. Select **Artifacts**.
4. Find and expand the menu option for the `cg-private` Artifactory repository.

There, you will find the `sed` package listed, along with any other packages you've pulled through the remote repository.

## Configuring pull-through caches for Chainguard's public repositories

You also have access to the public `chainguard` and `extra-packages` repositories. Because these repositories are public, they do not require authentication. To set up a pull-through cache for these package repositories on Artifactory, you can follow the same procedure outlined previously for the private APK repository.

You must create two remote repositories within Artifactory — one for each public package repo — by following the same steps as before:

1. On the Repositories page, click the **Create a Repository** button.
2. Select the **Remote** option.
3. In the **Select Package Type** window, select **Alpine**.

Enter the following details for the two remote repositories:

* **Repository Key** — This is the name used to identify your remote repository. Again, you can choose whatever names you like here but this guide's examples use the names `cg-chainguard` and `cg-extras`.
* **URL** — This must be set to `https://virtualapk.cgr.dev/<ORGANIZATION-ID>/chainguard` for the `chainguard` repository and `https://virtualapk.cgr.dev/<ORGANIZATION-ID>/extra-packages` for the `extra-packages` repository.
    * For both of these URLs, you need to replace the `<ORGANIZATION-ID>` placeholder with your Chainguard organization's UID. You can find this by running the `chainctl iam organizations list -o table`; the UID is the value in your organization's `ID` column. Alternatively, you can find it by checking the **Settings** ⇒ **General** page in the [Chainguard Console](https://console.chainguard.dev).

You **do not** need to set any values for the **User Name** or **Password / Access Token** fields, as the public repositories do not require authentication.

Next, for both repositories, navigate to the **Advanced** configuration tab and check the **Disable URL Normalization** option. This will prevent URL normalization from invalidating the URLs that packages are served from.

Keep all the remaining fields set to their default values and click the **Create Remote Repository** button. This creates the remote repository and returns you to the **Repositories** page.

After creating both repositories, generate and retrieve a token for each one as you did for the `cg-private` remote repository:

1. On the Repositories page, find both remote repositories you just created.
2. Click the ellipsis (**⋯**) all the way to the right of their respective rows.
3. Select **Set me up**.
4. Click the **Generate Token & Create Instructions** button.
5. Copy or take note of the tokens generated for your repositories.

Next, copy the resulting tokens to create a pair of environment variables. For the `cg-chainguard` repository's token:

```shell
export CG_TOKEN=<cg-chainguard-token>
```

Then for the `cg-extras` repo's token:

```shell
export EXTRAS_TOKEN=<cg-extras-token>
```

Following that, you can create a Dockerfile for the public repositories. As before, use single quotes around `'EOF'` to prevent shell expansion:

```shell
cat > Dockerfile.repos <<'EOF'
FROM cgr.dev/chainguard/python:latest-dev
USER root
ARG ARTIFACTORY_USERNAME
ARG ARTIFACTORY_SERVER_NAME
RUN --mount=type=secret,id=cg_token \
    --mount=type=secret,id=extras_token \
    cp /etc/apk/repositories /etc/apk/repositories.disabled && \
    echo "https://${ARTIFACTORY_USERNAME}:$(cat /run/secrets/cg_token)@${ARTIFACTORY_SERVER_NAME}.jfrog.io/artifactory/cg-chainguard/" > /etc/apk/repositories && \
    echo "https://${ARTIFACTORY_USERNAME}:$(cat /run/secrets/extras_token)@${ARTIFACTORY_SERVER_NAME}.jfrog.io/artifactory/cg-extras/" >> /etc/apk/repositories && \
    apk add c-ares && \
    rm /etc/apk/repositories
EOF
```

Following that, build the image, passing each Artifactory token as a Docker build secret:

```shell
docker build \
  --secret id=cg_token,env=CG_TOKEN \
  --secret id=extras_token,env=EXTRAS_TOKEN \
  --build-arg ARTIFACTORY_USERNAME=$ARTIFACTORY_USERNAME \
  --build-arg ARTIFACTORY_SERVER_NAME=$ARTIFACTORY_SERVER_NAME \
  -t ar-repos -f Dockerfile.repos .
```

As this command runs, it installs the `c-ares` package into the image.

## Debugging pull-through from Chainguard’s package repositories to Artifactory

If you run into issues when trying to pull from Chainguard's package repositories through Artifactory, you can try checking for these common pitfalls:

* You may run into issues if your Artifactory username is an email address; specifically, the `@` sign can lead to errors. Be sure that you're using a user profile with a name that only contains letters and numbers. If you must use a profile with an email address for a name, try percent-encoding the `@` sign by replacing it with `%40`.
* Ensure that all [network requirements](/chainguard/containers/registry/network-requirements/) are met.
* When configuring a remote Artifactory repository, ensure that the **URL** field is set correctly.
    * If necessary, ensure that you've set the correct UID for your organization in the URL field.
* It may help to [clear the Artifactory cache](https://jfrog.com/help/r/artifactory-cleanup-best-practices/clearing-an-oversized-cache).
* It could be that your Artifactory repository was misconfigured. In this case, create and configure a new Remote Artifactory repository to test with.
* If your output returns `package mentioned in index not found`, it usually means Artifactory or a CDN is normalizing or rewriting APK URLs (often by stripping query strings, collapsing path segments, or altering tokens). To prevent this, ensure that Artifactory's **Disable URL Normalization** option is checked in order to preserve exact filenames and tokens.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by referring to our [documentation](/chainguard/containers/overview/), and learn more about working with the Chainguard platform by reviewing our [Administration documentation](/chainguard/administration/). If you'd like to learn more about JFrog Artifactory, we encourage you to refer to the [official Artifactory documentation](https://jfrog.com/help/r/jfrog-artifactory-documentation).

---

### How to set up pull through from Chainguard's registry to Nexus
_Path: chainguard/containers/registry/pull-through-guides/nexus-pull-through/index.md_

Organizations can use Chainguard Containers along with third-party software repositories in order to integrate with current workflows as the single source of truth for software artifacts. In this situation, you can set up a proxy repository to function as a mirror of [Chainguard's registry](/chainguard/chainguard-registry/overview/). This mirror can then serve as a pull through cache for your Chainguard Containers.

This tutorial outlines how to set up a repository with [Sonatype Nexus](https://www.sonatype.com/products/sonatype-nexus-repository). Specifically, it will walk you through how to set up one repository you can use as a pull through cache for Chainguard's Free containers or for Production containers originating from a private Chainguard repository.

## Prerequisites

In order to complete this tutorial, you will need the following:

* Administrative privileges over a Nexus instance. If you're interested in testing out this configuration, you can either download a trial from [Sonatype's website](https://www.sonatype.com/products/sonatype-nexus-oss-download) or run it as a [Docker container](https://github.com/sonatype/docker-nexus3).

> Note: If you use the Docker solution, you will need to add an extra port for the repository to the `docker run` command. For example, if you run the repository on port `5051`, you would a command like `docker run -d -p 8081:8081 -p 5051:5051 --name nexus sonatype/nexus3` instead of the example given in the linked GitHub overview.

* Privileges to create a pull token on a Chainguard registry. (For private Chainguard repository access)
* A spare port on the Nexus server to serve the repository (Nexus limits you to 20 ports). Or an alternative solution — such as a reverse proxy — which is beyond the scope of this guide.

## Setting up Nexus as a pull through for free containers

[Free container images](/chainguard/containers/concepts/container-categories/#free-containers) are free to use, publicly available, and always represent versions tagged as `:latest`.

To set up a remote repository in Nexus from which you can pull Free containers, log in to Nexus with an **admin** account. Once there, click on the Administration mode cog in the top bar, click **Repository** in the left-hand navigation menu, and then select **Repositories**. On the Repositories page, click the **Create Repository** button and select the **docker (proxy)** Recipe.

Following that, you can enter the following details for your new remote repository:

* **Name** — This is used to refer to your repository. You can choose whatever name you like here, but this guide's examples will use the name `chainguard`.
* **Remote storage** — This must be set to `https://cgr.dev/`.
* **HTTP[S] port** — Choose an HTTP or HTTPS port as appropriate for your setup.

Following that, click the **Create repository** button at the bottom of the page. If everything worked as expected, you'll be taken back to the repository list and should now see an extra repository with your chosen name, with type "proxy".

Your Nexus URL is the hostname of the Nexus server AND the port number you chose; for example, `myrepo.local:5051`. If your Nexus server is running from a Docker container, your Nexus URL would be something like `localhost:5051`.

### Testing pull through of a free container

If your setup requires authentication, log in with a valid Nexus username and password:

```sh
docker login -u<user> <Nexus URL>
```

After running this command, you'll be prompted to enter a password.

After running the `docker login` command, you will be able to pull a Free container image through Nexus. The following example pulls the `wolfi-base` container image:

```sh
docker pull <Nexus URL>/chainguard/wolfi-base
```

Be sure the `docker pull` command contains the correct Nexus URL for your repository.

## Setting up Nexus as a pull through for production containers

Production Chainguard Containers are enterprise-ready images that come with patch SLAs and features such as [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) (FIPS) readiness. The process for setting up an Nexus repository that you can use as a pull through cache for Production images is similar to the one outlined previously for Free containers, but with a few extra steps.

To get started, you will need to create [a pull token](/chainguard/chainguard-registry/authenticating/#authenticating-with-a-pull-token) for your organization's registry. Pull tokens are longer-lived tokens that can be used to pull containers from other environments that don't support OIDC, such as some CI environments, Kubernetes clusters, or with registry mirroring tools like Nexus.

Follow the instructions in the link above to create a pull token and take note of the values for `username` and `password` as you'll need this to configure a repository for pulling through Production container images.

You can edit the existing repository and all your users will have access to the private images. Alternatively, you could create a new `chainguard-private` repository exactly as before but with restricted access, though restricting access to repositories in Nexus is beyond the scope of this guide.

At the bottom of the configuration screen there will be an HTTP section. Check the **Authentication** box and use the "Username" Authentication type.

Enter the `username` and `password` from the pull token in the respective fields.

Click the **Save** button to apply the changes.

### Testing pull through of a production container image:

If your setup requires authentication, log in with a valid Nexus username and password:

```sh
docker login -u<user> <Nexus URL>
```

After running this command, you'll be prompted to enter a password.

After running the `docker login` command, you will be able to pull a Production containers through Nexus. If your organization has access to it, the following example will pull the `chainguard-base` container image:

```sh
docker pull <Nexus URL>/<company domain>/chainguard-base
```

Be sure the `docker pull` command you run includes the name of your organization's registry.

## Debugging pull through from Chainguard’s registry to Nexus

If you run into issues when trying to pull Containers from Chainguard's Registry to Nexus, please ensure the following requirements are met:

* Ensure that all Containers [network requirements](/chainguard/containers/registry/network-requirements/) are met.
* When configuring a remote Nexus repository, ensure that the **URL** field is set to `https://cgr.dev/`. This field **must not** contain additional components.
* You can troubleshoot by running `docker login` from another node (using the Nexus pull token credentials) and try pulling a container image from `cgr.dev/chainguard/<image name>` or `cgr.dev/<example.com>/<image name>`, using your own organization's registry name in place of `<example.com>`.
* It could be that your Nexus repository was misconfigured. In this case, create and configure a new Nexus repository to test with.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about Chainguard's registry. You can also learn more about Chainguard Containers by checking out our [Containers documentation](/chainguard/containers/overview/). If you'd like to learn more about Sonatype Nexus, we encourage you to refer to the [official Nexus documentation](https://help.sonatype.com/en/sonatype-nexus-repository.html).

---

### How to set up pull-through from Chainguard's container registry to Artifactory
_Path: chainguard/containers/registry/pull-through-guides/artifactory-containers-pull-through/index.md_

Organizations can route container image pulls through Artifactory to centralize artifact management, enforce policy, and integrate Chainguard Containers into existing CI/CD workflows. You can configure Artifactory as a pull-through cache by setting up a remote repository pointed at [Chainguard's container registry](https://edu.chainguard.dev/chainguard/chainguard-registry/overview/).

This tutorial outlines how to set up remote repositories with [JFrog Artifactory](https://jfrog.com/artifactory/). Specifically, it goes over how to set up one repository you can use as a pull-through cache for Chainguard's public [Free containers](/chainguard/containers/concepts/container-categories/#free-containers) and another you can use for [Production containers](/chainguard/containers/concepts/container-categories/#production-containers) originating from a private Chainguard repository. It also outlines how you can use one of Artifactory's [virtual repositories](https://jfrog.com/help/r/jfrog-artifactory-documentation/virtual-repositories) as a pull-through cache to access resources from multiple remote repositories in a single location.

## Prerequisites

To complete this tutorial, you need the following:

* Administrative privileges over an Artifactory instance. If you're interested in testing out this configuration, you can set up a trial instance on the [JFrog Artifactory landing page](https://jfrog.com/artifactory/).
* Docker installed on your local machine. Refer to [the official documentation](https://docs.docker.com/engine/install/) to set this up.

Part of this guide assumes you have access to a private registry provided by Chainguard with one or more Production container images. If you don't already have access to these, you can [contact our sales team](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement). To complete this portion, you will also need the following:

* Permissions to pull container images from your organization's private Chainguard registry. At minimum, you must be granted the `registry.pull` role, but other built-in roles like `owner`, `editor`, or `viewer` will also work. Refer to our guide on [Built-in roles and capabilities reference](/chainguard/administration/iam-organizations/roles-role-bindings/capabilities-reference/#pull-token-creator-roles) for more details.
* `chainctl`, Chainguard's command line interface tool, installed on your local machine. To set this up, follow our [installation guide for `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/).

## Setting up Artifactory as a pull-through cache for free containers

Chainguard's Free Containers are free to use, publicly available, and always represent versions tagged as `:latest`.

To set up a remote repository in Artifactory from which you can pull Chainguard Free Containers:

1. Log in to the JFrog platform.
2. Select the **Administration** tab near the top of the screen.
3. Select **Repositories** from the left-hand navigation menu.
4. On the Repositories page, click **Create a Repository**.
5. Select the **Remote** option.
6. In the **Select Package Type** window, select **Docker**.

This takes you to a **Basic** configuration tab where you can enter the following details for your new remote repository:

* **Repository Key** — This is the name used to refer to your repository. You can choose whatever name you like here, but this guide's examples use the name `cgr-public`.
* **URL** — This must be set to `https://cgr.dev/`. This field **must not** include additional path components — setting it to something like `https://cgr.dev/chainguard/` will cause pulls to fail with a `manifest unknown` error. To shorten the pull path, use the **Project ID** field described below instead.
* **Project ID** — Optional. If you set this to `chainguard`, Artifactory prepends that path segment to upstream requests and your users can omit it from their pull commands. Leave it empty to keep the `chainguard/` prefix in the pull path, as this guide's examples do.
* **Include Patterns** — Ensure that you use the default value (`**/*`) in this field.
* **Enable Token Authentication** — Ensure this setting (under **Docker Settings**) is enabled. This is required, as you must authenticate to the remote repository in order to pull Chainguard Containers through it.
* **Block Mismatching Mime Types** — In the **Advanced** configuration tab, ensure that this option is checked.

Following that, click **Create Remote Repository**. Next, you can test that you're able to pull a Chainguard Free Container through the remote repository.

### Testing pull-through of a Chainguard free container

Before testing whether you're able to pull Chainguard's Free Containers through the remote Artifactory repository, you must retrieve a token generated by Artifactory for your remote repository. Expand the following section to retrieve a token and authenticate:

{{< details "JFrog Artifactory Token Retrieval" >}}
{{< blurb/jfrog-token >}}
{{< /details >}}

After running the `docker login` command, you will be able to pull a Chainguard Free Container through Artifactory. The following example pulls the `go` container image:

```sh
docker pull <my-project>.jfrog.io/cgr-public/chainguard/go
```

If you set **Project ID** to `chainguard` when creating the repository, omit that segment:

```sh
docker pull <my-project>.jfrog.io/cgr-public/go
```

Be sure the `docker pull` command you run includes the name of your project as well as your own repository key in place of `cgr-public`, if different.

## Setting up Artifactory as a pull-through cache for production containers

Production Chainguard Containers are enterprise-ready container images that come with patch Service Level Agreements (SLAs) and features such as [Federal Information Processing Standard](/chainguard/containers/working-with-images/fips-images/) (FIPS) readiness. The process for setting up an Artifactory repository that you can use as a pull-through cache for Chainguard Production Containers is similar to the one outlined previously for Free Containers, but with a few extra steps.

To get started, create [a pull token](/chainguard/chainguard-registry/authenticating/#authenticating-with-a-pull-token) for your organization's registry. Pull tokens are longer-lived tokens that can be used to pull Chainguard Containers from other environments that don't support OIDC, such as some CI environments, Kubernetes clusters, or registry mirroring tools like Artifactory.

To create a pull token with `chainctl`, run the following command:

```sh
chainctl auth configure-docker --pull-token
```

`chainctl` uses your organization automatically when you belong to only one. If you have access to more than one, add `--parent <organization>`, replacing `<organization>` with the name or ID you want to use.

> **Note**: You can find your Chainguard organization's name or ID by running `chainctl iam organizations list -o table`.

This command returns a `docker login` command like the following:

```output
. . .

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

Record the values for `<identity-id>` and `<pull-token>` as you'll need these credentials when you configure a new remote Artifactory repository for pulling through Production Containers.

After noting your credentials, you can begin setting up an Artifactory repository from which you can pull Chainguard Production Containers. This process is similar to the one outlined previously:

1. Log in to the JFrog platform.
2. Select the **Administration** tab near the top of the screen.
3. Select **Repositories** from the left-hand navigation menu.
4. On the Repositories page, click **Create a Repository**.
5. Select the **Remote** option.
6. In the **Select Package Type** window, select **Docker**.

Next, enter the following details for your new remote repository in the **Basic** configuration tab:

* **Repository Key** — Choose whatever name you like here, but this guide's examples use the name `cgr-private`.
* **URL** — This must be set to `https://cgr.dev/`. This field **must not** include additional path components — setting it to something like `https://cgr.dev/<organization>/` will cause pulls to fail with a `manifest unknown` error. To remove the organization from the pull path, use the **Project ID** field described below instead.
* **Project ID** — Optional. Set this to your organization's name (for example, `example.com`) and Artifactory prepends it to upstream requests, letting your users omit it from their pull commands. Because this field is set per repository, you need one remote repository per Chainguard organization if you pull from more than one.
* **User Name** — Enter the `<identity-id>` value you noted from the `docker login` command.
* **Password / Access Token** — Enter the `<pull-token>` value you noted from the `docker login` command.
* **Include Patterns** — Ensure that you use the default value (`**/*`) in this field.
* **Enable Token Authentication** — Ensure this setting (under **Docker Settings**) is enabled. This is required, as you must authenticate to the remote repository in order to pull Chainguard Containers through it.
* **Block Mismatching Mime Types** — In the **Advanced** configuration tab, ensure that this option is checked.

Finally, click **Create Remote Repository**. You can then move on to testing that you're able to pull Chainguard Production container images through this remote repository.

### Testing pull-through of a Chainguard production container

As with the `cgr-public` repository example, you must retrieve a token generated by Artifactory for your repository before testing whether you're able to pull Chainguard Production container images through the remote repository you just created. Expand the following section to retrieve a token and authenticate:

{{< details "JFrog Artifactory Token Retrieval" >}}
{{< blurb/jfrog-token >}}
{{< /details >}}

After running the `docker login` command, you will be able to pull Chainguard Production Containers through Artifactory. The following example pulls the `chainguard-base` image if your organization has access to it:

```sh
docker pull <my-project>.jfrog.io/cgr-private/<organization>/chainguard-base:latest
```

If you set **Project ID** to your organization's name when creating the repository, omit the organization from the pull path:

```sh
docker pull <my-project>.jfrog.io/cgr-private/chainguard-base:latest
```

Be sure the `docker pull` command you run includes the name of your Artifactory project and the name of your organization's registry. Additionally, if you entered a different repository key in the setup section, use it in place of `cgr-private`.

## Setting up an Artifactory virtual repository as a pull-through cache

Artifactory allows you to create what it refers to as [*virtual repositories*](https://jfrog.com/help/r/jfrog-artifactory-documentation/virtual-repositories). A virtual repository is a collection of one or more repositories (such as local, remote, or other virtual repositories) that have the same package type. The benefit of this is that you can access resources from multiple locations using a single logical URL.

You can also use a virtual repository as a pull-through cache. To set this up, create a new virtual repository:

1. Navigate to the **Repositories** tab.
2. Click **Create a Repository**.
3. Select the **Virtual** option.
4. In the **Select Package Type** window, select **Docker**.

When you reach the **New Virtual Repository** page, enter a key of your choosing into the **Repository Key** field. This guide's examples refer to this repository as `cgr-virt`.

Next, you must select existing repositories to include within this virtual repository. To keep things simple, this guide uses the `cgr-public` and `cgr-private` repositories created previously:

1. Locate the **Repositories** section in the **Basic** configuration tab.
2. Select the repositories you want to add from the **Available Repositories** by clicking their respective checkboxes.
3. Click the right-pointing chevron to move them to **Selected Repositories**.
4. Click **Create Virtual Repository**.

With that, you can retrieve the token and `docker login`.

### Testing pull-through with a virtual repository

As with the previous examples, you must retrieve a token generated by Artifactory before testing whether you're able to pull Chainguard Containers through the virtual repository. Expand the following section to retrieve a token and authenticate:

{{< details "JFrog Artifactory Token Retrieval" >}}
{{< blurb/jfrog-token >}}
{{< /details >}}

After retrieving your token and logging into `docker`, you will be able to pull Chainguard Containers through the Artifactory virtual repository.

To pull a public image, you would run a command like the following, which pulls the public `mariadb` image:

```sh
docker pull <my-project>.jfrog.io/cgr-virt/chainguard/mariadb:latest
```

To pull a Production Container, replace `chainguard` with the name of your organization's registry. The following example pulls the `chainguard-base` image if your organization has access to it:

```sh
docker pull <my-project>.jfrog.io/cgr-virt/<organization>/chainguard-base:latest
```

For both of these commands, be sure the `docker pull` command you run includes the name of your Artifactory project and the name of your organization's registry. Also, if you used a different repository key, substitute it for `cgr-virt` in the previous commands.

> **Note**: Take care when aggregating remote repositories that each set a **Project ID**. If both the free and private remotes strip their path prefixes, image names from different sources collapse into the same namespace within the virtual repository — for example, both `chainguard/go` and `<organization>/go` would resolve as `go`, and the virtual repository's resolution order determines which one you get.

## Debugging pull-through from Chainguard’s registry to Artifactory

If you run into issues when trying to pull images from Chainguard's container registry to Artifactory, ensure the following requirements are met:

* Ensure that all Containers [network requirements](/chainguard/containers/registry/network-requirements/) are met.
* If you attempt to pull a nonexistent image via pull-through, Artifactory will also make calls to `chainguard.dev` and `www.chainguard.dev`. Calls to these domains should not occur when pulling a valid image.
* When configuring a remote Artifactory repository, ensure that the **URL** field is set to `https://cgr.dev/`. This field **must not** contain additional components. Adding a path such as `https://cgr.dev/<organization>/` produces a `manifest unknown: The named manifest is not known to the registry` error, because Artifactory ignores the path portion of a Docker remote's URL. If your goal is to shorten the pull path, set the repository's **Project ID** to your organization's name instead.
* You can troubleshoot by running `docker login` from another node (using the Artifactory pull token credentials) and then trying to pull a Container from `cgr.dev/chainguard/<image name>` or `cgr.dev/<organization>/<image name>`.
* It may help to [clear the Artifactory cache](https://jfrog.com/help/r/artifactory-cleanup-best-practices/clearing-an-oversized-cache).
* Your Artifactory repository may be misconfigured. In this case, create and configure a new remote Artifactory repository to test with.

## Learn more

If you haven't already done so, you may find it useful to review our [Registry overview](/chainguard/chainguard-registry/overview/) to learn more about the Chainguard container registry. You can also learn more about Chainguard Containers by referring to our [Containers documentation](/chainguard/containers/overview/). If you'd like to learn more about JFrog Artifactory, refer to the [official Artifactory documentation](https://jfrog.com/help/r/jfrog-artifactory-documentation).

---

### Using the Chainguard Directory
_Path: chainguard/containers/registry/chainguard-directory/index.md_

There are hundreds of Chainguard Containers available for use. To help users explore and better understand all of these container images, we've developed the Chainguard Directory. This is a free to access web portal that does not require signing in from which you can view information about container images in the Chainguard catalog. This is great for quick searches or while exploring Chainguard's offerings.

If you want more specific information about what is available to your organization, take a look at the Chainguard Console. You'll first need to [create an account and log in](https://console.chainguard.dev/auth/login) but there you can interact in a clearer, organization-specific way. If you use the *Sign In* link in the directory, it brings you to the console. Learn more about the [Chainguard Console](/platform/console/images-directory/) in the related docs page.

## Accessing the Chainguard Directory

This guide is primarily framed around the Chainguard Directory and the Chainguard Console. The Directory is public facing and doesn't require any authentication to access it. The Console is also accessible to anyone, including users who aren't Chainguard customers. However, to access the Console, you'll first need to [create an account and log in](https://console.chainguard.dev/auth/login).

## Browse container images and details in the directory

The [Chainguard Containers Directory](https://images.chainguard.dev/) landing page has a card-based layout of container images.

Each card represents a container image available from Chainguard, and shows the image's name and logo, when it was last changed, the latest tag available. These cards include other details when relevant, like whether the image is part of Chainguard's Free tier of containers, if there is a FIPS-enabled version of the container image available, or if it's a STIG-hardened image.

By default, the Directory shows a paginated list of container images. You can select categories of container images to view from the menu to the left of the cards. This menu has the following options:

* **Featured**
* **Free**
* **Helm charts**
* **AI**
* **Application**
* **Base**
* **FIPS**

Above the cards is a search box you can use to search for specific Chainguard Containers. Clicking on any card or search result takes you to that container image's details page.

## Find Helm charts in the Chainguard Directory

For organizations looking to deploy their Chainguard container images with Helm, Chainguard provides upstream-produced Helm charts as well as a set of Chainguard-created charts labeled as iamguarded, designed specifically to support organizations migrating off of Bitnami.

You can find these charts and information about them in the Chainguard Directory. From the Categories sidebar menu, click **Helm charts**.

All Helm charts have a **Helm** icon, making them easier to see when looking through the full images list without using the Helm-specific category. Charts with the **shield** icon are iamguarded charts, created specifically to help people who are switching from Bitnami.

Click any chart name to learn the chart details.

## Learn more

The Chainguard Containers Directory is a useful tool for understanding what Chainguard Containers are available. To better understand how to work with individual container images, you can see if we have a [getting started guide](/chainguard/containers/getting-started/) available. We also provide a guide on [how to view Security Advisories](/chainguard/containers/security-advisories/) through our [self-service public Security Advisories page](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-directory).

---

### Authenticate to Chainguard's Registry
_Path: chainguard/containers/registry/authenticating/index.md_

## Public container images

Chainguard offers a collection of images that are publicly available, don't require authentication, and are free to use by anyone. However, logging in with a Chainguard account and authenticating when pulling from the registry gives you access to the Chainguard Console, and provides a mechanism for Chainguard to contact you if there are any issues with images you are pulling. This may enable Chainguard to notify you of upcoming deprecations, changes in behavior, critical vulnerabilities and remediations for images you have recently pulled.

## Quickstart: pull your first container

These steps take you from nothing to a container image on your machine. Everything after this section covers the cases that need more than a local pull — CI systems, Kubernetes clusters, and registry mirrors.

Before you start, [sign up for a Chainguard account](#signing-up) and [install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/), Chainguard's command-line tool.

1. Configure the credential helper:

    ```sh
    chainctl auth configure-docker
    ```

    This points your Docker configuration at `chainctl` for `cgr.dev` credentials, then opens a browser window to authenticate you. You don't need to run `chainctl auth login` first; `configure-docker` authenticates you when no valid token is available. For headless machines and other login flows, refer to [Authentication options for `chainctl`](/platform/chainctl-usage/authentication-options/).

2. Find the name of your organization:

    ```sh
    chainctl iam organizations list
    ```

3. Pull an image, replacing `$ORGANIZATION` with the name from the previous step:

    ```sh
    docker pull cgr.dev/$ORGANIZATION/python:latest
    ```

To see which repositories your organization can pull, run `chainctl images repos list`. To browse the full catalog, visit the [Chainguard Containers Directory](https://images.chainguard.dev/). Your organization's registry holds a subset of what the Directory lists, so browsing a container there doesn't mean you can pull it; refer to [Onboard your teams](/get-started/onboard-your-teams/#what-your-organization-can-pull) for how your subscription determines what's available.

If the pull fails, refer to [Troubleshoot registry authentication errors](/chainguard/containers/troubleshooting/registry-errors/), which maps each error `cgr.dev` returns to its cause.

## Signing up

You can register a Chainguard account through our [sign up form](https://console.chainguard.dev/auth/login?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement). This will create your account and a [Chainguard IAM organization](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/). If you already have an account, you can log in through the [login page](https://console.chainguard.dev/auth/login?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

For more details on signing in, you can review our [sign in guidance](/platform/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard/#logging-in). If your organization is interested in (or already using) custom identity providers like Okta, you can read [how to authenticate to Chainguard with custom identity providers](/platform/administration/custom-idps/custom-idps/).

## Authenticating with the `chainctl` credential helper

You can configure authentication by using the credential helper included with `chainctl`. This is the workflow recommended by Chainguard.

First [install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) and configure the credential helper:

```sh
chainctl auth configure-docker
```

This will update your Docker config file to call `chainctl` when an auth token is needed. A browser window will open when the token needs to be refreshed.

Pulls authenticated in this way are associated with your user.

## Authenticating with a pull token

You can also create a "pull token" using `chainctl`. This generates a longer-lived token that can be used to pull images from other environments that don't support OIDC, such as some CI environments, Kubernetes clusters, or with registry mirroring tools like Artifactory.

First [install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/), then log in and configure a pull token:

```sh
chainctl auth configure-docker --pull-token
```

With the latest release of `chainctl`, this will print a `docker login` command that can be run in the CI environment to log in with a pull token.

You can also pass the `--save` flag, which will update your Docker config file with the pull token directly.

This token expires in 30 days by default, which can be modified using the
`--ttl` flag. It sets the duration for the validity of the token. The maximum
valid value is `8760h` (equivalent to 365 days), Valid unit strings range from
nanoseconds to hours and are `ns`, `us`, `ms`, `s`, `m`, and `h`, for example
`--ttl=24h`.

Pulls authenticated in this way are associated with a Chainguard identity, which is associated with the organization selected when the pull token was created.

You can also export the pull token details into environment variables for
[authentication in automated
systems](/chainguard/containers/building-and-modifying/packages/private-apk-repos/#pull-token-automation).
Running `chainctl auth pull-token create --output=env` sets
`CHAINGUARD_IDENTITY_ID` to the username and `CHAINGUARD_TOKEN` to the password.
Refer to [pull token output formats and credential
names](/platform/chainctl-usage/pull-token-output/) for the other formats and
for the variable names each library ecosystem uses.

### Using a pull token with Podman, Helm, and other tools

The `docker login` command that `chainctl auth configure-docker --pull-token` prints contains the credentials for the token. The username is the Chainguard identity associated with the token, and the password is the token itself:

```sh
docker login "cgr.dev" \
  --username "<identity-id>" \
  --password "<pull-token>"
```

Save that pair and pass it to any tool that logs in to an OCI registry. For example, Podman:

```sh
podman login cgr.dev --username "$CHAINGUARD_IDENTITY_ID" --password "$CHAINGUARD_TOKEN"
```

Or Helm:

```sh
helm registry login cgr.dev --username "$CHAINGUARD_IDENTITY_ID" --password "$CHAINGUARD_TOKEN"
```

The same username and password work with registry mirroring tools such as Artifactory. Refer to the [pull-through guides](/chainguard/containers/registry/pull-through-guides/) for tool-specific instructions.

### Note on multiple pull tokens

Running the `chainctl auth configure-docker --pull-token` command multiple times will result in multiple pull tokens being created. However, the tokens stored in your Docker config when using `--save` will overwrite old tokens.

Tokens cannot be retrieved once they have been overwritten so they must be extracted from the local Docker config and saved elsewhere if multiple are required.

### Revoking a pull token

Pull tokens are associated with Chainguard identities so they can be viewed with:

```sh
chainctl iam identities list
```

To revoke a token, delete the associated identity.

```sh
chainctl iam identity delete <identity UUID>
```

### Managing pull tokens in the Chainguard Console

You can also create and view pull tokens in the [Chainguard Console](https://console.chainguard.dev/).

After navigating to the Console, click on **Settings** in the left-hand navigation menu. From the **Settings** pane, click on **Pull tokens**. There, you'll be presented with a table listing of all the active pull tokens for your selected organization.

This table shows the name of each pull token, their descriptions, the date they were created, and the number of days until they expire.

You can create a new pull token by clicking the **Create pull token** button at the top of the page. A new pane will appear where you can enter a name for the new pull token, add an optional description, and select when the pull token will expire. The **Expiration** drop-down menu has options for 30, 60, and 90 days, as well as a **Custom** expiration option. This will cause a **Custom Expiration** window to appear, allowing you to select the date when you'd like the token to expire.

After entering these details, click the **Create token** button and your new pull token will appear in the list with the rest of your organization's tokens.

If the Console won't let you create a pull token, your role is missing a capability rather than the registry rejecting you. Creating a pull token creates a Chainguard identity and a role-binding for it, so it needs a role with the `identity (create)` and `role_bindings (create)` capabilities. `registry.pull_token_creator` is the least privileged built-in role with both. Refer to [Overview of roles and role-bindings](/platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) to bind it, and to the [capabilities reference](/platform/administration/iam-organizations/roles-role-bindings/capabilities-reference/) for what each built-in role carries.

## Authenticating with GitHub Actions

You can configure authentication with OIDC-aware CI platforms like GitHub Actions.

First create an identity using `chainctl`, which can be limited to only allow OIDC federation from certain GitHub workflow runs:

```sh
chainctl iam identity create github [GITHUB-IDENTITY] \
  --github-repo=${GITHUB_ORG}@${GITHUB_OWNER_ID}/${GITHUB_REPO}@${GITHUB_REPO_ID} \
  --github-ref=refs/heads/main \
  --role=registry.pull
```

**Note**: The value passed to `--github-repo` must equal the repository portion of the `subject` field in the token GitHub issues. GitHub now embeds immutable numeric owner and repository IDs in that subject (for example, `my-org@123456/repo-name@654321`), so `--github-repo` must include them. Populate `GITHUB_OWNER_ID` and `GITHUB_REPO_ID` with your repository's numeric IDs; for how to retrieve them and when the format applies, refer to [Finding your repository's numeric identifiers](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers). If you need to further scope or change the subject, refer to the ["Example subject claims"](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#example-subject-claims) section of GitHub's OIDC documentation, then update the identity with [`chainctl iam identities update`](/platform/chainctl/chainctl-docs/chainctl_iam_identities_update/).

This creates a Chainguard identity that can be assumed by a GitHub Actions workflow only for the specified GitHub repository, triggered on pushes to the specified branch (such as `refs/heads/main`), with permissions only to pull from Chainguard's registry.

When this identity is created, its ID will be displayed. Using this ID, you can configure your GitHub Actions workflow to install `chainctl` and assume this identity when the workflow runs:

```yaml
name: Registry Example

on:
  push:
 branches: ['main']

permissions:
  contents: read
  id-token: write  # This is needed for OIDC federation.

jobs:
  example:
 runs-on: ubuntu-latest
 steps:
   - uses: chainguard-dev/setup-chainctl@main
     with:
       identity: [[ The Chainguard Identity ID you created above ]]
   - run: docker pull cgr.dev/chainguard/node
```

Pulls authenticated in this way are associated with the Chainguard identity you created, which is associated with the organization selected when the identity was created.

If the identity is configured to only work with GitHub Actions workflow runs from a given repo and branch, that identity will not be able to pull from other repos or branches, including pull requests targeting the specified branch.

## Authenticating with CircleCI OIDC token

You can configure authentication with OIDC-aware CircleCI platform.

First, use `chainctl` to create an [assumed identity](/platform/administration/assumable-ids/assumable-ids/#managing-identities-with-chainctl). This example uses a CircleCI ID of `1234` and will work for all projects in that organization. Replace `1234` with your identity issuer org. Modify the subject pattern regex to reduce the scope to specific repos in the organization.

```sh
chainctl iam identities create circleci-identity
--identity-issuer="https://oidc.circleci.com/org/1234"
--subject-pattern="org/1234/project/.+$"
--role=registry.pull
```

Use the identity created in the above command, shown here in the third `run` section as `5678`, to configure your workflow to install `chainctl` and assume this identity when the workflow runs:

```yaml
version: 2.1

jobs:
  install-and-authenticate:
    machine: true
    environment:
      CHAINCTL_TOKEN_FILE: "/tmp/oidc_token"

  steps:
    - checkout

    - run:
          name: Download chainctl
          command: |
            curl -o chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/aarch64/arm64/')"

    - run:
        name: Install chainctl
        command: |
          sudo install -o $UID -g $(id -g) -m 0755 chainctl /usr/local/bin/

    - run:
        name: Configure Docker auth
        command: |
          sudo chainctl auth configure-docker --identity-token="$CIRCLE_OIDC_TOKEN" --identity "5678"

    - run:
        name: Pull Docker image
        command: |
          sudo docker pull cgr.dev/cgr-demo.com/python:latest

workflows:
  version: 2
  chainctl-workflow:
    jobs:
      - install-and-authenticate
```

Refer to the [CircleCI documentation](https://circleci.com/docs/openid-connect-tokens/#format-of-the-openid-connect-id-token) to learn more about using OpenID Connect tokens in CircleCI jobs.

## Authenticating with Microsoft Entra ID OIDC token

You can configure authentication with OIDC using Microsoft Entra ID (formerly Azure Active Directory).

To acquire an OIDC ID token in Entra, you must complete an OAuth 2.0/OIDC flow. Entra issues access tokens (for authorization) and ID tokens (for authentication) as separate but related JWTs or [JSON Web Tokens](https://www.rfc-editor.org/rfc/rfc7519). Access tokens grant API access, while ID tokens prove user identity.

If you use the [implicit or hybrid flows](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-implicit-grant-flow) in Entra ID, enable **ID tokens (used for implicit and hybrid flows)** for your application. This can be found under **Authentication → Implicit grant and hybrid flows**. Then, configure a redirect URI as described in [Enable ID tokens](https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#enable-id-tokens).

If you use the authorization code flow (recommended), request the `openid` scope to receive an ID token; you don't need to select any of the portal checkboxes. Then, [authenticate a user and request an ID token](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow#request-an-authorization-code).

> **NOTE**: For CI workloads, Microsoft’s workload identity federation (federated identity credentials) exchanges your CI’s OIDC token for an **access token** to a resource; it does **not** issue ID tokens. If you need a non-interactive OIDC ID token for Chainguard, you will have an easier time using your CI provider’s native OIDC issuer directly with Chainguard, or you need to run an interactive user flow (for example, device code) to obtain an ID token.

Retrieve and save an ID token as a local environment variable. The following examples use `MS_ENTRA_ID_OIDC_TOKEN`.

Next, use `chainctl` to create an [assumed identity](/platform/administration/assumable-ids/assumable-ids/#managing-identities-with-chainctl). Replace `{tenant}` with your Entra ID tenant ID (GUID). Modify the subject pattern regular expression to reduce access from all users from that issuer to a more appropriate scope for your needs.

```sh
chainctl iam identities create entraid-identity \
  --identity-issuer="https://login.microsoftonline.com/{tenant}/v2.0" \
  --subject-pattern="^.+$" \ # matches all users from this issuer, adjust to restrict access
  --role=registry.pull
```

Use the identity created in the above command, shown here in the third `run` section as `entraid-identity`, to configure your workflow to install `chainctl` and assume this identity when the workflow runs:

```yaml
version: 2.1

jobs:
  install-and-authenticate:
    machine: true

  steps:
    - checkout

    - run:
          name: Download chainctl
          command: |
            curl -o chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/aarch64/arm64/')"

    - run:
        name: Install chainctl
        command: |
          sudo install -o $UID -g $(id -g) -m 0755 chainctl /usr/local/bin/

    - run:
        name: Configure Docker auth
        command: |
          sudo chainctl auth configure-docker --identity-token="$MS_ENTRA_ID_OIDC_TOKEN" --identity "entraid-identity"

    - run:
        name: Pull Docker image
        command: |
          sudo docker pull cgr.dev/cgr-demo.com/python:latest

workflows:
  version: 2
  chainctl-workflow:
    jobs:
      - install-and-authenticate
```

Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc) to learn more about using OpenID Connect tokens on the Microsoft Entra ID platform. Of special note is their warning about reading and validating their tokens:

> Don't attempt to validate or read tokens for any API you don't own, including the tokens in this example, in your code. Tokens for Microsoft services can use a special format that will not validate as a JWT, and may also be encrypted for consumer (Microsoft account) users. While reading tokens is a useful debugging and learning tool, do not take dependencies on this in your code or assume specifics about tokens that aren't for an API you control.

Chainguard does not require you to parse or validate the Microsoft-issued token yourself. Instead, just pass the token to `chainctl` as shown above.

## Authenticating with Kubernetes

You can also configure a Kubernetes cluster to use a pull token, as described above.

When you create a pull token with `--save`, your Docker config file is updated to include that token and configure it to be used when pulling images from `cgr.dev`.

After that, you can create a Kubernetes secret based on those credentials, following [these instructions](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials):

```sh
kubectl create secret generic regcred \
 --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
 --type=kubernetes.io/dockerconfigjson
```

> **Important Note:** this will also make any other credentials you have configured in your Docker config available in the secret. Ensure only the necessary credentials are included.

Then you can create a Pod that uses that secret, following [these instructions](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-pod-that-uses-your-secret):

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: cgr-example
spec:
  containers:
  - name: nginx
 image: cgr.dev/chainguard/nginx:latest
  imagePullSecrets:
  - name: regcred
```

For this example, save the file as `cgr-example.yaml`. Then you can create and get the Pod:

```sh
kubectl apply -f cgr-example.yaml
kubectl get pod cgr-example
```

Learn more in our [sign in guidance](/platform/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard/#logging-in).

---

### Getting started with the Chainguard Istio Containers
_Path: chainguard/containers/getting-started/platform-and-infrastructure/istio.md_

Chainguard's [Istio](https://istio.io) container images provide a security-hardened foundation for service mesh deployments with significantly reduced vulnerabilities compared to standard Istio images. Istio extends Kubernetes to establish a programmable, application-aware network using the Envoy service proxy, bringing traffic management, telemetry, and security to complex deployments. Built on Wolfi OS, Chainguard's minimal Istio images maintain full compatibility while enhancing security posture.

We will demonstrate how to get started with the Chainguard Istio container images on an
example kind cluster. To get started, you'll need Docker, kind, `kubectl`, and `istioctl`
installed. If you are missing any, you can follow the relevant link to get started.

* [Docker](https://docs.docker.com/get-docker/)
* [kind](https://kind.sigs.k8s.io/docs/user/quick-start/)
* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
* [istioctl](https://istio.io/latest/docs/setup/getting-started/#download)

{{< blurb/free-tier-message >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Start up a kind cluster

First, we'll start up a kind cluster to install Istio.

```sh
kind create cluster
```

This will return output similar to the following:

```output
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.27.3) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊
```

Following that, you can install the Istio Chainguard Containers with `istioctl`.

## Install Istio using Chainguard Containers

We will be using the `istioctl` command to install Istio. In order to use the
Chainguard Containers, we will need to set these following values:

* `hub = cgr.dev/$ORGANIZATION`

> **Note**: Be aware that you will need to change `cgr.dev/$ORGANIZATION` to reflect the name of your organization's repository within Chainguard's registry.

* `tag = latest`
* `values.pilot.image = istio-pilot`
* `values.global.proxy.image = istio-proxy`
* `values.global.proxy_init.image = istio-proxy`

We can set these values with the following `istioctl` command:

```sh
istioctl install --set tag=latest --set hub=cgr.dev/$ORGANIZATION \
  --set values.pilot.image=istio-pilot \
  --set values.global.proxy.image=istio-proxy \
  --set values.global.proxy_init.image=istio-proxy
```

The Istio Chainguard Container is now running on the kind cluster you created previously.
In the next section, you'll set up an Istio gateway and a VirtualService to test out
this container.

## Stand up a gateway and a VirtualService

To see the Istio installation in action, we will create two Istio resources:

* An Istio gateway serving the "http://hello.example.com" domain
* A VirtualService to always reply with "Hello, world!" to requests to the
  "http://hello.example.com" domain

Create a YAML manifest file with the following contents to define the Istio resources:

```sh
cat > example.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: sample-gateway
spec:
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "hello.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sample-virtual-service
spec:
  gateways:
  - sample-gateway
  hosts:
  - "hello.example.com"
  http:
  - directResponse:
      status: 200
      body:
        string: "Hello, world!\n"
EOF
```

Apply the YAML file to the cluster:

```sh
kubectl apply -f example.yaml
```

Now, in one terminal, start a port-forward to the Istio Ingress Gateway:

```sh
kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
```

In another terminal, send a request to the Istio Ingress Gateway:

```sh
curl -H "Host: hello.example.com" localhost:8080
```

This will return `Hello, world!` to the terminal output.

## Clean up your kind cluster

Once you are done, you can delete your kind cluster:

```sh
kind delete cluster
```

This will delete the default cluster context, `kind`.

## Advanced usage

{{< blurb/images-advanced image="Istio" >}}

---

### Getting started with the GitLab Chainguard Containers
_Path: chainguard/containers/getting-started/platform-and-infrastructure/gitlab/index.md_

Chainguard's GitLab container images provide a security-hardened foundation for deploying GitLab's DevOps platform. Built on Wolfi, these images are rebuilt daily with the latest security patches and include verifiable Sigstore signatures and SBOMs for every component.

The Chainguard GitLab offering spans fifteen components that align with the official GitLab Helm chart architecture: `gitlab-base`, `gitlab-certificates`, `gitaly`, `gitlab-agent`, `gitlab-kas`, `gitlab-shell`, `gitlab-exporter`, `gitlab-pages`, `gitlab-container-registry`, `gitlab-runner`, `gitlab-runner-helper`, and the Community Edition services `gitlab-sidekiq-ce`, `gitlab-toolbox-ce`, `gitlab-webservice-ce`, and `gitlab-workhorse-ce`. A FIPS-validated variant is also available for FedRAMP compliance.

This guide shows how to deploy a GitLab instance on a local Kubernetes cluster using the official [GitLab Helm chart](https://docs.gitlab.com/charts/) with Chainguard images. The configuration here is suitable for development and evaluation; for production deployments, follow [GitLab's production recommendations](https://docs.gitlab.com/charts/installation/deployment.html).

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Prerequisites

This guide requires the following tools installed on your local machine:

- [Docker](https://docs.docker.com/get-docker/)
- [k3d](https://k3d.io/stable/#installation) — a CLI tool for running K3s clusters in Docker
- [kubectl](https://kubernetes.io/docs/tasks/tools/)
- [Helm](https://helm.sh/docs/intro/install/)
- [chainctl](https://edu.chainguard.dev/platform/chainctl/) — the Chainguard CLI

Your machine should have at least 8 GB of RAM available for Docker to allocate to the cluster. GitLab deploys several services simultaneously, and insufficient memory is the most common cause of failed or stuck deployments.

You'll also need access to a Chainguard organization with the GitLab image group enabled. If you don't have access yet, [contact Chainguard](https://www.chainguard.dev/contact) to request a trial.

## Step 1: Authenticate with the Chainguard registry

Log in to the Chainguard registry:

```shell
chainctl auth login
```

{{< blurb/chainctl-auth >}}

Configure Docker to use your Chainguard credentials:

```shell
chainctl auth configure-docker
```

Set your Chainguard organization name as an environment variable. If you don't know your organization name, run `chainctl iam organizations list -o table` to find it.

```shell
export ORGANIZATION=<your-chainguard-organization>
```

## Step 2: Create a local Kubernetes cluster

Create a K3s cluster with k3d, disabling the default Traefik ingress and mapping host ports 80 and 443 to the cluster's load balancer:

```shell
k3d cluster create gitlab-demo \
  --k3s-arg "--disable=traefik@server:*" \
  -p "80:80@loadbalancer" \
  -p "443:443@loadbalancer"
```

The GitLab Helm chart installs its own NGINX ingress controller, so Traefik must be disabled to avoid a conflict. The port mappings let you reach GitLab at the standard HTTP and HTTPS ports on your local machine.

You'll see output similar to the following:

```output
INFO[0000] Created network 'k3d-gitlab-demo'
INFO[0001] Creating node 'k3d-gitlab-demo-server-0'
INFO[0001] Creating LoadBalancer 'k3d-gitlab-demo-serverlb'
INFO[0005] Starting servers...
INFO[0013] Cluster 'gitlab-demo' created successfully!
```

Verify that the cluster is running:

```shell
kubectl get nodes
```

```output
NAME                       STATUS   ROLES                  AGE   VERSION
k3d-gitlab-demo-server-0   Ready    control-plane,master   19s   v1.31.5+k3s1
```

The node should show a `Ready` status before you proceed.

## Step 3: Create an image pull secret

GitLab's Helm chart deploys pods in the `gitlab-system` namespace that pull images from `cgr.dev`. Kubernetes nodes don't inherit credentials from your local Docker configuration, so you need to create a pull secret explicitly before installing.

Create the namespace first so you can pre-populate the secret:

```shell
kubectl create namespace gitlab-system
```

Create a long-lived pull token for your Chainguard organization:

```shell
chainctl auth pull-token create \
  --name gitlab-pull-token \
  --ttl 8760h
```

The command outputs a username and password. Use those values to create a Kubernetes image pull secret:

```shell
kubectl create secret docker-registry cgr-pull-secret \
  --namespace gitlab-system \
  --docker-server=cgr.dev \
  --docker-username=<username-from-pull-token> \
  --docker-password=<password-from-pull-token>
```

```output
secret/cgr-pull-secret created
```

## Step 4: Create the GitLab configuration file

Create a file named `gitlab-values.yaml` with the following content. This file configures the GitLab Helm chart to pull all images from the Chainguard registry, references the pull secret you just created, and sets reduced resource requests appropriate for a local development environment.

Replace every occurrence of `ORGANIZATION` with your Chainguard organization name. If you set `$ORGANIZATION` in [Step 1](#step-1-authenticate-with-the-chainguard-registry), run the following command after saving the file to substitute it automatically:

```shell
sed -i "s/ORGANIZATION/$ORGANIZATION/g" gitlab-values.yaml
```

```yaml
installCertmanager: false

certmanager-issuer:
  email: admin@example.com

global:
  gitlabBase:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-base
      tag: "18.11"
  certificates:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-certificates
      tag: "18.11"
  hosts:
    domain: 127.0.0.1.nip.io
    externalIP: 127.0.0.1
  ingress:
    configureCertmanager: false
  image:
    pullSecrets:
      - name: cgr-pull-secret

gitlab:
  gitlab-exporter:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-exporter
      tag: "18.11"
  gitlab-shell:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-shell
      tag: "18.11"
  gitaly:
    image:
      repository: cgr.dev/ORGANIZATION/gitaly
      tag: "18.11"
  gitlab-pages:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-pages
      tag: "18.11"
  kas:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-kas
      tag: "18.11"
  sidekiq:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-sidekiq-ce
      tag: "18.11"
    resources:
      requests:
        cpu: 100m
        memory: 500Mi
  toolbox:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-toolbox-ce
      tag: "18.11"
  webservice:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-webservice-ce
      tag: "18.11"
    resources:
      requests:
        cpu: 300m
        memory: 1500Mi
    workhorse:
      image: cgr.dev/ORGANIZATION/gitlab-workhorse-ce
      tag: "18.11"

registry:
  image:
    repository: cgr.dev/ORGANIZATION/gitlab-container-registry
    tag: "18.11"

gitlab-runner:
  install: false

prometheus:
  install: false

redis:
  resources:
    requests:
      cpu: 50m
      memory: 64Mi

minio:
  resources:
    requests:
      cpu: 50m
      memory: 128Mi
```

A few notes on this configuration:

- **Image tags**: The `18.11` tag tracks the latest security-patched build within the GitLab 18.11 minor release. This provides a longer guide lifespan than `latest` while still receiving daily security updates.
- **Chart version**: The Helm install command in the next step pins to chart version `9.11.7`, which corresponds to GitLab 18.x. The chart 10.x series (GitLab 19+) requires externally managed PostgreSQL, Redis, and object storage. When Chainguard's `18.11` images are succeeded by a `19.x` series, this guide will require a corresponding update.
- **TLS**: With cert-manager disabled, the chart generates self-signed TLS certificates. Your browser will display a certificate warning when you first access GitLab — this is expected for a local development setup.
- **Workhorse**: The workhorse container runs inside the webservice pod and must use a Chainguard image built from the same commit as `gitlab-webservice-ce`. It is configured separately under `gitlab.webservice.workhorse` rather than as a standalone subchart.

## Step 5: Deploy GitLab with Helm

Add the official GitLab Helm chart repository:

```shell
helm repo add gitlab https://charts.gitlab.io/
helm repo update
```

Deploy GitLab, pinning to the chart version that matches the Chainguard image series:

```shell
helm upgrade --install gitlab gitlab/gitlab \
  --version 9.11.7 \
  --namespace gitlab-system \
  --values gitlab-values.yaml \
  --timeout 600s
```

The `--timeout 600s` flag gives the deployment up to ten minutes to complete. GitLab pulls several container images and initializes multiple services on first install, so the process takes several minutes.

Watch the deployment progress:

```shell
watch kubectl get pods -n gitlab-system
```

When the output stabilizes and all pods show a `Running` or `Completed` status, press `Ctrl+C` to exit. A healthy deployment looks like this:

```output
NAME                                               READY   STATUS      RESTARTS   AGE
gitlab-gitaly-0                                    1/1     Running     0          8m
gitlab-gitlab-exporter-...                         1/1     Running     0          8m
gitlab-gitlab-shell-...                            1/1     Running     0          8m
gitlab-kas-...                                     1/1     Running     0          8m
gitlab-migrations-...-...                          0/1     Completed   0          8m
gitlab-minio-...                                   1/1     Running     0          8m
gitlab-minio-create-buckets-...                    0/1     Completed   0          8m
gitlab-nginx-ingress-controller-...                1/1     Running     0          8m
gitlab-postgresql-0                                2/2     Running     0          8m
gitlab-redis-master-0                              2/2     Running     0          8m
gitlab-registry-...                                1/1     Running     0          8m
gitlab-sidekiq-all-in-1-v2-...                     1/1     Running     0          8m
gitlab-toolbox-...                                 1/1     Running     0          8m
gitlab-webservice-default-...                      2/2     Running     0          8m
```

> **Note**: The KAS pods may restart once on first boot while waiting for Redis to become ready. This is a normal startup ordering effect and resolves on its own within a minute or two.

## Step 6: Access GitLab

Retrieve the initial root password from the Kubernetes secret created during deployment:

```shell
kubectl get secret gitlab-gitlab-initial-root-password \
  -n gitlab-system \
  -o jsonpath='{.data.password}' | base64 --decode; echo
```

Open a browser and navigate to `https://gitlab.127.0.0.1.nip.io`. Proceed past the browser's certificate warning (expected because the deployment uses a self-signed certificate), then log in with the username `root` and the password you retrieved.

After logging in, navigate to **User menu > Edit profile > Password** and set a new password for the root account.

## Step 7: Clean up

When you're done, delete the cluster to remove all resources:

```shell
k3d cluster delete gitlab-demo
```

## Advanced usage

{{< blurb/images-advanced image="GitLab" >}}

### Enable GitLab Runner

To add GitLab Runner with Chainguard images, update `gitlab-values.yaml` with the following:

```yaml
gitlab-runner:
  install: true
  image:
    registry: cgr.dev
    image: ORGANIZATION/gitlab-runner
    tag: "18.11"
  runners:
    config: |
      [[runners]]
        [runners.kubernetes]
          helper_image = "cgr.dev/ORGANIZATION/gitlab-runner-helper:18.11"
```

Run `helm upgrade` with the updated values file to apply the change.

### Use the FIPS variant

Chainguard provides FIPS-validated variants of all GitLab images for FedRAMP and compliance-sensitive environments. To use them, append `-fips` to every image repository path in your values file. For example:

```yaml
global:
  gitlabBase:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-base-fips
      tag: "18.11"
  certificates:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-certificates-fips
      tag: "18.11"
```

Apply the same `-fips` suffix to all component image repositories in the `gitlab:` section, the `workhorse` block, and the `registry:` image.

---

### Getting started with the Cilium Chainguard Containers
_Path: chainguard/containers/getting-started/platform-and-infrastructure/cilium/index.md_

Chainguard's Cilium container images provide a security-hardened foundation for Kubernetes networking with significantly reduced vulnerabilities compared to standard Cilium deployments. Cilium leverages [eBPF](https://ebpf.io/) technology to transparently secure network connectivity between services, enabling powerful security policies without application changes. Built on Wolfi OS, Chainguard's minimal Cilium images enhance your cluster's security posture while maintaining full compatibility with Cilium's advanced networking features.

We will demonstrate how to get started with the Chainguard Cilium container images on an example K3s cluster. To get started, you'll need Docker, `k3d` (a CLI tool to install `k3s`), `kubectl`, and the `cilium` CLI installed.

* [Docker](https://docs.docker.com/get-docker/)
* [k3d](https://k3d.io/stable/#installation)
* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
* [cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)

{{< blurb/free-tier-message >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Start up a K3s cluster

Cilium does not work with the default Container Network Interface (CNI) plugin in K3s, so we'll start up a CNI for our K3s cluster and disable the network policy.

To do so, create a YAML manifest named `k3d.yaml` with the following command:

```sh
cat > k3d.yaml <<EOF
apiVersion: k3d.io/v1alpha5
kind: Simple
image: cgr.dev/chainguard/k3s:latest
servers: 1
options:
  k3s:
    extraArgs:
      # Cilium requires network policy and CNI to be turned off
      - arg: --disable-network-policy
        nodeFilters:
          - server:*
      - arg: --flannel-backend=none
        nodeFilters:
          - server:*
      - arg: --snapshotter=fuse-overlayfs
        nodeFilters:
          - server:*
EOF
```

Then, we'll start up the cluster:

```sh
k3d cluster create --config k3d.yaml
```

If cluster creation fails with errors, check that Docker is running.

Next, Cilium requires some system mounts for the nodes. Run the following command to configure the mounts:

```sh
for node in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do
    echo "Configuring mounts for $node"
    docker exec -i $node /bin/sh <<-EOF
        mount bpffs -t bpf /sys/fs/bpf
        mount --make-shared /sys/fs/bpf
        mkdir -p /run/cilium/cgroupv2
        mount -t cgroup2 none /run/cilium/cgroupv2
        mount --make-shared /run/cilium/cgroupv2/
EOF
done
```

For more information, refer to the settings suggested in the [Cilium documentation](https://docs.cilium.io/en/latest/installation/rancher-desktop/#configure-rancher-desktop).

With that, you're ready to install Cilium.

## Install Cilium using Chainguard Containers

We will use the Cilium CLI to install Cilium. In order to use Chainguard Containers, we must first set the following values:

```sh
export ORGANIZATION=<your-Chainguard-organization>
export AGENT_IMAGE=cgr.dev/$ORGANIZATION/cilium-agent:latest
export HUBBLE_RELAY_IMAGE=cgr.dev/$ORGANIZATION/cilium-hubble-relay:latest
export HUBBLE_UI_IMAGE=cgr.dev/$ORGANIZATION/cilium-hubble-ui:latest
export HUBBLE_UI_BACKEND_IMAGE=cgr.dev/$ORGANIZATION/cilium-hubble-ui-backend:latest
export OPERATOR_IMAGE=cgr.dev/$ORGANIZATION/cilium-operator-generic:latest
```

> **Note**: If you don't remember the name of your Chainguard organization, you can find it by running `chainctl iam organizations list -o table`.

After that, install Cilium using the following command:

```sh
cilium install \
    --helm-set hubble.relay.enabled=true \
    --helm-set hubble.ui.enabled=true \
    --helm-set image.override=$AGENT_IMAGE \
    --helm-set hubble.relay.image.override=$HUBBLE_RELAY_IMAGE \
    --helm-set hubble.ui.frontend.image.override=$HUBBLE_UI_IMAGE \
    --helm-set hubble.ui.backend.image.override=$HUBBLE_UI_BACKEND_IMAGE \
    --helm-set operator.image.override=$OPERATOR_IMAGE
```

This will return output similar to the following:

```output
🔮 Auto-detected Kubernetes kind: K3s
ℹ️  Using Cilium version 1.14.2
🔮 Auto-detected cluster name: k3d-k3s-default
```

Now that your cluster has a CNI plugin installed, the Pods will start to transition to the `Running` state. This may take a few minutes. Run the following command to check the status of the Pods:

```sh
watch kubectl get pods --all-namespaces
```

When all the Pods have a status of `Running` or `Completed`, press `Ctrl+C` to exit the watch.

## Verify that the Cilium installation is successful

Cilium comes with the `connectivity test` command, which is useful for verifying whether the Cilium installation was successful. Run the following command to run the connectivity test:

```sh
# We skip one of the tests because it needs `jq` util on the agent image, which we don't bundle.
cilium connectivity test \
    --external-cidr 8.0.0.0/8 \
    --external-ip 8.8.8.8 \
    --external-other-ip 8.8.4.4 \
    --test \!no-unexpected-packet-drops
```

This should takes about 5 minutes to complete. It will return output similar to the following:

```
ℹ️  Single-node environment detected, enabling single-node connectivity test
ℹ️  Monitor aggregation detected, will skip some flow validation steps
✨ [k3d-k3s-default] Creating namespace cilium-test for connectivity check...
✨ [k3d-k3s-default] Deploying echo-same-node service...
✨ [k3d-k3s-default] Deploying DNS test server configmap...
✨ [k3d-k3s-default] Deploying same-node deployment...
✨ [k3d-k3s-default] Deploying client deployment...
✨ [k3d-k3s-default] Deploying client2 deployment...
⌛ [k3d-k3s-default] Waiting for deployment cilium-test/client to become ready...
⌛ [k3d-k3s-default] Waiting for deployment cilium-test/client2 to become ready...
...

✅ All 32 tests (263 actions) successful, 2 tests skipped, 1 scenarios skipped.
```

Note that the exact output and results of individual tests may differ based on your local machine's configuration.

## Exploring the Cilium Hubble UI

Before you can explore the Hubble user interface, you will need to enable it with the `cilium` command:

```sh
cilium hubble enable --ui
```

Then run the following command to bring up the Hubble UI:

```sh
cilium hubble ui
```

A new browser window will open showing the Hubble UI. You can explore the Hubble UI to see the network traffic in your cluster. If you are running this during the connectivity test, it will show a visualization of the test traffic.

## Clean up your K3s cluster

Once you are done exploring Cilium, you can clean up your K3s cluster by running the following command:

```sh
k3d cluster delete
```

## Advanced usage

{{< blurb/images-advanced image="Cilium" >}}

---

### Getting started with the Python Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/python.md_

Chainguard's Python container images provide a more secure foundation for Python applications through distroless design, containing significantly fewer CVEs compared to traditional Python images. These production-ready images are optimized for building and running Python workloads.

Two variants of Chainguard Python images are available: a minimal runtime image containing only Python and its standard library, and a `-dev` variant that includes pip and a shell for development purposes. Since most Python applications require third-party packages, the recommended approach is using a [multi-stage Docker build](https://docs.docker.com/build/building/multi-stage/) with the `-dev` image for dependency installation and the minimal image for runtime.

This guide covers two examples of Python container images based on Wolfi as a runtime. The first uses the minimal image containing just Python, which has access to the [Python standard library](https://docs.python.org/3/library/). The second demonstrates a multi-stage build.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Example 1 — Minimal Python Chainguard Container

In this example, you'll build and run a distroless Python Chainguard Container in a single-stage build process. You'll first make a demonstration app, then build and run it.

### Step 1: Setting up a demo application

Start by creating a basic command-line Python application to serve as a demo. This app generates random octopus facts based on a list in a text file, using the `random` module from the Python standard library.

First, create a directory for your app. You can use any meaningful name and path; this example uses `octo-facts/`.

```shell
mkdir ~/octo-facts/ && cd $_
```

Create a new file named `main.py` to serve as the application entry point. The following Python script defines a light CLI app that takes in a text file, `facts.txt`, and returns a random line from that file.

```shell
cat > main.py <<'EOF'
'''Import random module to implement random.choice() function'''
import random

def random_line(text):
    '''Opens and reads lines of a UTF-8 encoded file, returning a random line'''
    with open(text, 'r', encoding='UTF-8') as file:
        line = file.readlines()
        return random.choice(line)

def main():
    '''Prints random line from facts.txt; verify your path'''
    print(random_line('facts.txt'))

if __name__ == "__main__":
    main()
EOF
```

Next, pull down the `facts.txt` file with `curl`. [Inspect the URL](https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/python/octo-facts/facts.txt) before downloading it to ensure it is safe to do so. Make sure you are still in the same directory where your `main.py` script is.

```shell
curl -O https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/python/octo-facts/facts.txt
```

At this point, you can run the script and be sure you are satisfied with the functionality. We recommend that you use a Python programming environment. Determine whether your system uses the `python` or `python3` command.

```shell
python main.py
```

You should receive the output of a randomized octopus fact.

```
The wolfi octopus was discovered in 1913.
```

The demo application is now ready. In the next step, you’ll create a Dockerfile to run your app.

### Step 2: Creating the Dockerfile

For this single-stage build, you'll only need one `FROM` line in your Dockerfile. The resulting container is based on the distroless Python Wolfi container image, which means it doesn’t come with a package manager or even a shell.

Begin by creating a Dockerfile. The following Dockerfile:

1. Starts a build stage based on the `python:latest` image;
2. Declares the working directory;
3. Copies the script and the text file that's being read;
4. Sets up the application as entry point for this container.

```shell
cat > Dockerfile <<'EOF'
FROM cgr.dev/chainguard/python:latest

WORKDIR /octo-facts

COPY main.py facts.txt ./

ENTRYPOINT [ "python", "/octo-facts/main.py" ]
EOF
```

You can now build the container image. If you receive an error, try again with `sudo`.

```shell
docker build . --pull -t octo-facts
```

Once the build is finished, run the container.

```shell
docker run --rm octo-facts
```

And you should get output similar to what you got before, with a random octopus fact.

```
Octopuses can breathe and see through their skin.
```

You have successfully completed the single-stage Python Chainguard Container. At this point, you can continue to the [multi-stage example](#example-2-multi-stage-build-for-python-chainguard-container) or [advanced usage](#advanced-usage).

## Example 2 — Multi-stage build for Python Chainguard Container

In this example, you'll build and run a multi-stage Python Chainguard Container. The build image includes pip and a shell, and the final distroless image leaves out these development tools for production.

### Step 1: Setting up a demo application

Start by creating a Python application that takes in an image file and converts it to ANSI escape sequences on the CLI to render an image.

To begin, create a directory for your app. You can use any meaningful name and path that resonates with you; this example uses `linky/`.

```shell
mkdir ~/linky/ && cd $_
```

First, write out the requirements for your app in a file named `requirements.txt`. This installs version 0.2.2 of [climage](https://pypi.org/project/climage/), which converts images into ANSI escape sequences:

```shell
cat > requirements.txt <<'EOF'
climage==0.2.2
EOF
```

Create a file named `linky.py` to hold your Python code. It defines a CLI app that takes in an
image file, `linky.png`, and prints a representation of that file to the terminal:

```shell
cat > linky.py <<'EOF'
'''import climage module to display images on terminal'''
from climage import convert

def main():
    '''Take in PNG and output as ANSI to terminal'''
    output = convert('linky.png', is_unicode=True)
    print(output)

if __name__ == "__main__":
    main()
EOF
```

Next, pull down the `linky.png` image file with `curl`. [Inspect the URL](https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/python/linky/linky.png) before downloading it to ensure it is safe to do so. Make sure you are still in the same directory where your `linky.py` script is.

```shell
curl -O https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/python/linky/linky.png
```

With your demo application ready, you can move on to the container stage.

### Step 2: Creating the Dockerfile

To keep the final container distroless while still being able to install dependencies with pip, the build consists of two stages: first, you’ll build the application using the `python:latest-dev` image variant, a Wolfi-based image that includes pip and other useful tools for development. Then, you’ll create a separate stage for the final image. The resulting container is based on the distroless Python Wolfi container image, which means it doesn’t come with pip or even a shell.

Begin by creating a Dockerfile. The following Dockerfile:

1. Starts a new build stage based on the `python:latest-dev` container image and calls it `builder`;
2. Creates a new virtual environment to cleanly hold the application's dependencies, using `--without-pip` to keep pip out of the environment and therefore out of the final image;
3. Copies `requirements.txt` from the current directory to the `/linky` location in the container;
4. Runs `pip --python /linky/venv/bin/python install --no-cache-dir -r requirements.txt` to install dependencies, where `--python` points the builder's own pip at the virtual environment;
5. Starts a new build stage based on the `python:latest` image;
6. Copies the dependencies in the virtual environment from the builder stage, and the source code from the current directory;
7. Sets up the application as the entry point for this container.

Write this configuration to your own Dockerfile:

```shell
cat > Dockerfile <<'EOF'
FROM cgr.dev/chainguard/python:latest-dev AS builder

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/linky/venv/bin:$PATH"

WORKDIR /linky

RUN python -m venv --without-pip /linky/venv
COPY requirements.txt .

RUN pip --python /linky/venv/bin/python install --no-cache-dir -r requirements.txt

FROM cgr.dev/chainguard/python:latest

WORKDIR /linky

ENV PYTHONUNBUFFERED=1
ENV PATH="/venv/bin:$PATH"

COPY linky.py linky.png ./
COPY --from=builder /linky/venv /venv

ENTRYPOINT [ "python", "/linky/linky.py" ]
EOF
```

You can now build the container image. If you receive a permission error, try running under `sudo`.

```shell
docker build . --pull -t linky
```

Once the build is finished, run the image with:

```shell
docker run --rm linky
```

And you should get output similar to what you got before, with a printed Linky on the command line.

## Advanced usage

{{< blurb/images-advanced image="Python" >}}

---

### Getting started with the Ruby Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/ruby.md_

Chainguard's [Ruby container images](https://images.chainguard.dev/directory/image/ruby/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-ruby) provide secure foundations for Ruby applications with minimal vulnerabilities through both development and production-ready distroless variants. These images significantly reduce attack surface compared to traditional Ruby base images while maintaining full compatibility with Ruby applications and the Rubygems ecosystem.

Because Ruby applications typically require the installation of third-party dependencies via [Rubygems](https://rubygems.org/), using a pure distroless image for building your application would not work. In cases like this, you'll need to implement a [multi-stage Docker build](https://docs.docker.com/build/building/multi-stage/) that uses one of the `-dev` images to set up the application.

In this guide, we'll build two example applications that demonstrate how to use Chainguard's Ruby container images. In the first, we’ll use a minimal image containing just Ruby to execute a demo that doesn't have any external dependencies. In the second example, we'll set up a multi-stage Docker build to run a demo that requires the installation of Rubygems via `bundler`.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Example 1: Minimal Ruby container in single stage build

We'll start by creating a small command-line Ruby application to serve as a demo. This application has no external dependencies; it will read from a text file containing facts about octopuses, and output a random line from that file. This demo is also available in our [demos repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/ruby), if you want to review the source files before building it.

### Step 1: Setting up the application

First, create a directory and then move into it for your app. Here we'll use `octo-facts`:

```shell
mkdir ~/octo-facts && cd ~/octo-facts
```

Next, create a new file to serve as the application entry point. Here, we’ll use `octo.rb`. You can edit this file in whatever code editor you would like. We’ll use `nano` as an example.

```shell
nano octo.rb
```

The following Ruby code will read a random line from the `facts.txt` file and print it out to the terminal:

```ruby
#!/usr/bin/env ruby

class OctoFact
  attr_accessor :source

  def initialize(source = "facts.txt")
    @source = source
  end

  def random_line
    puts File.readlines(@source).sample
  end
end

if __FILE__ == $0
  fact = OctoFact.new
  fact.random_line
end
```

Copy this code to your `octo.rb` script, then save and close the file.

Next, pull down the `facts.txt` file with `curl`. You can [inspect the file's contents](https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/ruby/octo-facts/facts.txt) before downloading it to ensure it is safe to do so. Make sure you are still in the same directory where your `octo.rb` script is.

```shell
curl -O https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/ruby/octo-facts/facts.txt
```

With all files in place, you can now run the demo using Docker. The following command will execute the demo code using the same base image we'll use to build our Dockerfile in the next step. It will set up a volume sharing the files in the current directory with the location `/work` inside the container, then execute the `octo.rb` script:

```shell
docker run --rm -v ${PWD}:/work cgr.dev/chainguard/ruby octo.rb
```

And you should get output like this, with a random fact about octopuses:

```shell
Octopuses have decentralized brains.
```

In the next step, we'll create a Dockerfile to build and run the demo.

### Step 2: Setting up the Dockerfile

With the demo ready, you can now set up a Dockerfile to build a custom image for your Ruby application. Make sure you're still on the same directory as the application files, then create a new Dockerfile using your text editor of choice:

```shell
nano Dockerfile
```

The following Dockerfile will:

1. Start a new image based on the `cgr.dev/chainguard/ruby:latest` container image;
2. Set up a workdir at `/app`;
3. Copy the application files to the workdir;
4. Set up the entry point for the container as `ruby octo.rb`.

Copy the following content to your `Dockerfile`:

```Dockerfile
FROM cgr.dev/chainguard/ruby:latest

WORKDIR /app

COPY octo.rb facts.txt ./

ENTRYPOINT [ "ruby", "octo.rb" ]
```

Save and close the file when you're done. Next, build the container image with:

```shell
docker build . --pull -t octo-ruby-demo
```

Once the build is finished, you can execute the container with:

```shell
docker run --rm octo-ruby-demo
```

And you should get output similar to what you got before, with a random octopus fact.

## Example 2: Multi-stage build for Ruby application runtime

To demonstrate how to containerize a more complex application that requires the installation of third party dependencies, we'll create a second demo that uses a [Docker multi-stage build](https://docs.docker.com/build/building/multi-stage/), which will combine the `cgr.dev/chainguard/ruby:latest-dev` development image to build the application and the `cgr.dev/chainguard/ruby:latest` distroless image to run it.

This demo will use the [rainbow](https://rubygems.org/gems/rainbow) Ruby gem to output to the command line interface a colorful quote, inspired by _cowsay_.

### Step 1: Setting up the application

First, create a directory for your app. Here we'll use `linky-says`:

```shell
mkdir ~/linky-says && cd ~/linky-says
```

Then, set up your Gemfile:

```shell
nano Gemfile
```

Copy the following content into your Gemfile to require the Rainbow Gem:

```ruby
source 'https://rubygems.org'

gem 'rainbow'
```

Save and close the file.

Next, create a new Ruby script file called `linky.rb`:

```shell
nano linky.rb
```

The following code outputs a colorful quote provided at runtime, incorporating an ASCII representation of Linky that is pulled from an `linky.txt` file located at the same directory as the ruby script. The printed quote colors alternate randomly between purple and magenta.

```ruby
#!/usr/bin/env ruby

require 'rainbow'
Rainbow.enabled = true

class Linky
  def says(message = "Hello World")
    colors = [:purple, :magenta]
    words = message.split(" ")

    print "\n ".ljust(40, " ")
    words.each do |n|
      print Rainbow(n).color(colors.sample) + " "
    end

    print "\n"
    puts File.readlines('linky.txt')
  end
end

if __FILE__ == $0
  linky = Linky.new
  inputArray = ARGV
  message = inputArray.length > 0 ? inputArray.join(' ') : "Hello Wolfi"
  linky.says(message)
end
```

Copy this code to your `linky.rb` script, then save and close the file.

Next, pull down the ASCII `linky.txt` file with `curl`. You can [inspect the file contents](https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/ruby/linky-says/linky.txt) before downloading it to ensure it is safe to do so. Make sure you are still in the same directory where your `linky.rb` script is.

```shell
curl -O https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/main/ruby/linky-says/linky.txt
```

With everything in place, you can now work on the Dockerfile that will install the application dependencies and execute your Ruby script.

### Step 2: Setting up the Dockerfile

To make sure our final container is _distroless_ while still being able to install Rubygems, our build will consist of **two** stages: first, we'll build the application using the `dev` image variant, a Wolfi-based image that includes the Gem executable, Bundler, and other useful tools for development. Then, we'll create a separate stage for the final container. The resulting container will be based on the distroless Ruby Wolfi image, which means it doesn't come with the Gem executable or even a shell.

Create a new Dockerfile using your code editor of choice, for example `nano`:

```shell
nano Dockerfile
```

The following Dockerfile will:

1. Start a new build stage based on the `cgr.dev/chainguard/ruby:latest-dev`container image and call it `builder`;
2. Set up environment variables that define the default location of installed Gems;
3. Copy the Gemfile from the current directory to the `/work` location in the container;
4. Install Bundler and run `bundle install`;
5. Start a new build stage based on the `cgr.dev/chainguard/ruby:latest` image;
6. Set up environment variables that define the default location of installed Gems;
7. Copy build artifacts from `builder` and into the final container
8. Copy the `linky.rb` and `linky.txt` files into the final container
9. Set up the application entry point as `ruby linky.rb`.

Copy this content to your own `Dockerfile`:

```Dockerfile
FROM cgr.dev/chainguard/ruby:latest-dev AS builder

ENV GEM_HOME=/work/vendor
ENV GEM_PATH=${GEM_PATH}:/work/vendor
COPY Gemfile /work/
RUN gem install bundler && bundle install

FROM cgr.dev/chainguard/ruby:latest

ENV GEM_HOME=/work/vendor
ENV GEM_PATH=${GEM_PATH}:/work/vendor

COPY --from=builder /work/ /work/
COPY linky.rb linky.txt /work/

ENTRYPOINT [ "ruby", "linky.rb" ]

```

Save the file when you're finished.

You can now build the image with:

```shell
docker build . --pull -t linky-says
```

Once the build is finished, run the container with:

```shell
docker run --rm linky-says Wolfi says hi
```

And you should get output like this:

```

                                       Wolfi says hi
                   @@@
              @@@*******@@@              /
           @@%**@@@@*******@@@          /
          @@*@@***********///@@        /
         @*************///////&@      /
        @@*****%@@@**////@@@&//@@    /
        @*****@**##@////@//##@//@   /
        @@*****@@@@//////@@@@//@@  /
      ,@@@@***////////////////@@@@,
 @@@*******/////////////////////(((((@@@
 @*******//////////////////////((((((((@
    @@@/////////@///////@///(((((%@@@
     #@///////@@@///////@@@((((((#@
         @@@    /@@///@@,    @@@

```

If you inspect the image with a `docker image inspect linky-says`, you'll notice that it has only **three** layers, thanks to the use of a multi-stage Docker build.

```shell
docker image inspect linky-says
```

```shell
...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ec653fe8da922557dd1d78b47b2c0074a6e9257e5a15e596bc4e1fb1e325c3d8",
                "sha256:d9541a2e82274d8140ed7f4cc79ce92f295d13951585c4a433f1baa35015e1eb",
                "sha256:a44e5fee28e11702a63418bf76c009b1b4948f1b0426e0f199b83702ae187796"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-05-09T19:53:16.060125796+02:00"
        }
    }
]

```

In such cases, the last `FROM` section from the Dockerfile is the one that composes the final image. That's why in our case it only adds two layers on top of the base `cgr.dev/chainguard/ruby:latest` image, containing the two `COPY` commands we use to copy the application files and its dependencies to the final image.

It's worth highlighting that no code or data is carried from one stage to the other unless you use a `COPY` command to explicitly copy it. This approach facilitates creating a slim final image with only what's absolutely necessary to execute the application. Using a multi-stage build like this, without shell tools and interactive language interpreters built in also makes your final container image more secure.

## Advanced usage

{{< blurb/images-advanced image="Ruby" >}}

---

### Getting started with the Go Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/go.md_

Chainguard's [Go container image](https://images.chainguard.dev/directory/image/go/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-go) provides a secure foundation for building Go applications. The distroless `latest` variant contains only the Go compiler and runtime, while the `latest-dev` variant includes additional build tools and package management capabilities for development workflows.

In this guide, we'll demonstrate how to build and execute Go applications using Chainguard Containers, using three examples from our [demos repository](https://github.com/chainguard-dev/edu-images-demos). In the first example, we'll build a CLI application using a Docker multi-stage build. In the second example, we'll build an application that's accessible by HTTP server, also using a Docker multi-stage build to obtain an optimized runtime. The third example shows how to build an image using [ko](https://ko.build/), a tool that enables you to build container images from Go programs and push them to container registries without requiring a Dockerfile.

The examples in this guide recommend executing Go binaries from one of our runtime Chainguard Containers, such as the [`glibc-dynamic`](https://images.chainguard.dev/directory/image/glibc-dynamic/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-go) or [`static`](https://images.chainguard.dev/directory/image/static/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-go) Chainguard Containers. That is possible because Go applications are compiled and the toolchain is not typically required in a runtime container image.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Preparation

This tutorial requires Docker to be installed on your local machine. If you don't have Docker installed, you can download and install it from the [official Docker website](https://docs.docker.com/get-docker/). The third and optional example requires the installation of [ko](https://ko.build/), which you can install by following the instructions on the official site.

### Cloning the demos repository

Start by cloning the demos repository to your local machine:

```shell
git clone git@github.com:chainguard-dev/edu-images-demos.git
```

Access the `go` folder in the repository:

```shell
cd edu-images-demos/go
```

Here you will find three folders, each with a different demo that we'll cover in this guide.

## Example 1: CLI application in multi-stage build

The following example demonstrates a command line application with support for flags and positional arguments. The application prints a modifiable greeting message and provides usage information if the wrong number of arguments are passed by a user or the user passes an unrecognized flag.

Start by accessing the `go-greeter` folder in the demos repository:

```shell
cd go-greeter
```

For reference, here is the content of the `Dockerfile` for this demo:

```Dockerfile
FROM cgr.dev/chainguard/go AS builder
COPY . /app
RUN cd /app && go build -o go-greeter .

FROM cgr.dev/chainguard/static
COPY --from=builder /app/go-greeter /usr/bin/
ENTRYPOINT ["/usr/bin/go-greeter"]
```

This Dockerfile will:

1. Start a build stage based on the `go:latest` container image and name it `builder`;
2. Copy the application files to the `/app` directory in the image;
3. Build the application in the `/app` directory;
4. Start a new build stage based on the `static:latest` image;
5. Copy the built application from the `builder` stage to the `/usr/bin` directory in the new image;
6. Set the entrypoint to the built application.

Run the following command to build the container image, tagging it `go-greeter`:

```shell
docker build . --pull -t go-greeter
```

You can now run the container image with:

```shell
docker run go-greeter
```

You should get output similar to the following:

```
Hello, Linky 🐙!
```

You can also pass in arguments that will be parsed by the Go CLI application:

```shell
docker run go-greeter -g Greetings "Chainguard user"
```

This will produce the following output:

```
Greetings, Chainguard user!
```

The application will also share usage instructions when prompted with the `--help` flag or when invalid flags are passed.

Because we used the `static` Chainguard Container as our runtime, the final container image only requires a few megabytes on disk:

```shell
docker inspect go-greeter | jq -c 'first' | jq .Size | numfmt --to iec --format "%8.4f"
```

```
 3.3009M
```

The final size, `3.309M`, is orders of magnitude smaller than it would be running the application using a Go image. However, if your application is dynamically linked to shared objects, consider using the `glibc-dynamic` Chainguard Container for your runtime or take extra steps to build your Go binary statically. In the next example, we'll build a web application and use the `glibc-dynamic` Chainguard Container as runtime.

## Example 2: Web application

The second example demonstrates an application that's accessible by HTTP server. The application renders a simple message that changes based on the URI.

Start by accessing the `greet-server` folder in the Go demos repository:

```shell
cd greet-server
```

For reference, here is the content of the `Dockerfile` for this demo:

```Dockerfile
FROM cgr.dev/chainguard/go AS builder
COPY . /app
RUN cd /app && go build

FROM cgr.dev/chainguard/glibc-dynamic
COPY --from=builder /app/greet-server /usr/bin/

EXPOSE 8080

ENTRYPOINT ["/usr/bin/greet-server"]
```

Use the following command to build the container image, tagging it `greet-server`:

```shell
docker build . --pull -t greet-server
```

Now you can run the container image with the following command:

```shell
docker run -p 8080:8080 greet-server
```

Visit `http://0.0.0.0:8080/` using a web browser on your host machine. You should get a greeting message:

```
Hello, Linky 🐙!
```

Changes to the URI will be routed to the application. Try visiting [http://0.0.0.0:8080/Chainguard%20Customer](http://0.0.0.0:8080/Chainguard%20Customer). You should see the following output:

```
Hello, Chainguard Customer!
```

The application will also share version information at [http://0.0.0.0:8080/version](http://0.0.0.0:8080/version).

## Example 3: Minimal Go Chainguard Container built with ko

In this example, we'll build a distroless Go Chainguard Container with [ko](https://ko.build/). ko offers fast container image builds for Go applications without requiring a Dockerfile. Additionally, ko produces [SBOMs](/open-source/sbom/what-is-an-sbom/) by default, supporting a holistic approach to software security.

Start by accessing the `go-digester` folder in the Go demos repository:

```shell
cd go-digester
```

The `go-digester` demo uses the `go-containerregistry` library to print out the digest of the latest build of a Chainguard Container, using `go` as the default image to pull the digest from, and with an optional parameter to specify a different container image name. If you have Go installed locally, you can run the application with:

```shell
go run main.go
```

You should obtain output similar to this:

```
The latest digest of the go Chainguard Container is sha256:86178b42db2e32763304e37f4cf3c6ec25b7bb83660dcb985ab603e3726a65a6
```

We'll now use ko to build an image that is suitable to run the application defined in `main.go`. By default, ko uses the `cgr.dev/chainguard/static` image as the base image for the build. You can override this by setting the `KO_DEFAULTBASEIMAGE` environment variable to a different base image.

Before building the container image, you'll need to set up the environment variable `KO_DOCKER_REPO`. This environment variable identifies where ko should push images that it builds. This is usually a remote registry like the GitHub Container registry or Docker Hub, but you can publish to your local machine for testing and demonstration purposes.

Run the following command to set the `KO_DOCKER_REPO` environment variable to your local machine:

```shell
export KO_DOCKER_REPO=ko.local
```

Next, ensuring that you are in the same directory as your `main.go` file, run the following command to build the container with ko:

```shell
ko build .
```

Once you run this command, you'll receive output similar to the following.

```
2024/12/06 13:03:14 Using base cgr.dev/chainguard/static:latest@sha256:5ff428f8a48241b93a4174dbbc135a4ffb2381a9e10bdbbc5b9db145645886d5 for go-digester
2024/12/06 13:03:15 git doesn't contain any tags. Tag info will not be available
2024/12/06 13:03:15 Building go-digester for linux/amd64
2024/12/06 13:03:20 Loading ko.local/go-digester-edc0ed689c7fb820a565f76425bed013:0914a85d803988ab10964323c0cd7b4bf89aed2603f6e8e276f798491c731336
2024/12/06 13:03:20 Loaded ko.local/go-digester-edc0ed689c7fb820a565f76425bed013:0914a85d803988ab10964323c0cd7b4bf89aed2603f6e8e276f798491c731336
2024/12/06 13:03:20 Adding tag latest
2024/12/06 13:03:20 Added tag latest
ko.local/go-digester-edc0ed689c7fb820a565f76425bed013:0914a85d803988ab10964323c0cd7b4bf89aed2603f6e8e276f798491c731336
```

At this point, your container is built. Because the output of `ko build` is an image reference, you can pass it to other tools like Docker. You can learn more about [deployment with ko](https://ko.build/deployment/) and [Kubernetes integration](https://ko.build/features/k8s/) by reading the respective documentation on the official site.

We'll demonstrate running the above built container with Docker.

> **Note**: To follow along, be sure that you copy and paste the last line of output from your last command that begins `ko.local/go-digester-...`

```shell
docker run --rm ko.local/go-digester-edc0ed689c7fb820a565f76425bed013:0914a85d803988ab10964323c0cd7b4bf89aed2603f6e8e276f798491c731336
```

Here, you'll expect to receive the same output as before that shows the digest of the Go container.

```
The latest digest of the go Chainguard Container is sha256:86178b42db2e32763304e37f4cf3c6ec25b7bb83660dcb985ab603e3726a65a6
```

You can also pass in an optional argument to specify which Chainguard Container to pull the latest digest from:

```shell
docker run --rm ko.local/go-digester-edc0ed689c7fb820a565f76425bed013:0914a85d803988ab10964323c0cd7b4bf89aed2603f6e8e276f798491c731336 mariadb
```

```
The latest digest of the mariadb Chainguard Container is sha256:6ba5d792d463b69f93e8d99541384d11b0f9b274e93efdeb91497f8f0aae03d1
```

## Advanced usage

{{< blurb/images-advanced image="Go" >}}

---

### Getting started with the PHP Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/php.md_

Chainguard's PHP container images provide secure foundations for PHP applications with minimal vulnerabilities compared to traditional PHP images. These images come in multiple variants: the `latest-fpm` variant for serving web applications via FastCGI, the `latest` variant for CLI applications, and development variants that include additional tools for building and debugging PHP workloads.

In this guide, we'll set up a demo and demonstrate how you can use Chainguard Containers to develop, build, and run PHP applications.

This tutorial requires Docker to be installed on your local machine. If you don't have Docker installed, you can download and install it from the [official Docker website](https://docs.docker.com/get-docker/).

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## 1. Setting up a (CLI) demo application

We'll start by getting the demo application ready. This CLI app generates random names based on a list of nouns and adjectives. To exemplify usage with Composer, the app has a single dependency on [minicli](https://github.com/minicli/minicli), a minimalist CLI framework for PHP.

Start by cloning the demos repository to your local machine:

```shell
git clone git@github.com:chainguard-dev/edu-images-demos.git
```

Locate the `namegen` demo and cd into its directory:

```shell
cd edu-images-demos/php/namegen
```

You can use the `php:latest-dev` image variant with a volume in order to install application dependencies with Composer. We'll use the `root` user to be able to write to the volume mounted in the container:

```shell
docker run --rm -v ${PWD}:/app --entrypoint composer --user root \
    cgr.dev/chainguard/php:latest-dev \
    install --no-progress --no-dev --prefer-dist
```

You'll get output like this, indicating that the package `minicli/minicli` was installed:

```shell
Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Package operations: 1 install, 0 updates, 0 removals
  - Downloading minicli/minicli (4.2.0)
  - Installing minicli/minicli (4.2.0): Extracting archive
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
```

Next, make sure permissions are set correctly on the generated files.

On Linux systems run the following:

```shell
sudo chown -R ${USER}:${USER} .
```

On macOS systems, run this:

```shell
sudo chown -R ${USER} .
```

The application should now be ready to be executed. For transparency, here is the code that will be executed, which you'll find in the `namegen` script:

```php
#!/usr/bin/php
<?php

require __DIR__ . '/vendor/autoload.php';

use Minicli\App;

$app = new App();

$app->registerCommand('get', function () use ($app) {

    $animals = [ 'turtle', 'seagull', 'octopus', 'shark', 'whale', 'dolphin', 'walrus', 'penguin', 'seahorse'];
    $adjectives = [ 'ludicrous', 'mischievous', 'graceful', 'fortuitous', 'charming', 'ravishing', 'gregarious'];

    $app->getPrinter()->info($adjectives[array_rand($adjectives)] . '-' . $animals[array_rand($animals)]);
});

$app->runCommand($argv);

```

You can now execute the app to test it out. Run the following command:

```shell
docker run --rm -v ${PWD}:/work \
    cgr.dev/chainguard/php:latest \
    /work/namegen get
```

The command should output a random name combination:

```shell
ludicrous-walrus
```

In the next step, you'll build the application in a multi-stage Dockerfile.

## 2. Building a distroless container for the application

We'll now build a distroless container for the application. To be able to install dependencies with Composer, our build will consist of **two** stages. First, we'll build the application using the development variant, a Wolfi-based image that includes Composer and other useful tools for development. Then, we'll create a separate stage for the final container. The resulting container will be based on the distroless PHP Wolfi image, which means it doesn't come with Composer or even a shell.

For reference, here is the content of the included `Dockerfile`:

```Dockerfile
FROM cgr.dev/chainguard/php:latest-dev AS builder
USER root
COPY . /app
RUN chown -R php /app
USER php
RUN cd /app && \
    composer install --no-progress --no-dev --prefer-dist

FROM cgr.dev/chainguard/php:latest
COPY --from=builder /app /app

ENTRYPOINT [ "php", "/app/namegen" ]
```

This Dockerfile will:

1. Start a new build stage based on the `php:latest-dev` container image and call it `builder`;
2. Copy files from the current directory to the `/app` location in the container;
3. Enter the `/app` directory and run `composer install` to install any dependencies;
4. Start a new build stage based on the `php:latest` image;
5. Copy the application from the `builder` stage;
6. Set up the application as entry point for this container.

You can now build the container with:

```shell
docker build . --pull -t php-namegen
```

You'll get output similar to this:

```shell
[+] Building 0.1s (12/12) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                                0.0s
 => => transferring dockerfile: 322B                                                                                0.0s
 => [internal] load metadata for cgr.dev/chainguard/php:latest-dev                                                  0.0s
 => [internal] load metadata for cgr.dev/chainguard/php:latest                                                      0.0s
 => [internal] load .dockerignore                                                                                   0.0s
 => => transferring context: 2B                                                                                     0.0s
 => [internal] load build context                                                                                   0.0s
 => => transferring context: 4.86kB                                                                                 0.0s
 => [builder 1/4] FROM cgr.dev/chainguard/php:latest-dev                                                            0.0s
 => [stage-1 1/2] FROM cgr.dev/chainguard/php:latest                                                                0.0s
 => CACHED [builder 2/4] COPY . /app                                                                                0.0s
 => CACHED [builder 3/4] RUN chown -R php /app                                                                      0.0s
 => CACHED [builder 4/4] RUN cd /app &&     composer install --no-progress --no-dev --prefer-dist                   0.0s
 => CACHED [stage-1 2/2] COPY --from=builder /app /app                                                              0.0s
 => exporting to image                                                                                              0.0s
 => => exporting layers                                                                                             0.0s
 => => writing image sha256:e617d7afd472d4a78d82060eaacd3a1c33310d6a267f6aaf9aa34b44e3ef8e5c                        0.0s
 => => naming to docker.io/library/php-namegen                                                                      0.0s
```

Once the build is finished, run the container with:

```shell
docker run --rm php-namegen get
```

And you should get output similar to what you got before, with a random name combination.

```
fortuitous-octopus
```

If you inspect the container image with a `docker image inspect php-namegen`, you'll notice that it has only **two** layers, thanks to the use of a multi-staging Docker build.

```shell
docker image inspect php-namegen
```

```shell
...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:52cf795862535c5f22dac055428527508088becebbe00293457693a5f8fa1df2",
                "sha256:95a8dc6d81c92158ac032e5167768a04e45f25b3bf4009c5698673c19d36d5c2"
            ]
        },
        "Metadata": {
            "LastTagTime": "2024-11-15T12:52:18.412117879+01:00"
        }
    }
]

```

In such cases, the last `FROM` section from the Dockerfile is the one that composes the final image. That's why in our case it only adds one layer on top of the base `php:latest` image, containing the `COPY` command we use to copy the application from the build stage to the final container.

It's worth highlighting that nothing is carried from one stage to the other unless you copy it. That facilitates creating a slim final image with only what's necessary to execute the application.

## 3. Working with the PHP-FPM image variant

The `latest-fpm` image variant is suitable for running PHP applications over FastCGI, to be served by a web server such as Nginx. In this section, we'll run a Docker Compose setup using the `latest-fpm` image variant and the Chainguard Nginx image.

The `namegen-api` demo is a variation of the previous demo, but it serves the random name generation over HTTP. The application responds with a JSON payload containing the animal and adjective combination, and accepts an optional `animal` parameter to specify the animal for the final suggested name.

Start by accessing the `namegen-api` demo folder. This should be at the same level as the previous `namegen` demo in the `edu-images-demos` repository. If your terminal is still open on the previous demo, you can navigate to the `namegen-api` folder with:

```shell
cd ../namegen-api
```

The `index.php` file contains the following code:

```php
<?php

$animals = [ 'turtle', 'seagull', 'octopus', 'shark', 'whale', 'dolphin', 'walrus', 'penguin', 'seahorse'];
$adjectives = [ 'ludicrous', 'mischievous', 'graceful', 'fortuitous', 'charming', 'ravishing', 'gregarious'];

$chosenAdjective = $adjectives[array_rand($adjectives)];
$chosenAnimal = $_GET['animal'] ?? $animals[array_rand($animals)];

echo json_encode(['animal' => $chosenAnimal, 'adjective' => $chosenAdjective]);
```

To serve this application over HTTP, we'll use the `latest-fpm` image variant in a Docker Compose setup. The following `docker-compose.yml` is included within the `namegen-api` folder:

```yaml
services:
  app:
    image: cgr.dev/chainguard/php:latest-fpm
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./:/app

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:80
    volumes:
      - ./:/app
      - ./nginx.conf:/etc/nginx/nginx.conf
```

This Docker Compose setup defines two services: `app` and `nginx`. The `app` service uses the `latest-fpm` image variant and mounts the current directory to the `/app` directory in the container. The `nginx` service uses the Chainguard Nginx container image and also mounts the current directory to the `/app` directory in the container, setting it as the document root with a custom configuration. A second volume replaces the default Nginx configuration with our custom one, included as `nginx.conf` in the same directory:

```
events {
  worker_connections  1024;
}

http {
    server {
        listen 80;
        index index.php index.html;
        root /app/public;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
}
```

To run this setup, execute:

```shell
docker-compose up
```

This command will start the services defined in the `docker-compose.yml` file. You can access the application at `http://localhost:8000` in your browser, or you can make a curl request to it:

```shell
curl http://localhost:8000
```

You should get a JSON response with a random name combination:

```
{"animal":"octopus","adjective":"ludicrous"}
```

You can also try passing an `animal` parameter to the URL:

```shell
curl 'http://localhost:8000?animal=cat'
```

```
{"animal":"cat","adjective":"mischievous"}
```

To stop the services, you can press `Ctrl+C` in the terminal where you ran `docker-compose up`.

## Advanced usage

{{< blurb/images-advanced image="PHP" >}}

---

### Getting started with the Laravel Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/laravel.md_

Chainguard's [Laravel container image](https://images.chainguard.dev/directory/image/laravel/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-laravel) provides a secure foundation for [Laravel](https://laravel.com) applications with minimal vulnerabilities compared to traditional PHP images. This specialized image includes all necessary PHP extensions and tooling for Laravel development while maintaining Chainguard's security-first approach, enabling developers to build complex applications without compromising on security.

In this guide, we'll set up a demo and demonstrate how you can use Chainguard Containers to develop, build, and run Laravel applications.

This tutorial requires Docker to be installed on your local machine. If you don't have Docker installed, you can download and install it from the [official Docker website](https://docs.docker.com/get-docker/).

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## 1. Setting up a demo application

We'll start by getting the demo application ready. The demo is called **OctoFacts**, and it shows a random fact about Octopuses alongside a random Octopus image each time the page is reloaded. Quotes are loaded from a `.txt` file into the database through a database migration.

By default, the application uses an [SQLite](https://www.sqlite.org/) database. This allows us to test the application with the built-in web server provided by the `artisan serve` command, without having to set up a full PHP development environment first. In the next step, we'll configure a multi-node environment using Docker Compose to demonstrate a typical LEMP (Linux, (E)Nginx, MariaDB, and PHP) environment using Chainguard Containers.

Start by cloning the demos repository to your local machine:

```shell
git clone git@github.com:chainguard-dev/edu-images-demos.git
```

Locate the `octo-facts` demo and cd into its directory:

```shell
cd edu-images-demos/php/octo-facts
```

The demo includes a `.env.dev` file with the app's configuration for development. You should create a copy of this file and save it as `.env`, so that the application can load default settings:

```shell
cp .env.dev .env
```

You can now use the builder Laravel container image to install dependencies via Composer. Notice that we're using the **laravel** system user in order to be able to write to the shared folder without issues:

```shell
docker run --rm -v ${PWD}:/app --entrypoint composer --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    install
```

You can now run the database migrations and seed the database with sample data. This will populate a `.sqlite` database with facts obtained from the `octofacts.txt` file in the root of the application.

```shell
docker run --rm -v ${PWD}:/app --entrypoint php --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    /app/artisan migrate --seed
```

Next, run `npm install` to install Node dependencies. You can use the `node:latest-dev` container image for that, but you'll need to use the **root** container user in order to be able to write to the shared folder using this image:

```shell
docker run --rm -v ${PWD}:/app --entrypoint npm --user root \
    cgr.dev/chainguard/node:latest-dev \
    install
```

Then, fix permissions on node modules with:

```shell
sudo chown -R ${USER} node_modules/
```

The next step is to build front end assets. You can use the `npm run build` command for that. Like with `npm install`, you'll need to set the container user to **root**.

```shell
docker run --rm -v ${PWD}:/app --entrypoint npm --user root \
    cgr.dev/chainguard/node:latest-dev \
    run build
```

Fix permissions on the public folder:

```shell
sudo chown -R ${USER} public/
```

The application is all set. Next, run the built-in web server with:

```shell
docker run -p 8000:8000 --rm -it -v ${PWD}:/app \
  --entrypoint /app/artisan --user laravel \
  cgr.dev/chainguard/laravel:latest-dev serve --host=0.0.0.0
```

This command will create a port redirect that allows you to access the built-in web server running in the container. It uses a volume share for the application files, and sets the entrypoint to the `artisan serve` command.

You should now be able to access the application from your browser at `localhost:8000`. You'll get a page similar to this:

![Preview of the OctoFacts demo Laravel application](https://github.com/chainguard-dev/edu-images-demos/raw/main/php/octo-facts/public/octofacts.png)

## 2. Creating a LEMP environment with Docker Compose

To demonstrate a full LEMP setup using Chainguard Containers, we'll now set up a Docker Compose environment to serve the application via Nginx. This setup can be used as a more robust development environment that replicates a production setting based on secure container images.

The following `docker-compose.yaml` file is already included in the root of the application folder:

```yaml
services:
  app:
    image: cgr.dev/chainguard/laravel:latest-dev
    restart: unless-stopped
    working_dir: /app
    volumes:
      - .:/app
    networks:
      - wolfi

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - .:/app
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - wolfi

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: laravel
      MARIADB_PASSWORD: password
      MARIADB_DATABASE: octofacts
    ports:
      - 3306:3306
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge
```

This `docker-compose.yaml` file defines 3 services to run the application (**app**, **nginx**, **mariadb**), using volumes to share the application files within the container and a configuration file for the Nginx server, which we'll showcase in a moment. Notice the database credentials within the `mariadb` service: these environment variables are used to set up the database. This is done automatically by the MariaDB container image entrypoint upon container initialization. We'll use these credentials to configure the new database within Laravel's `.env` file.

>Please note this Docker Compose setup is intended for local development only. For production environments, you should never keep sensitive data like database credentials in plain text. Check the [Docker Compose Documentation](https://docs.docker.com/compose/use-secrets/) for more information on how to handle sensitive data in Compose files.

The following `nginx.conf` file is also included within the root of the application folder. This file is based on the [recommended Nginx deployment configuration](https://laravel.com/docs/11.x/deployment#nginx) from official Laravel docs.

```nginx configuration
pid /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {
    server {
    listen 8080;
    root /app/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        include  /etc/nginx/mime.types;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
  }
}
```

This file sets up the document root to `app/public` and configures Nginx to redirect `.php` requests to the container running PHP-FPM (`app:9000`).

You can bring the environment up with:

```shell
docker compose up
```

This command will block your terminal and show live logs from each of the running services. With the MariaDB database up and running, you can now update Laravel's main `.env` file to change the database connection from **sqlite** to **mysql**.

Open the `.env` file in your editor of choice and locate the database settings. The `DB_CONNECTION` parameter is set to `sqlite`, you should change that to `mysql` and uncomment the remaining variables to reflect the settings from your `docker-compose.yaml` file. This is how the database section should look like when you're finished editing:

```ini
DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=octofacts
DB_USERNAME=laravel
DB_PASSWORD=password
```

Save and close the file. If you reload the application on your browser now, you should get a database error, because the database is empty. You'll need to re-run migrations and seed the database. To do that, you can run a `docker exec` command on the live container.

First, look for the container running the `app` service and copy its name.

```shell
docker compose ps
```

```shell
NAME                   IMAGE                                   COMMAND                  SERVICE   CREATED          STATUS          PORTS
octo-facts-app-1       cgr.dev/chainguard/laravel:latest-dev   "/bin/s6-svscan /sv"     app       11 seconds ago   Up 10 seconds
octo-facts-mariadb-1   cgr.dev/chainguard/mariadb              "/usr/local/bin/dock…"   mariadb   11 seconds ago   Up 10 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
octo-facts-nginx-1     cgr.dev/chainguard/nginx                "/usr/sbin/nginx -c …"   nginx     11 seconds ago   Up 10 seconds   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp
```

Then, you can run migrations like this:

```shell
docker exec octo-facts-app-1 php /app/artisan migrate --seed
```

You can use the same method to execute other Artisan commands while the environment is up. After running migrations and seeding the database, you should be able to reload the app from your browser at `localhost:8000` and get a new octopus fact.

## 3. Creating a distroless Laravel runtime for the application

So far, we have been using the `laravel:latest-dev` builder image to run the application in a development setting. For production workloads, the recommended approach for additional security is to create a [distroless](/chainguard/containers/getting-started-distroless/) runtime for the application that will contain only what's absolutely necessary for running the app on production. This is done by combining a **build** phase in a **multi-stage** Dockerfile.

To demonstrate this approach, we'll now build a distroless container image and test it using the Docker Compose setup exemplified in the previous section.

The following Dockerfile is included within the root of the application:

```Dockerfile
FROM cgr.dev/chainguard/laravel:latest-dev AS builder
USER root
RUN apk update && apk add nodejs npm
COPY . /app
RUN cd /app && chown -R php.php /app
USER php
RUN composer install --no-progress --no-dev --prefer-dist
RUN npm install && npm run build

FROM cgr.dev/chainguard/laravel:latest
COPY --from=builder /app /app
```

This Dockerfile starts with a build stage that copies the application files to the container, installs Node and NPM, installs the application dependencies, and dumps front-end assets to the public folder. A second stage based on `laravel:latest` copies the application from the build stage to the final distroless image. It's important to notice that we don't run any database migrations here, because at build time the database might not be ready yet. In other production scenarios, you may be able to include the migration within the Dockerfile, as long as the database is already up and running.

The file `docker-compose-distroless.yaml` included within the root of the application folder has a few changes compared to the previous `docker-compose.yaml` file. The `app` service now uses the `octofacts` image, which is built from the Dockerfile referenced above. The `user: laravel` directive is also removed so commands run as the default **php** user. This is how the `app` service looks like in the new file:

```yaml
  app:
    image: octofacts
    build:
      context: .
    restart: unless-stopped
    working_dir: /app
    user: laravel
    volumes:
      - .:/app
    networks:
      - wolfi
...
```

If your environment is still running, you should stop it before proceeding. Hit `CTRL+C` and then run:

```shell
docker compose down
```

This will stop and remove all containers, networks, and volumes created by the previous `docker-compose.yaml` file. You can now bring the new environment up with:

```shell
docker compose -f docker-compose-distroless.yaml up
```

Once the environment is up and running, you can now run the database migrations with:

```shell
docker exec octo-facts-app-1  php /app/artisan migrate --seed
```

You should now be able to reload your browser and obtain a new octopus fact.

## Advanced usage

{{< blurb/images-advanced image="Laravel" >}}

---

### Getting started with the Node Chainguard Container
_Path: chainguard/containers/getting-started/languages-and-runtimes/node.md_

Chainguard's [Node container image](https://images.chainguard.dev/directory/image/node/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-node) provides a secure runtime for Node.js applications. This distroless image includes Node.js and npm while maintaining a minimal attack surface for production deployments.

In this guide, we'll set up a demo application and create a Dockerfile to build and execute the demo using the Node Chainguard Containers as base.

This tutorial requires Docker, Node, and Npm to be installed on your local machine.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Step 1: Setting up a demo application

We'll start by creating a small Node application to serve as a demo. This application uses a mock server to test GET and POST requests, and is based on the [Docker Node example](https://docs.docker.com/language/nodejs/build-images/).

First, create a directory for your app. In this guide we'll use `wolfi-node`:

```shell
mkdir ~/wolfi-node && cd ~/wolfi-node
```

Run the following command to create a new `package.json` file.

```shell
npm init -y
```

Exit the `init` process.  You do not need to fill out the metadata as this is a demo.

Install `npm`:

```shell
npm install
```

Next, install the application dependencies. We'll need `ronin-server` and `ronin-mocks`, which are used together to create a "mock" server that saves JSON data in memory and returns it in subsequent GET requests to the same endpoint.

```shell
npm install ronin-server ronin-mocks
```

Using your code editor of choice, create a new file named `server.js` for your application. Here we'll use `nano`:

```shell
nano server.js
```

Copy the following code to your `server.js` file:

```js
const ronin = require('ronin-server')
const mocks = require('ronin-mocks')

const server = ronin.server()

server.use('/', mocks.server(server.Router(), false, true))
server.start()
```

Save the file when you're done. Then, run the server with:

```shell
node server.js
```

This command will start the application and wait for connections on port `8000`. The mocking server will save any JSON data submitted by a POST request

From a new terminal window, run the following command, which will make a POST request to your application sending a JSON payload:

```shell
curl --request POST \
  --url http://localhost:8000/test \
  --header 'content-type: application/json' \
  --data '{"msg": "testing" }'
```

When the connection is successful, you should get output like this on the terminal that is running the application:

```shell
2023-02-07T15:48:54:2450  INFO: POST /test
```

You can now test that the content was saved by running a GET request to the same endpoint:

```shell
curl http://localhost:8000/test
```

You'll get output similar to this:

```shell
{"code":"success","meta":{"total":1,"count":1},"payload":[{"msg":"testing","id":"f427f835-3e93-43ad-91c8-d150dffba0f9","createDate":"2023-02-07T14:48:54.256Z"}]}
```

The demo application is now ready. In the next step, you'll create a Dockerfile to run your app. Before moving along, make sure to stop the server running on your terminal by typing `CTRL+C` (or `CMD+C` for macOS users).

## Step 2: Creating the Dockerfile

In your code editor of choice, create a new Dockerfile:

```shell
nano Dockerfile
```

The following Dockerfile will:

1. Start a new image based on the `cgr.dev/chainguard/node:latest` container image;
2. Set the work dir to `/app` inside the container;
3. Copy application files from the current directory to the `/app` location in the container;
4. Run `npm install` to install production-only dependencies;
5. Set up additional arguments to the default entrypoint (`node`), specifying which script to run.

Copy this content to your own `Dockerfile`:

```Dockerfile
FROM cgr.dev/chainguard/node
ENV NODE_ENV=production

WORKDIR /app

COPY --chown=node:node ["package.json", "package-lock.json", "server.js", "./"]

RUN npm install --omit=dev

CMD [ "server.js" ]
```

Save the file when you're finished.

You can now build the container with:

```shell
docker build . --pull -t wolfi-node-server
```

Once the build is finished, run the container with:

```shell
docker run --rm -it -p 8000:8000 wolfi-node-server
```

And it should work the same way as before: the terminal will be blocked with the application waiting for connections on port `8000`. The difference is that this is running inside the container, so we set up a port redirect to receive requests on `localhost:8000`.

```shell
curl --request POST \
  --url http://localhost:8000/test \
  --header 'content-type: application/json' \
  --data '{"msg": "testing node wolfi image" }'
```

You can now query the same endpoint to receive the data that was stored in memory when you run the previous command:

```shell
curl http://localhost:8000/test
```

```shell
{"code":"success","meta":{"total":1,"count":1},"payload":[{"msg":"testing node wolfi image","id":"6011f987-b9f8-4442-8253-d54166df5966","createDate":"2023-02-07T15:57:23.520Z"}]}
```

## Advanced usage

Chainguard offers [slim variants](/chainguard/containers/concepts/container-variants/#slim-container-variants) of its Node.js container image. These have a smaller footprint than our standard Node.js images and are useful for building images with a minimal attack surface in multi-stage builds. Check out our [Node migration guide](/chainguard/containers/migration/migration-guides/node/#using-slim-images) to learn more.

{{< blurb/images-advanced image="Node" >}}

---

### Getting started with the C/C++ Chainguard Containers
_Path: chainguard/containers/getting-started/languages-and-runtimes/c/index.md_

Chainguard provides security-hardened container images for C and C++ development, offering minimal runtime environments with significantly reduced vulnerabilities compared to traditional base images. Built on Chainguard's own OS, these containers enable more secure deployment of compiled programs through purpose-built images for different linking scenarios. This guide demonstrates three approaches to compiling and running C/C++ applications using Chainguard's specialized containers.

The container image with which you choose to run your compiled program depends on the nature of your binaries. Static binaries can be executed in the minimal `static` Chainguard Container, while dynamically linked binaries can be run in the `glibc-dynamic` Container. For this demonstration, you will first compile a C binary using the `gcc-glibc` Chainguard Container, and then learn how to use a multi-stage build to run the resulting binary in the `glibc-dynamic` image. You'll also cover an example showing the multi-stage build process for the C++ programming language. To learn more about the differences between these container images, read our article on [Choosing a container for your compiled programs](/chainguard/containers/concepts/choosing-a-base-container/).

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Video

The content in this article is also available as a video.

{{< youtube g7fCIRJ8_pE >}}

## Prerequisites

To follow along with this guide, you will need to have [Docker Engine](https://docs.docker.com/engine/install/) and `gcc`, the [GNU Compiler Collection](https://gcc.gnu.org/), installed on your machine. You can find the code and Dockerfiles used in our [Containers demos GitHub repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/c).

## Example 1 --- Minimal C Chainguard Container

### Step 1: Setting up a demo application

To start, let's create a demo C application to run in your container. First you will create a folder to contain your demo files. The following command will create a new directory `cguide` and navigate to it.

```sh
mkdir -p ~/cguide && cd ~/cguide
```

Within this directory, you will create a file to hold the code for your first program. Use the text editor of your choice to begin editing a new file named `hello.c`. We will use `nano` as an example:

```sh
nano hello.c
```

Inside of your `hello.c` file, add in the following C code which will execute a "Hello, world!" application.

```C
/* Chainguard Academy (edu.chainguard.dev)
*  Getting Started with the C/C++ Chainguard Containers
*  Examples 1 & 2 - C
*/

#include <stdio.h>

// Main Function
int main(){
 printf("Hello, world!\n");
 printf("I am a demo from the Chainguard Academy.\n");
 printf("My code was written in C.\n");

 return 0;
}
```

When you are done editing the file, save and close it. If you used `nano`, you can do so by pressing `CTRL + X`, `Y`, and then `ENTER`.

Now, let's compile this file with `gcc`. This command uses the `-Wall` flag to display compiler errors and warnings, if any occur, and includes the `-o` flag to rename your executable to `hello`.

```sh
gcc -Wall -o hello hello.c
```

Once your program has compiled, you can run it with the following command:

```sh
./hello
```

This will return the "Hello, world!" program output in your terminal if the program executed successfully.

```Output
Hello, world!
I am a demo from the Chainguard Academy.
My code was written in C.
```

Now that you have successfully tested your example program locally, next, you will compile and run it from inside of a container image.

### Step 2: Creating the Dockerfile

An advantage of choosing to run your code inside of containerized environments is portability. In the previous step, `gcc` compiled the binary to run on your machine. However, if you were to run this binary on a different operating system, it likely will fail to execute properly. Using a container ensures that your program will run on any machine as the containerized environment will be consistent across platforms.

Let us begin by creating a Dockerfile called `Dockerfile1` for your container image.

```sh
nano Dockerfile1
```

This Dockerfile will do the following:

1. Use the `gcc-glibc:latest` Chainguard Container as the base image;
2. Create and set the current working directory to `/home/build`;
3. Copy the `hello.c` program code to the current directory;
4. Compile the program and name it `hello`;
5. Copy the compiled binary to `/usr/bin`;
6. Set the image to run as a non-root user; and,
7. Execute the compiled binary when the container is started.

```Dockerfile
# Example 1 - Single Stage Build for C

FROM cgr.dev/chainguard/gcc-glibc:latest

RUN ["mkdir", "/home/build"]
WORKDIR /home/build

COPY hello.c ./

RUN ["gcc", "-Wall", "-o", "hello", "hello.c"]
RUN ["cp", "hello", "/usr/bin/hello"]

USER 65532

ENTRYPOINT ["/usr/bin/hello"]
```

Add this text to your Dockerfile, save, and close it.

Next, use the Dockerfile you just created to build a container image named `example1` by running the following command. The `-f` flag specifies the Dockerfile which you are using to build from, and the `-t` flag will tag your image with a meaningful name.

```sh
docker build -f Dockerfile1 -t example1:latest .
```

With your container image built, you can now run it with the following command.

```sh
docker run --name example1 example1:latest
```

You will see output in your terminal identical to that of the binary you compiled locally.

```Output
Hello, world!
I am a demo from the Chainguard Academy.
My code was written in C.
```

In the next example, we will look at an alternative way to run your binary using a multi-stage build.

## Example 2 --- Multi-stage build for C applications

In our first example, you successfully compiled and executed your C binary in the `gcc-glibc` image. To go a step further, you can use a multi-stage build, allowing you to compile your program in one image and execute it in another image.

A multi-stage build gives you more control over your final image, as you can transfer your program to an image with a smaller footprint after build time to reduce your program's attack surface. The `glibc-dynamic` image, which you will use as your second stage in the build, does not contain `gcc`. Because of this, a malicious binary could not be compiled by an attacker tampering with the image.

### Creating the Dockerfile

Create a new Dockerfile called `Dockerfile2`.

```sh
nano Dockerfile2
```

This time, the Dockerfile will do the following:

1. Use the `gcc-glibc` Chainguard Container as the builder stage;
2. Create and set the current working directory to `/home/build`;
3. Copy your example `hello.c` program code to the current directory;
4. Compile the program using `gcc` and name it `hello`;
5. Begin a new stage using the `glibc-dynamic` Chainguard Container;
6. Copy the compiled binary to `/usr/bin` from the builder stage;
7. Set the image to run as a non-root user; and,
8. Execute your binary from the `glibc-dynamic` image when the container is started.

```Dockerfile
# Example 2 - Multi-Stage Build for C

FROM cgr.dev/chainguard/gcc-glibc:latest AS builder

RUN ["mkdir", "/home/build"]
WORKDIR /home/build

COPY hello.c ./

RUN ["gcc", "-Wall", "-o", "hello", "hello.c"]

FROM cgr.dev/chainguard/glibc-dynamic:latest

COPY --from=builder /home/build/hello /usr/bin/

USER 65532

ENTRYPOINT ["/usr/bin/hello"]
```

When you are finished editing your Dockerfile, save and close it.

With the new Dockerfile created, you can build the image. Execute the following command in your terminal to build your multi-stage image.

```sh
docker build -f Dockerfile2 -t example2:latest .
```

With your image built, you can now run it with the following command.

```sh
docker run --name example2 example2:latest
```

You will see output in your terminal identical to that of the previous example.

```Output
Hello, world!
I am a demo from the Chainguard Academy.
My code was written in C.
```

Having your program execute from a smaller container image with less packages reduces your potential attack surface, making it a more secure approach for production-facing builds.

## Example 3 --- Multi-stage build for C++ applications

So far, our demonstrations have featured a program coded in C. A similar image building process applies to binaries compiled for the C++ programming language.

### Step 1: Setting up a demo application

In your terminal, create a new file called `hello.cpp`.

```sh
nano hello.cpp
```

Add the following C++ code to the file you just created. This code will display a greeting specifying that it was written in C++.

```C++
/* Chainguard Academy (edu.chainguard.dev)
*  Getting Started with the C/C++ Chainguard Containers
*  Example 3 - C++
*/

#include <iostream>
using namespace std;

// Main Function
int main(){
    cout << "Hello, world!\n";
    cout << "I am a demo from the Chainguard Academy.\n";
    cout << "My code was written in C++.\n";

    return 0;
}
```

When you are done editing your file, save and close it.

You can now compile your C++ program using `g++`. Execute the following command in your terminal to compile the program. The command will display any compiler warnings or errors and will name the resultant binary `hello`.

```sh
g++ -Wall -o hello hello.cpp
```

Now you can test your compiled binary.

```sh
./hello
```

You will see the following output in your terminal.

```Output
Hello, world!
I am a demo from the Chainguard Academy.
My code was written in C++.
```

Now that you have confirmed that your C++ program executes, you are ready to build it inside of a container image.

### Step 2: Creating the Dockerfile

With a working C++ example, you can compile and run our program using a multi-stage build. With the text editor of your choice, create a new file named `Dockerfile3`.

```sh
nano Dockerfile3
```

This Dockerfile will do the following:

1. Use the `gcc-glibc` Chainguard Container as the builder stage;
2. Create and set the current working directory to `/home/build`;
3. Copy your example `hello.cpp` program code to the current directory;
4. Compile the program using `g++` and name it `hello`;
5. Begin a new stage using the `glibc-dynamic` Chainguard Container;
6. Copy the compiled binary to `/usr/bin` from the builder stage;
7. Set the image to run as a non-root user; and,
8. Execute your binary from the `glibc-dynamic` image when the container is started.

```Dockerfile
# Example 3 - Multi-Stage Build for C++

FROM cgr.dev/chainguard/gcc-glibc:latest AS builder

RUN ["mkdir", "/home/build"]
WORKDIR /home/build

COPY hello.cpp ./

RUN ["g++", "-Wall", "-o", "hello", "hello.cpp"]

FROM cgr.dev/chainguard/glibc-dynamic:latest

COPY --from=builder /home/build/hello /usr/bin/

USER 65532

ENTRYPOINT ["/usr/bin/hello"]
```

When you are finished editing your Dockerfile, save and close it.

With your new Dockerfile created, you can build the container image. Execute the following command in your terminal to build your multi-stage C++ image.

```sh
docker build -f Dockerfile3 -t example3:latest .
```

With your image built, you can now run it with the following command.

```
docker run --name example3 example3:latest
```

You will see output in your terminal identical to that of the C++ binary you compiled locally.

```Output
Hello, world!
I am a demo from the Chainguard Academy.
My code was written in C++.
```

With that, you have successfully performed a multi-stage image build for both C and C++ programs.

## Clean up

After completing the previous examples, you will have containers, images, and files remaining on your local machine. This section will show you how to remove these artifacts.

You can remove the containers you built by executing the following command.

```sh
docker container rm example1 example2 example3
```

Then, you can remove their associated container image builds as well:

```sh
docker image rm example1:latest example2:latest example3:latest
```

To remove the directory containing your Dockerfiles, binaries, and program code, run the following command:

```
rm -r ~/cguide
```

Following these commands, all artifacts introduced in this guide will now be removed from your machine.

## Advanced usage

{{< blurb/images-advanced image="C/C++" >}}

---

### Getting started with the WordPress Chainguard Container
_Path: chainguard/containers/getting-started/web-and-data-services/wordpress.md_

Chainguard's [WordPress container image](https://images.chainguard.dev/directory/image/wordpress/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-wordpress) is a drop-in replacement for the official [WordPress FPM-Alpine image](https://hub.docker.com/_/wordpress). It includes a [distroless](/chainguard/containers/getting-started-distroless/) variant for production use that removes shells, package managers, and other unnecessary components. The image ships with the latest PHP and WordPress versions and all required PHP extensions.

This guide covers three ways to use the WordPress Chainguard Container to build and run WordPress projects.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Preparation

This guide requires Docker. Download and install it from the [official Docker website](https://docs.docker.com/get-docker/) if you don't have it.

The images in this guide require a free Chainguard account. Sign up at [chainguard.dev](https://www.chainguard.dev/) if you don't have one, then authenticate:

```shell
chainctl auth login
```

{{< blurb/chainctl-auth >}}

If you encounter credential errors when pulling images, pull them individually before running `docker compose`:

```shell
docker pull cgr.dev/chainguard/wordpress:latest-dev
docker pull cgr.dev/chainguard/wordpress:latest
docker pull cgr.dev/chainguard/mariadb
docker pull cgr.dev/chainguard/nginx
```

### Clone the demos repository

Clone the demos repository to your local machine:

```shell
git clone git@github.com:chainguard-dev/edu-images-demos.git
```

Navigate to the `wordpress` demo directory:

```shell
cd edu-images-demos/php/wordpress
```

You'll find three directories, one for each example in this guide.

## Example 1: Testing the container image with a fresh WordPress install

The `latest-dev` variant of the Chainguard WordPress Container lets you run a fresh WordPress installation and explore the setup wizard. Changes you make won't persist after you stop the environment — the next example shows how to persist customizations using a volume.

The files for this example are in the `01-preview` directory. Open `docker-compose.yml` in your editor to follow along.

This example includes a `Dockerfile` that copies WordPress source files into the document root and sets ownership at build time:

```Dockerfile
FROM cgr.dev/chainguard/wordpress:latest-dev
USER root
RUN cp -r /usr/src/wordpress/. /var/www/html/ && \
    cp /var/www/html/wp-config-docker.php /var/www/html/wp-config.php && \
    chown -R php:php /var/www/html
USER php
```

The `docker-compose.yml` for this example:

```yaml
services:
  app:
    build: .
    image: wordpress-preview
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: $WORDPRESS_DB_USER
      WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD
      WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME
    volumes:
      - document-root:/var/www/html

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - document-root:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: $WORDPRESS_DB_USER
      MARIADB_PASSWORD: $WORDPRESS_DB_PASSWORD
      MARIADB_DATABASE: $WORDPRESS_DB_NAME
    ports:
      - 3306:3306

volumes:
  document-root:
```

This Docker Compose file defines three services: `app`, `nginx`, and `mariadb`:

- The `app` service builds a local image using the included `Dockerfile`, which copies WordPress source files from `/usr/src/wordpress` into the document root and renames `wp-config-docker.php` to `wp-config.php`. That config file reads database credentials from environment variables at runtime. The `document-root` volume is shared between `app` and `nginx`.
- The `nginx` service uses the [Chainguard nginx Container](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-wordpress), configured to serve the WordPress application on port 8000.
- The `mariadb` service uses the [Chainguard MariaDB Container](https://images.chainguard.dev/directory/image/mariadb/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-wordpress), configured with the environment variables needed to create the WordPress database.

The environment variables are stored in a `.env` file in the same directory. To view them, run:

```bash
cat .env
```

```ini
WORDPRESS_DB_HOST=mariadb
WORDPRESS_DB_USER=wp-user
WORDPRESS_DB_PASSWORD=wp-password
WORDPRESS_DB_NAME=wordpress
```

You can change these values as needed. The `.env` file is hidden and won't appear in most file explorers, but you can open it in any terminal text editor.

Build the image and start the services:

```bash
docker compose up --build
```

Open `http://localhost:8000` in your browser to reach the WordPress installation page. Follow the on-screen instructions to complete setup. Any customizations will be lost when you stop the environment.

To stop the services, press `CTRL+C` in the terminal, then run:

```bash
docker compose down
```

This removes the containers and networks. The next example shows how to mount a volume so that customizations like themes and plugins persist.

## Example 2: Customizing a new WordPress installation

To keep customizations — themes, plugins, and other changes — between container rebuilds, you need a volume with the correct permissions. This requires a user inside the container with the same UID as your host user. This example uses a custom Dockerfile to add a `wordpress` user with a configurable UID (defaulting to `1000`, the typical UID for a non-root user on Linux) and sets ownership of the document root accordingly.

Navigate to `02-customizing` to follow along. Here's the Dockerfile:

```Dockerfile
FROM cgr.dev/chainguard/wordpress:latest-dev
ARG UID=1000

USER root
RUN cp -r /usr/src/wordpress/. /var/www/html/ && \
    cp /var/www/html/wp-config-docker.php /var/www/html/wp-config.php && \
    cp -r /usr/src/wordpress/wp-content /usr/src/wp-content-default
RUN addgroup wordpress && adduser -SD -u "$UID" -s /bin/bash wordpress wordpress
RUN chown -R wordpress:wordpress /var/www/html /usr/src/wp-content-default

COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh

USER wordpress
ENTRYPOINT ["/docker-entrypoint.sh"]
```

In addition to creating the `wordpress` user, the Dockerfile copies WordPress source files into the document root at build time and saves a copy of the default `wp-content` directory to `/usr/src/wp-content-default`. A custom entrypoint script uses that copy to populate the host-mounted `wp-content` directory on first run if it doesn't yet contain a `themes` subdirectory:

```bash
#!/bin/sh
# Populate wp-content from defaults on first run (when themes directory is absent)
if [ ! -d /var/www/html/wp-content/themes ]; then
    cp -r /usr/src/wp-content-default/. /var/www/html/wp-content/
fi
exec php-fpm
```

The `docker-compose.yml` file references the custom Dockerfile and accepts a UID build argument:

```yaml
services:
  app:
    image: wordpress-local-dev
    build:
      context: .
      dockerfile: Dockerfile
      args:
        UID: 1000
    user: wordpress
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: $WORDPRESS_DB_USER
      WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD
      WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - document-root:/var/www/html

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - document-root:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: $WORDPRESS_DB_USER
      MARIADB_PASSWORD: $WORDPRESS_DB_PASSWORD
      MARIADB_DATABASE: $WORDPRESS_DB_NAME
    ports:
      - 3306:3306

volumes:
  document-root:
```

Only the `app` service differs from the previous example. The `build` section references the custom Dockerfile and sets `UID` to `1000` by default; pass your own UID at build time to match your host user. The bind mount at `./wp-content` persists the WordPress content directory to the host.

Build the image, passing your UID as a build argument:

```shell
docker compose build --build-arg UID=$(id -u) app
```

Once the build completes, start the services:

```shell
docker compose up
```

Open `http://localhost:8000` in your browser to access the WordPress installation.

In a separate terminal, check that the `wp-content` directory was populated with the default WordPress themes and plugins:

```shell
❯ ls -la wp-content
total 24
drwxrwxr-x  4 erika erika 4096 Jul 18 21:16 .
drwxrwxr-x  3 erika erika 4096 Jul 18 21:15 ..
-rw-rw-r--  1 erika erika   14 Jul 18 21:05 .gitignore
-rw-r--r--  1 erika 65533   28 Jan  1  1970 index.php
drwxr-xr-x  2 erika 65533 4096 Jul 18 21:16 plugins
drwxr-xr-x 16 erika 65533 4096 Jul 18 21:16 themes
```

The matching UID between the container's `wordpress` user and your host user is what allows files written by the container to be owned by your host account.

Any themes and plugins you install now persist between container rebuilds.

To stop the services, press `CTRL+C` in the terminal, then run:

```bash
docker compose down
```

The next example shows how to build a distroless WordPress image for production.

## Example 3: Using the distroless variant of the WordPress container image

This example uses a multi-stage Docker build to produce a distroless image with a smaller attack surface. The distroless image includes only the dependencies needed to run WordPress, without a shell or package manager.

The key difference from the previous examples is that all WordPress files — including any customizations in `wp-content` — are baked into the image at build time rather than populated at runtime. This makes the image self-contained: it doesn't rely on init steps or host volumes. Adding custom content at build time increases the final image size, but prevents filesystem changes once the container is running.

To demonstrate custom content, this example includes the [Cue](https://wordpress.org/themes/cue/) blogging theme and the [Imsanity](https://wordpress.org/plugins/imsanity/) image-resizing plugin.

Navigate to `03-distroless` to follow along. Here's the Dockerfile:

```Dockerfile
FROM cgr.dev/chainguard/wordpress:latest-dev AS builder

#copy wp-content folder
COPY ./wp-content /usr/src/wordpress/wp-content

USER root
#copy WordPress source to document root and set up config
RUN cp -r /usr/src/wordpress/. /var/www/html/ && \
    cp /var/www/html/wp-config-docker.php /var/www/html/wp-config.php

FROM cgr.dev/chainguard/wordpress:latest

COPY --from=builder --chown=php:php /var/www/html /var/www/html
```

The `COPY` instruction places your local `wp-content` into `/usr/src/wordpress/wp-content` before the `RUN` step merges it with the rest of the WordPress source. `USER root` is required because the WordPress source directory in this image is only readable by root. The `RUN` command copies everything to `/var/www/html` and renames `wp-config-docker.php` to `wp-config.php`, which reads database credentials from environment variables at runtime. The final stage copies the populated document root into the distroless image with `php:php` ownership.

The `docker-compose.yml` file references the custom Dockerfile:

```yaml
services:
  app:
    image: wordpress-local-distroless
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: $WORDPRESS_DB_USER
      WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD
      WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME
      WORDPRESS_CONFIG_EXTRA: |
        # Disable plugin and theme update and installation
        define( 'DISALLOW_FILE_MODS', true );
        # Disable automatic updates
        define( 'AUTOMATIC_UPDATER_DISABLED', true );
    volumes:
      - document-root:/var/www/html

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - document-root:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: $WORDPRESS_DB_USER
      MARIADB_PASSWORD: $WORDPRESS_DB_PASSWORD
      MARIADB_DATABASE: $WORDPRESS_DB_NAME
    ports:
      - 3306:3306

volumes:
  document-root:

```

Build and start the environment:

```shell
docker compose up --build
```

This WordPress setup behaves like the previous examples, but the image is self-contained — it requires no host volumes and allows no new package installations or shell access. The `WORDPRESS_CONFIG_EXTRA` environment variable disables theme and plugin installation and automatic updates, preventing filesystem changes inside the running container.

To stop the services, press `CTRL+C` in the terminal, then run:

```bash
docker compose down
```

To keep your WordPress installation up to date, pin the image to a digest and use [Digestabot](/chainguard/containers/security-and-compliance/updating-containers/digestabot/), a GitHub Action that opens a pull request whenever the digest behind the tag you reference changes. Chainguard rebuilds its container images daily, so this picks up each new WordPress build.

## Advanced usage

{{< blurb/images-advanced image="WordPress" >}}

---

### Getting started with the MinIO Chainguard Container
_Path: chainguard/containers/getting-started/web-and-data-services/minio.md_

MinIO is a high-performance, S3-compatible object storage system that has become widely adopted across the cloud-native ecosystem, with over 1 billion pulls on Docker Hub. It's used for testing, local development, and production deployments across on-premises and cloud environments. MinIO's solid S3 compatibility has made it a common choice for developers who need S3-compatible storage without AWS dependencies, and it's integrated into popular open source projects like Trino and Apache Spark for backup and archival, AI/ML workloads, data lakes, and application data storage.

On October 23, 2025, the MinIO project stopped publishing the free, community edition of their Docker container image to Docker Hub and Quay repositories, requiring developers to build and maintain their own containers from source code. This change has impacted countless build pipelines and CI/CD workflows. Additionally, a new vulnerability, [CVE-2025-62506](https://www.cve.org/CVERecord?id=CVE-2025-62506), was reported in MinIO containers, which the maintainers declined to patch in the community edition.

To help the community maintain secure and up-to-date MinIO deployments without additional complexity, Chainguard has made our [MinIO container image](https://images.chainguard.dev/directory/image/minio/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-minio) publicly available and free to all users. Built with a distroless design and minimal attack surface, Chainguard's production-ready MinIO image is continuously rebuilt from source in our SLSA L3 hardened infrastructure, providing zero-CVE images that are updated daily with new releases and security fixes.

In this guide, we'll demonstrate how to deploy and use MinIO with Chainguard Containers through two practical examples. These examples show you how to replace existing MinIO deployments with Chainguard's more secure alternative while maintaining compatibility with your existing S3 workflows. The first example covers basic deployment for testing and development environments. The second example demonstrates how to build applications that interact with MinIO programmatically, which is relevant for CI/CD pipelines, automated backup systems, data processing workflows, and any application that requires object storage capabilities.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Preparation

This tutorial requires Docker to be installed on your local machine. If you don't have Docker installed, you can download and install it from the [official Docker website](https://docs.docker.com/get-docker/).

### Cloning the demos repository

Start by cloning the demos repository to your local machine:

```shell
git clone https://github.com/chainguard-dev/edu-images-demos.git
```

Navigate to the `minio` folder in the repository:

```shell
cd edu-images-demos/minio
```

This directory contains Docker Compose configurations and a sample Python application that we'll use in this guide.

## Example 1: Running MinIO with Docker Compose

This example demonstrates how to deploy MinIO for local development and testing environments. This setup is useful when you need S3-compatible storage for developing applications locally, running integration tests, or testing data pipelines before deploying to production. By using Docker Compose, you can spin up a complete object storage environment that mimics production S3 behavior without requiring cloud resources or complex configuration.

The MinIO Chainguard Container can be used directly without requiring a custom Dockerfile. The image comes pre-configured and ready to run with minimal setup.

For reference, here is the relevant section from the `docker-compose.yml` file:

```yaml
services:
  minio:
    image: cgr.dev/chainguard/minio:latest
    container_name: minio-server
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin123
    command: server /data --console-address ":9001"
    volumes:
      - minio-data:/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    networks:
      - minio-net

volumes:
  minio-data:
    driver: local

networks:
  minio-net:
    driver: bridge
```

This configuration will:

1. Pull the `cgr.dev/chainguard/minio:latest` image directly from the Chainguard registry;
2. Expose port 9000 for the MinIO API and port 9001 for the web console;
3. Set up admin credentials using environment variables;
4. Configure MinIO to serve data from the `/data` directory with the console on port 9001;
5. Create a persistent volume to store MinIO data;
6. Include a health check to monitor the server status.

To start the MinIO server, run:

```shell
docker compose up -d minio
```

Once the service is running, you can access:

- **MinIO API**: http://localhost:9000
- **MinIO Console**: http://localhost:9001

Open your web browser and navigate to http://localhost:9001. Log in using the credentials defined in the compose file:

- **Username**: `minioadmin`
- **Password**: `minioadmin123`

The MinIO console provides a graphical interface where you can create buckets, upload files, and manage your object storage. You can also interact with MinIO programmatically using the S3 API, which we'll demonstrate in the next example.

To stop the MinIO server, run:

```shell
docker compose down
```

Note that the data will persist in the `minio-data` volume even after stopping the container. To remove the volume and all stored data, add the `-v` flag:

```shell
docker compose down -v
```

## Example 2: Building a Python client application with multi-stage build

This example demonstrates how to build containerized applications that interact with MinIO programmatically using the S3 API. This pattern is common in production systems for automated workflows such as CI/CD pipelines that upload build artifacts, data processing jobs that read and write large datasets, backup systems that archive files to object storage, or microservices that store and retrieve user-generated content.

The example uses a multi-stage Docker build with Chainguard Python images, which reduces the final container size and attack surface by separating build dependencies from runtime requirements. This approach is recommended for production deployments where security and efficiency are priorities.

The demo includes a Python script that performs the following operations:

- Connecting to the MinIO server with retry logic
- Creating buckets
- Uploading objects (files and data)
- Listing objects in a bucket
- Downloading objects
- Deleting objects

### Step 1: Understanding the application structure

The application consists of three main files:

1. **requirements.txt** - Python dependencies:

   ```
   minio==7.2.8
   urllib3==2.2.3
   ```

2. **main.py** - The Python application demonstrating MinIO operations
3. **Dockerfile** - Multi-stage build configuration

Let's examine the key parts of the Python application. The script uses the MinIO Python SDK to interact with the object storage server:

```python
from minio import Minio
from minio.error import S3Error

def get_minio_client():
    """Create and return a MinIO client instance"""
    endpoint = os.getenv("MINIO_ENDPOINT", "localhost:9000")
    access_key = os.getenv("MINIO_ACCESS_KEY", "minioadmin")
    secret_key = os.getenv("MINIO_SECRET_KEY", "minioadmin123")
    secure = os.getenv("MINIO_SECURE", "false").lower() == "true"

    return Minio(
        endpoint,
        access_key=access_key,
        secret_key=secret_key,
        secure=secure
    )
```

The application includes functions for common operations like creating buckets, uploading objects, and listing contents. It demonstrates best practices such as connection retry logic and proper error handling.

### Step 2: Understanding the multi-stage Dockerfile

The `Dockerfile` uses a multi-stage build to keep the final image minimal and secure:

```Dockerfile
# Multi-stage build using Chainguard images
# Stage 1: Build stage with Python dev image to install dependencies
FROM cgr.dev/chainguard/python:latest-dev as builder

WORKDIR /app

# Copy requirements and install dependencies
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Stage 2: Runtime stage with minimal Python image
FROM cgr.dev/chainguard/python:latest

WORKDIR /app

# Copy installed packages from builder
COPY --from=builder /home/nonroot/.local/lib/python3.*/site-packages /home/nonroot/.local/lib/python3.13/site-packages

# Copy application code
COPY main.py .

# Run as non-root user (already set in base image)
USER nonroot

# Set Python path to include user-installed packages
ENV PYTHONPATH=/home/nonroot/.local/lib/python3.13/site-packages

CMD ["main.py"]
```

This Dockerfile will:

1. Start a build stage based on the `python:latest-dev` container image with build tools and pip;
2. Install the MinIO Python SDK and its dependencies;
3. Start a new runtime stage based on the minimal `python:latest` distroless image;
4. Copy only the installed packages and application code from the builder stage;
5. Run as a non-root user for enhanced security;
6. Set the application as the container's entry point.

### Step 3: Running the complete example

The `docker-compose.yml` file includes both the MinIO server and the Python application:

```yaml
services:
  minio:
    image: cgr.dev/chainguard/minio:latest
    container_name: minio-server
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin123
    command: server /data --console-address ":9001"
    volumes:
      - minio-data:/data
    networks:
      - minio-net

  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: minio-app
    depends_on:
      - minio
    environment:
      MINIO_ENDPOINT: minio:9000
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin123
      MINIO_SECURE: "false"
    networks:
      - minio-net
```

First, ensure the MinIO server is running:

```shell
docker compose up -d minio
```

Wait a few seconds for MinIO to fully start, then build and run the Python application:

```shell
docker compose up app
```

You should see output similar to this:

```
============================================================
MinIO Sample Application with Chainguard Container
============================================================

Waiting for MinIO server to be ready...
MinIO server is ready!

1. Creating bucket 'demo-bucket'...
✓ Created bucket: demo-bucket

2. Listing all buckets...
  - demo-bucket (created: 2025-10-27 14:23:45.123456+00:00)

3. Uploading sample objects...
✓ Uploaded object: hello.txt to bucket: demo-bucket
✓ Uploaded object: data.json to bucket: demo-bucket
✓ Uploaded object: info.txt to bucket: demo-bucket

4. Listing objects in bucket 'demo-bucket'...
  - hello.txt (size: 18 bytes)
  - data.json (size: 62 bytes)
  - info.txt (size: 53 bytes)

5. Downloading and displaying 'hello.txt'...
✓ Downloaded object: hello.txt from bucket: demo-bucket
   Content: Hello from MinIO!

6. Deleting 'info.txt'...
✓ Deleted object: info.txt from bucket: demo-bucket

7. Listing objects in bucket 'demo-bucket' after deletion...
  - hello.txt (size: 18 bytes)
  - data.json (size: 62 bytes)

============================================================
Demo completed successfully!
============================================================
```

The application demonstrates a complete workflow for working with MinIO object storage. You can also view the created bucket and uploaded objects through the MinIO console at http://localhost:9001.

To stop all services, run:

```shell
docker compose down
```

### Step 4: Extending the application for your use case

This demo application provides a foundation for building production object storage workflows. You can extend it to meet specific requirements such as:

- Uploading files from disk for backup or archival systems
- Implementing bucket policies and access control for multi-tenant environments
- Adding versioning and lifecycle management for compliance requirements
- Integrating with data processing pipelines or application services

The MinIO Python SDK supports the full S3 API, enabling you to implement any S3-compatible functionality required for your use case. This makes it a suitable replacement for AWS S3 in development environments, or for production deployments where you need control over your storage infrastructure.

## Using MinIO images from Docker Hub

The demo repository includes alternative configurations using the older Docker Hub images (`minio/minio:latest` and `python:3.13-slim`) for comparison purposes. However, these images are no longer recommended for production use.

To use the Docker Hub images:

```shell
docker compose -f docker-compose.dockerhub.yml up
```

**Important Note**: As of October 23, 2025, MinIO stopped publishing container images to Docker Hub and Quay. The images that remain are no longer maintained and contain known vulnerabilities, including CVE-2025-62506, which the maintainers have declined to patch. We recommend using Chainguard's MinIO image instead, which provides:

- **Minimal attack surface** - Distroless design with only essential components
- **Zero CVEs** - Regular security updates to maintain a clean vulnerability profile
- **Non-root by default** - Enhanced security posture
- **Smaller image size** - Faster deployments and reduced storage requirements
- **SBOM included** - Complete software bill of materials for compliance
- **Free and publicly available** - No authentication required to pull the image

## Video walkthrough: Multi-stage build and image scanning

This video demonstrates the workflow covered in Example 2, showing how to build the Python client application using a multi-stage Docker build with Chainguard images. The walkthrough also includes scanning both the Chainguard MinIO image and the Docker Hub alternative with Grype to compare their security profiles, illustrating the vulnerability differences between maintained and unmaintained container images.

{{< youtube iaEvQdZ9gh4 >}}

---

### Getting started with the nginx Chainguard Container
_Path: chainguard/containers/getting-started/web-and-data-services/nginx/index.md_

Chainguard's nginx container images provide a security-hardened foundation for web server deployments. Available in both development (`:latest-dev`) and production (`:latest`) variants, these images maintain full nginx functionality while reducing attack surface. The production variant uses a distroless approach, removing shells and package managers to enhance security for production workloads. For current CVE data on each image and tag, see the [nginx entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-nginx).

In this tutorial, we will create a local demo website using nginx to serve static HTML content to a local port on your machine. Then we will use the nginx Chainguard Container to build and execute the demo in a lightweight containerized environment.

If you'd like, you can watch our [Getting Started with the nginx Chainguard Container video](https://youtu.be/KirTeDMzzxk) as you work through this tutorial, which will walk through the same steps that are detailed here.

{{< youtube KirTeDMzzxk >}}

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Prerequisites

You will need to have [nginx](https://nginx.org/en/download.html) and [Docker Engine](https://docs.docker.com/engine/install/) installed on your machine to follow along with this demonstration.

For this tutorial, you will be copying code to files you create locally. You can find the demo code throughout this tutorial, or you can find the complete demo at the [demo GitHub repository](https://github.com/chainguard-dev/edu-images-demos/tree/main/nginx).

## Step 1: Setting up a demo website

We'll start by serving static content to a local web server with nginx.

With nginx installed, create a directory for your demo. In this guide we'll call the directory `nginxdemo`:

```shell
mkdir ~/nginxdemo/ && cd $_
```

Within this directory, we will create a `data` directory to contain our content to be hosted by the web server.

```shell
mkdir data && cd $_
```

Using a text editor of your choice, create a new file `index.html` for the HTML content that will be served. We will use `nano` as an example.

```shell
nano index.html
```

The following HTML file displays a graphic of Linky alongside a fun octopus fact.

```HTML
<!DOCTYPE html>
<html>
<head>
<title>Chainguard nginx Demo Website</title>
<link rel="stylesheet" href="stylesheet.css">
</head>

<body>

<h1>nginx Demo Website</h1>

<h2>from the <a href="https://edu.chainguard.dev/" target="_blank">Chainguard Academy</a></h2>

<img src="linky.png" class="corners" width="250px">

<i><h3>Did you know?</h3></i>
<p>The Wolfi octopus is the world's smallest octopus, weighing in on average at less than a gram!</p>
<p>They are found near the coastlines of the west Pacific Ocean.</p>

</body>

</html>
```

Copy this code to your `index.html` file, save, and close it.

Next, create a CSS file named `stylesheet.css` using the text editor of your choice. We'll use `nano` to demonstrate.

```shell
nano stylesheet.css
```

Copy the following code to your `stylesheet.css` file.

```CSS
/*
Chainguard Academy nginx Demo Website
*/

body {
    text-align: center;
    background-color: #fcebfc;
    font-family: Arial, sans-serif;
}

h1 {
    color: #df45e6;
}

h2, h3 {
    color: #9745e6;
}

p {
    color: #583ce8
}

.corners {
    border-radius: 10px;
}

```

After copying the code into the `stylesheet.css` file, save and close it.

Next, you will pull down the `linky.png` file using `curl`. Always [inspect the URL](https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/fb54a9767a5474716398ac33de81d66e263d4c6f/nginx/data/linky.png) before downloading it to ensure it comes from a safe and trustworthy location.

```shell
curl -O https://raw.githubusercontent.com/chainguard-dev/edu-images-demos/fb54a9767a5474716398ac33de81d66e263d4c6f/nginx/data/linky.png
```

Now, return to the `nginxdemo` directory you made earlier.

```shell
cd ../
```

Here we will create the `nginx.conf` configuration file used by nginx to run the local web server. We will demonstrate this using `nano`.

```shell
nano nginx.conf
```

Copy the following code into the configuration file you created. In the `location` directive, be sure to update the configuration to reference the path from root to the `data` directory you created in a previous step. The file path which you are not using should be commented out using the `#` symbol to prevent syntax errors.

```nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen 8080;
        server_name localhost;
        charset koi8-r;

        location / {
            root /Users/username/nginxdemo/data; # Update the file path for your system
            #root /home/username/nginxdemo/data; # Linux file path example

        }

    }

    include servers/*;

}
```

Once you are finished editing the configuration file, save and close it.

Create a new file named `mime.types` using a text editor of your choice. We will use `nano` to demonstrate.

```shell
nano mime.types
```

Copy and paste the following code into your `mime.types` file. This file will allow nginx to handle the HTML, CSS, and png files we created when rendering the webserver.

```nginx
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    image/png                                        png;
}
```

Save and close the `mime.types` file when you are finished editing it.

Next, copy the absolute filepath to the `nginx.conf` file you created earlier. Replacing the example path with this copied path, execute the following command to initialize the nginx server:

```shell
nginx -c /Users/username/nginxdemo/nginx.conf
```

Please note that you may encounter some permissions errors when executing this command. You will need to update the permissions of the default nginx logging directory on some systems to proceed. For example, nginx installed with Homebrew stores its log files at `/opt/homebrew/var/log/nginx/`, while on a Linux machine, the logs are stored in `/var/log/nginx/`. To update the permissions of these directories, execute the following command, updating the log file path if need be.

```shell
chmod +wx /opt/homebrew/var/log/nginx/
```

With the directory permissions updated, you should now be able to initialize the nginx server.

To view the HTML content, navigate to `localhost:8080` in your web browser of choice. You will see a simple landing page with a picture of Linky and a fun fact about the Wolfi octopus.

If you make any changes to the files nginx is serving, run `nginx -s reload` in your terminal to allow the changes to render. When you are finished with your website, run `nginx -s quit` to allow nginx to safely shut down.

## Step 2: Creating the Dockerfile

We will now use a Dockerfile to build an image containing the demo.

In the `nginxdemo` directory, create the `Dockerfile` with the text editor of your choice. We will use `nano`:

```shell
nano Dockerfile
```

The following Dockerfile will:

1. Start a new build based on the `cgr.dev/chainguard/nginx:latest` container image;
2. Note which container port we need to expose for nginx to listen on;
3. Copy the HTML content from the data directory into the image.

Copy this content to your own `Dockerfile`:

```Dockerfile
FROM cgr.dev/chainguard/nginx:latest

EXPOSE 8080

COPY data /usr/share/nginx/html/
```

Save the file when you're finished.

You can now build the container image with:

```shell
docker build . --pull -t nginx-demo
```

Once the build is complete, run the container image with:

```shell
docker run -d --name nginxcontainer -p 8080:8080 nginx-demo
```

The `-d` flag configures our container to run as a background process. The `--name` flag will name our container `nginxcontainer`, making it easy to identify from other containers. The `-p` flag publishes the port that the container listens on to a port on your local machine. This allows us to navigate to `localhost:8080` in a web browser of our choice to view the HTML content served by the container. You should see the same HTML page as before, with Linky and an octopus fun fact.

If you wish to publish to a different port on your machine, such as `1313`, you can do so by altering the command-line argument as shown:

```shell
docker run -d --name nginxcontainer -p 1313:8080 nginx-demo
```

When you are done with your container, you can stop it with the following command:

```shell
docker container stop nginxcontainer
```

## Advanced usage

In this demo, we did not copy the configuration file into the container image built from the Dockerfile. This is because the default configuration file in the image was sufficient for the scope of this demo. If you wish to use a custom configuration file, you must ensure that file paths, ports, and other system-specific settings are configured to match the container environment. You can find more information about making these changes at the [Chainguard nginx Container Overview](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-nginx).

{{< blurb/images-advanced image="nginx" >}}

---

### Getting started with the PostgreSQL Chainguard Container
_Path: chainguard/containers/getting-started/web-and-data-services/postgres/index.md_

Chainguard's PostgreSQL container image provides a security-hardened foundation for running Postgres databases. Built on Wolfi with a distroless design, it includes only the packages the database needs, maintaining full PostgreSQL functionality while reducing attack surface. For current CVE data on each image and tag, see the [PostgreSQL entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/postgres/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-postgres).

Through daily rebuilds with the latest patches and minimal dependencies, Chainguard's PostgreSQL image enhances database security posture. This enables you to run production Postgres workloads in containerized environments with both a smaller footprint and improved protection against supply chain attacks.

In order to illustrate how the PostgreSQL Chainguard Container might be used in practice, this tutorial involves setting up an example PHP application that uses a Postgres database. This guide assumes you have Docker installed to run the demo; specifically, the procedure outlined in this guide uses [Docker Compose](https://docs.docker.com/compose/install/) to manage the environment on your local machine.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Step 1: Setting up a demo application

This step involves downloading the demo application code to your local machine. To ensure that the application files don't remain on your system navigate to a temporary directory like `/tmp/`.

```sh
cd /tmp/
```

Your system will automatically delete the `/tmp/` directory's contents the next time it shuts down or reboots.

The code that comprises this demo application is hosted in a public GitHub repository managed by Chainguard. Pull down the example application files from GitHub with the following command.

```sh
git clone --sparse https://github.com/chainguard-dev/edu-images-demos.git
```

Because this guide's demo application code is stored in a repository with other examples, we don't need to pull down every file from this repository. For this reason, this command includes the `--sparse` option. This will initialize a sparse-checkout file; this causes the working directory to contain only the files in the root of the repository until the sparse-checkout configuration is modified.

Navigate into this new directory.

```sh
cd edu-images-demos
```

To retrieve the files you need for this tutorial's sample application, run the following `git` command.

```sh
git sparse-checkout set postgres
```

This modifies the sparse-checkout configuration initialized in the previous `git clone` command so that the checkout only consists of the repo's `postgres` directory.

Navigate into this new directory.

```sh
cd postgres/
```

From here, you can run the application and use a web browser to observe it working in real time, which we'll do in the next section.

## Step 2: Inspect, run, and test the sample application

We encourage you to check out [the application code on GitHub](https://github.com/chainguard-dev/edu-images-demos/tree/main/postgres) to better understand how this application works, but we'll provide a brief overview here.

This demo creates a LEPP (Linux, (E)NGINX, PostgreSQL and PHP-FPM) environment based on Wolfi Chainguard Containers. We will use Docker Compose to bring up the environment, which will spin up three containers: an `app` container, a `postgres` container, and an `nginx` container. These will run as services.

Once the environment is up, you can visit the demo in your web browser. The `index.php` file contains code that does the following:

* Connects to the PostgreSQL server running in the `postgres` container
* Creates a new table named `data` if it doesn't already exist
* Inserts a new entry into the table with a random number
* Queries the table to show all the entries

Every time you reload the page, a new entry will be added to the table.

Note that this application includes a Dockerfile.

```sh
cat Dockerfile
```

```
FROM cgr.dev/chainguard/php:latest-fpm-dev

USER root
RUN apk update && apk add php-pgsql

USER php
```

This Dockerfile takes the public `php:latest-fpm-dev` Chainguard Container and installs the `php-pgsql` package onto it. This container image comes with drivers that allow PHP applications to connect to MySQL or MariaDB databases by default but it doesn't have an equivalent for PostgreSQL. For this reason, we use this Dockerfile to install this package in order for the PHP application to be able to connect to the Postgres database.

Execute the following command to build a container with this Dockerfile, and then create and start each of the three containers and bring up the application.

```sh
docker compose up -d
```

The `-d` option is short for `--detach`; this will cause the containers to run in the background, allowing you to continue using the same terminal window. If you run into permissions issues when running this command, try running it again with `sudo` privileges.

> **Note**: If at any point you'd like to stop and remove these containers, run `docker compose down`.

Once all the containers have started, you'll be able to visit the application and observe it working. Open up your preferred web browser and navigate to `localhost:8000`. There, you'll be presented with text like the following

![Screenshot showing a Firefox web browser window with "localhost:8000" in the address bar. On the page is the following text: "Array ( [data_key] => code [data_value] => 8404 )"](pg-demo-success-1.png)

Every time you refresh your browser, a new entry will appear.

![Screenshot showing a Firefox web browser window with "localhost:8000" in the address bar. On the page is the following text: "Array ( [data_key] => code [data_value] => 8404 ), Array ( [data_key] => code [data_value] => 5124 ) Array ( [data_key] => code [data_value] => 1527 )". This indicates that the page was refreshed twice since the previous screenshot.](pg-demo-success-2.png)

This shows that the application is recording each visit in the PostgreSQL database and that the application is working correctly.

After confirming that the application is functioning as expected, you can read through the next section to explore how else you can work with the `postgres` container.

## Step 3: Working with the database

The `docker-compose.yml` file contains some configuration details regarding the PostgreSQL database used in this example application. Run the following command to inspect the contents of this file.

```sh
cat docker-compose.yml
```

We're interested in the `postgres` service:

```
. . .

  postgres:
 image: cgr.dev/chainguard/postgres
 restart: unless-stopped
 environment:
   POSTGRES_USER: php
   POSTGRES_PASSWORD: password
   POSTGRES_DB: php-test
 ports:
   - 5432:5432
 networks:
   - wolfi

. . .
```

This section defines a few environment variables relating to the database used in the example application. Importantly, they specify that the application database is named `php-test` and runs under a user named `php` with the password "password". Using this information, you can connect to the `php-test` database running in the container with a command like the following.

```sh
docker exec -it postgres-postgres-1 \
psql -p 5432 -U php -W -d php-test
```

`docker exec` allows you to execute commands within a running container. The `-i` argument allows you to execute an interactive command while the `-t` option allocates a pseudo-TTY to the process within the container. Because our goal is to access the sample database through the `psql` command line client, these options are necessary. Next, enter the name of the container running the PostgreSQL database; by default, this will be named `postgres-postgres-1`.

Following that, the remainder of this command represents the command that will be run within the container. Here, we run the `psql` command to access the database specifying that we want to connect over port `5432` as the `php` user. The `-W` option indicates that we want to be prompted to enter the password interactively, and `-d php-test` specifies that we want to connect to the `php-test` database.

```
Password:
```

Enter `password` and you'll then be presented with the `psql` command prompt.

```
psql (15.3)
Type "help" for help.

php-test=#
```

From here, you can interact with the database from within the `postgres-postgres-1` container as you would with any other PostgreSQL database. For example, you could update existing tables, create new ones, and insert or delete data.

To close the `psql` prompt, you can enter the following command.

```PostgreSQL
\q
```

Of course, you likely won't be regularly managing your containerized databases over the command line. The purpose of this section is to only show that you can interact with the database running in this container just like you would with any other Postgres database.

## Advanced usage

{{< blurb/images-advanced image="PostgreSQL" >}}

### Configuring the PostgreSQL container image

You can extend Chainguard's PostgreSQL container image with environment variables. Chainguard's PostgreSQL container image is compatible with the environment variables available in the official PostgreSQL image, including the following:

* `PGDATA`: This variable allows you to define another location for database files. The default data directory is `/var/lib/postgresql/data`.
* `POSTGRES_PASSWORD`: This environment variable sets the superuser password for PostgreSQL. This variable is required to use the PostgreSQL image.
* `POSTGRES_USER`: This is used with the `POSTGRES_PASSWORD` variable to set a superuser for the database and its password. If not specified, you can use the default `postgres` user.
* `POSTGRES_DB`: Using this variable allows you to set a different name for the default database. If not specified, the default database will be `postgres` or the value set by `POSTGRES_USER`.
* `POSTGRES_INITDB_ARGS`: This variable allows you to send arguments to `postgres initdb`.
* `POSTGRES_INITDB_WALDIR`: You can set this variable to define the location for the PostgreSQL transaction log. By default, the transaction log is stored in a subdirectory of the main PostgresSQL data folder, which you can define with `PGDATA`.
* `POSTGRES_HOST_AUTH_METHOD`: This variable allows you to control the `auth-method` used to authenticate when connecting to the database.

Note that if you set the `POSTGRES_HOST_AUTH_METHOD` variable to `trust`, then the `POSTGRES_PASSWORD` variable is no longer required:

```shell
docker run --rm -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=linky -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest
```

Be aware that the Docker specific variables will only have an effect if you start the container with an empty data directory; pre-existing databases won't be affected on container startup.

You can also run the Chainguard PostgreSQL container image with a custom configuration file. The following example will mount a PostgreSQL configuration file named `my-postgres.conf` to the container.

```shell
docker run --rm -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest -c 'config_file=/etc/postgresql/postgresql.conf'
```

This command also uses the `postgres` server's `-c` flag to set the `config_file` runtime parameter.

---

### Getting started with the MariaDB Chainguard Container
_Path: chainguard/containers/getting-started/web-and-data-services/mariadb/index.md_

Chainguard's MariaDB container image provides a security-hardened foundation for database workloads. Built on Wolfi with a distroless design, it removes unnecessary components while maintaining full MariaDB functionality. For current CVE data on each image and tag, see the [MariaDB entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/mariadb/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-mariadb).

Through daily rebuilds with the latest patches and minimal dependencies, Chainguard's MariaDB image dramatically reduces your database's attack surface. This enables you to run production MariaDB databases with enhanced security posture and a smaller container footprint.

In order to illustrate how the MariaDB Chainguard Container might be used in practice, this tutorial involves setting up an example PHP application that uses a MariaDB database. This guide assumes you have Docker installed to run the demo; specifically, the procedure outlined in this guide uses [Docker Compose](https://docs.docker.com/compose/install/) to manage the environment on your local machine.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Step 1: Setting up a demo application

This step involves downloading the demo application code to your local machine. To ensure that the application files don't remain on your system navigate to a temporary directory like `/tmp/`.

```sh
cd /tmp/
```

Your system will automatically delete the `/tmp/` directory's contents the next time it shuts down or reboots.

The code that comprises this demo application is hosted in a public GitHub repository managed by Chainguard. Pull down the example application files from GitHub with the following command.

```sh
git clone --sparse https://github.com/chainguard-dev/edu-images-demos.git
```

Because this guide's demo application code is stored in a repository with other examples, we don't need to pull down every file from this repository. For this reason, this command includes the `--sparse` option. This will initialize a sparse-checkout file, causing the working directory to contain only the files in the root of the repository until the sparse-checkout configuration is modified.

Navigate into this new directory and list its contents to confirm this.

```sh
cd edu-images-demos/ && ls
```

For now, this directory will only contain the repository's `LICENSE` and `README` files.

```
LICENSE  README.md
```

To retrieve the files you need for this tutorial's sample application, run the following `git` command.

```sh
git sparse-checkout set mariadb
```

This modifies the sparse-checkout configuration initialized in the previous `git clone` command so that the checkout only consists of the repo's `mariadb` directory.

Navigate into this new directory.

```sh
cd mariadb/
```

From here, you can run the application and use a web browser to observe it working in real time, which we'll do in the next section.

## Step 2: Inspect, run, and test the sample application

We encourage you to check out [the application code on GitHub](https://github.com/chainguard-dev/edu-images-demos/tree/main/mariadb) to better understand how this application works, but we'll provide a brief overview here.

This demo creates a LEMP (Linux, (E)NGINX, MariaDB and PHP-FPM) environment based on Wolfi Chainguard Containers. We will use Docker Compose to bring up the environment, which will spin up three containers: an `app` container, a `mariadb` container, and an `nginx` container. These will run as services.

Once the environment is up, you can visit the demo in your web browser. The `index.php` file contains code that does the following:

* Connects to the MariaDB server running in the `mariadb` container
* Creates a new table named `data` if it doesn't already exist
* Inserts a new entry into the table with a random number
* Queries the table to show all the entries

Every time you reload the page, a new entry will be added to the table.

Execute the following command to create and start each of the three containers and bring up the application.

```sh
docker compose up -d
```

The `-d` option is short for `--detach`; this will cause the containers to run in the background, allowing you to continue using the same terminal window. If you run into permissions issues when running this command, try running it again with `sudo` privileges.

> **Note**: If at any point you'd like to stop and remove these containers, run `docker compose down`.

Once all the containers have started, you'll be able to visit the application and observe it working. Open up your preferred web browser and navigate to `localhost:8000`. There, you'll be presented with text like the following.

![Screenshot showing a Firefox web browser window with "localhost:8000" in the address bar. On the page is the following text: "Array ( [data_key] => code [data_value] => 7064 )"](mdb-demo-success-1.png)

Every time you refresh your browser, a new entry will appear.

![Screenshot showing a Firefox web browser window with "localhost:8000" in the address bar. On the page is the following text: "Array ( [data_key] => code [data_value] => 7064 ), Array ( [data_key] => code [data_value] => 7006 ) Array ( [data_key] => code [data_value] => 7507 )". This indicates that the page was refreshed twice since the previous screenshot.](mdb-demo-success-2.png)

This shows that the application is recording each visit in the MariaDB database and that the application is working correctly.

After confirming that the application is functioning as expected, you can read through the next section to explore how else you can work with the `mariadb` container.

## Step 3: Working with the database

The `docker-compose.yml` file contains some configuration details regarding the MariaDB database used in this example application. Run the following command to inspect the contents of this file.

```sh
cat docker-compose.yml
```

We're interested in the `mariadb` service:

```
. . .

  mariadb:
 image: cgr.dev/chainguard/mariadb
 restart: unless-stopped
 environment:
   MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
   MARIADB_USER: php
   MARIADB_PASSWORD: password
   MARIADB_DATABASE: php-test
 ports:
   - 3306:3306
 volumes:
   - ./:/app
 networks:
   - wolfi

. . .
```

This section defines a few environment variables relating to the database used in the example application. Importantly, they specify that the application database runs under a user named `php` with the password "password". Using this information, you can connect to the `php` database running in the container with a command like the following.

```sh
docker exec -it mariadb-mariadb-1 mariadb --user php -p
```

`docker exec` allows you to execute commands within a running container. The `-i` argument allows you to execute an interactive command while the `-t` option allocates a pseudo-TTY to the process within the container. Because our goal is to access the sample database through the `mariadb` command line client, these options are necessary. Next, enter the name of the container running the MariaDB database; by default, this will be named `mariadb-mariadb-1`.

Following that, the remainder of this command represents the command that will be run within the container. Here, we run the `mariadb` command to access the database specifying that we want to connect as the `php` user. The final `-p` option indicates that we want to be prompted to enter the password.

```
Enter password:
```

Enter `password` and you'll then be presented with the MariaDB command line SQL shell.

```
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.11.4-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

From here, you can interact with the database from within the `mariadb-mariadb-1` container as you would with any other MariaDB database. For example, you could update existing tables, create new ones, and insert or delete data.

To close the MariaDB prompt, you can enter the following command.

```MariaDB
\q
```

Of course, you likely won't be regularly managing your containerized databases over the command line. The purpose of this section is to only show that you can interact with the database running in this container just like you would with any other MariaDB database.

## Advanced usage

{{< blurb/images-advanced image="MariaDB" >}}

---

### Getting started with the Chainguard Spark FIPS container
_Path: chainguard/containers/getting-started/ai-and-data/spark-fips.md_

Apache Spark is a distributed computing engine for batch processing, stream processing, and machine learning at scale. Organizations subject to federal compliance requirements—including FedRAMP, FISMA, and Department of Defense frameworks—must use FIPS 140-3 validated cryptography for all cryptographic operations in Spark.

Chainguard's Spark FIPS container packages Apache Spark with the Bouncy Castle FIPS cryptographic provider, replacing the standard JVM cryptographic modules with NIST-validated equivalents. In FIPS mode, TLS connections require BCFKS-format keystores rather than the standard PKCS12 or JKS formats, and only FIPS-approved cipher suites are permitted.

This guide covers two deployment patterns. The first demonstrates how to generate BCFKS keystores and verify that Spark runs correctly with FIPS TLS configured. The second shows how to deploy Spark in Kubernetes cluster mode using the Spark Operator FIPS container, which is the recommended approach for production workloads.

{{< details "What is distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

{{< details "Chainguard Containers" >}}
{{< blurb/images >}}
{{< /details >}}

## Prerequisites

Both examples require Docker and access to the Chainguard private registry. Example 2 also requires `kubectl`, `helm`, and `kind`.

- [Docker](https://docs.docker.com/get-docker/) installed and running
- Chainguard customer credentials for `cgr.dev/chainguard-private`
- For Example 2: [`kubectl`](https://kubernetes.io/docs/tasks/tools/), [`helm`](https://helm.sh/docs/intro/install/), and [`kind`](https://kind.sigs.k8s.io/docs/user/quick-start/)

Authenticate your Docker client to the Chainguard registry:

```shell
chainctl auth configure-docker
```

## Understanding BCFKS keystores

Standard Java applications use JKS or PKCS12 keystores. Neither format is available in FIPS mode. Bouncy Castle FIPS requires BCFKS (Bouncy Castle Keystore), a proprietary keystore format that complies with FIPS 140-3 storage requirements.

The Spark FIPS container pre-installs the Bouncy Castle FIPS libraries at `/usr/share/java/bouncycastle-fips/` and pre-configures the JVM to load the BCFIPS provider. Any `keytool` operation that creates or reads a BCFKS keystore must explicitly specify the BCFIPS provider:

```
-storetype BCFKS
-providername BCFIPS
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
-providerpath /usr/share/java/bouncycastle-fips/bc-fips.jar
```

Before running `keytool`, clear `JAVA_TOOL_OPTIONS` and `JDK_JAVA_OPTIONS`, then set them explicitly with the Bouncy Castle module path. The image's default values for those variables include global JVM options that conflict with the keytool BCFIPS provider arguments.

## Example 1: Generate BCFKS keystores and run a local smoke test

This example generates BCFKS keystores inside the Spark FIPS container and then runs the built-in SparkPi example to verify that Spark starts correctly with FIPS TLS configured.

### Generate a BCFKS keystore and truststore

Create a working directory, then run the keystore generation inside the container as root so it can write to the mounted output volume. The script creates a local certificate authority, a server keystore signed by that CA, and a truststore containing the CA certificate.

Set your keystore passwords as environment variables. Use the same values throughout both examples:

```shell
export KEY_PASSWORD=$KEY_PASSWORD
export TRUSTSTORE_PASSWORD=$TRUSTSTORE_PASSWORD
```

```shell
mkdir -p spark-ssl
```

```shell
docker run --rm --user 0:0 \
  -v "$(pwd)/spark-ssl":/out \
  -e KEY_PASSWORD=$KEY_PASSWORD \
  -e TRUSTSTORE_PASSWORD=$TRUSTSTORE_PASSWORD \
  --entrypoint /bin/sh \
  cgr.dev/chainguard-private/spark-fips:latest -c '
set -e
BC_JAR=/usr/share/java/bouncycastle-fips/bc-fips.jar
BC_DIR=/usr/share/java/bouncycastle-fips

run_kt() {
  env -u JAVA_TOOL_OPTIONS -u JDK_JAVA_OPTIONS \
    JAVA_TOOL_OPTIONS="--module-path=${BC_DIR} --add-modules=jdk.crypto.ec,jdk.crypto.cryptoki" \
    keytool "$@" \
    -providername BCFIPS \
    -providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
    -providerpath "${BC_JAR}"
}

# Create a local CA keypair
run_kt -genkeypair \
  -alias root-ca \
  -dname "CN=Spark CA, OU=Test, O=Test, C=US" \
  -keyalg RSA -keysize 2048 -validity 3650 \
  -ext bc=ca:true \
  -keystore /out/ca-keystore.bcfks -storetype BCFKS \
  -storepass "${TRUSTSTORE_PASSWORD}" -keypass "${TRUSTSTORE_PASSWORD}"

# Export the CA certificate
run_kt -exportcert -rfc \
  -alias root-ca \
  -keystore /out/ca-keystore.bcfks -storetype BCFKS \
  -storepass "${TRUSTSTORE_PASSWORD}" \
  -file /out/ca.crt

# Create the server keystore
run_kt -genkeypair \
  -alias spark-server \
  -dname "CN=localhost, OU=Test, O=Test, C=US" \
  -keyalg RSA -keysize 2048 -validity 825 \
  -ext "SAN=dns:localhost,ip:127.0.0.1" \
  -keystore /out/keystore.bcfks -storetype BCFKS \
  -storepass "${KEY_PASSWORD}" -keypass "${KEY_PASSWORD}"

# Create the truststore and import the CA certificate
run_kt -importcert -noprompt \
  -alias root-ca -file /out/ca.crt \
  -keystore /out/truststore.bcfks -storetype BCFKS \
  -storepass "${TRUSTSTORE_PASSWORD}"

echo "Keystores written to /out:"
ls -lh /out/*.bcfks
'
```

After the script completes, the `spark-ssl/` directory contains three files:

| File | Purpose |
| ------ | --------- |
| `keystore.bcfks` | Server certificate and private key |
| `truststore.bcfks` | CA certificate used to verify peers |
| `ca-keystore.bcfks` | CA keypair used to sign the server certificate (not needed at runtime) |

For production deployments, replace the self-signed CA with certificates from your organization's PKI, and store passwords in your secrets management system rather than inline in shell commands.

### Verify the keystore

Confirm the keystore was created correctly:

```shell
docker run --rm --user 0:0 \
  -v "$(pwd)/spark-ssl":/out \
  -e KEY_PASSWORD=$KEY_PASSWORD \
  --entrypoint /bin/sh \
  cgr.dev/chainguard-private/spark-fips:latest -c '
BC_JAR=/usr/share/java/bouncycastle-fips/bc-fips.jar
BC_DIR=/usr/share/java/bouncycastle-fips
env -u JAVA_TOOL_OPTIONS -u JDK_JAVA_OPTIONS \
  JAVA_TOOL_OPTIONS="--module-path=${BC_DIR} --add-modules=jdk.crypto.ec,jdk.crypto.cryptoki" \
  keytool -list \
  -keystore /out/keystore.bcfks \
  -storetype BCFKS \
  -providername BCFIPS \
  -providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
  -providerpath "${BC_JAR}" \
  -storepass "${KEY_PASSWORD}"
'
```

The output lists the alias `spark-server` as a `PrivateKeyEntry`, confirming that the keystore is accessible by the BCFIPS provider.

### Run SparkPi with FIPS TLS

Run the built-in SparkPi example in local mode with FIPS TLS configured. The command sets both the Spark SSL layer (`spark.ssl.*`) and the JVM JSSE layer (`javax.net.ssl.*`). In local mode both sets of settings apply to the same JVM, but you need both in Kubernetes cluster mode where executor JVMs are separate processes.

```shell
docker run --rm --user 0:0 \
  -v "$(pwd)/spark-ssl":/ssl \
  -e KEY_PASSWORD=$KEY_PASSWORD \
  -e TRUSTSTORE_PASSWORD=$TRUSTSTORE_PASSWORD \
  cgr.dev/chainguard-private/spark-fips:latest \
  spark-submit \
  --master local[1] \
  --class org.apache.spark.examples.SparkPi \
  --conf spark.ssl.enabled=true \
  --conf spark.ssl.keyStore=/ssl/keystore.bcfks \
  --conf spark.ssl.keyStoreType=BCFKS \
  --conf spark.ssl.keyStoreProvider=BCFIPS \
  --conf spark.ssl.keyStorePassword=$KEY_PASSWORD \
  --conf spark.ssl.trustStore=/ssl/truststore.bcfks \
  --conf spark.ssl.trustStoreType=BCFKS \
  --conf spark.ssl.trustStoreProvider=BCFIPS \
  --conf spark.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD \
  --conf "spark.driver.extraJavaOptions=-Dorg.bouncycastle.fips.approved_only=true -Djavax.net.ssl.keyStore=/ssl/keystore.bcfks -Djavax.net.ssl.keyStoreType=BCFKS -Djavax.net.ssl.keyStoreProvider=BCFIPS -Djavax.net.ssl.keyStorePassword=$KEY_PASSWORD -Djavax.net.ssl.trustStore=/ssl/truststore.bcfks -Djavax.net.ssl.trustStoreType=BCFKS -Djavax.net.ssl.trustStoreProvider=BCFIPS -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD" \
  /usr/lib/spark/examples/jars/spark-examples.jar 10
```

A successful run prints output similar to:

```
Pi is roughly 3.14...
```

## Example 2: Deploy on Kubernetes with the Spark Operator

In Kubernetes cluster mode, Spark creates a driver pod and one or more executor pods. At driver pod startup, the Spark Operator mounts a runtime ConfigMap at `/usr/lib/spark/conf`, which overwrites any files baked into the image at that path. This means you cannot rely on keystores or `spark-defaults.conf` files placed there at image build time.

The solution is to store keystores in a Kubernetes Secret and mount it at a path outside the Spark configuration directory. Spark properties, including the TLS configuration, go into the `sparkConf` section of the SparkApplication resource. The operator writes those values directly into the driver and executor configurations at submission time, bypassing the mounted ConfigMap entirely.

### Set up a local Kubernetes cluster

Create a kind cluster for testing:

```shell
kind create cluster --name spark-fips-test
```

Pull the Chainguard images and load them into the kind cluster. Kind nodes do not share the host Docker image cache, so this step is required for local testing:

```shell
docker pull cgr.dev/chainguard-private/spark-fips:latest
docker pull cgr.dev/chainguard-private/spark-operator-fips:latest

kind load docker-image cgr.dev/chainguard-private/spark-fips:latest \
  --name spark-fips-test

kind load docker-image cgr.dev/chainguard-private/spark-operator-fips:latest \
  --name spark-fips-test
```

For production clusters, configure an image pull secret for `cgr.dev` rather than pre-loading images. Refer to the [Chainguard registry authentication documentation](/chainguard/containers/registry/authenticating/) for details.

### Create namespaces and RBAC

Create separate namespaces for the operator and the Spark jobs, and grant the Spark service account the permissions it needs to create driver and executor pods:

```shell
kubectl create namespace spark-operator
kubectl create namespace spark-jobs
kubectl create serviceaccount spark --namespace spark-jobs
kubectl create rolebinding spark-role \
  --clusterrole=edit \
  --serviceaccount=spark-jobs:spark \
  --namespace spark-jobs
```

### Create the keystore secret

If you completed Example 1, the `spark-ssl/` directory already contains the generated files. Otherwise, run the keystore generation step from that example first.

Store the keystores in a Kubernetes Secret:

```shell
kubectl create secret generic spark-ssl-stores \
  --from-file=keystore.bcfks=./spark-ssl/keystore.bcfks \
  --from-file=truststore.bcfks=./spark-ssl/truststore.bcfks \
  --namespace spark-jobs
```

### Install the Spark Operator

Install the Spark Operator using the Chainguard Spark Operator FIPS image. The `spark.jobNamespaces` setting tells the operator to watch the `spark-jobs` namespace for SparkApplication resources:

```shell
helm repo add spark-operator https://kubeflow.github.io/spark-operator
helm repo update

helm install spark-operator spark-operator/spark-operator \
  --namespace spark-operator \
  --set image.registry=cgr.dev \
  --set image.repository=chainguard-private/spark-operator-fips \
  --set image.tag=latest \
  --set image.pullPolicy=Never \
  --set "spark.jobNamespaces[0]=spark-jobs"
```

Wait for the operator to become ready:

```shell
kubectl wait deployment/spark-operator-controller \
  --namespace spark-operator \
  --for=condition=Available \
  --timeout=120s
```

### Run a SparkApplication with FIPS TLS

Save the following manifest as `spark-pi-fips.yaml`. It runs the built-in SparkPi example in cluster mode with FIPS TLS configured. The keystores are mounted from the Secret at `/keystores`, and the FIPS TLS settings are passed through `sparkConf` so they apply to both the driver and executor JVMs.

```yaml
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi-fips
  namespace: spark-jobs
spec:
  type: Scala
  mode: cluster
  image: cgr.dev/chainguard-private/spark-fips:latest
  imagePullPolicy: Never
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///usr/lib/spark/examples/jars/spark-examples.jar
  arguments:
    - "10"
  sparkVersion: "4.1.2"
  restartPolicy:
    type: Never

  volumes:
    - name: keystores
      secret:
        secretName: spark-ssl-stores

  sparkConf:
    spark.ssl.enabled: "true"
    spark.ssl.keyStore: "/keystores/keystore.bcfks"
    spark.ssl.keyStoreType: "BCFKS"
    spark.ssl.keyStoreProvider: "BCFIPS"
    spark.ssl.keyStorePassword: "$KEY_PASSWORD"
    spark.ssl.trustStore: "/keystores/truststore.bcfks"
    spark.ssl.trustStoreType: "BCFKS"
    spark.ssl.trustStoreProvider: "BCFIPS"
    spark.ssl.trustStorePassword: "$TRUSTSTORE_PASSWORD"
    spark.kubernetes.driverEnv.JAVA_TOOL_OPTIONS: "--module-path=/usr/share/java/bouncycastle-fips --add-modules=jdk.crypto.ec,jdk.crypto.cryptoki"
    spark.kubernetes.executorEnv.JAVA_TOOL_OPTIONS: "--module-path=/usr/share/java/bouncycastle-fips --add-modules=jdk.crypto.ec,jdk.crypto.cryptoki"

  driver:
    serviceAccount: spark
    volumeMounts:
      - name: keystores
        mountPath: /keystores
        readOnly: true
    env:
      - name: JDK_JAVA_OPTIONS
        value: >-
          -Dorg.bouncycastle.fips.approved_only=true
          -Djavax.net.ssl.keyStore=/keystores/keystore.bcfks
          -Djavax.net.ssl.keyStoreType=BCFKS
          -Djavax.net.ssl.keyStoreProvider=BCFIPS
          -Djavax.net.ssl.keyStorePassword=$KEY_PASSWORD
          -Djavax.net.ssl.trustStore=/keystores/truststore.bcfks
          -Djavax.net.ssl.trustStoreType=BCFKS
          -Djavax.net.ssl.trustStoreProvider=BCFIPS
          -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD

  executor:
    instances: 1
    volumeMounts:
      - name: keystores
        mountPath: /keystores
        readOnly: true
    env:
      - name: JDK_JAVA_OPTIONS
        value: >-
          -Dorg.bouncycastle.fips.approved_only=true
          -Djavax.net.ssl.keyStore=/keystores/keystore.bcfks
          -Djavax.net.ssl.keyStoreType=BCFKS
          -Djavax.net.ssl.keyStoreProvider=BCFIPS
          -Djavax.net.ssl.keyStorePassword=$KEY_PASSWORD
          -Djavax.net.ssl.trustStore=/keystores/truststore.bcfks
          -Djavax.net.ssl.trustStoreType=BCFKS
          -Djavax.net.ssl.trustStoreProvider=BCFIPS
          -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD
```

The `JDK_JAVA_OPTIONS` value in the driver and executor sections overrides the image's default, which sets only the trust store type. The full value here adds FIPS approved-only mode and JSSE settings for both the keystore and truststore. The `JAVA_TOOL_OPTIONS` override in `sparkConf` extends the image's default module path with the EC and CRYPTOKI modules that Bouncy Castle FIPS requires at runtime.

For production deployments, do not hardcode passwords in the manifest. Store them in a Kubernetes Secret and reference them via `valueFrom.secretKeyRef` in the `env` sections. `sparkConf` values like `spark.ssl.keyStorePassword` cannot reference environment variables directly. The production pattern is to use an init container or a wrapper script that generates `spark-defaults.conf` from environment variables before the Spark entrypoint runs.

Apply the manifest:

```shell
kubectl apply -f spark-pi-fips.yaml
```

### Verify the job

Watch the `spark-jobs` namespace until the driver pod completes:

```shell
kubectl get pods --namespace spark-jobs --watch
```

Once the driver pod shows `Completed`, retrieve the Pi estimate from its logs:

```shell
POD=$(kubectl get pods --namespace spark-jobs \
  -l spark-role=driver \
  -o jsonpath='{.items[-1:].metadata.name}')

kubectl logs "$POD" --namespace spark-jobs | grep "Pi is"
```

A successful run prints output similar to:

```
Pi is roughly 3.14...
```

You can also confirm that FIPS approved-only mode was active by checking the `JDK_JAVA_OPTIONS` line near the top of the driver logs:

```shell
kubectl logs "$POD" --namespace spark-jobs | grep "JDK_JAVA_OPTIONS"
```

The output includes `-Dorg.bouncycastle.fips.approved_only=true`.

### Clean up

Delete the SparkApplication and the kind cluster when you're done:

```shell
kubectl delete -f spark-pi-fips.yaml
kind delete cluster --name spark-fips-test
```

---

### Getting started with the NeMo Chainguard Container
_Path: chainguard/containers/getting-started/ai-and-data/nemo/index.md_

Chainguard's [NeMo container image](https://images.chainguard.dev/directory/image/nemo/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-nemo) provides a security-hardened environment for NVIDIA's [NeMo](https://github.com/NVIDIA/NeMo) deep learning framework with minimal vulnerabilities compared to traditional AI/ML containers. NeMo enables building conversational AI models through module collections for Automatic Speech Recognition (ASR), Natural Language Processing (NLP), and Text-to-Speech (TTS) tasks. Built for [CUDA 12](https://developer.nvidia.com/about-cuda) GPU acceleration, this lightweight container maintains full NeMo functionality while significantly reducing security risks for both training and production inference workloads.

{{< details "What is Deep Learning?" >}}
{{< blurb/deep-learning >}}
{{< /details >}}

In this getting started guide, we will use the NeMo Chainguard Container to generate speech from plain text using models provided by NeMo's text-to-speech (TTS) and natural language processing (NLP) collections. In doing so, we'll compare the security and footprint of the NeMo Chainguard Container to the official runtime container image and consider further approaches and resources for applying the NeMo Chainguard Container to additional tasks in conversational AI.

This guide is primarily designed for use in an environment with access to one or more NVIDIA GPUs. However, NeMo is built on [PyTorch Lightning](https://lightning.ai/docs/pytorch/stable/), which supports a wide variety of [accelerators](https://pytorch-lightning.readthedocs.io/en/1.1.8/accelerators.html), or interfaces to categories of processing units (CPU, GPU, TPU) or high-level clustering mechanisms such as [Distributed Data Parallel](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html). Some consideration will be given to alternative computing environments such as CPU in this tutorial.

{{< blurb/free-tier-message >}}

## Prerequisites

If Docker Engine (or Docker Desktop) is not already installed, follow the [instructions for installing Docker Engine on your host machine](https://docs.docker.com/engine/install/).

To take advantage of connected GPUs, you'll need to install CUDA Toolkit on your host machine.

{{< details "Installing CUDA Toolkit" >}}
{{< blurb/cuda >}}
{{< /details >}}

This tutorial can be followed without connected GPUs or CUDA Toolkit. To run commands in this tutorial on CPU, omit the `--gpus all` flag when executing container commands. Keep in mind that some functionality within NeMo (such as training models) will take significantly longer on CPU.

## Testing access to GPUs

We'll start by running the NeMo Chainguard Container interactively and determine whether the environment has access to connected GPUs.

Use the following command to pull the container image, run it with GPU access, and start a Python interpreter inside the running container.

```shell
docker run -it --rm \
  --gpus all \
  --shm-size=8g \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  cgr.dev/$ORGANIZATION/nemo:latest
```

> **Note**: Be aware that you will need to change `$ORGANIZATION` to reflect the name of your organization's repository within Chainguard's registry.

These options allow access to all available GPUs, allocate a custom amount of shared memory (8 GB) to the container, and set an upper bound on container memory use.

Running this command for the first time may take a few minutes, since it will download  the NeMo Chainguard Container to your host machine. Once the image is pulled and the command runs successfully, you will be interacting with a bash shell in the running container. Enter the following commands at the prompt to check the availability of your GPU.

```shell
python
```

```python
Python 3.11.9 (main, May  1 2024, 21:48:03) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nemo.core import pytorch_lightning
>>> len(pytorch_lightning.accelerators.find_usable_cuda_devices())
1
```

The above output shows that one GPU is connected and available. Since PyTorch is also accessible within our NeMo Chainguard Container, you can also use it to access more granular information on CUDA and attached GPUs.

```python
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

Once you've determined that your environment has access to CUDA and connected GPUs, exit the container by typing `Control-d` or by typing `exit()` and pressing `Enter`. You should be returned to the prompt of your host machine.

## NeMo overview

NeMo is a generative AI toolkit and framework with a focus on conversational AI tasks such as NLP, ASR, and TTS, as well as large language models (LLM) and multimodal (MM) models. NeMo uses a system of [neural modules](https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/core/neural_modules.html), an abstraction over a variety of common elements in model training and inference such as encoders, decoders, loss functions, layers, or models. NeMo also provides [collections of modules](https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/collections.html) targeting specific areas of concern in conversational and generative AI, such as LLMs, speech AI / NLP, and TTS.

NeMo is built on [PyTorch Lightning](https://lightning.ai/docs/pytorch/stable/), a high-level interface to PyTorch with a focus on scalability, and uses the [Hydra](https://hydra.cc/) library for configuration management.

Since NeMo is a framework with many collections of modules suitable for a wide variety of projects, we've chosen an example task, generative text to speech, requiring the use of two TTS modules. This is an appropriate example of a task that might be run as part of a larger production application.

## Text to speech (TTS) example

In this section, we'll run a script that uses the NeMo Chainguard Container to:

- Start with a message in plain text
- Transform it into a set of phonemes
- Generate a spectrogram (waveform representation) using a NeMo-provided spectrogram model
- Transform the spectrogram values into audio using a NeMo-provided vocoder (human voice) model
- Write the resulting audio to a `.wav` file at a set rate

First, let's create a folder to work in on your host machine:

```shell
mkdir -p ~/nemo-tts && cd ~/nemo-tts
```

Next, let's download our [tts.py](https://github.com/chainguard-dev/nemo-examples/blob/main/tts.py) script:

```shell
curl https://raw.githubusercontent.com/chainguard-dev/nemo-examples/main/tts.py > tts.py
```

You should now be in a working directory containing only one file, `tts.py`.

We'll be mounting this folder in our container as a volume, which will allow us to both pass in our script and extract our output.

We'll now start a container based on our NeMo Chainguard Container, mount the current working directory containing our `tts.py` script inside the container as a volume, and run the script in the container:

```shell
docker run -it --rm \
  --gpus all \
  --user root \
  --shm-size=8g \
  --ulimit memlock=-1 \
 --ulimit stack=67108864 \
  -v $PWD:/home/nonroot/nemo-test \
  cgr.dev/$ORGANIZATION/nemo:latest \
 "/home/nonroot/nemo-test/tts.py"
```

Note that we ran the above script as root. This allows us to share the script and output `.wav` file between the host and container. Remember not to run your container image as root in a production environment.

If your host machine does not have attached GPUs and you'd like to run the above on your CPU, omit the `--gpus all \` line. The script tests for availability of the CUDA platform and sets the accelerator to CPU if CUDA is not detected, so the script will also function on CPU.

Since we're using pretrained models to perform text to speech, this example will only take a few minutes using a CPU only. However, other tasks such as model training and finetuning may take significantly longer without connected GPUs.

Note that NeMo collections are large, and initial imports can take up to a minute depending on your environment. The script may appear to hang during that time.

After imports are complete, you should see a large amount of output as NeMo pulls models and works through the steps in the script (tokenizing, generating a spectrogram, generating audio, and writing audio to disk). On completion, the script outputs a `test.wav` file. Because we mounted a volume, this file should now be present in the working directory of your host machine.

```shell
ls
```

```output
test.wav  tts.py
```

The `test.wav` file should contain audio similar to this output:

{{< audio src="tts-example.wav" caption="Output from the TTS script" >}}

## Final considerations and next steps

This section will consider next steps for applying the NeMo Chainguard Container to other tasks in conversational AI.

In the [tts.py](https://github.com/chainguard-dev/nemo-examples/blob/main/tts.py) script run above, we used two models provided by NeMo, both contained within the TTS collection.

- [Tacotron2 speech synthesis model](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/nemo/models/tts_en_tacotron2)
- [HiFi-GAN speech synthesis model](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/speechsynthesis_hifigan)

The former model allows us to convert plain text into a spectrogram, or a representation of a waveform. The second model generates audio from the spectrogram. Note that NVIDIA's model overview pages provide useful background information, tags, and sample code. You can search the [full NGC model catalog](https://catalog.ngc.nvidia.com/models?filters=&orderBy=weightPopularDESC&query=&page=&pageSize=) to find pretrained models for use with NeMo.

In this script, we used pretrained models to create the phonemes and audio output. These models can be finetuned with your own speech data to customize the results.

The following resources may give a starting point for further explorations with the NeMo Chainguard Container:

- NVIDIA provides a wide variety of [NeMo Tutorials](https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/starthere/tutorials.html) that are a strong entry point for working with the framework to accomplish specific tasks.
- NVIDIA's [NeMo Playbooks](https://docs.nvidia.com/nemo-framework/user-guide/latest/playbooks/index.html) provide a basis for more advanced tasks and configurations and address running workloads on different platforms and orchestration tooling.
- The [NeMo Collections](https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/collections.html) organizes reference documentation for NeMo collections and modules.
- The [NVIDIA NGC model catalog](https://catalog.ngc.nvidia.com/models?filters=&orderBy=weightPopularDESC&query=&page=&pageSize=) can be searched to find models suitable for specific tasks, and each model's overview page provides a useful reference with sample code.
- This [NVIDIA Conversational AI publications page](https://research.nvidia.com/labs/conv-ai/publications) collects papers that use the NeMo framework, showcasing cutting-edge generative deep learning using NeMo

---

### Getting started with the PyTorch Chainguard Container
_Path: chainguard/containers/getting-started/ai-and-data/pytorch/index.md_

Chainguard's [PyTorch container image](https://images.chainguard.dev/directory/image/pytorch/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-getting-started-pytorch) provides a security-hardened foundation for deep learning workloads. Built with [PyTorch](https://pytorch.org/) and [CUDA](https://developer.nvidia.com/about-cuda) support for GPU acceleration, this minimal image maintains full deep learning capabilities while reducing attack surface. This guide demonstrates fine-tuning models and secure inference deployment.

{{< details "What is Deep Learning?" >}}
{{< blurb/deep-learning >}}
{{< /details >}}

{{< details "Setting up CUDA" >}}
{{< blurb/cuda >}}
{{< /details >}}

This guide is designed for use in an environment with access to one or more NVIDIA GPUs. However, the code below is written to also run in a CPU-only environment. Please note that tuning the model will take significantly longer in a CPU-only environment.

## Testing access to GPUs

Our first step is to check whether our PyTorch-CUDA environment has access to connected GPUs.

If you don't already have Docker Engine installed, follow the [instructions for installing Docker Engine on your host machine](https://docs.docker.com/engine/install/).

Run the below command to pull the container image, run it with GPU access, and start a Python interpreter inside the running container.

```bash
docker run --rm -it \
 --gpus all \
 cgr.dev/chainguard/pytorch:latest
```

Running the above for the first time may take a few minutes to pull the `pytorch` Chainguard Container, currently 3.3GB. Once the image runs, you will be interacting with a Python interpreter in the running container. Enter the following commands at the prompt to check the availability of your GPU.

```
Python 3.11.9 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

If the CUDA computing environment is accessible to PyTorch, `torch.cuda.is_available()` will return `True`. You should also check that at least one GPU is connected. If your environment only has access to CPU, you can complete the rest of this tutorial, but the step of fine-tuning the pretrained model will take significantly longer.

Once you've determined that your environment has access to CUDA and connected GPUs, exit the container by typing `Control-d` or by typing `exit()` and pressing `Enter`. You should be returned to the prompt of your host machine.

## Training and inference overview

A common workflow in deep learning is to collect labeled data, train a model using that data, and store the model. Later, this model can be loaded and used for inference, or making predictions based on novel inputs not in the training set. For example, we might train a model to recognize animals, then store the model as a serialized and compressed file. Later, and possibly in a new environment, we can load the model and use it to perform a classification task on novel data, such as an image of a whale provided by a user.

It is common for model training to be performed in a development environment, and for inference to be performed in a production environment. We will follow this assumption in this tutorial, but be mindful not to use privileged access or root users in production.

In this tutorial, we'll fine-tune a pretrained model for an image classification task: classifying whether a provided image is an octopus 🐙, a whale 🐳, or a penguin 🐧. We've chosen these animals in appreciation of Wolfi and Chainguard, Docker, and Linux, respectively. Rather than train a model from scratch, a process that requires a large set of input data, we'll start with a ResNet model with 18 layers ([resnet18](https://pytorch.org/vision/main/models/generated/torchvision.models.resnet18.html)). Using a fine-tuning approach with a pretrained model with relatively few layers is appropriate when using a limited amount of input data. In our case, we'll be using 60 images for each class, further divided into 40 training and 20 validation images.

For the training step, we'll be accessing the container image as root. This allows us to save the model to a volume and preserve it on the host system. In our inference step, we'll access the container as the non-root user, an approach that will be more secure for a production use case.

## Fine-tuning the model

In this section, we'll download prepared data to your environment, download a model training script, and run the script to train and save the model. These tasks will all be performed by running the below command. Further details on the Docker command, input data, and script are provided later in the section.

First check that `curl` and `tar` are available on your system, and install them if necessary. [Docker Engine](https://docs.docker.com/engine/install/) will also need to be installed.

Run the following to download necessary files and train the model. If there is an issue with the command, refer to the [manual step-by-step instructions](#manual-steps-to-fine-tune-the-model) below.

Note: if you're following this tutorial in an environment without access to GPU, remove the `--gpus all \` line below before running.

```bash
mkdir image_classification && cd image_classification
curl https://codeload.github.com/chainguard-dev/pytorch-getting-started/tar.gz/main | \
 tar -xz --strip=1 pytorch-getting-started-main/ && \
 docker run --user root --rm -it \
 --gpus all \
 -v "$PWD/:/home/nonroot/octopus-detector" \
 cgr.dev/chainguard/pytorch:latest \
 "/home/nonroot/octopus-detector/image_classification.py"
```

The above command creates a new folder, `image_classification`, and changes the working directory to that folder. It then uses `curl` to download the training script and training and validation images from GitHub as a tar file and extracts the files. A container based on the `pytorch` container image is then created and the script and data are shared between host and container in a volume. The model is trained using the provided script and data, and the resulting model is saved to the volume.

Training should take 1-3 minutes in a GPU-equipped environment, and 20-30 minutes in a CPU-only environment. Once the command completes, you can check your current working directory for a trained model as a `.pt` file:

```bash
$ ls
README.md  image_classification.py
data       octopus_whale_penguin_model.pt
```

## Manual steps to fine-tune the model

Below are manual steps to perform the above download and training procedure interactively. You may wish to follow these steps if you need to modify the above for your own use case, if you'd like to better understand the steps involved, or if you have difficulty running the above command in your environment. These steps use `git clone` rather than `curl`. Also note that this manual process uses the `:latest-dev` version of the container image, since the `:latest` container image does not include shells such as bash for increased security.

In the below steps, the prompt of your host machine will be denoted as `(host) $`, while the prompt of the container machine will be denoted as `(container) $`

1. Check that you have Git and Docker installed:

    ```bash
    (host) $ git --version
    git version 2.30.2
    (host) $ docker --version
    Docker version 20.10.17, build 100c701
    ```

2. Clone the [repository with the training and validation data and the training script](https://github.com/chainguard-dev/pytorch-getting-started) and `cd` into the cloned repository:

    ```bash
    (host) $ git clone https://github.com/chainguard-dev/pytorch-getting-started.git
    (host) $ cd pytorch-getting-started
    ```

3. Run the below command to start an interactive session in a running `pytorch` Chainguard Container with root access. If your environment doesn't have access to GPU, remove the `--gpus all \` line before running. Note the volume option, which creates a volume on the container based on the current working directory, allowing access to our training script and data inside the container. Remember that this guide assumes you are training the model in a controlled development environment—do not use root access in any production scenario.

    ```bash
    (host) $ docker run --user root --rm -it \
     --gpus all \
     --entrypoint bash \
     -v "$PWD/:/home/nonroot/octopus-detector" \
     cgr.dev/chainguard/pytorch:latest-dev
    ```

4. You should now have access to an interactive shell inside the container. Navigate to the created volume:

    ```bash
    (container) $ cd /home/nonroot/octopus-detector/
    (container) $ pwd
    /home/nonroot/octopus-detector
    ```

5. Run the model-training script:

    ```bash
    (container) $ python image_classification.py
    Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /root/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
    100.0%
    🐙 Epoch 0/24
    🐳 train Loss: 0.9276 Acc: 0.5583
    🐧 val Loss: 0.2275 Acc: 0.9500

    [...]

    🐙 Epoch 24/24
    🐳 train Loss: 0.1940 Acc: 0.9167
    🐧 val Loss: 0.0248 Acc: 1.0000

    Training complete in 1m 39s
    Best val Acc: 1.000000
    ```

6. If the script ran successfully, you should have a saved model serialized as a `.pt` file in the current working directory:

    ```bash
    (container) $ ls
    octopus_whale_penguin_model.pt data image_classification.py
    ```

7. At this point, you've trained your model. Shut down the container by pressing `Control-d` or by typing `exit` and pressing `Enter`. Since we used a volume, the model should also be present on the host machine:

    ```bash
    (host) $ ls
    octopus_whale_penguin_model.pt image_classification.py data
    ```

## Running inference

You have now downloaded the resnet18 pretrained model and fine-tuned it to detect three classes of images: octopuses, whales, and penguins. Now that the model is trained, we can load it, pass in a new image, and receive the model's prediction. Using an existing model for prediction is called inference, and in many common scenarios inference is run in a production environment. For this reason, we'll access our existing model with the nonroot user in this section.

The script ([image_classification.py](https://github.com/chainguard-dev/pytorch-getting-started/blob/main/image_classification.py)) run in the above commands has been written to check if a model exists in the same folder and, if present, load it. It will also perform inference if a path to an image is passed as an argument when the script is run. Since we should now have a model file present on our host machine, let's go ahead and run inference on a new image of an octopus.

Feel free to find your own image of an octopus on the web, or run the below command to download [an image](https://raw.githubusercontent.com/chainguard-dev/pytorch-getting-started/main/inference-images/octopus.jpg) not in the training data. The training data used realistic images, so you may not wish to choose, for example, a stylized or cartoon image of an octopus.

```bash
curl https://raw.githubusercontent.com/chainguard-dev/pytorch-getting-started/main/inference-images/octopus.jpg > octopus.jpg
```

Now that we have a novel input, let's run inference to classify the image:

```bash
 docker run --rm -it \
 --gpus all \
 -v "$PWD/:/home/nonroot/octopus-detector" \
 cgr.dev/chainguard/pytorch:latest \
 "/home/nonroot/octopus-detector/image_classification.py" \
 "/home/nonroot/octopus-detector/octopus.jpg"
```

After running this, you should see the model's classification of the image as output:

```bash
octopus
```

Feel free to try the above inference on other images of octopuses, whales, and penguins. The model should have high accuracy for images similar to those in the training set, which consists of photorealistic images.

## Notes on the script

In this section, we'll review the script provided in the above steps, highlighting some common options and approaches and a few ways the script might be adapted to other use cases. Deep learning is a complex and emerging field, so this section can only provide a high-level overview and a few recommendations for moving forward.

To fine-tune a model for image classification as we did here, you can replace the provided training and validation data with your own. The script examines the number of folders in the training set to determine the targeted number of classes. The folder names are used as class labels. We used 40 training and 20 validation images for each class, but a ratio of 5:1 training to validation may also produce good results.

By fine-tuning a pretrained model, we took advantage of transfer learning, meaning that the pretrained model (resnet18) was already trained on inputs with relevance to our classification task. Because we used transfer learning, the relatively small amount of input data was still sufficient for good accuracy in our fine-tuned model. If you're working with a large amount of input data, you might consider using a larger pretrained model, such as resnet34. In addition, if training using significantly more data or training using limited computation relative to the task, you may consider the more efficient convolutional neural network as fixed feature extractor approach, which trains only one attached layer rather than updates the original model.

PyTorch maintains a [set of guides](https://pytorch.org/tutorials/) that are frequently updated. These provide a good starting point when undertaking a new project in PyTorch. If you're new to the field of deep learning, the book [Deep Learning for Coders with Fastai and PyTorch](https://course.fast.ai/Resources/book.html) hosts [freely available materials on GitHub](https://github.com/fastai/fastbook).

---

### Overview of migrating to Chainguard Containers
_Path: chainguard/containers/migration/migrations-overview.md_

Chainguard Containers are minimal by design — most are [distroless](/chainguard/containers/getting-started-distroless/), with no shell or package manager. That keeps the attack surface small, but it also means moving an existing workload over usually requires adjusting how your image installs dependencies, which user it runs as, and what its entrypoint expects.

This guide covers the differences that matter during a migration, a recommended rollout strategy, and what to do when something breaks. For background on what Chainguard Containers are and how they are built, refer to the [Chainguard Containers overview](/chainguard/containers/overview/).

## Migration key points

* Most Chainguard Containers have no shell or package manager by default. This is great for security, but sometimes you need these things, especially in builder images. For those cases we have development container images (also known as `-dev` images, as in `cgr.dev/chainguard/python:latest-dev`) which do include a shell and package manager.
* The development variants and `wolfi-base` / `chainguard-base` use BusyBox by default, so any `groupadd` or `useradd` commands will need to be ported to `addgroup` and `adduser`.
* The free tier of Containers provides only the `:latest` and `:latest-dev` versions. Our paid Production Containers offer tags for major and minor versions.
* Chainguard Containers are [based on `glibc`](/chainguard/containers/concepts/glibc-vs-musl/) and our packages cannot be mixed with Alpine packages (which are instead based on musl).
* In some cases, the entrypoint in Chainguard Containers can be different from equivalent images based on other distros, which can lead to unexpected behavior. You should always check the image's specific documentation to understand how the entrypoint works.
* When needed, Chainguard recommends using a base image like `chainguard-base` or a development variant to install an application's OS-level dependencies.

Perhaps the best place for most users to get started with migrating to Chainguard Containers is by following our guide on [How to port a sample application to Chainguard Containers](/chainguard/containers/migration/porting-apps-to-chainguard/). This guide involves updating a sample application made up of three services to use Chainguard Containers. Although the application involved is fairly simple, the concepts outlined in the guide can also be useful for migrating more complex applications.

### Development containers

As mentioned previously, Chainguard's standard container images typically do not include a shell or package manager. This helps to minimize the size of containers and also reduces their potential attack surface, but many users find that they need images that include a shell or package manager to support their specific use case. For this reason, Chainguard offers development containers (also known as `-dev` variants, since their image tags are appended with `-dev`). These variants come with more tooling than our standard container images, including a shell and package manager.

Although development variants are still more secure than most popular container images based on other distros, for increased security on production environments we recommend combining them with a distroless variant in a multi-stage build.

Refer to our guide on [Chainguard's Container variants](/chainguard/containers/concepts/container-variants/) for more information on development containers.

### Full variants

For a number of our most popular Containers, Chainguard also offers *full* variants, whose tags are appended with `-full`. Unlike standard or development variants, full variants are designed to map to their upstream equivalent — typically the Debian-based image on Docker Hub — including the packages, environment variables, and entrypoint scripts that our minimal images omit. They exist primarily to ease migration: if your build or test pipelines depend on components from your previous image, starting with a full variant lets you adopt Chainguard Containers without untangling those dependencies first. Once you've migrated, we recommend moving to a slimmer variant that includes only what your workload needs.

Refer to our guide on [Chainguard's Container variants](/chainguard/containers/concepts/container-variants/#full-container-variants) for more information on full variants.

## Before migrating

Before you begin actively migrating to Chainguard Containers, review the images that your organization has access to and determine which teams and applications will be using each image. Notify the teams involved in the migration process so they can begin preparing. For teams that are new to Chainguard Containers, we recommend taking the online self-paced course, [Linky’s Guide to Chainguard Containers](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images).

Next, determine which users and/or systems are going to need access to your Chainguard registry in order to begin preparing access. Most customers will need to copy images from their Chainguard registry into their organization's registry. An easy way to do this is by configuring the organization's registry as a pull-through mirror of the Chainguard registry. We have a guide on [how to configure Artifactory](/chainguard/containers/registry/pull-through-guides/artifactory-containers-pull-through/) for this use case.

## Recommended rollout approach

When the goal is to migrate multiple deployments to Chainguard Containers, a major consideration is the strategy in which these container images are rolled out and deployed throughout your environment. The recommended rollout strategy for most customers is as follows:

* Start with less complex and non-critical applications to build confidence before migrating mission-critical workloads.
* Employ a gradual approach where you choose a small subset of container images and deploy those first to a non-production environment for testing and validation, and then to a small percentage of production instances and then gradually scale up.
* Use strategies like blue-green deployments or canary releases to introduce the updated container images gradually into production.

We understand that customers may have urgent timelines and need to accelerate Chainguard Container deployment by rolling out many images to a larger percentage of production simultaneously. For customers to be successful in this accelerated approach, we recommend the following:

* Have internal Chainguard Container champions identified and ready to lead and assist cross-functionally across teams.
* Your teams participating in the Chainguard Container migration should have the following technical skillset:
    * Familiarity with tools used to build images and run containers such as Docker CLI, Dockerfiles (including multi-stage builds), and orchestration platforms (Kubernetes, ECS, etc).
    * Experience using appropriate deployment security standards (such as the [Kubernetes Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/)).
    * Experience debugging containers that have no shell.
* Review and understand concepts in the [Shared responsibility model](/chainguard/containers/concepts/shared-responsibility-model/).
* Your organization should already have a mature container strategy in place, including:
    * Mature and Established UAT and regression testing processes.
    * Automated CI/CD with permissions restrictions and auditing.
    * Monitoring, logging and runtime security.

Finally, as you plan for the migration to Chainguard Containers you should ensure there’s a clear rollback plan in case of unforeseen issues during migration. Keep the previous container image tagged and accessible for quick redeployment if necessary.

### Adding certificates

A common requirement for many customers is to add a company specific certificate or other security related content. The three most common ways to accomplish this are:

1. [Incert](/chainguard/containers/custom-assembly/incert-custom-certs/)
2. Dockerfile and `update-ca-certificates` utility
3. Dockerfile and java keytool

The process of adding or updating certificates, configuring APK repositories, and implementing other organization-specific customizations into an image is commonly known as creating a “Golden Image”. This approach enables these standard modifications to be applied once and then distributed across all teams, thereby reducing the risk of errors and minimizing friction during the migration process.

### Image type considerations

Many Chainguard customers use both application and base container images, but it often takes more time to migrate your applications to a base image in comparison to an application image due to the complexity of coordinating multiple teams, testing, and release schedules. We recommend starting with and migrating to application images first while your teams get trained and onboarded with base images.

#### Application images

When migrating to a [Chainguard Application Container](/chainguard/containers/concepts/container-categories/#application-containers) you should first check the image’s overview page on the [Containers  Directory](https://images.chainguard.dev) for usage details and any compatibility notes. There may be user, permissions, or volume path differences with the Chainguard Image that you should be aware of.

It is a best practice to use the same version of the Chainguard Application Image as what is currently running in your environment, if that version is available from Chainguard. Post-migration you should thoroughly test and monitor your application.

#### Base images

When migrating to a [Chainguard Base Container](/chainguard/containers/concepts/container-categories/#base-containers) you should first check the images’s overview page on the [Containers Directory](https://images.chainguard.dev) for usage details and any compatibility remarks. You should understand the libraries, runtime requirements, and operating system dependencies of the applications you plan to have running on the base image.

It is a best practice to use the same versions of any languages or applications that will be running on the Chainguard Base Container as what is currently running in your environment. Do not upgrade language or application versions at the same time that you migrate. Post-migration you should test and monitor your application as outlined below in Section 6.

If you need a package to use with your Chainguard Base Container, ChainguardOS packages are available using `apk`. Ensure you only use ChainguardOS packages, as Alpine APKs are not compatible with ChainguardOS. Additionally, it is important to note that vendor provided packages need to be [glibc](/chainguard/containers/concepts/glibc-vs-musl/) based and their functionality should be fully tested along with the application.

### Extending Chainguard Containers

You can take advantage of Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) and [Private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) features to extend your container images

Custom Assembly allows users to create customers container images with extra packages added. This reduces their risk exposure by creating container images that are tailored to their internal organization and application requirements while still having few-to-zero CVEs.

Private APK Repositories, meanwhile, allow customers to pull secure apk packages from Chainguard. The list of packages available in an organization’s private repository is based on the apk repositories that the organization already has access to. For example, say your organization has access to the [Chainguard MySQL container image](https://images.chainguard.dev/directory/image/mysql/versions). Along with `mysql`, this image comes with other apk packages, including `bash`, `openssl`, and `pwgen`. This means that you'll have access to these apk packages through your organization's private APK repository, along with any others that appear in Chainguard container images that your organization has access to.

## Tips for migrating to Chainguard Containers

Although not fully comprehensive, it can be helpful to keep the following list of tips and strategies in mind when migrating to Chainguard Containers.

* Use development variants when you need a shell
* If necessary, install a different shell
* Use `apk search` to find the utilities needed by your application
* Beware of entrypoint differences between Chainguard Containers and their upstream counterparts
* Be aware that Chainguard Containers typically do not run as root by default
* If packages you need are missing, install them into a base image, preferably as part of a multi-stage build

Each of these tips and strategies are explained in greater detail in our guide on [Container migration tips](/chainguard/containers/migration/migration-tips/).

## Troubleshooting

The move to a distroless workflow can be confusing for both individual developers and larger teams. We recommend taking the following steps when you encounter issues as you begin using Chainguard Containers:

* **Debugging Distroless Container Images**: Debugging distroless images can be challenging due to the absence of a shell and package manager.
    * **Temporary Rebuild with `-dev` Tag**: Temporarily rebuild your image using the development variant to get a shell and other debugging tools. This is useful for local troubleshooting or in developer clusters.
        * Remember to remove the `-dev` tag before merging.
    * **Ephemeral Debug Containers**: In Kubernetes, use `kubectl debug` to launch an ephemeral container attached to the existing Pod for troubleshooting.
    * **Docker Debug**: While `docker debug` is available, it requires a Docker Desktop Pro license.
    * **`cdebug` and `kubectl debug`**: These tools allow you to enter a running container for debugging and can access the target container's file system.
    * **`chainctl images diff`**: This command allows you to compare two container images and identify differences between them.
* **General Troubleshooting Tips**:
    * Check the image's overview page in the [Containers Directory](https://images.chainguard.dev/) for specific usage details.
    * If you encounter issues, use a development image as a starting point.
    * Ensure you've replaced `apt install` or equivalent commands with `apk add`.
    * If elevated privileges are needed, use `USER root` before commands that require administrative access, then switch back to a non-root user before finalizing the image build.
    * Always check the image documentation for entrypoint details, as they may vary from other distributions. You can find entrypoint details in the [Specifications tab](https://images.chainguard.dev/directory/image/python/specifications) on any image's entry in the [Containers Directory](https://images.chainguard.dev/).

### Troubleshooting resources

To help with troubleshooting issues that can occur, Chainguard Academy has a guide on [Debugging distroless containers](/chainguard/containers/troubleshooting/debugging-distroless-images/).

Lastly, you might also find help in the [Chainguard Containers FAQs](/chainguard/containers/faq/).

## Migration resources

Once you have worked through the [sample application port](/chainguard/containers/migration/porting-apps-to-chainguard/#porting-key-points), the [Migration best practices and checklist](/chainguard/containers/migration/migration-checklist/) collects the steps worth running through before and during a rollout.

To automate Dockerfile migration, [The Guardener](/chainguard/guardener/dockerfile-migration/) is an AI-powered agent that iteratively converts, builds, and validates your Dockerfiles for use with Chainguard Containers.

Chainguard Academy groups the rest of its migration material into three sets:

* **[Migration guides](/chainguard/containers/migration/migration-guides/)** — language- and platform-specific guidance for Python, Node, PHP, .NET, Go, and Java.
* **[Compatibility guides](/chainguard/containers/migration/compatibility/)** — what changes when moving from Alpine, Debian, Red Hat, or Ubuntu.
* **[Getting started guides](/chainguard/containers/getting-started/)** — how to work with a specific Container, several with a sample application.

### Courses

Chainguard also offers a number of courses aimed to help teams understand and use Chainguard Containers.

#### Quickstart

* [Chainguard Containers Crash Course](https://courses.chainguard.dev/linkys-crash-course-on-chainguard-images): A quick overview of everything you need to know to get started ASAP.

#### Getting started (developer-focused)

* [Getting Started With Chainguard Containers](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/getting-started-with-chainguard-images): Intro to everything you need to know - from basic setup to security scanning.
* [Foundations of Supply Chain Security](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/foundations-of-software-supply-chain-security): The what, why, and how of keeping your software supply chain secure.
* [Migration guidance](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/migration-guidance): Your friendly guide to moving to Chainguard Containers without the headaches.

#### Level up (next level courses)

* [Foundations of Supply Chain Security](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/foundations-of-software-supply-chain-security): The what, why, and how of keeping your software supply chain secure.
* [Images! Images! Images!](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/images-images-images): Become an image expert - from FIPS to SBOMs and everything in between.
* [Crush Your CVEs](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/crush-your-cves): Master vulnerability management and keep your systems secure.

#### Running the show (admin courses)

* [Registry Rockstar](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/registry-rockstar): Everything you need to know about managing access, identity, and registry setup.
* [Chainguard's Superstar Support](https://courses.chainguard.dev/path/linkys-guide-to-chainguard-images/chainguards-superstar-support): Get the most out of Chainguard's support resources and tools.

## Further reading

* [Overview of Chainguard Containers](/chainguard/containers/overview/)
* [How to use Chainguard Containers](/chainguard/containers/using-and-deploying/using-containers/)
* [How to transition to secure container images with new migration guides (Blog)](https://www.chainguard.dev/unchained/how-to-transition-to-secure-container-images-with-new-migration-guides)
* [Getting started with distroless containers](/chainguard/containers/getting-started-distroless/)

---

### Migrating Dockerfiles to Chainguard Containers
_Path: chainguard/containers/migration/migrating-to-chainguard-images.md_

Chainguard Containers provide enhanced security through minimal design and built-in provenance attestation, requiring some adjustments when migrating from traditional base images. Built on the [Wolfi](/open-source/wolfi/overview/) Linux distribution, these images offer compatibility with most applications while significantly reducing attack surface and vulnerabilities.

A general migration process would involve the following steps:

1. **Identify the base image you need**. Check out the [Chainguard Containers Directory](https://images.chainguard.dev/directory?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-to-chainguard-images) to identify the image that is the closest match to what you currently use. You may also use [wolfi-base](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-to-chainguard-images) as a flexible starting point for your experimentation.
2. **Try the `-dev` variant of the image first.** Chainguard Containers typically have a **distroless** variant, which is very minimal and doesn't include `apk`, and a **dev** variant that contains tooling necessary to build applications and install new packages. Start with the **dev** variant or the **wolfi-base** image to have more room for customization.
3. **Identify packages you need to install**. Depending on your current base image, you may need to include additional packages to meet dependencies. Refer to the [Searching for packages](#searching-for-packages) section for more details on how to find packages. Make sure the packages you intend to install will work with the base image you select — for example, if you select an older base image built with an older release of `glibc` and want to install newer packages built with a newer release, you will encounter problems. It's a good rule of thumb to use the newest base image you can with the newest packages that match the build.
4. **Migrate to a distroless image**. Evaluate the option of using a Docker multi-stage build to create a final distroless image containing only what you need. Check the [Getting started with distroless images](/chainguard/containers/getting-started-distroless/) for more details of how to work with distroless images. Although not required, this process should give you a smaller image with additional safeguards.

There are some differences in Wolfi's `busybox` and `coreutils` packages when compared to their counterparts in distros such as Debian or even Alpine. Some binaries and scripts are not included by default, which contributes to a smaller package size. This was done in order to keep images to a minimum, but be aware that some commands might still be available through separate packages.

The next sections of this page contain distro-specific information that should help you streamline the migration process from your current base images to Chainguard images.

## Migrating from Debian and Ubuntu Dockerfiles

Chainguard Containers use the [apk](https://wiki.alpinelinux.org/wiki/Package_management) package format, which differs from the Debian-based `apt` in several ways. Some of these features contribute in making packages smaller and more accountable, resulting in smaller images with traceable provenance information based on cryptographic signatures. The page [Why apk](/open-source/wolfi/apk-package-manager/) from the official Wolfi documentation explains in more detail why we use apk.

If you are coming from a Debian-based Dockerfile, you'll need to adapt some of your commands to be compatible with the apk ecosystem:

| Command Description          | Debian-based Dockerfile | Wolfi-based Equivalent |
|------------------------------|-------------------------|------------------------|
| Install a package            | `apt install`           | `apk add`              |
| Remove a package             | `apt remove`            | `apk del`              |
| Update package manager cache | `apt update`            | `apk update`           |

Our [Debian compatibility](/chainguard/containers/migration/compatibility/debian-compatibility/) page has a table listing common tools and their corresponding package(s) in both Wolfi and Debian distributions. For Ubuntu-based Dockerfiles, check our [Ubuntu compatibility](/chainguard/containers/migration/compatibility/ubuntu-compatibility/) page.

## Migrating from Red Hat UBI Dockerfiles

If you are coming from a Red Hat UBI (Universal Base Image) Dockerfile, you'll also need to adapt some of your commands to be compatible with the apk ecosystem. Wolfi uses BusyBox utilities, which offer a smaller footprint compared to GNU coreutils in Red Hat images. Our [Red Hat compatibility](/chainguard/containers/migration/compatibility/red-hat-compatibility/) page has a table listing common tools and their corresponding package(s) in both Wolfi and Red Hat distributions.

If you are coming from a Red Hat UBI based Dockerfile, you'll need to adapt some of your commands to be compatible with the apk ecosystem:

| Command Description          | Red Hat UBI Dockerfile | Wolfi-based Equivalent |
|------------------------------|------------------------|------------------------|
| Install a package            | `yum install`          | `apk add`              |
| Remove a package             | `yum remove`           | `apk del`              |
| Update package manager cache | `yum makecache`        | `apk update`           |

## Migrating from Alpine Dockerfiles

If your Dockerfile is based on Alpine, the process for migrating to Chainguard Containers should be more straightforward, since you're already using `apk` commands. Wolfi packages typically match what is available in Alpine, with some exceptions. For instance, the Wolfi busybox package is slimmer and doesn't include all tools available in Alpine's busybox. Check the [Alpine compatibility](/chainguard/containers/migration/compatibility/alpine-compatibility/) page for a list of common tools and their corresponding packages in Wolfi and Alpine.

Be aware that binaries are not compatible between Alpine and Wolfi. You **should not** attempt to copy Alpine binaries into a Wolfi-based container image.

## Searching for packages

Packages from Debian and other base distributions might have a different name in Wolfi. To search for packages, log into an ephemeral container based on `cgr.dev/chainguard/wolfi-base`:

```shell
docker run -it --rm --entrypoint /bin/sh cgr.dev/chainguard/wolfi-base
```

Then, run `apk update` to update the local apk cache with latest Wolfi packages:

```shell
apk update
```

You'll get output similar to this:

```
fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
[https://packages.wolfi.dev/os]
OK: 46985 distinct packages available
```

Now you can use `apk search` to look for packages. The following example searches for PHP 8.2 XML extensions:

```shell
apk search php*8.2*xml*
```

You should get output similar to this:

```
php-8.2-simplexml-8.2.17-r0
php-8.2-simplexml-config-8.2.17-r0
php-8.2-xml-8.2.17-r0
php-8.2-xml-config-8.2.17-r0
php-8.2-xmlreader-8.2.17-r0
php-8.2-xmlreader-config-8.2.17-r0
php-8.2-xmlwriter-8.2.17-r0
php-8.2-xmlwriter-config-8.2.17-r0
php-simplexml-8.2.11-r1
php-xml-8.2.11-r1
php-xmlreader-8.2.11-r1
php-xmlwriter-8.2.11-r1
```

### Searching which package has a command

To search in which package you can find a command, you can use the syntax `apk search cmd:command-name`. For instance, if you want to discover which package has the command `useradd`, you can use:

```shell
apk search cmd:useradd
```

You'll get output indicating that the `shadow` package has the command you are looking for.

```
shadow-4.15.1-r0
```

### Searching for package dependencies

To check for package dependencies, you can use the syntax `apk search -R info package-name`. For example, to search which packages are listed as dependencies for the `shadow` package that we've seen in the previous section, you can run:

```shell
apk -R info shadow
```

And this will give you a list of dependencies for each version of the `shadow` package currently available:

```
...
shadow-4.15.1-r0 depends on:
so:ld-linux-x86-64.so.2
so:libbsd.so.0
so:libc.so.6
so:libcrypt.so.1
so:libpam.so.0
so:libpam_misc.so.0
```

### Searching for packages that include a shared object

To search which packages include a shared object, you can use the syntax `apk search so:shared-library`. As an example, if you want to check which packages include the `libxml2` shared library, you can run something like:

```shell
apk search so:libxml2.so*
```

And this should give you output indicating that this shared object is included within the `libxml2-2.12.6-r0` package.

For detailed information about apk options and flags when searching for packages, check the [official documentation](https://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html#_searching_for_packages).

## Resources to learn more

Our [Getting started guides](/chainguard/containers/getting-started/) have detailed examples for different language ecosystems and stacks. Make sure to also check image-specific information in our [Chainguard Containers Directory](https://images.chainguard.dev/directory?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-to-chainguard-images).

If you can't find an image that is a good match for your use case, or if your build has dependencies that cannot be met with the regular catalog, [get in touch with us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) for alternative options.

To automate the process of migrating your Dockerfiles, check out [The Guardener](/chainguard/guardener/dockerfile-migration/), an AI-powered agent that iteratively converts, builds, and validates your Dockerfiles for use with Chainguard Containers.

---

### Migration best practices and checklist
_Path: chainguard/containers/migration/migration-checklist.md_

Chainguard container images are designed to be minimal and to include special features for increased security and provenance attestation. Depending on your current base image and customizations, you may need to make some adjustments when migrating your current workloads to use Chainguard Containers. This checklist provides a high-level overview of the steps you should consider when migrating to Chainguard Containers.

> **Download the [PDF version](/downloads/migrating-to-chainguard-images.pdf) of this checklist [here](/downloads/migrating-to-chainguard-images.pdf)!**

## Important to know

- Most Chainguard Containers don’t have a package manager or a shell by default. These are **distroless** images intended to be used as slim runtimes for production environments.
- For every version of an image, a complimentary **standard** image is provided with a shell and the apk package manager. These are identified by the `-dev` suffix and can be customized.
- When possible, we recommend using multistage builds that combine a build stage based on a `-dev` variant and a runtime stage based on a distroless image.
- Chainguard Containers typically don’t run as root, so a `USER root` statement may be required before installing software.
- Chainguard Containers are based on **apk**. If you’re coming from Debian or Ubuntu you’ll need to replace `apt` commands with their `apk` equivalents. This also applies for other distros that are not based on **apk**.
- Some images may behave differently than their equivalent in other distros, due to differences in entrypoint and shell availability. Always check the image documentation for usage details.
- For a number of our most popular Containers, a **full** variant (tagged `-full`) maps to the upstream image to ease initial migration. It's a useful starting point if your pipeline depends on packages from your previous image, though we recommend moving to a slimmer variant once you've migrated. Refer to [Full container variants](/chainguard/containers/concepts/container-variants/#full-container-variants).

## Migration checklist

- [ ] Check the image’s overview page on the [Containers Directory](https://images.chainguard.dev) for usage details and any compatibility remarks.
- [ ] Replace your current base image with a standard `-dev` (such as `latest-dev`) variant as a starting point.
- [ ] Add a `USER root` statement before package installations or other commands that must run as an administrative user.
- [ ] Replace any instances of `apt install` (or equivalent) with `apk add`.
- [ ] Use `apk search` on a running container or the [APK Explorer](https://apk.dag.dev/) tool to identify packages you need – some commands might be available with different names or bundled with different packages.
- [ ] When copying application files to the image, make sure proper permissions are set.
- [ ] Switch back to a non-root user so that the image does not run as root by default.
- [ ] Build and test your image to validate your setup.
- [ ] Optional: migrate your setup to a multi-stage build that uses a distroless image variant as runtime. Our [Getting started with distroless](https://edu.chainguard.dev/chainguard/containers/concepts/getting-started-distroless/) guide has detailed information on how to work with distroless images and multi-stage builds.

For detailed migration guidance, please refer to our [Migration docs](https://edu.chainguard.dev/chainguard/containers/migration/) on Chainguard Academy. For troubleshooting, check our [Debugging distroless containers](https://edu.chainguard.dev/chainguard/containers/troubleshooting/debugging-distroless-images/) resource.

---

### Tips for migrating to Chainguard Containers
_Path: chainguard/containers/migration/migration-tips.md_

The process of migrating over to Chainguard Containers isn't always straightforward. To help customers become acquainted with Chainguard Containers as they go through the migration process, we've assembled this list of tips and strategies for migrating over their applications.

## Use development variants when you need a shell

Chainguard provides development (or `-dev`) variants of its containers which include a shell and package manager to allow users to more easily debug and modify the image.

To illustrate, if you try to get a shell in the `cgr.dev/chainguard/nginx:latest` image it will return an error:

```bash
docker run -it --entrypoint /bin/sh --user root cgr.dev/chainguard/nginx:latest

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown.
```

But this is possible with the `latest-dev` variant:

```bash
docker run -it --entrypoint /bin/sh --user root cgr.dev/chainguard/nginx:latest-dev

/ # apk add php
fetch https://packages.wolfi.dev/os/aarch64/APKINDEX.tar.gz
(1/6) Installing xz (5.4.6-r0)
(2/6) Installing libxml2 (2.12.6-r0)
(3/6) Installing php-8.2-config (8.2.18-r0)
(4/6) Installing readline (8.2-r3)
(5/6) Installing sqlite-libs (3.45.1-r0)
(6/6) Installing php-8.2 (8.2.18-r0)
OK: 66 MiB in 38 packages

/ #
```

Although the `-dev` variants have similar security features as their distroless counterparts — such as complete SBOMs and signatures — they feature additional software that is typically not necessary in production environments. The general recommendation is to use the `-dev` variants only to build the application and then copy all application artifacts into a distroless image, which will result in a final container image that has a minimal attack surface and won't allow package installations or logins.

That being said, it's worth noting that `-dev` variants of Chainguard Containers are completely fine to run in production environments. After all, the `-dev` variants are still **more secure** than many popular container images based on fully-featured operating systems such as Debian and Ubuntu since they carry less software, follow a more frequent patch cadence, and offer attestations for what they include.

## Install a different shell

The `-dev` variants and `chainguard-base` image use the [ash](https://en.wikipedia.org/wiki/Almquist_shell) shell from BusyBox by default. This is nice from a minimalism perspective, but it's not so great if you need to port a bash and Debian centric entrypoint script to Chainguard Containers.

In these cases you have a choice — you can update your scripts to work in ash, or you can install the shell that works with your scripts. There's no reason to be stuck on the ash shell if you really need bash or zsh.

For example:

```bash
docker run -it cgr.dev/$ORGANIZATION/chainguard-base

423450e3fd52:/# echo {1..5}
{1..5}

423450e3fd52:/# apk add bash
fetch https://packages.wolfi.dev/os/aarch64/APKINDEX.tar.gz
(1/3) Installing ncurses-terminfo-base (6.4_p20231125-r1)
(2/3) Installing ncurses (6.4_p20231125-r1)
(3/3) Installing bash (5.2.21-r1)
OK: 20 MiB in 17 packages

423450e3fd52:/# bash

423450e3fd52:/# echo {1..5}
1 2 3 4 5

423450e3fd52:/#
```

Note that this example uses the `chainguard-base` image, which is only available as a paid Production Container. To follow along with this example, you would need to be part of an organization that has access to this image.

## Use `apk search`

Following on from the last point, you'll often need to install extra utilities to provide required dependencies for applications and scripts. These dependencies are likely to have different package names compared to other Linux distributions, so the `apk search` command can be very useful for finding the package you need.

For example, say we are porting a Dockerfile that uses the `groupadd` command. We could convert this to the BusyBox `addgroup` equivalent, but it's also perfectly fine to add the `groupadd` utility. The only issue is that there's no `groupadd` package, so we have to search for it:

```bash
docker run -it cgr.dev/$ORGANIZATION/chainguard-base

ae154854dc6d:/# groupadd
/bin/sh: groupadd: not found

ae154854dc6d:/# apk add groupadd
ERROR: unable to select packages:
  groupadd (no such package):
 required by: world[groupadd]

ae154854dc6d:/# apk search groupadd
shadow-4.15.1-r0

ae154854dc6d:/# apk add shadow
(1/4) Installing libmd (1.1.0-r1)
(2/4) Installing libbsd (0.12.2-r0)
(3/4) Installing linux-pam (1.6.1-r0)
(4/4) Installing shadow (4.15.1-r0)
OK: 20 MiB in 18 packages

ae154854dc6d:/# groupadd
Usage: groupadd [options] GROUP

Options:
  -f, --force                exit successfully if the group already exists,
                             and cancel -g if the GID is already used
  -g, --gid GID              use GID for the new group
  -h, --help                 display this help message and exit
  -K, --key KEY=VALUE        override /etc/login.defs defaults
  -o, --non-unique           allow to create groups with duplicate
                             (non-unique) GID
  -p, --password PASSWORD    use this encrypted password for the new group
  -r, --system               create a system account
  -R, --root CHROOT_DIR      directory to chroot into
  -P, --prefix PREFIX_DIR    directory prefix
  -U, --users USERS          list of user members of this group
```

Another useful trick is the `cmd:` syntax for finding packages that provide commands. For example, searching for `ldd` returns multiple results:

```bash
ae154854dc6d:/# apk search ldd
dpkg-dev-1.22.6-r0
nfs-utils-2.6.4-r1
posix-libc-utils-2.39-r1
```

But if we use the `cmd:` syntax we only get a single result:

```bash
ae154854dc6d:/# apk search cmd:ldd
posix-libc-utils-2.39-r1
```

And we can even use the syntax directly in `apk add`:

```bash
ae154854dc6d:/# apk add cmd:ldd
(1/4) Installing ncurses-terminfo-base (6.4_p20231125-r1)
(2/4) Installing ncurses (6.4_p20231125-r1)
(3/4) Installing bash (5.2.21-r1)
(4/4) Installing posix-libc-utils (2.39-r1)
OK: 27 MiB in 22 packages
```

## Watch out for entrypoint differences

In some cases, the entrypoint of Chainguard Containers can have a different behavior from their equivalent images based on other distros. This happens because many popular container images use an entrypoint script that allows running commands on the image through a shell. Since our images typically don't have a shell by default, this can lead to unexpected behavior.

For example, if you run Docker Hub's official Python image, it opens the Python interpreter by default:

```bash
docker run -it python
Python 3.12.3 (main, Apr 10 2024, 11:26:46) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

And the Chainguard Container works in the same way:

```bash
docker run -it cgr.dev/chainguard/python
Python 3.12.3 (main, Apr  9 2024, 16:36:34) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
```

But if you pass a Linux command to the Docker Hub image, it will be run from a shell:

```bash
docker run -it python echo "in a shell"
in a shell
```

The Chainguard Python image doesn't use an entrypoint script. It relies on the Python interpreter as single entrypoint for both the `latest` and the `latest-dev` variants. So instead of executing the command through a shell, it tries to parse the command as an argument to the Python interpreter:

```bash
docker run -it cgr.dev/chainguard/python echo "in a shell"
/usr/bin/python: can't open file '//echo': [Errno 2] No such file or directory
```

The same behavior can be observed in the `latest-dev` variant, which does contain a shell, but uses the Python interpreter as entrypoint to keep consistency with the `latest` variant:

```bash
docker run -it cgr.dev/chainguard/python:latest-dev echo "in a shell"
/usr/bin/python: can't open file '//echo': [Errno 2] No such file or directory
```

Other images, such as our [WordPress container images](https://images.chainguard.dev/directory/image/wordpress/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrations-overview), will have a different entrypoint behavior in their `-dev` variant to allow for customization and to facilitate migration from other base images. It's important to always read the image's documentation to understand how the entrypoint works, and if there are any major differences from other images you may be used to work with.

## Containers don't run as root by default

Although there are exceptions, Chainguard Containers typically don’t run as the root user. The reason for this is that distroless containers should have no privileged capabilities, and containers that run as a non-root user and use a minimal seccomp profile are ideal from a security perspective.

Because they don't run as the root user, you may need to include a `USER root` statement in your Dockerfile before installing software on a Chainguard Container.

Additionally, be aware that `-dev` images also do not run as root in most cases, which can result in permission errors like the following:

```bash
docker run -it --entrypoint bin/bash chainguard/python:latest-dev

bash-5.2$ mkdir test
mkdir: can't create directory 'test': Permission denied

bash-5.2$ sudo mkdir test
bash: sudo: command not found
```

In cases like this, you can instead run a command like the following to access the container's shell as the root user:

```bash
docker run -it --user root --entrypoint bin/bash chainguard/python:latest-dev
```

Here, the `--user` option tells Docker to assume the root user role.

## Packages not found

Container images are usually meant to support every possible use case. Because of this, they often contain packages that aren't always necessary, which increases the container image's attack surface and makes it more likely to contain CVEs.

Chainguard Containers are built with minimalism in mind, and thus contain the bare minimum packages needed for an image to function. However, this also means that Chainguard Containers may not contain the packages that you'd expect to find in third-party alternatives.

If a Chainguard Container is missing certain packages that are required for your application, we recommend using a base image and installing the required dependencies on top of it, preferably in a multi-stage Docker build. Our guides on [How to use Chainguard Containers](/chainguard/containers/using-and-deploying/using-containers/#extending-chainguard-base-containers) and [Getting started with distroless](/chainguard/containers/migration/migrations-overview/) include guidance on how you can extend Chainguard base images.

For a number of our most popular Containers, Chainguard offers a *full* variant (tagged `-full`) that maps to the upstream image, including the packages you'd expect from the third-party alternative. If a full variant is available for an image you're migrating, it can serve as a low-friction starting point while you determine which packages your workload actually needs. Refer to [Full container variants](/chainguard/containers/concepts/container-variants/#full-container-variants) for details.

Alternatively, you can take advantage of Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) and [Private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) features to extend your container images. Custom Assembly allows users to create customers container images with extra packages added. This reduces their risk exposure by creating container images that are tailored to their internal organization and application requirements while still having few-to-zero CVEs.

Private APK Repositories, meanwhile, allow customers to pull secure apk packages from Chainguard. The list of packages available in an organization’s private repository is based on the apk repositories that the organization already has access to. For example, say your organization has access to the [Chainguard MySQL container image](https://images.chainguard.dev/directory/image/mysql/versions). Along with `mysql`, this image comes with other apk packages, including `bash`, `openssl`, and `pwgen`. This means that you'll have access to these apk packages through your organization's private APK repository, along with any others that appear in Chainguard container images that your organization has access to.

In some cases you may have Docker builds that copy in binaries to run agents or similar tooling. You may find these binaries don’t work as expected as they are designed to run on a different Linux distribution. Be aware that Chainguard Containers may not have the dependencies required by third-party binaries, or they may be stored at a different path.

## Learn more

For more resources on migrating to Chainguard Containers, please refer to our [Containers migration documentation](/chainguard/containers/migration/). In particular, our [Migration overview](/chainguard/containers/migration/migrations-overview/) may be of interest. Chainguard Academy also hosts a number of [Compatibility resources](/chainguard/containers/migration/compatibility/) and [Migration guides](/chainguard/containers/migration/migration-guides/) for specific platforms and tools.

---

### Migrate a Python application to Chainguard Containers
_Path: chainguard/containers/migration/migration-guides/python.md_

Chainguard's Python containers provide a migration path to significantly reduce vulnerabilities in Python applications while maintaining full compatibility with existing workloads. This guide explains how to migrate your containerized Python applications to benefit from Chainguard's enhanced security posture and daily updates.

Chainguard Containers are built on [Wolfi](/open-source/wolfi/), a [distroless](/software-security/videos/distroless/) Linux distribution designed for security and a reduced attack surface. Chainguard Containers are smaller and have few or no CVEs. Our Chainguard Containers for Python are built nightly for extra freshness, so they're always up-to-date with the latest remediations.

{{< details "What is Distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi OS?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

Because Chainguard Containers aim to be minimal, adapting your containerized application requires that you consider some additional factors, which the following sections describe.

## Chainguard Containers for Python overview

We distribute two versions of our [Python container image](https://images.chainguard.dev/directory/image/python/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-python): a development image that includes shells such as ash/bash and package managers such as pip and a standard image that removes these tools for increased security. Our public standard images are tagged as `latest`, while our public development images are tagged as `latest-dev`.

## Differences from the Docker Official Image

When migrating your Python application, keep in mind these differences between the [Chainguard Container for Python](https://images.chainguard.dev/directory/image/python/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-python) and the [official Docker image](https://hub.docker.com/_/python).

- The entrypoint for the Chainguard Container for Python is `/usr/bin/python`. When running either the `latest` or `latest-dev` versions of the image interactively, you'll be working in the Python interpreter. When using `CMD` in your Dockerfiles, the container passes the provided commands to `python` by default. If you change the path to include binaries from a virtual environment, you should manually set the entrypoint. Otherwise, your Dockerfile continues to use the included system Python as the entrypoint, and you won't have access to installed packages in the virtual environment.
- Chainguard Containers for Python run as the `nonroot` user by default. If you need elevated permissions, such as to add packages with `apk`, run the image as `--user root`. You should not use the root user in a production scenario.
- The `/home` and `/home/nonroot` directories are owned by the nonroot user.
- The `python:latest` Chainguard Container intended for production does not include a `sh`, `ash`, or `bash`. Refer to the [Debugging distroless](/chainguard/containers/debugging-distroless-images/) guide for advice on resolving issues without the use of these shells.
- The `python:latest` Chainguard Container does not contain package managers such as `pip` or `apk`. See the sections below for guidance on multi-stage builds (recommended) or building your own images on Wolfi (advanced usage).
- Chainguard Containers for Python aim to be lightweight, and you may find that specific packages or dependencies are not included by default. The [image details reference](https://images.chainguard.dev/directory/image/python/specifications?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-python) provides specific information on packages, features, and default environment variables for the image.

## Migrating a Python application

When migrating most containerized Python applications, we recommend building a virtual environment with any needed Python packages using our provided development images, then copying over the virtual environment to our stripped-down standard image. Chainguard Academy hosts [detailed instructions for a multi-stage build for a CLI-based Python script](/chainguard/containers/getting-started/languages-and-runtimes/python/).

The below Dockerfile provides an example of such a multi-stage build for a simple Flask application. You can view a version of this Dockerfile with included sample Flask application and `requirements.txt` in [this repository](https://github.com/chainguard-dev/cg-images-python-migration/tree/python-only), and the original unmigrated application in the [v0 branch](https://github.com/chainguard-dev/cg-images-python-migration/tree/v0). A more complex setup with reverse proxy orchestrated with Docker Compose is provided in the next section.

```Dockerfile
# syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/python:latest-dev AS dev

WORKDIR /flask-app

RUN python -m venv --without-pip venv
ENV PATH="/flask-app/venv/bin":$PATH
COPY requirements.txt requirements.txt
RUN pip --python /flask-app/venv/bin/python install -r requirements.txt

FROM cgr.dev/chainguard/python:latest

WORKDIR /flask-app

COPY app.py app.py
COPY --from=dev /flask-app/venv /flask-app/venv
ENV PATH="/flask-app/venv/bin:$PATH"

EXPOSE 8000

ENTRYPOINT ["python", "-m", "gunicorn", "-b", "0.0.0.0:8000", "app:app"]
```

When running an application containerized with the above Dockerfile, the application should be visible on `0.0.0.0:8000`.

As you can see, the primary difference in this Flask application compared to the pre-migration application is the use of a multistage build. In the initial stage, we copy our requirements into the development version of the Python Chainguard Image, initialize a virtual environment, and install needed packages with pip. In the second stage, we copy the virtual environment from the development image, copy the application from the host, set exposed port metadata, and run the application with the [Gunicorn](https://gunicorn.org/) WSGI server.

We create the virtual environment with `--without-pip` and install into it with `pip --python`, which runs the development image's own pip against the virtual environment. Because the second stage copies that environment into the production image, anything installed there ships to production. Leaving pip out keeps the production image limited to the packages your application imports.

By default, the entrypoint for the Python Chainguard Container is `/usr/bin/python` rather than `bash`. However, if you shadow the included system `python` with the virtual environment `python` on the path as we do above, you should set the entrypoint explicitly. Otherwise, you won't have access to the packages included in your virtual environment.

We recommend that you pin dependencies to specific versions in your own application. The example Flask application script linked above also enables debug mode, which should be turned off in a production scenario.

You may wish to include the following environmental variables in your Dockerfile. The first prevents the buffering of output, meaning that all messages printed to standard output are immediately printed rather than being held in a cache. The second prevents the creation of cached bytecode, which can marginally reduce image size.

```Dockerfile
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
```

## Serving an application with nginx and Docker Compose

We provide an [nginx Chainguard Container](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-python), also built on Wolfi and rebuilt daily, that can be used as a secure and performant reverse proxy to serve your application. You can view an [example orchestration of a Flask application and nginx using Chainguard Containers](https://github.com/chainguard-dev/cg-images-python-migration/tree/compose-flask-nginx) at the linked repository. The `compose.yml` file is provided as a reference below.

```Dockerfile
services:
  flask-app:
    build:
      context: flask-app
    restart: always
    ports:
      - 8000:8000
    networks:
      - backnet
      - frontnet
  nginx:
    build: nginx
    restart: always
    ports:
      - 80:80
    depends_on:
      - flask-app
    networks:
      - frontnet

networks:
  backnet:
  frontnet:
```

The backnet and frontnet networks are provided in anticipation of other backend services such as a database container. View the [sample repository branch](https://github.com/chainguard-dev/cg-images-python-migration/tree/compose-flask-nginx) for a full orchestration example with nginx configuration.

## Advanced usage

If your project image requires a set of packages that cannot be installed with pip using the multi-stage approach above, you can consider building your application on the [Wolfi base image](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-python) and installing additional Python and non-Python packages as APKs.

## Additional resources

You may wish to refer to the [Python microservice example](/chainguard/containers/migration/porting-apps-to-chainguard/#updating-the-python-microservice) in the [porting a sample application guide](/chainguard/containers/migration/porting-apps-to-chainguard/) as an additional useful reference while migrating your application.

Debugging distroless containers can be a challenge given their lack of interactive tools such as shells. If you're having difficulty debugging issues with your multi-stage build, you may find the [Debugging distroless](/chainguard/containers/debugging-distroless-images/) guide a useful resource.

The following blog posts and videos may also assist with migrating your Python application:

- [Blog post: Securely Containerize a Python Application with Chainguard Containers](https://dev.to/chainguard/securely-containerize-a-python-application-with-chainguard-images-bn8)
- [Video: How to containerize a Python application with a multi-stage build using Chainguard Containers](https://www.youtube.com/watch?v=2D0JULd4E5A)

---

### Migrate a .NET application to Chainguard Containers
_Path: chainguard/containers/migration/migration-guides/dotnet.md_

Chainguard's [.NET container images](https://images.chainguard.dev/directory/image/dotnet-sdk/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-dotnet) provide a security-hardened foundation for building and running applications with significantly fewer vulnerabilities than .NET images provided by Microsoft. Chainguard's .NET container images maintain full .NET compatibility while dramatically reducing the attack surface.

This guide demonstrates migrating a .NET application from Microsoft's official images to Chainguard's .NET container images by building one application with two different Dockerfiles and comparing the results side by side. This guide also highlights concrete examples of the security improvements resulting from migrating to Chainguard Containers.

## Prerequisites

This tutorial uses the publicly available .NET container images from Chainguard's [Free tier](/chainguard/containers/concepts/container-categories/#free-containers) of images. You don't need special access or permissions to use these images.

To follow along, you must have Docker installed on your local machine. If you don't have Docker installed, you can download and install it from the [official Docker website](https://docs.docker.com/get-docker/). Optionally, you can install [Grype](https://github.com/anchore/grype) to scan container images for vulnerabilities and compare the security posture of different base images.

## Retrieving the demo application files

This step involves downloading the demo application code to your local machine. To prevent the application files from remaining on your system, navigate to a temporary directory like `/tmp/`:

```sh
cd /tmp/
```

Most systems automatically delete the `/tmp/` directory's contents the next time they shut down or reboot.

The code that comprises this demo application is hosted in a [public GitHub repository managed by Chainguard](https://github.com/chainguard-dev/edu-images-demos). Pull down the example application files from GitHub with the following command:

```sh
git clone --sparse https://github.com/chainguard-dev/edu-images-demos.git
```

Because this guide's demo application code is stored in a repository with other examples, we don't need to pull down every file from this repository. For this reason, this command includes the `--sparse` option. This initializes a [sparse-checkout](https://git-scm.com/docs/git-sparse-checkout) file, causing the working directory to contain only the files in the root of the repository until you modify the sparse-checkout configuration.

Navigate into this new directory:

```sh
cd edu-images-demos/
```

To retrieve the files you need for this tutorial's sample application, run the following `git` command:

```sh
git sparse-checkout set dotnet
```

This modifies the sparse-checkout configuration initialized in the previous `git clone` command so that the checkout only consists of the repo's `dotnet` directory.

Navigate into the `dotnet` directory:

```sh
cd dotnet/
```

This directory holds a single .NET application along with two Dockerfiles that build it:

- `notlinky.Dockerfile`: Builds the application on Microsoft's official .NET images
- `linky.Dockerfile`: Builds the same application on Chainguard Containers

Both Dockerfiles compile the same `Program.cs` and `dotnetapp.csproj`, so the only difference between the two images comes from the base images each Dockerfile uses.

## Understanding the demo application

The demo application is a .NET console program that displays runtime and system information, including:

- Operating system architecture and description
- .NET framework version
- Current user and hostname
- Hardware information (processor count and memory)
- Container cgroup memory limits and usage

When it runs, the application prints an ASCII art banner reading `dotnet` followed by these runtime details. It also writes the same output to a file named `output.txt` in its working directory, so the runtime image must allow the application's user to write to that directory. This detail matters when you build with Chainguard Containers, as explained later in this guide.

This sample application is based on Microsoft's [dotnet-runtimeinfo sample](https://github.com/dotnet/dotnet-docker/blob/main/samples/) and demonstrates a typical .NET console application that could be containerized for various use cases.

In the following sections, we'll build and compare both versions of the application.

## Building with Microsoft's .NET images

Start by building and running the application with the .NET container images provided by Microsoft to establish a baseline for comparison.

Inspect `notlinky.Dockerfile` to see how it's structured:

```sh
cat notlinky.Dockerfile
```

```output
FROM mcr.microsoft.com/dotnet/sdk AS build

WORKDIR /source

COPY dotnetapp.csproj .
RUN dotnet restore

COPY . .
RUN dotnet publish --no-restore -o /app

FROM mcr.microsoft.com/dotnet/runtime

COPY --from=build --chown=app:app /app /app

WORKDIR /app

USER app

ENTRYPOINT ["./dotnetapp"]
```

This Dockerfile uses a multi-stage build pattern:

1. **Build stage**: Uses `mcr.microsoft.com/dotnet/sdk` to restore dependencies and publish the application
2. **Runtime stage**: Uses `mcr.microsoft.com/dotnet/runtime` for the final image
3. **User configuration**: Copies the published files with `--chown=app:app` and then switches to the non-root `app` user with `USER app`

Build the container image using this Dockerfile:

```sh
docker build -t dotnet-example:notlinky -f notlinky.Dockerfile .
```

Using `notlinky.Dockerfile`, this `docker build` command builds an image tagged `dotnet-example:notlinky`.

Use this image to run the application:

```sh
docker run --rm dotnet-example:notlinky
```

```output
         42
         42              ,d                             ,d
         42              42                             42
 ,adPPYb,42  ,adPPYba, MM42MMM 8b,dPPYba,   ,adPPYba, MM42MMM
a8"    `Y42 a8"     "8a  42    42P'   `"8a a8P_____42   42
8b       42 8b       d8  42    42       42 8PP!!!!!!!   42
"8a,   ,d42 "8a,   ,a8"  42,   42       42 "8b,   ,aa   42,
 `"8bbdP"Y8  `"YbbdP"'   "Y428 42       42  `"Ybbd8"'   "Y428

OSArchitecture: X64
OSDescription: Ubuntu 24.04.4 LTS
FrameworkDescription: .NET 10.0.9

UserName: app
HostName : ca426367d7a5

ProcessorCount: 16
TotalAvailableMemoryBytes: 16472748032 (15.34 GiB)
```

Running the container returns system information, including a stylized ASCII art banner followed by runtime details.

## Building with Chainguard's .NET container images

Next, build the application with Chainguard's .NET container images. Inspect `linky.Dockerfile` to understand the differences:

```sh
cat linky.Dockerfile
```

```output
FROM cgr.dev/chainguard/dotnet-sdk AS build

WORKDIR /source

COPY dotnetapp.csproj .
USER root
RUN dotnet restore

COPY . .
RUN dotnet publish --no-restore -o /app

FROM cgr.dev/chainguard/dotnet-runtime

COPY --from=build --chown=65532:65532 /app /app

WORKDIR /app

ENTRYPOINT ["./dotnetapp"]
```

Like `notlinky.Dockerfile`, this Dockerfile uses a multi-stage build. To find the differences between the two, run the following `diff` command:

```sh
git diff --no-index -U1000 notlinky.Dockerfile linky.Dockerfile
```

```diff
diff --git a/notlinky.Dockerfile b/linky.Dockerfile
index 3b7a6e2..8cd6f2e 100644
--- a/notlinky.Dockerfile
+++ b/linky.Dockerfile
@@ -1,19 +1,18 @@
-FROM mcr.microsoft.com/dotnet/sdk AS build
+FROM cgr.dev/chainguard/dotnet-sdk AS build

 WORKDIR /source

 COPY dotnetapp.csproj .
+USER root
 RUN dotnet restore

 COPY . .
 RUN dotnet publish --no-restore -o /app

-FROM mcr.microsoft.com/dotnet/runtime
+FROM cgr.dev/chainguard/dotnet-runtime

-COPY --from=build --chown=app:app /app /app
+COPY --from=build --chown=65532:65532 /app /app

 WORKDIR /app

-USER app
-
 ENTRYPOINT ["./dotnetapp"]
```

This `diff` output highlights the following differences:

1. **Registry and images**: The Chainguard Dockerfile uses `cgr.dev/chainguard/dotnet-sdk` and `cgr.dev/chainguard/dotnet-runtime` instead of the `mcr.microsoft.com` equivalents.
2. **User switching during restore**: The Chainguard Dockerfile switches to `USER root` before `dotnet restore`. Chainguard's .NET images run as a non-root user by default, and restoring packages requires root.
3. **File ownership**: Both Dockerfiles use `--chown` so the runtime user owns the copied files and can write the application's `output.txt`. The Microsoft image names its user `app`, while Chainguard's default non-root user is UID `65532`. The default username varies across Chainguard's container images (for example, `nonroot` or `app`), so referencing the UID is less ambiguous.
4. **No explicit runtime user**: The Microsoft Dockerfile ends with `USER app` to drop root privileges. The Chainguard runtime already runs as non-root, so the Chainguard Dockerfile omits this line.

Build a container image with this Dockerfile:

```sh
docker build -t dotnet-example:linky -f linky.Dockerfile .
```

Here, the `docker build` command tags the image `dotnet-example:linky`.

Run the application:

```sh
docker run --rm dotnet-example:linky
```

```output
         42
         42              ,d                             ,d
         42              42                             42
 ,adPPYb,42  ,adPPYba, MM42MMM 8b,dPPYba,   ,adPPYba, MM42MMM
a8"    `Y42 a8"     "8a  42    42P'   `"8a a8P_____42   42
8b       42 8b       d8  42    42       42 8PP!!!!!!!   42
"8a,   ,d42 "8a,   ,a8"  42,   42       42 "8b,   ,aa   42,
 `"8bbdP"Y8  `"YbbdP"'   "Y428 42       42  `"Ybbd8"'   "Y428

OSArchitecture: X64
OSDescription: Wolfi
FrameworkDescription: .NET 10.0.9

UserName: nonroot
HostName : 7e5255990efe

ProcessorCount: 16
TotalAvailableMemoryBytes: 16472748032 (15.34 GiB)
```

This output is nearly identical to what the `dotnet-example:notlinky` image returned. The differences reflect the underlying base image: the operating system is `Wolfi` rather than Ubuntu, and the application runs as `nonroot` rather than `app`. Otherwise, the two applications function identically.

## Comparing the results

If you have Grype installed, you can scan both of the container images you've built for vulnerabilities. Start by scanning the `dotnet-example:notlinky` image:

```sh
grype dotnet-example:notlinky
```

```output
. . .

[0014]  INFO found 19 vulnerability matches across 270 packages
[0014] DEBUG   ├── fixed: 0
[0014] DEBUG   ├── ignored: 0 (due to user-provided rule)
[0014] DEBUG   ├── dropped: 0 (due to hard-coded correction)
[0014] DEBUG   └── matched: 19
[0014] DEBUG       ├── unknown severity: 0
[0014] DEBUG       ├── negligible: 0
[0014] DEBUG       ├── low: 12
[0014] DEBUG       ├── medium: 7
[0014] DEBUG       ├── high: 0
[0014] DEBUG       └── critical: 0
NAME                INSTALLED                FIXED-IN  TYPE  VULNERABILITY   SEVERITY
coreutils           9.4-3ubuntu6.2                     deb   CVE-2025-5278   Low
dpkg                1.22.6ubuntu6.6                    deb   CVE-2026-2219   Medium
gpgv                2.4.4-2ubuntu17.4                  deb   CVE-2025-68972  Medium
. . .
```

This portion of the `grype` output shows that the `dotnet-example:notlinky` container image has 19 vulnerabilities, including 12 low-severity and 7 medium-severity vulnerabilities.

Next, scan the Chainguard-based image:

```sh
grype dotnet-example:linky
```

```output
. . .

[0002]  INFO found 0 vulnerability matches across 195 packages
[0002] DEBUG   ├── fixed: 0
[0002] DEBUG   ├── ignored: 0 (due to user-provided rule)
[0002] DEBUG   ├── dropped: 0 (due to hard-coded correction)
[0002] DEBUG   └── matched: 0
[0002] DEBUG       ├── unknown severity: 0
[0002] DEBUG       ├── negligible: 0
[0002] DEBUG       ├── low: 0
[0002] DEBUG       ├── medium: 0
[0002] DEBUG       ├── high: 0
[0002] DEBUG       └── critical: 0
No vulnerabilities found
```

As this output shows, `grype` didn't find any vulnerabilities in the `dotnet-example:linky` image.

You can compare the sizes of the two container images with `docker`:

```sh
docker images dotnet-example
```

```output
REPOSITORY       TAG        IMAGE ID       CREATED         SIZE
dotnet-example   linky      defe30f42942   5 minutes ago   151MB
dotnet-example   notlinky   70e03529cea6   7 minutes ago   210MB
```

This output shows that the `dotnet-example:linky` container image is significantly smaller than the `dotnet-example:notlinky` image.

> **Note**: The command outputs shown in these examples were validated at the time of this writing. Over time, the number of vulnerabilities in either image is likely to change, though you can always expect the Chainguard-based image to contain fewer vulnerabilities.

## .NET migration considerations and best practices

When migrating a .NET application to use Chainguard Containers, keep the following considerations in mind:

- **Registry change**: Update image references from `mcr.microsoft.com` to `cgr.dev/chainguard` (or to your organization's private repository within the Chainguard registry, as in `cgr.dev/example.com`)
- **Multi-stage builds**: Both approaches use [multi-stage builds](/chainguard/containers/concepts/getting-started-distroless/#multi-stage-builds) to separate build-time and runtime dependencies
- **`restore` operations**: Chainguard's security model requires switching to root for `dotnet restore` or `apk` operations:

```dockerfile
USER root
RUN dotnet restore
```

- **File ownership**: Chainguard runtime images run as a non-root user by default. If your application writes to its working directory, copy the published files with `--chown` so the runtime user owns them. Referencing the default non-root UID, `65532`, avoids ambiguity, since the username varies across Chainguard Containers:

```dockerfile
COPY --from=build --chown=65532:65532 /app /app
```

Because the Chainguard runtime image already runs as non-root, you don't need to add a `USER` directive to drop privileges in the runtime stage.

Choose the runtime image based on the type of application:

- `cgr.dev/chainguard/dotnet-runtime:latest` for .NET Core applications (these are often console applications, like the one in this guide)
- `cgr.dev/chainguard/aspnet-runtime:latest` for ASP.NET applications (these are typically web applications)

If a build stage needs a shell or package manager, use a [development variant](/chainguard/containers/concepts/container-variants/) of the relevant Chainguard container image.

## Learn more

Migrating .NET applications from Microsoft's official images to Chainguard's container images provides significant security benefits with minimal code changes. The multi-stage build pattern remains the same, with the primary differences being:

1. Updated image registry and tags
2. Switching to root during package operations in the build stage
3. Automatic non-root execution in the runtime stage

These small changes result in containerized applications with few-to-zero vulnerabilities and smaller image sizes.

For detailed information about Chainguard's .NET container images and additional configuration options, refer to the following resources:

- The [.NET SDK](https://images.chainguard.dev/directory/image/dotnet-sdk/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-dotnet) and [.NET Runtime](https://images.chainguard.dev/directory/image/dotnet-runtime/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-dotnet) documentation pages contain full details on Chainguard's .NET images, including usage documentation, provenance, and security advisories.
- Our [General migration guidance](/chainguard/containers/migration/migrating-to-chainguard-images/) is helpful for understanding migration best practices.
- [The Guardener](/chainguard/guardener/dockerfile-migration/) is an AI-powered agent that iteratively converts, builds, and validates your Dockerfiles for use with Chainguard Containers.

---

### Migrate a Java application to Chainguard Containers
_Path: chainguard/containers/migration/migration-guides/java.md_

Chainguard's Java containers fill the same roles as the Java base images found on Docker Hub, such as `eclipse-temurin` and `maven`, but are built on [Wolfi](/open-source/wolfi/) with a much smaller package set. Chainguard builds its own JDK from source in Wolfi, and rebuilds these containers nightly so security patches land without manual intervention. Porting a Dockerfile takes a handful of changes, mostly around the non-root user and the absent shell, which [Differences from the Java images on Docker Hub](#differences-from-the-java-images-on-docker-hub) covers in full. For current CVE data on a specific container and tag, refer to the [JRE entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/jre/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java).

{{< details "What is Distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi OS?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

This guide is intended to help you port an existing Java Dockerfile to a Chainguard Containers base.

## Java Chainguard Containers

Chainguard publishes four containers for Java, split by the job they do:

| Container | Contents | Use it for |
| --- | --- | --- |
| [`maven`](https://images.chainguard.dev/directory/image/maven/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java) | JDK plus Apache Maven | The build stage of a Maven project |
| [`gradle`](https://images.chainguard.dev/directory/image/gradle/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java) | JDK plus Gradle | The build stage of a Gradle project |
| [`jdk`](https://images.chainguard.dev/directory/image/jdk/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java) | Full Java Development Kit | Compiling inside the container without Maven or Gradle |
| [`jre`](https://images.chainguard.dev/directory/image/jre/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java) | Java Runtime Environment only | Running a compiled JAR in production |

The `jre` container is the production target. It has no compiler, no build tooling, no shell, and no package manager, which keeps it small but also means you cannot extend it in place. The build containers include a shell and a package manager and can be extended freely.

Each of these also comes in a [development variant](/chainguard/containers/concepts/container-variants/), distinguished by the tag suffix (for example, `jre:latest-dev`). The development variants add a shell and package manager to a runtime container, which makes them useful for debugging and for the rare application that needs system tooling at runtime.

The recommended approach for migration is to use a multi-stage build: compile in `maven` or `gradle`, then copy the JAR into `jre`. This guide's [migration example](#migration-example) builds exactly that.

## Migrating from other distributions

Dockerfiles often contain commands specific to the Linux distribution they are based on. Most commonly this relates to package installation (`apt` versus `yum` versus `apk`), but it also covers the default shell (`bash` versus `ash`) and default utilities (`groupadd` versus `addgroup`). The high-level guide on [Migrating to Chainguard Containers](/chainguard/containers/migration/migrating-to-chainguard-images/) covers distro-based migration and package compatibility for Debian, Alpine, Ubuntu, and Red Hat UBI base images.

## Installing further dependencies

Java applications sometimes need native libraries at build time, runtime, or both. Wolfi has a large package repository, though package names may differ from other distributions.

The easiest way to search is with apk tools in a `wolfi-base` container:

```shell
docker run -it --rm cgr.dev/chainguard/wolfi-base
```

```shell
apk update
apk search freetype
```

Add the packages you find to the build stage of your Dockerfile. Note that `apk add` needs write access, so a Dockerfile that installs packages has to switch to the root user first with `USER root`. For more searching tips, check the [Searching for Packages](/chainguard/containers/migration/migrating-to-chainguard-images/#searching-for-packages) section of the base migration guide.

## Differences from the Java images on Docker Hub

If you are migrating from Docker Hub's `maven` image or from `eclipse-temurin`, a few differences matter:

- **The containers run as a non-root user.** UID `65532` is the default, where the Docker Hub images run as root. If a build step needs elevated privileges, add `USER root` before it, and switch back for the production stage.
- **`WORKDIR` differs by container.** It is `/app` in `jre`, and `/home/build` in `maven`, `gradle`, and `jdk`.
- **The entrypoint is the tool, not a shell.** `jre` sets `/usr/bin/java` and `maven` sets `/usr/bin/mvn`, so arguments you pass to `docker run` go to that program. For example, `docker run cgr.dev/chainguard/jre:latest -version` prints the container's Java version. To get a shell you need a `-dev` variant and an explicit entrypoint override: `docker run --entrypoint /bin/sh -it cgr.dev/chainguard/jre:latest-dev`.
- **`JAVA_HOME` is `/usr/lib/jvm/default-jvm`.** Scripts that hardcode a Temurin path need updating.
- **There are far fewer libraries and utilities present.** An application may turn out to have a dependency the container doesn't carry, which you need to add explicitly.

## Migration example

This example ports a Spring Boot application from Docker Hub's `maven` image to Chainguard's Maven and JRE containers, in two steps. The application listens on port `8080` and answers `/hello`. Its source is in the [`learning-labs-java` repository](https://github.com/chainguard-dev/learning-labs-java):

```shell
git clone https://github.com/chainguard-dev/learning-labs-java.git
cd learning-labs-java
```

Each step writes a new Dockerfile rather than editing one in place, so you can build all three and compare them side by side. The repository ships its own `Dockerfile` variants from when the accompanying video was recorded, but those pin container digests from 2024; the files you create here track current tags instead, which is what makes the size and CVE comparison meaningful.

### The starting point

Save the following as `Dockerfile.classic`. This Dockerfile is a single-stage build on Docker Hub's `maven` image, which is itself built on Eclipse Temurin:

```Dockerfile
FROM maven:latest

WORKDIR /work

COPY src/ src/
COPY pom.xml pom.xml

RUN mvn clean package

WORKDIR /app
RUN cp /work/target/java-demo-app-1.0.0.jar .

ENTRYPOINT ["java", "-jar", "java-demo-app-1.0.0.jar"]
```

Build and run it:

```shell
docker build -f Dockerfile.classic -t java-maven .
docker run --rm -d --name java-demo -p 8080:8080 java-maven
curl localhost:8080/hello
docker stop java-demo
```

The result is a working application in a large container. Everything Maven needed in order to build the JAR is still sitting in the image that runs it.

### Step 1: change the base container

Copy `Dockerfile.classic` to `Dockerfile.cg` and change a single line, the `FROM` instruction:

```Dockerfile
FROM cgr.dev/chainguard/maven:latest
```

The remainder of the file is unchanged. Build it under a new tag to allow a direct comparison:

```shell
docker build -f Dockerfile.cg -t java-maven-cg .
```

That single line cuts the image size substantially, and clears out the operating-system package findings a scanner reports, because there are far fewer packages left to report on. Compare the two directly:

```shell
docker images | grep java-maven
grype java-maven
grype java-maven-cg
```

This base swap replaces the operating system underneath your application, so findings against distribution packages largely go away. It does not touch your application's own dependencies: the JARs Maven resolved from `pom.xml` are identical in both images, so any CVEs in those survive the change. Fixing those means updating the dependencies themselves, which is what [Chainguard Libraries for Java](/chainguard/libraries/java/overview/) addresses.

If you prefer Docker Hub to `cgr.dev`, Chainguard's Free containers are mirrored there under the `chainguard` organization, so `FROM chainguard/maven:latest` also works.

### Step 2: split the build into two stages

The container still carries Maven and a full JDK into production. A multi-stage build compiles in the Maven container and copies only the JAR into the JRE container. Save the following as `Dockerfile.cg-multi`:

```Dockerfile
FROM cgr.dev/chainguard/maven:latest AS builder

WORKDIR /work

COPY src/ src/
COPY pom.xml pom.xml

RUN mvn clean package

FROM cgr.dev/chainguard/jre:latest AS runner

WORKDIR /app

COPY --from=builder /work/target/java-demo-app-1.0.0.jar .

ENTRYPOINT ["java", "-jar", "java-demo-app-1.0.0.jar"]
```

```shell
docker build -f Dockerfile.cg-multi -t java-maven-multi-cg .
docker run --rm -d --name java-demo -p 8080:8080 java-maven-multi-cg
curl localhost:8080/hello
docker stop java-demo
```

The application behaves the same, in a container roughly 250 MB smaller than the single-stage Chainguard build, because the build tooling never reaches the final stage. The `jre` container also has no shell, so there is nothing for an attacker who reaches the container to run.

This step cuts scanner findings a second time, and for a different reason than the base swap did. A single-stage build ships Maven's own bundled JARs and everything it downloaded into the local repository, and a scanner reports on all of them. Only the application JAR survives the copy into the final stage:

```shell
grype java-maven-multi-cg
```

There are two important things to note on the `COPY` line. The JAR filename comes from the project's `pom.xml`, so it differs in your application; a wildcard such as `COPY --from=builder /work/target/*.jar app.jar` avoids restating the version. Additionally, because `jre` already sets `WORKDIR` to `/app`, the `WORKDIR` line in the runner stage is explicit rather than required.

### Video demonstration

The following video walks through the same migration outlined in the previous steps:

{{< youtube FYOVcSv1-oY >}}

## Additional resources

- The [JRE container documentation](https://images.chainguard.dev/directory/image/jre/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-java) has full details on the Java containers, including usage, provenance, and security advisories.
- [Build Java containers with Jib](/chainguard/containers/building-and-modifying/build-tools/building-java-containers-with-jib/) covers building Java containers without writing a Dockerfile at all, using Jib's Maven and Gradle plugins.
- [Building minimal container images](/chainguard/containers/building-and-modifying/building-minimal-containers/) explains the multi-stage pattern this guide uses, and when a runtime container is the right final base.
- [Fully bootstrapping Java from source in Wolfi](https://www.chainguard.dev/unchained/fully-bootstrapping-java-from-source-in-wolfi) describes how Chainguard builds its JDK.
- [Debugging distroless container images](/chainguard/containers/troubleshooting/debugging-distroless-images/) covers working with a production container that has no shell.
- [How to port a sample application to Chainguard Containers](/chainguard/containers/migration/porting-apps-to-chainguard/) works through porting a legacy application.

---

### Migrate a PHP application to Chainguard Containers
_Path: chainguard/containers/migration/migration-guides/php.md_

Chainguard's PHP container images provide enhanced security for PHP applications through minimal, purpose-built images that reduce attack surface. Based on [Wolfi](/open-source/wolfi/), they include only the packages your application needs, while maintaining full compatibility with PHP workloads. Daily automated builds deliver the latest security patches without manual intervention. For current CVE data on each PHP image and tag, see the [PHP entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/php/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-php).

This article will assist you in the process of migrating your existing PHP Dockerfiles to leverage the benefits of Chainguard Containers, including a smaller attack surface and a more secure application footprint.

## PHP Chainguard Containers

Chainguard offers multiple PHP images and variants catering to distinct use cases. In addition to the regular PHP image that includes CLI and FPM variants, we offer a dedicated [Laravel](https://images.chainguard.dev/directory/image/laravel/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-php) image designed for Laravel applications.

Each variant comes in two flavors: a minimal runtime image (distroless) and a development variant distinguished by the `-dev` suffix (e.g., `latest-dev`).

In a nutshell, distroless images don't include a package manager or a shell, being used exclusively as runtimes to keep the environment to a minimum. Development variants, on the other hand, include packages such as `apk` and `composer` for building PHP applications. Development variants can be used _as-is_ to provide a more straightforward migration path. Whenever possible, though, we encourage users to combine both images in a multi-stage environment to build a final distroless image that will function strictly as an application runtime.

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

For a deeper exploration of distroless images and their differences from standard base images, refer to the guide on [Getting started with distroless images](/chainguard/containers/getting-started-distroless/).

## Migrating from non-apk systems

When migrating from distributions that are not based on the `apk` ecosystem, you'll need to update your Dockerfile accordingly. Our high-level guide on [Migrating to Chainguard Containers](/chainguard/containers/migration/migrating-to-chainguard-images/) contains details about distro-based migration and package compatibility when migrating from Debian, Ubuntu, and Red Hat UBI base images.

## Installing PHP extensions

Wolfi offers several PHP extensions as optional packages you can install with `apk`. Because PHP extensions are system-level packages, they require `apk` which is only available in our development image variants. The following extensions are already included within all Chainguard PHP image variants:

- `php-mbstring`
- `php-curl`
- `php-openssl`
- `php-iconv`
- `php-mysqlnd`
- `php-pdo`
- `php-pdo_sqlite`
- `php-pdo_mysql`
- `php-sodium`
- `php-phar`

In addition to those, the Laravel image includes the following extensions:

- `php-ctype`
- `php-dom`
- `php-fileinfo`
- `php-simplexml`

You can run a temporary container with the `php -m` command to see a list of enabled extensions:

```shell
docker run --rm --entrypoint php cgr.dev/chainguard/php -m
```

To check for extensions available for installation, you can run a temporary container with the `dev` variant of a given image and use `apk` to search for packages. For instance, this will log you into a container based on the `php:latest-dev` image:

```shell
docker run -it --rm --entrypoint /bin/sh --user root cgr.dev/chainguard/php:latest-dev
```

Make sure to update the package manager cache:

```shell
apk update
```

If you want to search for PHP 8.2 XML extensions, for example, you can run the following:

```shell
apk search php*8.2*xml*
```

And this should give you a list of all PHP 8.2 XML extensions available in Wolfi.

```output
php-8.2-simplexml-8.2.17-r0
php-8.2-simplexml-config-8.2.17-r0
php-8.2-xml-8.2.17-r0
php-8.2-xml-config-8.2.17-r0
php-8.2-xmlreader-8.2.17-r0
php-8.2-xmlreader-config-8.2.17-r0
php-8.2-xmlwriter-8.2.17-r0
php-8.2-xmlwriter-config-8.2.17-r0
php-simplexml-8.2.11-r1
php-xml-8.2.11-r1
php-xmlreader-8.2.11-r1
php-xmlwriter-8.2.11-r1
```

For more searching tips, check the [Searching for packages](/chainguard/containers/migration/migrating-to-chainguard-images/#searching-for-packages) section of our base migration guide.

## Migrating PHP CLI workloads to use Chainguard Containers

Our `latest` and `latest-dev` PHP image variants are designed to run CLI applications and scripts that don't need a web server. As a first step towards migration, you might want to change your base image to the `latest-dev` variant, since that would be the closest option for a drop-in base image replacement. Once you have your dependencies and steps dialed in, you can optionally migrate to a multi-stage build to create a strict runtime containing only what the application needs to run.

The following `Dockerfile` uses the `php:latest-dev` image to build the application, which in this case means copying the application files and installing dependencies via `composer`. A second build stage copies the application to a final distroless image based on `php:latest`.

```Dockerfile
FROM cgr.dev/chainguard/php:latest-dev AS builder
USER root
COPY .. /app
RUN chown -R php /app
USER php
RUN cd /app && \
    composer install --no-progress --no-dev --prefer-dist

FROM cgr.dev/chainguard/php:latest
COPY --from=builder /app /app

ENTRYPOINT [ "php", "/app/myscript.php" ]
```

Our [PHP getting started](/chainguard/containers/getting-started/languages-and-runtimes/php/) guide has step-by-step instructions on how to build and run a PHP CLI application with Chainguard Containers.

## Migrating PHP web applications to use Chainguard Containers

For PHP web applications that serve content through a web server, you should use the `latest-fpm` and `latest-fpm-dev` variants of our PHP image. Combine it with our [nginx image](https://images.chainguard.dev/directory/image/nginx/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-php) and an optional database for a traditional LEMP setup.

The overall migration process is essentially the same as described in the previous section, with the difference that you won't set up application entry points, since these images run as services. Your Dockerfile may require additional steps to set up front-end dependencies, initialize databases, and perform any additional tasks needed for the application to run through a web server.

You can use [Docker Compose](https://docs.docker.com/compose/) to create a LEMP environment and test your setup locally. The following `docker-compose.yaml` file creates a local environment to serve a PHP web application using our PHP-FPM, Nginx, and MariaDB images:

```yaml
version: "3.7"
services:
  app:
    image: cgr.dev/chainguard/php:latest-fpm-dev
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./app:/app
    networks:
      - wolfi

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - ./app:/app
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - wolfi

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: user
      MARIADB_PASSWORD: password
      MARIADB_DATABASE: php-test
    ports:
      - 3306:3306
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge

```

Notice that the environment creates a few shared volumes to share the application files and also the `nginx.conf` file with the specific web server configuration. You'll need that to tell Nginx to redirect `.php` requests to the `php-fpm` service.

An example `nginx.conf` file to handle PHP requests with default settings:

```yaml
pid /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {
    server {
        listen 8080;
        index index.php index.html;
        root /app/public;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
}
```

## Migrating Laravel applications to use Chainguard Containers

Chainguard has a dedicated [Laravel image](https://images.chainguard.dev/directory/image/laravel/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-php) designed for applications built on top of the [Laravel](https://laravel.com) PHP Framework. This image is based on the `php:latest-fpm` variant, with additional extensions required by Laravel. Migration should follow the same steps described in previous sections, with the `laravel:latest-dev` variant as builder and `laravel:latest` as the distroless variant of this image.

In addition to including extensions required by Laravel by default, the image includes a **laravel** system user that facilitates running `composer` and `artisan` commands from a host environment, which enables users to create and develop Laravel applications with the `-dev` variant of this image. Check the section on [Developing Laravel applications](#developing-laravel-applications) for more information on how to use the development variant of the Laravel image for development environments.

## Using development containers

Our PHP development images are minimal yet versatile images that include `apk` and `composer`. You can use these images to create and develop PHP applications on a containerized development environment.

Development images can be identified by the `-dev` suffix (e.g: `php:latest-dev`). You can use them to execute Composer commands from a Dockerfile or directly from the command line with `docker run`. This allows users to run Composer without having to install PHP on their host system.

### Running Composer

To be able to write to your host's filesystem through a shared volume, you'll need to use the **root** container user when installing dependencies with Composer using the `latest-dev` or `latest-fpm-dev` image variants.

**Example 1: Installing Dependencies**

```shell
docker run --rm -v ${PWD}:/app --entrypoint composer --user root \
    cgr.dev/chainguard/php:latest-dev \
    install
```

**Example 2: Requiring a new dependency**

```shell
docker run --rm -v ${PWD}:/app --entrypoint composer --user root \
    cgr.dev/chainguard/php:latest-dev \
    require minicli/minicli
```

You'll need to fix file permissions once installation is finished:

```shell
sudo chown -R ${USER}:${USER} .
```

### Running the built-in web server

You can use the built-in PHP web server to preview web applications using a `docker run` command with a port redirect.

The following command will run the `php:latest-dev` image variant with the built-in server (`php -S`) on port `8000`, redirecting all requests to the same port on the host machine, and using the current folder as document root:

```shell
docker run -p 8000:8000 --rm -it -v ${PWD}:/work \
    cgr.dev/chainguard/php:latest-dev \
    -S 0.0.0.0:8000 -t /work
```

The preview should be live at `localhost:8000`.

### Developing Laravel applications

The `laravel:latest-dev` image has a system user with uid `1000` that can be used for development. This facilitates handling file permissions when working with shared volumes in a development environment.

**Creating a New Laravel Project**

The following command will create a new Laravel project called **demo-laravel** in the current folder.

```shell
docker run --rm -v ${PWD}:/app --entrypoint composer --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    create-project laravel/laravel demo-laravel --working-dir=/app
```

**Running Artisan Commands**

To run Artisan commands, you'll need to create a volume to share your Laravel application within the container and set the image entrypoint to `/app/artisan`. The following example runs the `artisan migrate` command from the application folder:

```shell
docker run --rm -v ${PWD}:/app --entrypoint /app/artisan --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    migrate
```

**Running the Artisan Web Server**

To quickly preview your Laravel application, you can use Artisan's built-in web server. The following command runs the built-in Artisan web server from the application folder:

```shell
docker run -p 8000:8000 --rm -it -v ${PWD}:/app --entrypoint /app/artisan --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    serve --host=0.0.0.0
```

The preview should be live at `localhost:8000`.

## Additional resources

Our [PHP image documentation](https://images.chainguard.dev/directory/image/php/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-php) covers details about all PHP image variants, including the list of available tags for both development and production images. For another example of a LEMP setup using MariaDB, check our guide on [Getting started with the MariaDB Chainguard Container](https://edu.chainguard.dev/chainguard/containers/getting-started/web-and-data-services/mariadb/).

The [Debugging distroless](/chainguard/containers/debugging-distroless-images/) guide contains important information for debugging issues with distroless images. You can also refer to the [Verifying containers](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/) resource for details around provenance, SBOMs, and image signatures.

---

### Migrate a Node.js application to Chainguard Containers
_Path: chainguard/containers/migration/migration-guides/node.md_

Chainguard's Node.js container images offer a streamlined migration path for applications seeking enhanced security posture through minimal, distroless design. Built on [Wolfi](/open-source/wolfi/), they include only the packages your application needs, which keeps both the attack surface and the image size small. Daily automated builds ensure your applications always have the latest security patches without manual intervention. For current CVE data on each image and tag, see the [Node entry in the Chainguard Containers directory](https://images.chainguard.dev/directory/image/node/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-node).

{{< details "What is Distroless?" >}}
{{< blurb/distroless >}}
{{< /details >}}

{{< details "What is Wolfi OS?" >}}
{{< blurb/wolfi >}}
{{< /details >}}

{{< details "What are multi-stage builds?" >}}
{{< blurb/multistage >}}
{{< /details >}}

This article is intended as a guide to porting existing Dockerfiles for Node.js applications to a
Chainguard Containers base.

## Node.js Chainguard Containers

The [Node.js](https://images.chainguard.dev/directory/image/node/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-node) images come in two main
flavors; runtime images intended for production usage and builder images intended for use in the
build-step of multi-stage builds. The builder images are distinguished by the `-dev` suffix (e.g.,
`latest-dev`).

The production images are intentionally as minimal as possible. They have enough dependencies to run
a Node.js application but no more. There is no package manager or shell, which reduces the attack
surface of the image, but can also make it difficult to extend the image. The builder images have
more build tooling as well as a shell and package manager, allowing them to be easily extended. We
still aim to keep CVE counts as low as possible in the builder images and they can be used in
production if necessary (such as when the application requires extra system dependencies at
runtime), but we recommend using the builder image as the first step in a multi-stage build with the
production image as the base for the final image.

This extremely minimal approach to the runtime image is sometimes known as "distroless". For a
deeper exploration of distroless images and their differences from standard base images, refer to
the guide on [Getting Started with Distroless
images](/chainguard/containers/getting-started-distroless/).

## Migrating from other distributions

Dockerfiles will often contain commands specific to the Linux Distribution they are based on. Most
commonly this will be package installation instructions (e.g. `apt` vs `yum` vs `apk`) but also
differences in default shell (e.g. `bash` vs `ash`) and default utilities (e.g. `groupadd` vs `addgroup`).
Our high-level guide on [Migrating to Chainguard Containers](/chainguard/containers/migration/migrating-to-chainguard-images/)
contains details about distro-based migration and package compatibility when migrating from Debian,
Alpine, Ubuntu and Red Hat UBI base images.

## Installing further dependencies

Sometimes your applications will require further dependencies, either at build-time, runtime or
both. Wolfi has large number of software packages available, so you are likely to be able to
install common packages via `apk add`, but be aware that packages may be named differently than in
other distributions.

The easiest way to search for packages is via apk tools. For example:

```shell
docker run -it --rm cgr.dev/chainguard/wolfi-base
f273a9aa3242:/# apk update
fetch https://packages.wolfi.dev/os/aarch64/APKINDEX.tar.gz
 [https://packages.wolfi.dev/os]
OK: 53914 distinct packages available
f273a9aa3242:/# apk search cairo
cairo-1.18.0-r1
cairo-dev-1.18.0-r1
cairo-gobject-1.18.0-r1
cairo-static-1.18.0-r1
cairo-tools-1.18.0-r1
harfbuzz-8.4.0-r1
harfbuzz-dev-8.4.0-r1
pango-1.52.2-r1
pango-dev-1.52.2-r1
py3-cairo-1.26.0-r0
py3-cairo-dev-1.26.0-r0
```

These packages can then be easily added to your Dockerfile.
For more searching tips, check the [Searching for
Packages](/chainguard/containers/migration/migrating-to-chainguard-images/#searching-for-packages)
section of our base migration guide.

## Differences from the official Docker image

If you are migrating from the [official Docker image](https://hub.docker.com/_/node) there are a
few differences that are important to be aware of.

- Our images run as the `node` user with UID 65532 by default. If you need elevated privileges
   for a task, such as installing a dependency, you will need to change to the root user. For
   example add a `USER root` statement into a Dockerfile. For security reasons you should make
   sure that the production application runs with a lower privilege user such as `node`.
- `WORKDIR` is set to `/app` which is owned by the `node` user.
- The Docker Official images have a "smart" entrypoint that interprets the CMD setting. So `docker
   run -it node` will launch the Node.js interpreter but `docker run -it node /bin/sh` will launch a
   shell. The latter does not work with Chainguard Containers. In the non `-dev` images, there is no
   shell to launch, and in the `-dev` images you will need to change the entrypoint e.g. `docker run
   --entrypoint /bin/sh -it cgr.dev/chainguard/node`.
- The image has a defined `NODE_PORT=3000` environment variable which can be used by applications
- Our Node.js images include [dumb-init](https://github.com/Yelp/dumb-init) which can be used to
   wrap the Node process in order to handle signals properly and allow for graceful shutdown. You
   can use dumb-init by setting an entrypoint such as: `ENTRYPOINT ["/usr/bin/dumb-init", "--"]`
- In general there are many fewer libraries and utilities in the Chainguard Container. You may find that
   your application has an unexpected dependency which needs to be added into the Chainguard Container.

## Migration example

This section has a short example of migrating a Node.js application with a Dockerfile building on
`node:latest` to use the Chainguard Node.js Containers. The code for [this example can be found on
GitHub](https://github.com/chainguard-dev/cg-images-node-migration).

Our starting Dockerfile uses the `node:latest` image from Docker Hub in a single-stage build:

```Docker
FROM node:latest

ENV NODE_ENV production

WORKDIR /usr/src/app

COPY package.json .
RUN npm install
USER node
COPY . .

EXPOSE 3000

CMD npm start
```

If you've cloned the GitHub repository, you can build this image with:

```shell
docker build -t node-classic-image -f Dockerfile-classic .
```

Directly porting to Chainguard Containers with the least number of changes results in this Dockerfile:

```Docker
FROM cgr.dev/chainguard/node:latest-dev

ENV NODE_ENV production

WORKDIR /usr/src/app

COPY package.json .
RUN npm install
USER node
COPY . .

EXPOSE 3000

ENTRYPOINT npm start
```

Here we've changed the image to `cgr.dev/chainguard/latest-dev` and the `CMD` command became
`ENTRYPOINT`.

We can still do better in terms of size and security. A multi-stage Dockerfile would look like:

```Docker
FROM cgr.dev/chainguard/node:latest-dev AS builder

ENV NODE_ENV production

WORKDIR /usr/src/app

COPY package.json .
RUN npm install
USER node
COPY . .

FROM cgr.dev/chainguard/node:latest

COPY --from=builder --chown=node:node /usr/src/app /app
EXPOSE 3000
ENV NODE_ENV=production
ENV PATH=/app/node_modules/.bin:$PATH
WORKDIR /app
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["node", "app.js"]
```

If you've cloned the GitHub repository, you can build this image with:

```shell
docker build -t node-multi-image -f Dockerfile-multi .
```

The advantages of this build are:

- we are using `dumb-init` so the container shuts down cleanly in response to `docker stop`.
- we do not have all the build tooling in the final image, resulting in a smaller and more secure
   production image

Note that in a production app you may want to use a `package-lock.json` file and the `npm ci` command
instead of `npm install` to ensure the correct version of all dependencies is used.

### Using slim images

If Chainguard's Node.js image has been added to your organization's Chainguard Registry, you will have access to more tags than just `latest`, including *slim tags*. These represent Chainguard's [slim variants](/chainguard/containers/concepts/container-variants/#slim-container-variants), which have an even smaller attack surface than our standard container images. In the case of Node.js, the slim variants omit some packages that are included in the standard image for compatibility purposes, including `npm` and `busybox`.

Because they lack these compatibility packages, the slim Node.js images are often used in multi-stage builds. The following example updates the `Dockerfile-multi` file shown previously to point to one of Chainguard's slim Node.js images:

```Docker
FROM cgr.dev/chainguard/node:latest-dev AS builder

ENV NODE_ENV production

WORKDIR /usr/src/app

COPY package.json .
RUN npm install
USER node
COPY . .

FROM cgr.dev/$ORGANIZATION/node:25-slim

COPY --from=builder --chown=node:node /usr/src/app /app
EXPOSE 3000
ENV NODE_ENV=production
ENV PATH=/app/node_modules/.bin:$PATH
WORKDIR /app
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["node", "app.js"]
```

This example specifies the `:25-slim` tag, but be aware that Chainguard includes slim variants for every version of Node.js it offers.

To build an image with a Dockerfile like this, your organization would need to have Chainguard's Node.js image included in its registry. You would also need to update `$ORGANIZATION` to reflect the name of your organization's registry.

## Additional resources

- The [Node.js image documentation](https://images.chainguard.dev/directory/image/node/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-migration-migrating-node)
contains full details on our images, including usage documentation, provenance and security
advisories.

- The [How to Port a Sample Application to Chainguard
Containers](/chainguard/containers/migration/porting-apps-to-chainguard/) article contains an example of porting a
Node.js Dockerfile for a legacy application.

- The [How to migrate a Node.js application to Chainguard Containers](https://www.youtube.com/watch?v=hfpVS-UP4Yw) video works through an example of porting a Node.js Dockerfile.

- Bret Fisher has an excellent [guide to creating Node.js container
images](https://github.com/BretFisher/nodejs-rocks-in-docker/), including advice for using
distroless.

- The [Debugging distroless](/chainguard/containers/debugging-distroless-images/) guide contains important information for debugging issues with distroless images. You can also refer to the [Verifying containers](/chainguard/containers/security-and-compliance/verifying-chainguard-images-and-metadata-signatures-with-cosign/) resource for details around provenance, SBOMs, and image signatures.

---

### How to port a sample application to Chainguard Containers
_Path: chainguard/containers/migration/porting-apps-to-chainguard/index.md_

## Porting key points

* Chainguard's distroless Containers have no shell or package manager by default. This is great for security, but sometimes you need these things, especially in builder images. For those cases we have `-dev` variants (such as `cgr.dev/chainguard/python:latest-dev`) which do include a shell and package manager.
* Chainguard Containers typically don't run as root, so a `USER root` statement may be required before installing software. This should be a temporary escalation only; after completing any root-level operations, you should create and switch to a dedicated non-root user (for example, using `addgroup` and `adduser`) or use the image's built-in non-root user. Leaving the container running as root defeats the security purpose of using minimal images.
* The `-dev` variants and `wolfi-base` / `chainguard-base` use BusyBox by default, so you need to port any `groupadd` or `useradd` commands to `addgroup` and `adduser`.
* The [Free tier](/chainguard/containers/concepts/container-categories/#free-containers) of Containers provides `:latest` and `:latest-dev` versions. Our paid Production Containers offer tags for major and minor versions.
* We use apk tooling, so `apt install` commands become `apk add`.
* Chainguard Containers are based on `glibc` and our packages cannot be mixed with Alpine packages.
* In some cases, the entrypoint in Chainguard Containers can be different from equivalent container images based on other distros, which can lead to unexpected behavior. You should always check the image's specific documentation to understand how the entrypoint works.
* When needed, Chainguard recommends using a Base Container like `chainguard-base` or a `-dev` variant to install an application's OS-level dependencies.
* Although `-dev` variants are still more secure than most popular container images based on other distros, for increased security on production environments we recommend combining them with a distroless variant in a multi-stage build.

## The sample application

The application in question is [identidock](https://github.com/using-docker/identidock). This application was written for the book [Using Docker](https://learning.oreilly.com/library/view/using-docker/9781491915752/) about ten years ago, which shows that we can still migrate software of this age to a new container while realizing the benefits of a no-to-low CVE count. The application itself creates [identicons](https://en.wikipedia.org/wiki/Identicon) for a user name, similar to what [GitHub generates for users with no avatar](https://github.blog/2013-08-14-identicons/). It was designed at the time to demonstrate a "microservices" approach, and as such it's made up of 3 services:

* The main identidock service, which takes the requests and talks to the
  [dnmonster](https://github.com/amouat/dnmonster) service and the redis cache
* A NodeJS application which creates the identicons
* Redis which is used as a simple cache

The following diagram shows how the services fit together. The user only talks to the identidock service. The identidock service first checks the cache to see if it has already created an identicon for the input and, if not, requests a new identicon from the dnmonster service. The identicon is then returned to the user and saved to the cache if required.

![Diagram of Identidock architecture](arch.png)

The book walked through using various orchestrators to deploy the application, some of which have since fallen out of usage (anyone remember [fleet](https://github.com/coreos/fleet)?). For the sake of this tutorial, we'll use Docker Compose, which is arguably the simplest surviving orchestrator covered in the book.

The first task was to get the 10-year-old application building and running again. As it was a simple example application, this was thankfully straightforward and mainly required bumping versions of dependencies and a couple of cases of replacing unmaintained libraries. For a larger project, this may well have been a major effort. The original code can be found on the [using-docker GitHub repository](https://github.com/using-docker/identidock) and the updated working version (prior to moving to Chainguard Containers) can be found on the [v1 branch](https://github.com/chainguard-dev/identidock-cg/tree/v1) of the [repository for this tutorial](https://github.com/chainguard-dev/identidock-cg/).

In order to follow along with the tutorial, please clone the code and switch to the `v1` branch:

```bash
git clone https://github.com/chainguard-dev/identidock-cg.git
cd identidock-cg
git switch v1
```

## Updating the Node.js microservice

To begin, we'll update the heart of the application – the dnmonster service. dnmonster is based on [monsterid.js](https://github.com/KevinGaudin/monsterid.js/) by Kevin Gaudin. The dnmonster container hosts an API which returns an [identicon](https://en.wikipedia.org/wiki/Identicon) based on the input it's given.

```bash
docker run -d -p 8080:8080 amouat/dnmonster
curl --output ./monster.png 'localhost:8080/monster/wolfi?size=100'
```

In this example, we give dnmonster the input "wolfi", for which it produces the following image:

![Simple "monster" art](monster.png "Monster generated for wolfi input")

The version of the code on the v1 branch already contains a few updates from the original code, as well as bumping versions, the codebase was moved from the old and sporadically maintained [restify](https://github.com/restify/node-restify) module to the more modern [express](https://expressjs.com/) module.

The Dockerfile for this version of the dnmonster service can be found in the dnmonster folder:

```Dockerfile
FROM node

RUN apt-get update && apt-get install -yy --no-install-recommends \
    libcairo2-dev libjpeg62-turbo-dev libpango1.0-dev libgif-dev \
    librsvg2-dev build-essential g++

#Create non-root user
RUN groupadd -r dnmonster && useradd -r -g dnmonster dnmonster
RUN install -d -o dnmonster -g dnmonster /home/dnmonster

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install
COPY ./src /usr/src/app

RUN chown -R dnmonster:dnmonster /usr/src/app
USER dnmonster

EXPOSE 8080

CMD [ "npm", "start" ]
```

The container image can be built with:

```bash
cd dnmonster
docker build --pull -t dnmonster .
```

Looking at this image:

```bash
docker images dnmonster
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
dnmonster    latest    3337171ebb44   4 minutes ago   1.79GB
```

We can also run the [Grype scanning tool](https://github.com/anchore/grype) to investigate if there are any known vulnerabilities present in the image:

```
grype docker:dnmonster
 ✔ Loaded image                                                                                                dnmonster:latest
 ✔ Parsed image                                         sha256:17ad85081f0b4151b30556e2750ceab3222495cfc32caec2bf6e7be3647de78e
 ✔ Cataloged contents                                          5c969fe3503a9f5e6c83117d0efa79af70380eac2abe66a756eae00351972352
   ├── ✔ Packages                        [788 packages]
   ├── ✔ File digests                    [20,143 files]
   ├── ✔ File metadata                   [20,143 locations]
   └── ✔ Executables                     [1,343 executables]
 ✔ Scanned for vulnerabilities     [600 vulnerability matches]
   ├── by severity: 7 critical, 103 high, 290 medium, 49 low, 500 negligible (195 unknown)
   └── by status:   7 fixed, 1137 not-fixed, 544 ignored
...
```

This tells us that (at the time of writing) the image is 1.79 GB in size and has **hundreds of known vulnerabilities**.

The first step in moving to Chainguard Containers is to try switching the container image name in to check if anything breaks. In this case, we’ll begin with the development variant of the Node image. Change the first line of the Dockerfile from:

```Dockerfile
FROM node
```

To:

```Dockerfile
FROM cgr.dev/chainguard/node:latest-dev
```

Unlike the `cgr.dev/chainguard/node:latest` image, the `:latest-dev` version includes a shell and package manager, which we need for some of the build steps. In general, it's better to use the more minimal `:latest` version where possible in order to keep the size down and reduce the tooling available to attackers. Often the `:latest-dev` container image can be used as a build step in a multi-stage, with a more minimal image such as `:latest` used in the final production image.

If you try building this image, you'll find that it breaks in several places. The container image needs to install various libraries so that it can compile the [`node-canvas`](https://github.com/Automattic/node-canvas) dependency, and this looks a bit different in Debian than it does in [Wolfi](https://github.com/wolfi-dev/) (the OS powering Chainguard Containers). In Wolfi, we first need to switch to the root user to install software and we use `apk add` instead of `apt-get`. We then need to figure out the Wolfi equivalents of the various Debian packages, which may not always have a one-to-one correspondence. There are tools to help here – you can consult our [migration guides](/chainguard/containers/migration/compatibility/debian-compatibility/) and use apk tools (like `apk search libjpeg`), but searching the [Wolfi GitHub](https://github.com/wolfi-dev/os) repository for package names often provides you with what you’re looking for.

Make these changes by replacing the `RUN apt-get …` line with the following `RUN apk update` and adding a `USER root` line. The start of the Dockerfile should look like this:

```Dockerfile
FROM cgr.dev/chainguard/node:latest-dev

USER root
RUN apk update && apk add \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev python3 make gcc\
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev\
    libfontconfig1
```

The next change we need to make is to the `RUN groupadd …` line. Chainguard Containers use BusyBox by default, which means `groupadd` needs to become `addgroup`. Rewrite the line so that it looks like this:

```Dockerfile
RUN addgroup dnmonster && adduser -D -G dnmonster dnmonster
```

Finally, the default entrypoint for the Chainguard container image is `/usr/bin/node`. If we leave the `CMD` as it is, node interprets it as an argument, which isn't what we want. The Docker official image uses an entrypoint script to interpret commands, but this isn't available in the `cgr.dev/chainguard/node:latest-dev` image. The fix is to change the `CMD` command to `ENTRYPOINT`, which overrides the `/usr/bin/node` command:

```Dockerfile
ENTRYPOINT [ "npm", "start" ]
```

Once you've made all these changes, you should have a Dockerfile that looks like:

```Dockerfile
FROM cgr.dev/chainguard/node:latest-dev

USER root
RUN apk update && apk add \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev python3 make gcc\
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev\
    libfontconfig1

#Create non-root user
RUN addgroup dnmonster && adduser -D -G dnmonster dnmonster
RUN install -d -o dnmonster -g dnmonster /home/dnmonster

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install
COPY ./src /usr/src/app

RUN chown -R dnmonster:dnmonster /usr/src/app
USER dnmonster

EXPOSE 8080

ENTRYPOINT [ "npm", "start" ]
```

At this point, we have a version of dnmonster that works and is equivalent to the previous version. We can build this image:

```bash
docker build --pull -t dnmonster-cg .
...
```

And investigate it again:

```bash
docker images dnmonster-cg
REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
dnmonster-cg   latest    5b785d38a022   About a minute ago   1.55GB

grype docker:dnmonster-cg
 ✔ Vulnerability DB                [updated]
 ✔ Loaded image                                                                                             dnmonster-cg:latest
 ✔ Parsed image                                         sha256:4795459b2f4a28bb721b19b798b4f78d6affb6b2a43096f8752576e6ce3fcd2c
 ✔ Cataloged contents                                          aa53bb57b8e994e65de7f3e19da6b1945a86005fe76961383166248aad56f6fe
   ├── ✔ Packages                        [599 packages]
   ├── ✔ File digests                    [14,204 files]
   ├── ✔ File metadata                   [14,204 locations]
   └── ✔ Executables                     [733 executables]
 ✔ Scanned for vulnerabilities     [2 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 0 low, 0 negligible (2 unknown)
   └── by status:   0 fixed, 2 not-fixed, 0 ignored
NAME         INSTALLED  FIXED-IN  TYPE  VULNERABILITY   SEVERITY
git          2.48.1-r0            apk   CVE-2024-52005  Unknown
python-3.13  3.13.1-r5            apk   CVE-2025-0938   Unknown
```

So the image is a bit smaller at 1.55GB, but more importantly, we've vastly reduced the number of vulnerabilities. There are now only 2 known vulnerabilities.

But we can still do more. In particular, although 1.55GB is smaller than the previous version, it's still a large image. To get the size down, we can use a multi-stage build where the built assets are copied into a minimal Production Container, which doesn't include build tooling or dependencies required during development.

Ideally, we would use the `cgr.dev/chainguard/node:latest` image for this, but we also need to install the dependencies for `node-canvas`, which means we need an image with apk tools. Normally it’s recommended to use a `:latest-dev` image for this, but in node's case, the `:latest-dev` image is relatively large due to the inclusion of build tooling, such as C compilers, that can be required by Node modules. Instead, we're going to use the `wolfi-base` image and install `nodejs` as a package.

To do this, replace the Dockerfile with the following:

```Dockerfile
FROM cgr.dev/chainguard/node:latest-dev AS build

USER root
RUN apk update && apk add \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev python3 make gcc \
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev \
    libfontconfig1

#Create non-root user
RUN addgroup dnmonster && adduser -D -G dnmonster dnmonster
RUN install -d -o dnmonster -g dnmonster /home/dnmonster

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install
COPY ./src /usr/src/app

RUN chown -R dnmonster:dnmonster /usr/src/app
USER dnmonster

EXPOSE 8080

ENTRYPOINT [ "npm", "start" ]

FROM cgr.dev/chainguard/wolfi-base

RUN apk update && apk add nodejs \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev \
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev

WORKDIR /app
COPY --from=build /usr/src/app /app

EXPOSE 8080
ENTRYPOINT [ "node", "server.js" ]
```

We've added an `as build` statement to the first `FROM` line and added a second build that starts on the line `FROM cgr.dev/chainguard/wolfi-base`. The second build installs the required dependencies (including Node.js) before copying the build artifacts from the first image. We also changed the entrypoint to execute Node directly, as the container image no longer contains npm.

Build and investigate the image:

```bash
docker build --pull -t dnmonster-multi .
…
docker images dnmonster-multi
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
dnmonster-multi   latest    a2efea945fb9   2 minutes ago   620MB

grype dnmonster-multi
 ✔ Loaded image                                                                                          dnmonster-multi:latest
 ✔ Parsed image                                         sha256:08c8f2b6f0bc8b55a5962abfb9daaee9030fc37c19875592ea53f896f29a4c60
 ✔ Cataloged contents                                          37c6abd0a832ad48e4a604a392d6ebbea1a7483ddedf94b7762186de9e991cff
   ├── ✔ Packages                        [343 packages]
   ├── ✔ File digests                    [8,887 files]
   ├── ✔ File metadata                   [8,887 locations]
   └── ✔ Executables                     [601 executables]
 ✔ Scanned for vulnerabilities     [0 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 0 low, 0 negligible
   └── by status:   0 fixed, 0 not-fixed, 0 ignored
No vulnerabilities found
```

This results in a container image that is now 620MB in size and has 0 CVEs.

We're most of the way now, but there are still a couple of finishing touches to make. The first one is to remove the dnmonster user. The wolfi-base image already defines a `nonroot` user, so we can make the build a little less complicated by using that user directly. The second one is to add in a process manager. We have node running as the root process (PID 1) in the container, which isn't ideal as it doesn't handle some of the responsibilities that come with running as PID 1, such as forwarding signals to subprocesses. You can see this most clearly when you try to stop the image – it takes several seconds as the process doesn't respond to the SIGTERM signal sent by Docker and has to be hard killed with SIGKILL. To fix this, we can add [`tini`](https://github.com/krallin/tini), a small init for containers.

The `tini` binary runs as PID 1, launches npm as a subprocess, and takes care of PID 1 responsibilities. Now, the final Dockerfile looks like this:

```Dockerfile
FROM cgr.dev/chainguard/node:latest-dev AS build

USER root

RUN apk update && apk add \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev python3 make gcc \
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev \
    libfontconfig1

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ENV NODE_ENV production
COPY package.json /usr/src/app/
RUN npm install
COPY ./src /usr/src/app

FROM cgr.dev/chainguard/wolfi-base

RUN apk update && apk add tini nodejs \
    cairo-dev libjpeg-turbo-dev pango-dev giflib-dev \
    librsvg-dev glib-dev harfbuzz-dev fribidi-dev expat-dev libxft-dev

WORKDIR /app
COPY --from=build /usr/src/app /app

EXPOSE 8080
ENTRYPOINT ["tini", "--" ]
CMD [ "node", "server.js" ]
```

This version is also available in the [main branch of the repository](https://github.com/chainguard-dev/identidock-cg/blob/main/dnmonster/Dockerfile).

Build it:

```bash
docker build --pull -t dnmonster-final .
…
```

And run it to prove it still works:

```bash
docker run -d -p 8080:8080 dnmonster-final
...
curl --output ./monster.png 'localhost:8080/monster/wolfi?size=100'
```

> **Note:** If you receive a "port is already allocated" error, be sure to clean up the previous container. Check what containers are running with `docker container ls` and remove it with `docker rm -f <container-name>`. There are still more tweaks that could be made. Bret Fisher has some [excellent resources on building Node.js containers in this GitHub repo](https://github.com/BretFisher/nodejs-rocks-in-docker). But for the purposes of this example app, we've made excellent progress.

## Updating the Python microservice

The next service we update is Identidock, the main entrypoint for the application. Identidock is responsible for looking up requests in the cache and falling-back to calling the dnmonster service if they're not present.

Again, the version of the code on the v1 branch already contains a few updates from the original code, but in this case all that was needed was to bump various libraries to newer versions. The Dockerfile for the v1 version can be found in the identidock folder and looks like:

```Dockerfile
FROM python

RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==3.1.0 uWSGI requests==2.32.3 redis==5.2.1
WORKDIR /app
USER uwsgi
COPY app /app
COPY cmd.sh /

EXPOSE 9090 9191

CMD ["/cmd.sh"]
```

The image can be built with the following, assuming the current directory is the root of repo:

```bash
cd identidock
docker build --pull -t identidock .
…
```

Inspect the container image:

```bash
docker images identidock
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
identidock   latest    a718358590ff   11 seconds ago   1.51GB
```

Scan for vulnerabilities:

```bash
grype docker:identidock
 ✔ Loaded image                                                                                               identidock:latest
 ✔ Parsed image                                         sha256:0b4ac715984206f1e9134aa48a8efeba88e7badc3969d6f8c79cca98b47df676
 ✔ Cataloged contents                                          5ebeaac39f8f941d41629fdb1e13c39bc73558caadfe7699963b4b3a6c55a222
   ├── ✔ Packages                        [452 packages]
   ├── ✔ File digests                    [20,129 files]
   ├── ✔ File metadata                   [20,129 locations]
   └── ✔ Executables                     [1,428 executables]
 ✔ Scanned for vulnerabilities     [621 vulnerability matches]
   ├── by severity: 7 critical, 100 high, 296 medium, 47 low, 515 negligible (200 unknown)
   └── by status:   2 fixed, 1163 not-fixed, 544 ignored
```

At the time of writing, this container image is 1.51GB with hundreds of vulnerabilities (7 critical) according to Grype.

Again as a first step, we try switching directly to the Chainguard Container. To do this, edit the Dockerfile so the first line reads:

```Dockerfile
FROM cgr.dev/chainguard/python:latest-dev
```

Before building the image we need to also update `groupadd` syntax to use the `addgroup` format. As Chainguard Containers don't run as root by default for security reasons, we also need to change to the root user for this command to work. Replace the `RUN groupadd` line with the lines:

```Dockerfile
USER root
RUN addgroup uwsgi && adduser -D -G uwsgi uwsgi
```

The image now builds, but there are issues due to differences in the image entrypoint. If you run the container image, you get a confusing error message such as:

```bash
`File "/cmd.sh", line 4`
  if [ "$ENV" = 'DEV' ]; then
         ^^^^^^
SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
```

This is caused by the Chainguard Containers using `/usr/bin/python` as the entrypoint, which means the `cmd.sh` entrypoint script is interpreted by Python instead of the shell. Fixing this can be as easy as changing the entrypoint, but let's take a look at the script first.

This is the file `cmd.sh` in the identidock directory:

```bash
#!/bin/bash
set -e

if [ "$ENV" = 'DEV' ]; then
   echo "Running Development Server"
   exec python "/app/identidock.py"
elif [ "$ENV" = 'UNIT' ]; then
    echo "Running Unit Tests"
    exec python "tests.py"
else
    echo "Running Production Server"
    exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py \
               --callable app --stats 0.0.0.0:9191
fi
```

This script decides how to run the application depending on how the `ENV` environment variable is set. The idea here is to allow us to use the same image in development, testing, and production. This approach is no longer recommended as it leads to development tooling being present in the production environment. Even though the development tooling isn't run in production, it is still bloating the image and is potentially exploitable by attackers. Therefore, we use a different approach and break the Dockerfile into separate development and production images.

Let’s skip to the final Dockerfile for our image and walk through the changes made. These changes address multiple issues, beyond just having multiple images, and are based on the [Chainguard Academy guide to Python images](/chainguard/containers/getting-started/languages-and-runtimes/python/).

Replace the Dockerfile with this one (this is also available on the ["main" branch](https://github.com/chainguard-dev/identidock-cg/blob/main/identidock/Dockerfile)):

```Dockerfile
FROM cgr.dev/chainguard/python:latest-dev AS dev

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app
RUN python -m venv --without-pip /app/venv
COPY requirements.txt ./
RUN pip --python /app/venv/bin/python install --no-cache-dir -r requirements.txt
COPY app /app

EXPOSE 5000

ENTRYPOINT ["python"]
CMD ["identidock.py"]

FROM cgr.dev/chainguard/python

WORKDIR /app
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

COPY app/identidock.py ./
COPY --from=dev /app/venv /app/venv

EXPOSE 9090
ENTRYPOINT [ "gunicorn", "-b", "0.0.0.0:9090", "identidock:app" ]
```

And add the file `requirements.txt` to the current directory (`identidock`) with the following contents:

```
Flask==3.1.0
requests==2.32.3
redis==5.2.1
gunicorn==23.0.0
```

The first thing to notice is that we have a multistage build now. If you want the Development container image rather than the production one, you can specify it during docker build:

```bash
docker build --pull --target dev -t identidock:dev .
```

Otherwise, you get the standard variant only.

There are several more environment variables defined. These prevent the creation of Python bytecode and buffering of output.

The installation of pip modules has moved to the `requirements.txt` file. The main thinking here is that we don't need to update the Dockerfile each time a dependency is updated or changed.

The development server runs on port 5000, while the production server runs on port 9090. We could edit this so they both run on the same port, but this approach reduces the chance of accidentally running the development server in production. The development server is started directly from the entrypoint, so we are no longer dependent on an entrypoint script, simplifying our architecture.

To get a minimal, clean production install, we are using a Python virtual environment ([venv](https://docs.python.org/3/library/venv.html)) in the development image to isolate all dependencies, which are then copied over to the production image. The `--without-pip` flag keeps pip out of that environment, so the production image carries only the packages the application imports. Installing into the environment then takes `pip --python /app/venv/bin/python`, which runs the development image's system pip against the environment. If you work inside the development container, use that same `--python` flag to add a package, because a bare `pip install` targets the system interpreter instead. Finally, the production image has been changed to use [gunicorn](https://gunicorn.org/) as [uwsgi has entered "maintenance mode"](https://github.com/unbit/uwsgi).

Build the final image:

```bash
docker build --pull -t identidock-cg .
```

And take a look at it:

```bash
docker images identidock-cg
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
identidock-cg   latest    1b5689af14a1   14 seconds ago   122MB
```

Run a scan with grype:

```bash
grype docker:identidock-cg
 ✔ Loaded image                                                                                            identidock-cg:latest
 ✔ Parsed image                                         sha256:c79295258a2b67f2a0eda49c41a2d791888df6cc7b3bdea694d810ec5d2916d8
 ✔ Cataloged contents                                          6c8262ac152209ef3e36cad9c49c0d3e3f16d7cbfeafad9abb569c7690c68c2e
   ├── ✔ Packages                        [45 packages]
   ├── ✔ File digests                    [1,667 files]
   ├── ✔ File metadata                   [1,667 locations]
   └── ✔ Executables                     [135 executables]
 ✔ Scanned for vulnerabilities     [1 vulnerability matches]
   ├── by severity: 0 critical, 0 high, 0 medium, 0 low, 0 negligible (1 unknown)
   └── by status:   0 fixed, 1 not-fixed, 0 ignored
NAME         INSTALLED  FIXED-IN  TYPE  VULNERABILITY  SEVERITY
python-3.13  3.13.1-r5            apk   CVE-2025-0938  Unknown
```

The result of all these changes is that the production image is only 122 MB (down from 1.51GB, so an enormous saving of over a GB) and has 1 CVE (down from hundreds). This is a huge improvement!

Further information on using Chainguard Containers with Python can be found in our [Getting started guide](https://edu.chainguard.dev/chainguard/containers/getting-started/languages-and-runtimes/python/).

## Replacing the Redis container and updating the Docker Compose file

Updating Redis is straightforward. We're not making any changes to the application image, so all we need to do is directly update the reference to `redis:7` in the Docker Compose file to `cgr.dev/chainguard/redis`. The new container image requires no extra configuration, but we go from a 195 MB image with 129 vulnerabilities to a 33 MB image with 0 CVEs (again according to Grype).

To update Compose, in the top level directory of the repo, replace the content of the `docker-compose.yml` file with the following:

```yaml
name: identidock

services:
  frontend:
    build: identidock
    ports:
      - "9090:9090"

  dnmonster:
    build: dnmonster

  redis:
    image: cgr.dev/chainguard/redis
```

If you now run `docker compose up --build`, you should have a working application that can be reached on port 9090:

![Screenshot of running application](app.png "Screenshot of running application")

There are some differences between this version and the original. The environment variable used for switching between image variants has been removed and the ports have changed to reflect the default port used in gunicorn.

This Compose file doesn't contain support for a development workflow currently – ideally we would be able to quickly iterate on our code without building a new image. The original file used volumes to achieve this, but this isn't something we want to do with the production image. One solution is to have a separate development Compose file, which builds the development image and uses a volume to mount code at runtime for immediate feedback. New versions of Docker also support [Compose Watch](https://docs.docker.com/compose/file-watch/) which can be a more efficient and granular solution than volume mounts. Refer to [What is Docker Compose Watch and what problem does it solve?](https://collabnix.com/what-is-docker-compose-watch-and-what-problem-does-it-solve/) for an introductory tutorial on using Compose Watch.

## Conclusion

Porting our application to Chainguard Containers was relatively straightforward. There were some gotchas around differences to other images, such as different entrypoint settings and names for packages. The largest part of the puzzle was moving from single image builds to multistage builds that take advantage of the minimal Chainguard runtime images for Python and NodeJS. Once all this was done, we ended up with a much smaller set of images and with a drastically reduced number of CVEs.

### Cleaning up

To clean up the resources used in this guide, first stop any containers started by Compose:

```bash
docker-compose down
```

Then check `docker ps` to see if any containers are still running and stop them with `docker stop
<id>`.

You can then remove any container images you've built:

```bash
docker rmi -f dnmonster dnmonster-cg dnmonster-multi identidock identidock:dev identidock-cg
```

---

### Dockerfile Converter
_Path: chainguard/containers/migration/migration-tools/dockerfile-conversion.md_

Chainguard's [Dockerfile Converter (dfc)](https://github.com/chainguard-dev/dfc) was designed to facilitate the process of porting existing Dockerfiles to use Chainguard Containers. The following platforms are currently supported:

* Alpine (`apk`)
* Debian / Ubuntu (`apt`, `apt-get`)
* Fedora / RedHat / UBI (`yum`, `dnf`, `microdnf`)

> **Note:** If you prefer a fully automated approach, [The Guardener](/chainguard/guardener/dockerfile-migration/) is an AI-powered agent that can migrate, optimize, and validate your Dockerfiles with minimal manual intervention.

## Installation

If you use Homebrew, you can install dfc with:

```shell
brew install chainguard-dev/tap/dfc
```

If you prefer to use the Go toolchain, you can install dfc directly from source. The following command will download the latest version of dfc and install it in your `$GOPATH/bin` directory:

```shell
go install github.com/chainguard-dev/dfc@latest
```

If that does not work, make sure the PATH environment variable is properly set:

```shell
export PATH="$PATH:$(go env GOPATH)/bin"
```

To verify that the installation was successful, run:

```shell
dfc -v
```

You will receive output indicating which version of dfc you have installed, such as:

```
dfc version v0.9.3
```

## Getting started

DFC supports inline conversion of entire Dockerfiles and single `FROM` and `RUN` instructions. It can also read Dockerfiles from files or standard input (stdin). The converted Dockerfile will use Chainguard Containers as the base image, which are available at `cgr.dev/<org>`.

### Inline usage

With inline usage, you can convert single instructions or entire Dockerfiles. For example, to convert a single `FROM` line, you can run:

```shell
echo "FROM node" | dfc -
```

This will give you the following result:

```
FROM cgr.dev/ORG/node:latest
```

The `ORG` here is a placeholder that you should replace with your unique organization's namespace at Chainguard, or use `chainguard` for the free tier of images. In the [customizing section](#customizing-the-conversion) you'll learn how to use the `--org` flag to set this up automatically.

You can also convert single `RUN` directives such as the following:

```shell
echo "RUN apt-get update && apt-get install -y nano" | dfc -
```

Which will give you the following output:

```
RUN apk add --no-cache nano
```

It is also possible to convert a whole Dockerfile using inline mode. Here we use a heredoc input stream to create the Dockerfile content and pipe it to `dfc`:

```shell
cat <<DOCKERFILE | dfc -
FROM node
RUN apt-get update && apt-get install -y nano
DOCKERFILE
```

This will convert to:

```
FROM cgr.dev/ORG/node:latest-dev
USER root
RUN apk add --no-cache nano
```

Notice the `USER root` directive that has been included here to allow for package installations. You'll find details of why that happens in the [How it works](#package-installations) section of this guide.

### Usage with regular Dockerfiles

Unless specified, dfc will not make any direct changes to your Dockerfile, writing the results to the default output stream. To convert a Dockerfile and save the output to a new file called `Dockerfile.converted`, run the following command:

```shell
dfc ./Dockerfile > ./Dockerfile.converted
```

You can also pipe the Dockerfile’s contents from stdin:

```shell
cat ./Dockerfile | dfc -
```

## How it works

DFC was designed to work offline by default, which means it doesn't validate image names or check for the existence of images in a live registry. Instead, it relies on a set of rules and mappings to convert Dockerfiles to use Chainguard Containers. This includes not only the change of base image used in a Dockerfile, but also the conversion of package managers and commands used in `RUN` instructions.

### FROM conversion

DFC will convert the `FROM` instruction in a Dockerfile using two main mechanisms:

* **Registry Path Rewriting:** `dfc` programmatically rewrites the registry path in all `FROM` instructions to align with the Chainguard registry format. By default, it inserts a placeholder for the organization name, which can be explicitly set using the `--org` flag. This mechanism ensures that resulting images are sourced from the appropriate organization namespace within the Chainguard container registry.
* **Image Name Translation:** `dfc` also performs automated translation of image names based on an internal mapping file. This mapping correlates common base images and their versions to their Chainguard Container equivalents. Custom mappings can be defined to accommodate project-specific requirements, as detailed in a subsequent section. When a mapping does not exist for a specific image, `dfc` will default to use the same image name as the original Dockerfile.

For example, the following command will convert an inline `FROM` instruction using `node` as the base image:

```shell
echo "FROM node" | dfc -
```

You will receive the following output:

```shell
FROM cgr.dev/ORG/node:latest
```

### Tag mappings

The tag conversion process follows a set of rules:

1) For `chainguard-base`, always use the `latest` tag.
   * This means that if the base image is `debian`, it will be converted to `cgr.dev/ORG/chainguard-base:latest`.
2) When no tag is specified, or when a tag is not semantic, use `latest`.
   * For example, `FROM node` will be converted to `FROM cgr.dev/ORG/node:latest`.
3) When a tag is specified, truncate semantic to major.minor (e.g.: 1.2.3 to 1.2).
   * For example, `FROM node:14.17.3` will be converted to `FROM cgr.dev/ORG/node:14.17`.
   * If the tag is not semantic (e.g., `latest`, `stable`, etc.), it will be converted to `latest`.
4) For any version except `chainguard-base`, add `-dev` suffix when there are `RUN` commands.
   * For example, `FROM node:14` will be converted to `FROM cgr.dev/ORG/node:14-dev` if the Dockerfile has `RUN` instructions.
   * If there are no `RUN` commands, it will not have the `-dev` suffix, e.g., `FROM node:14` will be converted to `FROM cgr.dev/ORG/node:14`.

More Examples:

* `FROM node:14` → `FROM cgr.dev/ORG/node:14-dev` (if stage has RUN commands)
* `FROM node:14.17.3` → `FROM cgr.dev/ORG/node:14.17-dev` (if stage has RUN commands)
* `FROM debian:bullseye` → `FROM cgr.dev/ORG/chainguard-base:latest` (always)
* `FROM golang:1.19-alpine` → `FROM cgr.dev/ORG/go:1.19-dev` (if stage has RUN commands)
* `FROM node:${VERSION}` → `FROM cgr.dev/ORG/node:${VERSION}-dev` (if stage has RUN commands)

### Package installations

When a Dockerfile uses package managers such as `apt`, `dnf`, or `yum` to install software, `dfc` automatically translates these commands to their `apk` equivalents. This conversion leverages an internal mapping file to resolve package name differences between distributions, ensuring accurate and compatible package installation within the Chainguard Containers environment.

In addition to that, DFC automatically includes a `USER root` directive when it detects package installation commands in the Dockerfile. This is necessary because Chainguard Containers are built with a non-root user by default, and package installation commands typically require root privileges.

For example, consider the following Dockerfile based on Fedora:

```Dockerfile
FROM fedora

RUN dnf -y update && dnf clean all && dnf -y install python-pip && dnf clean all

ADD . /src

RUN cd /src; pip install -r requirements.txt

EXPOSE 8080

CMD ["python", "/src/index.py"]
```

The following command will convert this Dockerfile and print the results to stdout:

```shell
dfc Dockerfile
```

You will receive the following output:

```Dockerfile
FROM cgr.dev/ORG/chainguard-base:latest
USER root

RUN apk add --no-cache python-pip

ADD . /src

RUN cd /src; pip install -r requirements.txt

EXPOSE 8080

CMD ["python", "/src/index.py"]
```

### BusyBox changes for user and group management

DFC will automatically change any `useradd` and `groupadd` instructions in your Dockerfile to `adduser` and `addgroup` to match Busybox’s syntax. This ensures that user and group creation commands execute correctly within the Chainguard Containers environment, maintaining consistent behavior and preventing build failures.

For example, consider the following Dockerfile that adds a `nonroot` user to the image:

```Dockerfile
FROM php:8.3-cli

RUN apt-get update && apt-get install -y \
    git \
    curl \
    libxml2-dev \
    zip \
    unzip

# Install Composer and set up application
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /app
COPY . /app

# set up nonroot system user
RUN useradd -r -s /bin/bash nonroot && \
    chown -R nonroot /app && \
    cd /app && composer install

USER nonroot
ENTRYPOINT [ "php", "minicli", "mycommand" ]
```

When converting this Dockerfile with `dfc`, the `useradd` command will be replaced with `adduser`, and the resulting Dockerfile will look like this:

```Dockerfile
FROM cgr.dev/ORG/php:8.3-dev
USER root

RUN apk add --no-cache curl git libxml2-dev unzip zip

# Install Composer and set up application
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /app
COPY . /app

# set up nonroot system user
RUN adduser --system --shell /bin/bash nonroot && \
    chown -R nonroot /app && \
    cd /app && \
    composer install

USER nonroot
ENTRYPOINT [ "php", "minicli", "mycommand" ]
```

### Multi-stage Dockerfiles

Multi-stage builds are crucial for creating smaller, more secure, and efficient container images. By separating the build environment from the final runtime environment, they significantly reduce the final image size by discarding unnecessary build-time dependencies. This also enhances security by minimizing the attack surface.

DFC is designed to recognize and process multi-stage Dockerfiles the same way it handles regular single-stage Dockerfiles, converting them to leverage the advantages of Chainguard Containers.

Consider this multi-stage Python Dockerfile, which includes a few build-time dependencies and a leaner runtime:

```Dockerfile
FROM python:3.9 as builder
WORKDIR /app

RUN apt update && apt install -y curl git

ENV PATH="/venv/bin:$PATH"
RUN python -m venv /app/venv

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-slim
WORKDIR /app

ENV PATH="/venv/bin:$PATH"

COPY main.py /app
COPY --from=builder /app/venv /venv

CMD ["python", "/app/main.py"]
```

Running DFC on this Dockerfile with default options will give you the following result:

```shell
FROM cgr.dev/ORG/python:3.9-dev AS builder
USER root
WORKDIR /app

RUN apk add --no-cache curl git

ENV PATH="/venv/bin:$PATH"
RUN python -m venv /app/venv

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

FROM cgr.dev/ORG/python:3.9
WORKDIR /app

ENV PATH="/venv/bin:$PATH"

COPY main.py /app
COPY --from=builder /app/venv /venv

CMD ["python", "/app/main.py"]
```

As you will notice, DFC used a _distroless_ Python Chainguard Container for the final runtime stage: `cgr.dev/ORG/python:3.9`. That is possible because DFC didn't detect any `RUN` instruction in the final stage. If we had system-level dependencies installed via `apk` or other `RUN` instructions in the runtime stage, DFC would instead default to the regular, fully-featured Python image from Chainguard Containers, which in this case would be `cgr.dev/ORG/python:3.9-dev`.

For more details on distroless and how to work with multi-stage builds, check our guide on [Getting started with distroless](/chainguard/containers/concepts/getting-started-distroless/).

## Customizing the conversion

There are several ways to customize the conversion process of Dockerfiles using `dfc`.

### Setting the ORG

By default, `dfc` uses `ORG` as a placeholder for the image registry address. You can provide the `--org` parameter to specify the organization that you’re a member of. To use free tier images, use `chainguard` as the organization.

For example, the following command will convert a Dockerfile and set the organization to `chainguard`:

```shell
echo "FROM node" | dfc --org chainguard -
```

You will receive output similar to this:

```
FROM cgr.dev/chainguard/node:latest
```

### Using a custom registry

You can also specify a custom registry to use for the conversion. This is useful if you have your own registry. To do this, use the `--registry` flag followed by the desired registry URL. For example, if you want to use `myregistry.example.com` as the registry, you can run:

```shell
echo "FROM node" | dfc --registry myregistry.example.com -
```

You'll get output like this:

```
FROM myregistry.example.com/node:latest
```

One thing to note is that the `--registry` flag will override the `--org` flag, so if you specify both, the `--registry` will take precedence.

### Using custom mappings

You can also provide a custom mapping file to `dfc` using the `--mapping` flag. This allows you to define your own rules for converting Dockerfiles, such as specific image names or package names that should be translated differently.

For example, consider the following Dockerfile based on the `php:fpm` image:

```Dockerfile
FROM php:fpm

RUN apt-get update && apt-get install -y \
    git \
    curl \
    libxml2-dev \
    zip \
    unzip

# Install Composer and set up application
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN mkdir /application
COPY . /application/
RUN cd /application && composer install
```

By default, DFC will convert the `php:fpm` base image to Chainguard's main PHP image, `php:latest-dev`. However, we'd like this to be converted to `php:latest-fpm-dev`, since that is the FPM variant of the PHP image in the Chainguard registry. To handle that case, we can create a custom mapping file called `mappings.yaml` with the following content:

```yaml
images:
  php:fpm: php:latest-fpm-dev
```

Then, when running `dfc`, we can specify this mapping file using the `--mapping` flag:

```shell
dfc Dockerfile --mappings mappings.yaml
```

And this will produce the following output:

```Dockerfile
FROM cgr.dev/ORG/php:latest-fpm-dev
USER root

RUN apk add --no-cache curl git libxml2-dev unzip zip

# Install Composer and set up application
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN mkdir /application
COPY . /application/
RUN cd /application && composer install
```

## Advanced topics

### Making in-place changes

By default, dfc will print the converted Dockerfile to stdout, and won’t make any changes to your original Dockerfile. You can use the `--in-place` flag to make dfc overwrite the original file. This will also create a `.bak` file to back up the original file contents.

```shell
dfc Dockerfile --in-place
```

```
2025/03/14 14:54:21 saving dockerfile backup to Dockerfile.bak
2025/03/14 14:54:21 overwriting Dockerfile
```

This method does not work with inline input.

### Working with JSON output

If you plan on using `dfc` programmatically, the JSON output can come in handy. For example, the following will convert an inline Dockerfile and output the results in JSON format, parsed by `jq` for readability:

```shell
cat <<DOCKERFILE | dfc --org chainguard.edu --json - | jq
FROM node
RUN apt-get update && apt-get install -y nano
DOCKERFILE
```

```
{
  "lines": [
    {
      "raw": "FROM node",
      "converted": "FROM cgr.dev/chainguard.edu/node:latest-dev\nUSER root",
      "stage": 1,
      "from": {
        "base": "node"
      }
    },
    {
      "raw": "RUN apt-get update && apt-get install -y nano",
      "converted": "RUN apk add -U nano",
      "stage": 1,
      "run": {
        "distro": "debian",
        "manager": "apt-get",
        "packages": [
          "nano"
        ]
      }
    },
    {
      "raw": ""
    }
  ]
}

```

Check also the [Useful jq formulas](https://github.com/chainguard-dev/dfc?tab=readme-ov-file#useful-jq-formulas) section from the dfc repository as reference on how to use jq to filter the JSON output.

### Using dfc as a Go library

You can import the package `github.com/chainguard-dev/dfc/pkg/dfc` and use it directly from Go code to parse and convert Dockerfiles on your own, without the dfc CLI. This way, you can integrate dfc into your own Go applications or scripts, which can be especially useful if you have a large number of Dockerfiles to convert or if you want to further customize the output produced by dfc.

Check the [Using from Go](https://github.com/chainguard-dev/dfc?tab=readme-ov-file#using-from-go) section on the dfc repository for examples on how to use it as a Go library.

### Usage via AI agent (MCP server)

While dfc operates completely offline and does not in itself use AI to perform conversion of Dockerfiles, it can be leveraged as an MCP (Model Context Protocol) Server to integrate with an AI-based prompt engineering workflow.

This experimental capability allows AI agents to utilize DFC’s powerful conversion logic within a broader AI-driven engineering ecosystem. It's particularly useful for scenarios where automation handles 90% of the conversion and AI manages edge cases and custom logic.

For more information on how to use DFC with AI agents, check the [Project's README on GitHub](https://github.com/chainguard-dev/dfc#usage-via-ai-agent-mcp-server).

## Learn more

If you'd like to learn more about our Dockerfile Converter, including how to get involved with the project, you can check out the [dfc repository on GitHub](https://github.com/chainguard-dev/dfc). We welcome contributions and feedback from the community.

---

### Find a matching Chainguard image using the API
_Path: chainguard/containers/migration/migration-tools/find-match.md_

This guide walks through calling the [Chainguard Image Matcher API](/chainguard/api/spec-api-v1/#tag/imagematcher) to find the best Chainguard equivalent for an existing container image. It assumes you already have an SBOM for the image you want to migrate.

For background on how the matcher works and how it scores recommendations, refer to [Image Matcher overview](/chainguard/containers/migration/migration-tools/image-matcher/).

## Prerequisites

Before getting started, you will need:

- An SBOM for your source image in CycloneDX JSON format, with `purl` values on each component.
    - SBOMs produced by [Syft](https://github.com/anchore/syft), Trivy, `docker sbom`, or cdxgen all work.
- `chainctl` [installed and authenticated](/chainguard/api/authentication/).
- `jq` installed.
- Your Chainguard organization UID.
    - Retrieve it from **Settings > General** in the [Chainguard Console](https://console.chainguard.dev/org/-/settings/general), or run `chainctl iam groups list`.

## Step 1: Reshape your SBOM for the API

The Image Matcher API does not accept a raw CycloneDX document. It expects an `sbomComponents` array containing only distribution packages, with a small number of fields per component.

Save the following as `build-request.jq`:

```jq
{
  parent_id: $org_id,
  dist_name: $dist,
  arch: $arch,
  sbom: {
    sbomComponents: [
      .components[]
      | select(.purl != null and (.purl | startswith($purl_prefix)))
      | {
          type: .type,
          purl: .purl,
          name: .name,
          cpe: .cpe,
          bomref: ."bom-ref",
          version: .version
        }
    ]
  }
}
```

This filter does three things: it selects only distribution packages by PURL prefix, drops irrelevant CycloneDX fields (licenses, properties, publisher, etc.) that the API ignores, and renames `bom-ref` to `bomref` to match the API's expected field name.

Run it with values for your source distribution:

```bash
export ORG_ID="<your-org-uid>"

jq \
  --arg org_id "$ORG_ID" \
  --arg dist   "debian" \
  --arg arch   "x86_64" \
  --arg purl_prefix "pkg:deb/" \
  -f build-request.jq \
  your-image.cdx.json \
  > request.json
```

Use the following table to match `dist`, `arch`, and `purl_prefix` to your source image:

| Distribution      | `dist`         | `purl_prefix` |
|-------------------|----------------|---------------|
| Debian            | `debian`       | `pkg:deb/`    |
| Ubuntu            | `ubuntu`       | `pkg:deb/`    |
| Alpine            | `alpine`       | `pkg:apk/`    |
| Red Hat / RHEL    | `redhat`       | `pkg:rpm/`    |
| SUSE              | `suse`         | `pkg:rpm/`    |
| Amazon Linux      | `amazon-linux` | `pkg:rpm/`    |

Pass `dist_version` as an additional `--arg` if you know the exact version (for example, `12` for Debian 12, `24.04` for Ubuntu 24.04). This is optional, but it narrows the candidate set and improves results.

### Example request body

The reshaped request body for a Debian nginx image looks like the following:

```json
{
  "parent_id": "<your-org-uid>",
  "dist_name": "debian",
  "arch": "x86_64",
  "sbom": {
    "sbomComponents": [
      {
        "type": "library",
        "purl": "pkg:deb/debian/nginx@1.28.0-1~bookworm?arch=amd64&distro=debian-12",
        "name": "nginx",
        "cpe": "cpe:2.3:a:nginx:nginx:1.28.0-1~bookworm:*:*:*:*:*:*:*",
        "bomref": "pkg:deb/debian/nginx@1.28.0-1~bookworm?arch=amd64&distro=debian-12&package-id=...",
        "version": "1.28.0-1~bookworm"
      },
      {
        "type": "library",
        "purl": "pkg:deb/debian/libssl3@3.0.17-1~deb12u3?arch=amd64&distro=debian-12&upstream=openssl",
        "name": "libssl3",
        "cpe": "cpe:2.3:a:libssl3:libssl3:3.0.17-1~deb12u3:*:*:*:*:*:*:*",
        "bomref": "pkg:deb/debian/libssl3@3.0.17-1~deb12u3?arch=amd64&distro=debian-12&package-id=...",
        "version": "3.0.17-1~deb12u3"
      }
    ]
  }
}
```

## Step 2: Call the API

Run the following:

```bash
curl -sS \
  -H "Authorization: Bearer $(chainctl auth token)" \
  -H "Content-Type: application/json" \
  -X POST "https://console-api.enforce.dev/image-recommendation/v1/match" \
  -d @request.json
```

## Step 3: Interpret the results

The response contains a ranked `images` array, ordered from highest to lowest `probabilityScore`. For example:

```json
{
  "images": [
    {
      "imageRef": "cgr.dev/<your-org>/nginx:latest",
      "probabilityScore": 98.57,
      "satisfiedCount": 6,
      "totalRequired": 86,
      "coverage": 0.07,
      "satisfiedPackages": [...],
      "missingPackages": [...],
      "extraPackages": 14
    }
  ],
  "totalExternalPackages": 143,
  "requiredApks": ["nginx-mainline", "libgcc", "glibc", ...],
  "unmatchedExternalPkgs": ["adduser", "apt", "base-files", ...]
}
```

Key fields to check:

- **`probabilityScore`**: the matcher's confidence estimate (0–100). A score of 90 or above is a strong match. Scores in the 50–70 range warrant human review.
- **`imageRef`**: the full OCI reference for the recommended image. Use the final path segment and tag (for example, `nginx:latest`) when displaying this to users or comparing against the [Chainguard image catalog](https://images.chainguard.dev/). Keep the full reference if you intend to pull the image.
- **`missingPackages`**: packages from your SBOM that are not present in the recommended image. Some missing packages are expected: Chainguard images are intentionally minimal. Review this list to identify any packages your application requires at runtime.
- **`unmatchedExternalPkgs`**: source packages the matcher could not map to any Chainguard APK. A long list is normal for general-purpose distributions like Debian, where many entries are build-time tools or base-image scaffolding.

### Low `coverage` with a high `probabilityScore`

You may notice that `coverage` (the fraction of required APKs present in the image) can be low even when `probabilityScore` is high. This is expected behavior. Package weights are not uniform: the package that defines an image's purpose carries a weight orders of magnitude larger than common shared dependencies. A `probabilityScore` of 98 with `coverage` of 0.07 means the matcher is highly confident it has found the right image, even though many low-level library names differ between your source distribution and Chainguard's APK catalog.

Learn more about the probability score in the [Image Matcher overview](/chainguard/containers/migration/migration-tools/image-matcher/#understanding-the-probability-score).

### Reviewing multiple candidates

The API returns up to 10 candidates by default. For common stacks the top result is typically correct, but it is good practice to review the second and third results, particularly when:

- The top score is below 90.
- The top two scores are within a few points of each other.
- The source image is not a well-known public image.

To request more or fewer candidates, add a `count` field to your request body. To suppress weak matches, add a `threshold` field (default: `50.0`).

---

### Image Matcher overview
_Path: chainguard/containers/migration/migration-tools/image-matcher.md_

The [Chainguard Image Matcher](/chainguard/api/spec-api-v1/#tag/imagematcher) is an API-based tool that analyzes the software bill of materials (SBOM) of an existing container image and returns a ranked list of Chainguard images that most closely match it. It is designed to support migration workflows where you know what you are running today and want to find the best Chainguard equivalent.

## How it works

You supply an SBOM for your current image, along with the source Linux distribution. The Image Matcher maps the packages in your SBOM to Chainguard APK packages, scores each candidate Chainguard image based on how well its contents cover your requirements, and returns a ranked list of recommendations with confidence scores.

The matcher is deterministic: the same SBOM submitted to the same API will always produce the same results. There is no machine learning model involved. Results may change slightly over time as Chainguard improves its mapping data and publishes new images, but there is no per-request variation.

### What the matcher returns

Each recommendation includes:

- The recommended Chainguard image reference
- A probability score (0–100) indicating how closely the image matches your SBOM
- The packages from your SBOM that are satisfied by the recommended image
- The packages that would be missing if you migrated to that image
- Any extra packages present in the image that your SBOM did not request

The number of candidates returned by the API is configurable, and the results are ranked by score. For well-known stacks such as `nginx`, `postgres`, or `redis`, the top result is typically the right choice. For less common images, the results may warrant human review.

## Understanding the probability score

The probability score is the matcher's confidence estimate, normalized to a 0–100 scale. It is calculated from three weighted components:

- **Satisfied score**: the sum of weights of SBOM packages present in the candidate image. This is the dominant factor.
- **Missing score**: the sum of weights of SBOM packages absent from the candidate image. This is weighted lightly. Chainguard images are intentionally minimal, so some missing packages are expected and do not significantly penalize the score.
- **Extra score**: the sum of weights of packages in the candidate image that your SBOM did not request. This carries a moderate penalty.

The combined raw score is passed through a sigmoid-like transform and clamped to 0–100.

A score of 90 or above is a strong match. Scores in the 50–70 range warrant human review. The score is capped at 100, so multiple candidates may report the same top score while differing in their underlying ranking — use the `overallScore` field to differentiate them when needed.

Package weights are not uniform. The package that defines an image's primary purpose (for example, `postgres` in the `postgres` image) carries a weight orders of magnitude larger than common shared dependencies like `openssl` or `ca-certificates`. This is why the matcher reliably identifies the right base image even when many low-level library names differ between distributions.

## How packages are mapped across distributions

Linux distributions use different names for packages that provide the same upstream software. The matcher translates source package names from your SBOM into Chainguard APK names before scoring. This translation is where most of the recommendation logic is concentrated.

The following table shows representative examples of how the same upstream software appears across distributions and in the Chainguard catalog:

| Upstream project   | Debian / Ubuntu              | Alpine               | Red Hat / Amazon Linux | Chainguard APK(s)                |
|--------------------|------------------------------|----------------------|------------------------|----------------------------------|
| GNU C Library      | `libc6`, `libc-bin`          | (musl libc instead)  | `glibc`                | `glibc`                          |
| OpenSSL library    | `libssl3`                    | `libssl3`            | `openssl-libs`         | `libssl3`, `libcrypto3`          |
| Apache HTTP Server | `apache2`                    | `apache2`            | `httpd`                | `httpd`                          |
| nginx web server   | `nginx`                      | `nginx`              | `nginx`                | `nginx-mainline`, `nginx-stable` |
| PostgreSQL server  | `postgresql-16`, `postgresql-17` | `postgresql16`   | `postgresql-server`    | `postgresql-16`, `postgresql-17` |
| curl HTTP client   | `curl` + `libcurl4`          | `curl` + `libcurl`   | `curl` + `libcurl`     | `curl`                           |

Two patterns are common:

- **Many source packages map to one Chainguard APK.** Debian splits the GNU C Library into `libc6`, `libc-bin`, and other sub-packages, while Chainguard ships the same software under the single name `glibc`. An SBOM listing `libc6` is translated to `glibc` before any image is scored.
- **One source package maps to multiple Chainguard APKs.** Some upstream packages correspond to more than one Chainguard APK because Chainguard publishes multiple variants. A reference to `nginx` fans out to both `nginx-mainline` and `nginx-stable`; a reference to `postgresql` fans out to `postgresql-16`, `postgresql-17`, and so on.

### Mapping sources

The matcher builds its package map from three sources, applied in priority order:

1. **Curated equivalences.** Hand-maintained rules for cases where automatic matching would be ambiguous or incorrect, such as the `apache2` → `httpd` rename and version-specific PostgreSQL fan-out.
2. **CPE and PURL matching.** Each Chainguard APK carries CPE and PURL identifiers from its `melange` build definition. When a source package's identifiers overlap with a Chainguard APK's, the matcher treats them as equivalent. This handles the long tail of common dependencies without per-package curation.
3. **Runtime module overlap.** For packages whose value is a bundled language ecosystem (Go modules, Python packages, Node modules), the matcher can detect shared underlying modules and treat packages as equivalent even when their distro-level names differ.
Source packages that cannot be mapped appear in the `unmatchedExternalPkgs` field of the response. A long list of unmatched packages is normal for general-purpose distributions like Debian: most entries are build-time tools, base-image scaffolding, or documentation packages that Chainguard's minimal images do not include.

## Limitations

- **Distribution must be specified.** The matcher works against a per-distribution package universe. You must supply `dist_name` with each request. Providing `dist_version` and `arch` is optional but improves results.
- **Results depend on SBOM quality.** The matcher maps packages primarily via `purl` and `cpe` fields. SBOMs that lack these fields on components will produce weaker results.
- **Chainguard images are intentionally minimal.** Expect missing packages in recommendations. This is by design: Chainguard images ship fewer packages than upstream equivalents in order to reduce attack surface.
- **The image catalog is refreshed daily.** Newly published Chainguard images typically appear in recommendations within one to two days of release.
- **The score is an estimate, not a guarantee.** A high probability score means the matcher is confident, not that the migration will be drop-in compatible. Always validate the recommended image in your environment before replacing production images.

---

### Red Hat UBI compatibility
_Path: chainguard/containers/migration/compatibility/red-hat-compatibility.md_

Chainguard Containers and Red Hat UBI base images have different binaries and scripts included in their respective `busybox` and `coreutils` packages. Note that Red Hat UBI images by default do not have a `busybox` package.

The following table lists common tools and their corresponding package(s) in both Wolfi and Red Hat distributions.

Note that `$PATH` locations like `/usr/bin` or `/sbin` are not included here. If you have compatibility issues with tools that are included in both `busybox` and `coreutils`, be sure to check `$PATH` order and confirm which version of a tool is being run.

Generally, if a tool exists in `busybox` but does not have a `coreutils` counterpart, there will be a specific package that includes it. For example the `zcat` utility is included in the `gzip` package in both Wolfi and Red Hat.

You can use the `apk search` command in Wolfi, or the `yum search` or `dnf search` commands in Red Hat to find out which package includes a tool.

| Utility         | Wolfi busybox | Redhat-ubi busybox | Wolfi coreutils | Redhat-ubi coreutils |
| --------------- | :-----------: | :----------------: | :-------------: | :------------------: |
| `[`             |      ✅       |                    |       ✅        |          ✅          |
| `[[`            |      ✅       |                    |                 |                      |
| `add-shell`     |      ✅       |                    |                 |                      |
| `addgroup`      |      ✅       |                    |                 |                      |
| `adduser`       |      ✅       |                    |                 |                      |
| `adjtimex`      |      ✅       |                    |                 |                      |
| `arch`          |      ✅       |                    |                 |          ✅          |
| `arping`        |      ✅       |                    |                 |                      |
| `ash`           |      ✅       |                    |                 |                      |
| `awk`           |      ✅       |                    |                 |                      |
| `b2sum`         |               |                    |       ✅        |          ✅          |
| `base32`        |               |                    |       ✅        |          ✅          |
| `base64`        |      ✅       |                    |       ✅        |          ✅          |
| `basename`      |      ✅       |                    |       ✅        |          ✅          |
| `basenc`        |               |                    |       ✅        |                      |
| `bbconfig`      |      ✅       |                    |                 |                      |
| `bc`            |      ✅       |                    |                 |                      |
| `beep`          |      ✅       |                    |                 |                      |
| `bunzip2`       |      ✅       |                    |                 |                      |
| `bzcat`         |      ✅       |                    |                 |                      |
| `bzip2`         |      ✅       |                    |                 |                      |
| `cal`           |      ✅       |                    |                 |                      |
| `cat`           |      ✅       |                    |       ✅        |          ✅          |
| `chattr`        |      ✅       |                    |                 |                      |
| `chcon`         |               |                    |       ✅        |          ✅          |
| `chgrp`         |      ✅       |                    |       ✅        |          ✅          |
| `chmod`         |      ✅       |                    |       ✅        |          ✅          |
| `chown`         |      ✅       |                    |       ✅        |          ✅          |
| `chpasswd`      |      ✅       |                    |                 |                      |
| `chroot`        |      ✅       |                    |       ✅        |          ✅          |
| `chrt`          |      ✅       |                    |                 |                      |
| `cksum`         |      ✅       |                    |       ✅        |          ✅          |
| `clear`         |      ✅       |                    |                 |                      |
| `cmp`           |      ✅       |                    |                 |                      |
| `comm`          |      ✅       |                    |       ✅        |          ✅          |
| `coreutils`     |               |                    |       ✅        |          ✅          |
| `cp`            |      ✅       |                    |       ✅        |          ✅          |
| `cpio`          |      ✅       |                    |                 |                      |
| `cryptpw`       |      ✅       |                    |                 |                      |
| `csplit`        |               |                    |       ✅        |          ✅          |
| `cut`           |      ✅       |                    |       ✅        |          ✅          |
| `date`          |      ✅       |                    |       ✅        |          ✅          |
| `dc`            |      ✅       |                    |                 |                      |
| `dd`            |      ✅       |                    |       ✅        |          ✅          |
| `delgroup`      |      ✅       |                    |                 |                      |
| `deluser`       |      ✅       |                    |                 |                      |
| `df`            |      ✅       |                    |       ✅        |          ✅          |
| `diff`          |      ✅       |                    |                 |                      |
| `dir`           |               |                    |       ✅        |          ✅          |
| `dircolors`     |               |                    |       ✅        |          ✅          |
| `dirname`       |      ✅       |                    |       ✅        |          ✅          |
| `dmesg`         |      ✅       |                    |                 |                      |
| `dnsdomainname` |      ✅       |                    |                 |                      |
| `dos2unix`      |      ✅       |                    |                 |                      |
| `du`            |      ✅       |                    |       ✅        |          ✅          |
| `echo`          |      ✅       |                    |       ✅        |          ✅          |
| `ed`            |      ✅       |                    |                 |                      |
| `egrep`         |      ✅       |                    |                 |                      |
| `env`           |      ✅       |                    |       ✅        |          ✅          |
| `expand`        |      ✅       |                    |       ✅        |          ✅          |
| `expr`          |      ✅       |                    |       ✅        |          ✅          |
| `factor`        |      ✅       |                    |       ✅        |          ✅          |
| `fallocate`     |      ✅       |                    |                 |                      |
| `false`         |      ✅       |                    |       ✅        |          ✅          |
| `fgrep`         |      ✅       |                    |                 |                      |
| `find`          |      ✅       |                    |                 |                      |
| `findfs`        |      ✅       |                    |                 |                      |
| `flock`         |      ✅       |                    |                 |                      |
| `fmt`           |               |                    |       ✅        |          ✅          |
| `fold`          |      ✅       |                    |       ✅        |          ✅          |
| `free`          |      ✅       |                    |                 |                      |
| `fsync`         |      ✅       |                    |                 |                      |
| `fuser`         |      ✅       |                    |                 |                      |
| `getopt`        |      ✅       |                    |                 |                      |
| `getty`         |      ✅       |                    |                 |                      |
| `grep`          |      ✅       |                    |                 |                      |
| `groups`        |      ✅       |                    |                 |          ✅          |
| `gunzip`        |      ✅       |                    |                 |                      |
| `gzip`          |      ✅       |                    |                 |                      |
| `hd`            |      ✅       |                    |                 |                      |
| `head`          |      ✅       |                    |       ✅        |          ✅          |
| `hexdump`       |      ✅       |                    |                 |                      |
| `hostid`        |      ✅       |                    |       ✅        |          ✅          |
| `hostname`      |      ✅       |                    |                 |                      |
| `id`            |      ✅       |                    |       ✅        |          ✅          |
| `inotifyd`      |      ✅       |                    |                 |                      |
| `install`       |      ✅       |                    |       ✅        |          ✅          |
| `ionice`        |      ✅       |                    |                 |                      |
| `iostat`        |      ✅       |                    |                 |                      |
| `ipcrm`         |      ✅       |                    |                 |                      |
| `ipcs`          |      ✅       |                    |                 |                      |
| `join`          |               |                    |       ✅        |          ✅          |
| `kill`          |      ✅       |                    |                 |                      |
| `killall`       |      ✅       |                    |                 |                      |
| `killall5`      |      ✅       |                    |                 |                      |
| `less`          |      ✅       |                    |                 |                      |
| `link`          |      ✅       |                    |       ✅        |          ✅          |
| `linux32`       |      ✅       |                    |                 |                      |
| `linux64`       |      ✅       |                    |                 |                      |
| `ln`            |      ✅       |                    |       ✅        |          ✅          |
| `logger`        |      ✅       |                    |                 |                      |
| `login`         |      ✅       |                    |                 |                      |
| `logname`       |               |                    |       ✅        |          ✅          |
| `ls`            |      ✅       |                    |       ✅        |          ✅          |
| `lsattr`        |      ✅       |                    |                 |                      |
| `lsof`          |      ✅       |                    |                 |                      |
| `lzcat`         |      ✅       |                    |                 |                      |
| `lzma`          |      ✅       |                    |                 |                      |
| `lzop`          |      ✅       |                    |                 |                      |
| `lzopcat`       |      ✅       |                    |                 |                      |
| `md5sum`        |      ✅       |                    |       ✅        |          ✅          |
| `microcom`      |      ✅       |                    |                 |                      |
| `mkdir`         |      ✅       |                    |       ✅        |          ✅          |
| `mkfifo`        |      ✅       |                    |       ✅        |          ✅          |
| `mknod`         |      ✅       |                    |       ✅        |          ✅          |
| `mkpasswd`      |      ✅       |                    |                 |                      |
| `mktemp`        |      ✅       |                    |       ✅        |          ✅          |
| `more`          |      ✅       |                    |                 |                      |
| `mountpoint`    |      ✅       |                    |                 |                      |
| `mpstat`        |      ✅       |                    |                 |                      |
| `mv`            |      ✅       |                    |       ✅        |          ✅          |
| `netstat`       |      ✅       |                    |                 |                      |
| `nice`          |      ✅       |                    |       ✅        |          ✅          |
| `nl`            |      ✅       |                    |       ✅        |          ✅          |
| `nmeter`        |      ✅       |                    |                 |                      |
| `nohup`         |      ✅       |                    |       ✅        |          ✅          |
| `nologin`       |      ✅       |                    |                 |                      |
| `nproc`         |      ✅       |                    |       ✅        |          ✅          |
| `nsenter`       |      ✅       |                    |                 |                      |
| `numfmt`        |               |                    |       ✅        |          ✅          |
| `od`            |      ✅       |                    |       ✅        |          ✅          |
| `passwd`        |      ✅       |                    |                 |                      |
| `paste`         |      ✅       |                    |       ✅        |          ✅          |
| `pathchk`       |               |                    |       ✅        |          ✅          |
| `pgrep`         |      ✅       |                    |                 |                      |
| `pidof`         |      ✅       |                    |                 |                      |
| `ping`          |      ✅       |                    |                 |                      |
| `ping6`         |      ✅       |                    |                 |                      |
| `pinky`         |               |                    |       ✅        |          ✅          |
| `pipe_progress` |      ✅       |                    |                 |                      |
| `pivot_root`    |      ✅       |                    |                 |                      |
| `pkill`         |      ✅       |                    |                 |                      |
| `pmap`          |      ✅       |                    |                 |                      |
| `pr`            |               |                    |       ✅        |          ✅          |
| `printenv`      |      ✅       |                    |       ✅        |          ✅          |
| `printf`        |      ✅       |                    |       ✅        |          ✅          |
| `ps`            |      ✅       |                    |                 |                      |
| `pstree`        |      ✅       |                    |                 |                      |
| `ptx`           |               |                    |       ✅        |          ✅          |
| `pwd`           |      ✅       |                    |       ✅        |          ✅          |
| `pwdx`          |      ✅       |                    |                 |                      |
| `rdev`          |      ✅       |                    |                 |                      |
| `readahead`     |      ✅       |                    |                 |                      |
| `readlink`      |      ✅       |                    |       ✅        |          ✅          |
| `realpath`      |      ✅       |                    |       ✅        |          ✅          |
| `remove-shell`  |      ✅       |                    |                 |                      |
| `renice`        |      ✅       |                    |                 |                      |
| `reset`         |      ✅       |                    |                 |                      |
| `resize`        |      ✅       |                    |                 |                      |
| `rev`           |      ✅       |                    |                 |                      |
| `rm`            |      ✅       |                    |       ✅        |          ✅          |
| `rmdir`         |      ✅       |                    |       ✅        |          ✅          |
| `run-parts`     |      ✅       |                    |                 |                      |
| `runcon`        |               |                    |       ✅        |          ✅          |
| `sed`           |      ✅       |                    |                 |                      |
| `seq`           |      ✅       |                    |       ✅        |          ✅          |
| `setpriv`       |      ✅       |                    |                 |                      |
| `setserial`     |      ✅       |                    |                 |                      |
| `setsid`        |      ✅       |                    |                 |                      |
| `sh`            |      ✅       |                    |                 |                      |
| `sha1sum`       |      ✅       |                    |       ✅        |          ✅          |
| `sha224sum`     |               |                    |       ✅        |          ✅          |
| `sha256sum`     |      ✅       |                    |       ✅        |          ✅          |
| `sha384sum`     |               |                    |       ✅        |          ✅          |
| `sha3sum`       |      ✅       |                    |                 |                      |
| `sha512sum`     |      ✅       |                    |       ✅        |          ✅          |
| `shred`         |      ✅       |                    |       ✅        |          ✅          |
| `shuf`          |      ✅       |                    |       ✅        |          ✅          |
| `sleep`         |      ✅       |                    |       ✅        |          ✅          |
| `sort`          |      ✅       |                    |       ✅        |          ✅          |
| `split`         |      ✅       |                    |       ✅        |          ✅          |
| `stat`          |      ✅       |                    |       ✅        |          ✅          |
| `stdbuf`        |               |                    |       ✅        |          ✅          |
| `strings`       |      ✅       |                    |                 |                      |
| `stty`          |      ✅       |                    |       ✅        |          ✅          |
| `su`            |      ✅       |                    |                 |                      |
| `sum`           |      ✅       |                    |       ✅        |          ✅          |
| `sync`          |      ✅       |                    |       ✅        |          ✅          |
| `sysctl`        |      ✅       |                    |                 |                      |
| `tac`           |      ✅       |                    |       ✅        |          ✅          |
| `tail`          |      ✅       |                    |       ✅        |          ✅          |
| `tar`           |      ✅       |                    |                 |                      |
| `tee`           |      ✅       |                    |       ✅        |          ✅          |
| `test`          |      ✅       |                    |       ✅        |          ✅          |
| `time`          |      ✅       |                    |                 |                      |
| `timeout`       |      ✅       |                    |       ✅        |          ✅          |
| `top`           |      ✅       |                    |                 |                      |
| `touch`         |      ✅       |                    |       ✅        |          ✅          |
| `tr`            |      ✅       |                    |       ✅        |          ✅          |
| `traceroute`    |      ✅       |                    |                 |                      |
| `traceroute6`   |      ✅       |                    |                 |                      |
| `tree`          |      ✅       |                    |                 |                      |
| `true`          |      ✅       |                    |       ✅        |          ✅          |
| `truncate`      |      ✅       |                    |       ✅        |          ✅          |
| `tsort`         |      ✅       |                    |       ✅        |          ✅          |
| `tty`           |      ✅       |                    |       ✅        |          ✅          |
| `ttysize`       |      ✅       |                    |                 |                      |
| `tunctl`        |      ✅       |                    |                 |                      |
| `uname`         |      ✅       |                    |       ✅        |          ✅          |
| `unexpand`      |      ✅       |                    |       ✅        |          ✅          |
| `uniq`          |      ✅       |                    |       ✅        |          ✅          |
| `unix2dos`      |      ✅       |                    |                 |                      |
| `unlink`        |      ✅       |                    |       ✅        |          ✅          |
| `unlzma`        |      ✅       |                    |                 |                      |
| `unlzop`        |      ✅       |                    |                 |                      |
| `unxz`          |      ✅       |                    |                 |                      |
| `unzip`         |      ✅       |                    |                 |                      |
| `uptime`        |      ✅       |                    |                 |                      |
| `users`         |               |                    |       ✅        |          ✅          |
| `usleep`        |      ✅       |                    |                 |                      |
| `uudecode`      |      ✅       |                    |                 |                      |
| `uuencode`      |      ✅       |                    |                 |                      |
| `vconfig`       |      ✅       |                    |                 |                      |
| `vdir`          |               |                    |       ✅        |          ✅          |
| `vi`            |      ✅       |                    |                 |                      |
| `vlock`         |      ✅       |                    |                 |                      |
| `watch`         |      ✅       |                    |                 |                      |
| `wc`            |      ✅       |                    |       ✅        |          ✅          |
| `which`         |      ✅       |                    |                 |                      |
| `who`           |      ✅       |                    |       ✅        |          ✅          |
| `whoami`        |      ✅       |                    |       ✅        |          ✅          |
| `xargs`         |      ✅       |                    |                 |                      |
| `xxd`           |      ✅       |                    |                 |                      |
| `xzcat`         |      ✅       |                    |                 |                      |
| `yes`           |      ✅       |                    |       ✅        |          ✅          |
| `zcat`          |      ✅       |                    |                 |                      |

---

### Ubuntu compatibility
_Path: chainguard/containers/migration/compatibility/ubuntu-compatibility.md_

Chainguard Containers and Ubuntu base images have different binaries and scripts included in their respective `busybox` and `coreutils` packages.

The following table lists common tools and their corresponding package(s) in both Wolfi and Ubuntu distributions.

Note that `$PATH` locations like `/usr/bin` or `/sbin` are not included here. If you have compatibility issues with tools that are included in both `busybox` and `coreutils`, be sure to check `$PATH` order and confirm which version of a tool is being run.

Generally, if a tool exists in `busybox` but does not have a `coreutils` counterpart, there will be a specific package that includes it. For example the `zcat` utility is included in the `gzip` package in both Wolfi and Ubuntu.

You can use the `apk search` command in Wolfi, and the `apt-cache search` command in Ubuntu to find out which package includes a tool.

| Utility             | Wolfi busybox | Ubuntu busybox | Wolfi coreutils | Ubuntu coreutils |
| ------------------- | :-----------: | :------------: | :-------------: | :--------------: |
| `[`                 |      ✅       |       ✅       |       ✅        |        ✅        |
| `[[`                |      ✅       |       ✅       |                 |                  |
| `acpid`             |               |       ✅       |                 |                  |
| `add-shell`         |      ✅       |                |                 |                  |
| `addgroup`          |      ✅       |                |                 |                  |
| `adduser`           |      ✅       |                |                 |                  |
| `adjtimex`          |      ✅       |       ✅       |                 |                  |
| `ar`                |               |       ✅       |                 |                  |
| `arch`              |      ✅       |       ✅       |                 |        ✅        |
| `arp`               |               |       ✅       |                 |                  |
| `arping`            |      ✅       |       ✅       |                 |                  |
| `ash`               |      ✅       |       ✅       |                 |                  |
| `awk`               |      ✅       |       ✅       |                 |                  |
| `b2sum`             |               |                |       ✅        |        ✅        |
| `base32`            |               |                |       ✅        |        ✅        |
| `base64`            |      ✅       |                |       ✅        |        ✅        |
| `basename`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `basenc`            |               |                |       ✅        |        ✅        |
| `bbconfig`          |      ✅       |                |                 |                  |
| `bc`                |      ✅       |       ✅       |                 |                  |
| `beep`              |      ✅       |                |                 |                  |
| `bin`               |               |                |                 |        ✅        |
| `blkdiscard`        |               |       ✅       |                 |                  |
| `blockdev`          |               |       ✅       |                 |                  |
| `brctl`             |               |       ✅       |                 |                  |
| `bunzip2`           |      ✅       |       ✅       |                 |                  |
| `bzcat`             |      ✅       |       ✅       |                 |                  |
| `bzip2`             |      ✅       |       ✅       |                 |                  |
| `cal`               |      ✅       |       ✅       |                 |                  |
| `cat`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `chattr`            |      ✅       |                |                 |                  |
| `chcon`             |               |                |       ✅        |        ✅        |
| `chgrp`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chmod`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chown`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chpasswd`          |      ✅       |       ✅       |                 |                  |
| `chroot`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `chrt`              |      ✅       |                |                 |                  |
| `chvt`              |               |       ✅       |                 |                  |
| `cksum`             |      ✅       |                |       ✅        |        ✅        |
| `clear`             |      ✅       |       ✅       |                 |                  |
| `cmp`               |      ✅       |       ✅       |                 |                  |
| `comm`              |      ✅       |                |       ✅        |        ✅        |
| `coreutils`         |               |                |       ✅        |                  |
| `cp`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `cpio`              |      ✅       |       ✅       |                 |                  |
| `cryptpw`           |      ✅       |                |                 |                  |
| `csplit`            |               |                |       ✅        |        ✅        |
| `cttyhack`          |               |       ✅       |                 |                  |
| `cut`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `date`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `dc`                |      ✅       |       ✅       |                 |                  |
| `dd`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `deallocvt`         |               |       ✅       |                 |                  |
| `delgroup`          |      ✅       |                |                 |                  |
| `deluser`           |      ✅       |                |                 |                  |
| `depmod`            |               |       ✅       |                 |                  |
| `devmem`            |               |       ✅       |                 |                  |
| `df`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `diff`              |      ✅       |       ✅       |                 |                  |
| `dir`               |               |                |       ✅        |        ✅        |
| `dircolors`         |               |                |       ✅        |        ✅        |
| `dirname`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `dmesg`             |      ✅       |       ✅       |                 |                  |
| `dnsdomainname`     |      ✅       |       ✅       |                 |                  |
| `dos2unix`          |      ✅       |       ✅       |                 |                  |
| `du`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `dumpkmap`          |               |       ✅       |                 |                  |
| `dumpleases`        |               |       ✅       |                 |                  |
| `echo`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `ed`                |      ✅       |                |                 |                  |
| `egrep`             |      ✅       |       ✅       |                 |                  |
| `env`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `expand`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `expr`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `factor`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `fallocate`         |      ✅       |       ✅       |                 |                  |
| `false`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `fatattr`           |               |       ✅       |                 |                  |
| `fgrep`             |      ✅       |       ✅       |                 |                  |
| `find`              |      ✅       |       ✅       |                 |                  |
| `findfs`            |      ✅       |                |                 |                  |
| `flock`             |      ✅       |                |                 |                  |
| `fmt`               |               |                |       ✅        |        ✅        |
| `fold`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `free`              |      ✅       |       ✅       |                 |                  |
| `freeramdisk`       |               |       ✅       |                 |                  |
| `fsfreeze`          |               |       ✅       |                 |                  |
| `fstrim`            |               |       ✅       |                 |                  |
| `fsync`             |      ✅       |                |                 |                  |
| `ftpget`            |               |       ✅       |                 |                  |
| `ftpput`            |               |       ✅       |                 |                  |
| `fuser`             |      ✅       |                |                 |                  |
| `getopt`            |      ✅       |       ✅       |                 |                  |
| `getty`             |      ✅       |       ✅       |                 |                  |
| `grep`              |      ✅       |       ✅       |                 |                  |
| `groups`            |      ✅       |       ✅       |                 |        ✅        |
| `gunzip`            |      ✅       |       ✅       |                 |                  |
| `gzip`              |      ✅       |       ✅       |                 |                  |
| `halt`              |               |       ✅       |                 |                  |
| `hd`                |      ✅       |                |                 |                  |
| `head`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `hexdump`           |      ✅       |       ✅       |                 |                  |
| `hostid`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `hostname`          |      ✅       |       ✅       |                 |                  |
| `httpd`             |               |       ✅       |                 |                  |
| `hwclock`           |               |       ✅       |                 |                  |
| `i2cdetect`         |               |       ✅       |                 |                  |
| `i2cdump`           |               |       ✅       |                 |                  |
| `i2cget`            |               |       ✅       |                 |                  |
| `i2cset`            |               |       ✅       |                 |                  |
| `id`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `ifconfig`          |               |       ✅       |                 |                  |
| `ifdown`            |               |       ✅       |                 |                  |
| `ifup`              |               |       ✅       |                 |                  |
| `init`              |               |       ✅       |                 |                  |
| `inotifyd`          |      ✅       |                |                 |                  |
| `insmod`            |               |       ✅       |                 |                  |
| `install`           |      ✅       |                |       ✅        |        ✅        |
| `ionice`            |      ✅       |       ✅       |                 |                  |
| `iostat`            |      ✅       |                |                 |                  |
| `ip`                |               |       ✅       |                 |                  |
| `ipcalc`            |               |       ✅       |                 |                  |
| `ipcrm`             |      ✅       |                |                 |                  |
| `ipcs`              |      ✅       |                |                 |                  |
| `ipneigh`           |               |       ✅       |                 |                  |
| `join`              |               |                |       ✅        |        ✅        |
| `kill`              |      ✅       |       ✅       |                 |                  |
| `killall`           |      ✅       |       ✅       |                 |                  |
| `killall5`          |      ✅       |                |                 |                  |
| `klogd`             |               |       ✅       |                 |                  |
| `last`              |               |       ✅       |                 |                  |
| `less`              |      ✅       |       ✅       |                 |                  |
| `link`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `linux32`           |      ✅       |       ✅       |                 |                  |
| `linux64`           |      ✅       |       ✅       |                 |                  |
| `linuxrc`           |               |       ✅       |                 |                  |
| `ln`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `loadfont`          |               |       ✅       |                 |                  |
| `loadkmap`          |               |       ✅       |                 |                  |
| `logger`            |      ✅       |       ✅       |                 |                  |
| `login`             |      ✅       |       ✅       |                 |                  |
| `logname`           |               |       ✅       |       ✅        |        ✅        |
| `logread`           |               |       ✅       |                 |                  |
| `losetup`           |               |       ✅       |                 |                  |
| `ls`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `lsattr`            |      ✅       |                |                 |                  |
| `lsmod`             |               |       ✅       |                 |                  |
| `lsof`              |      ✅       |                |                 |                  |
| `lsscsi`            |               |       ✅       |                 |                  |
| `lzcat`             |      ✅       |       ✅       |                 |                  |
| `lzma`              |      ✅       |       ✅       |                 |                  |
| `lzop`              |      ✅       |       ✅       |                 |                  |
| `lzopcat`           |      ✅       |                |                 |                  |
| `md5sum`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `md5sum.textutils`  |               |                |                 |        ✅        |
| `mdev`              |               |       ✅       |                 |                  |
| `microcom`          |      ✅       |       ✅       |                 |                  |
| `mkdir`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkdosfs`           |               |       ✅       |                 |                  |
| `mke2fs`            |               |       ✅       |                 |                  |
| `mkfifo`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `mknod`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkpasswd`          |      ✅       |       ✅       |                 |                  |
| `mkswap`            |               |       ✅       |                 |                  |
| `mktemp`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `modinfo`           |               |       ✅       |                 |                  |
| `modprobe`          |               |       ✅       |                 |                  |
| `more`              |      ✅       |       ✅       |                 |                  |
| `mount`             |               |       ✅       |                 |                  |
| `mountpoint`        |      ✅       |                |                 |                  |
| `mpstat`            |      ✅       |                |                 |                  |
| `mt`                |               |       ✅       |                 |                  |
| `mv`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `nameif`            |               |       ✅       |                 |                  |
| `nc`                |               |       ✅       |                 |                  |
| `netstat`           |      ✅       |       ✅       |                 |                  |
| `nice`              |      ✅       |                |       ✅        |        ✅        |
| `nl`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `nmeter`            |      ✅       |                |                 |                  |
| `nohup`             |      ✅       |                |       ✅        |        ✅        |
| `nologin`           |      ✅       |       ✅       |                 |                  |
| `nproc`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `nsenter`           |      ✅       |       ✅       |                 |                  |
| `nslookup`          |               |       ✅       |                 |                  |
| `nuke`              |               |       ✅       |                 |                  |
| `numfmt`            |               |                |       ✅        |        ✅        |
| `od`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `openvt`            |               |       ✅       |                 |                  |
| `partprobe`         |               |       ✅       |                 |                  |
| `passwd`            |      ✅       |                |                 |                  |
| `paste`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `patch`             |               |       ✅       |                 |                  |
| `pathchk`           |               |                |       ✅        |        ✅        |
| `pgrep`             |      ✅       |                |                 |                  |
| `pidof`             |      ✅       |       ✅       |                 |                  |
| `ping`              |      ✅       |       ✅       |                 |                  |
| `ping6`             |      ✅       |       ✅       |                 |                  |
| `pinky`             |               |                |       ✅        |        ✅        |
| `pipe_progress`     |      ✅       |                |                 |                  |
| `pivot_root`        |      ✅       |       ✅       |                 |                  |
| `pkill`             |      ✅       |                |                 |                  |
| `pmap`              |      ✅       |                |                 |                  |
| `poweroff`          |               |       ✅       |                 |                  |
| `pr`                |               |                |       ✅        |        ✅        |
| `printenv`          |      ✅       |                |       ✅        |        ✅        |
| `printf`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `ps`                |      ✅       |       ✅       |                 |                  |
| `pstree`            |      ✅       |                |                 |                  |
| `ptx`               |               |                |       ✅        |        ✅        |
| `pwd`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `pwdx`              |      ✅       |                |                 |                  |
| `rdate`             |               |       ✅       |                 |                  |
| `rdev`              |      ✅       |                |                 |                  |
| `readahead`         |      ✅       |                |                 |                  |
| `readlink`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `realpath`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `reboot`            |               |       ✅       |                 |                  |
| `remove-shell`      |      ✅       |                |                 |                  |
| `renice`            |      ✅       |       ✅       |                 |                  |
| `reset`             |      ✅       |       ✅       |                 |                  |
| `resize`            |      ✅       |                |                 |                  |
| `resume`            |               |       ✅       |                 |                  |
| `rev`               |      ✅       |       ✅       |                 |                  |
| `rm`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmdir`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmmod`             |               |       ✅       |                 |                  |
| `route`             |               |       ✅       |                 |                  |
| `rpm`               |               |       ✅       |                 |                  |
| `rpm2cpio`          |               |       ✅       |                 |                  |
| `run-init`          |               |       ✅       |                 |                  |
| `run-parts`         |      ✅       |       ✅       |                 |                  |
| `runcon`            |               |                |       ✅        |        ✅        |
| `sbin`              |               |                |                 |        ✅        |
| `sed`               |      ✅       |       ✅       |                 |                  |
| `seq`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `setkeycodes`       |               |       ✅       |                 |                  |
| `setpriv`           |      ✅       |       ✅       |                 |                  |
| `setserial`         |      ✅       |                |                 |                  |
| `setsid`            |      ✅       |       ✅       |                 |                  |
| `sh`                |      ✅       |       ✅       |                 |                  |
| `sha1sum`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha224sum`         |               |                |       ✅        |        ✅        |
| `sha256sum`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha384sum`         |               |                |       ✅        |        ✅        |
| `sha3sum`           |      ✅       |                |                 |                  |
| `sha512sum`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `shred`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `shuf`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `sleep`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `sort`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `split`             |      ✅       |                |       ✅        |        ✅        |
| `ssl_client`        |               |       ✅       |                 |                  |
| `start-stop-daemon` |               |       ✅       |                 |                  |
| `stat`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `stdbuf`            |               |                |       ✅        |        ✅        |
| `strings`           |      ✅       |       ✅       |                 |                  |
| `stty`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `su`                |      ✅       |                |                 |                  |
| `sum`               |      ✅       |                |       ✅        |        ✅        |
| `svc`               |               |       ✅       |                 |                  |
| `svok`              |               |       ✅       |                 |                  |
| `swapoff`           |               |       ✅       |                 |                  |
| `swapon`            |               |       ✅       |                 |                  |
| `switch_root`       |               |       ✅       |                 |                  |
| `sync`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `sysctl`            |      ✅       |       ✅       |                 |                  |
| `syslogd`           |               |       ✅       |                 |                  |
| `tac`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `tail`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `tar`               |      ✅       |       ✅       |                 |                  |
| `taskset`           |               |       ✅       |                 |                  |
| `tee`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `telnet`            |               |       ✅       |                 |                  |
| `test`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `tftp`              |               |       ✅       |                 |                  |
| `time`              |      ✅       |       ✅       |                 |                  |
| `timeout`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `top`               |      ✅       |       ✅       |                 |                  |
| `touch`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `tr`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `traceroute`        |      ✅       |       ✅       |                 |                  |
| `traceroute6`       |      ✅       |       ✅       |                 |                  |
| `tree`              |      ✅       |                |                 |                  |
| `true`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `truncate`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `tsort`             |      ✅       |                |       ✅        |        ✅        |
| `tty`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `ttysize`           |      ✅       |                |                 |                  |
| `tunctl`            |      ✅       |                |                 |                  |
| `ubirename`         |               |       ✅       |                 |                  |
| `udhcpc`            |               |       ✅       |                 |                  |
| `udhcpd`            |               |       ✅       |                 |                  |
| `uevent`            |               |       ✅       |                 |                  |
| `umount`            |               |       ✅       |                 |                  |
| `uname`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `uncompress`        |               |       ✅       |                 |                  |
| `unexpand`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `uniq`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `unix2dos`          |      ✅       |       ✅       |                 |                  |
| `unlink`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `unlzma`            |      ✅       |       ✅       |                 |                  |
| `unlzop`            |      ✅       |                |                 |                  |
| `unshare`           |               |       ✅       |                 |                  |
| `unxz`              |      ✅       |       ✅       |                 |                  |
| `unzip`             |      ✅       |       ✅       |                 |                  |
| `uptime`            |      ✅       |       ✅       |                 |                  |
| `users`             |               |                |       ✅        |        ✅        |
| `usleep`            |      ✅       |       ✅       |                 |                  |
| `usr`               |               |                |                 |        ✅        |
| `uudecode`          |      ✅       |       ✅       |                 |                  |
| `uuencode`          |      ✅       |       ✅       |                 |                  |
| `vconfig`           |      ✅       |       ✅       |                 |                  |
| `vdir`              |               |                |       ✅        |        ✅        |
| `vi`                |      ✅       |       ✅       |                 |                  |
| `vlock`             |      ✅       |                |                 |                  |
| `w`                 |               |       ✅       |                 |                  |
| `watch`             |      ✅       |       ✅       |                 |                  |
| `watchdog`          |               |       ✅       |                 |                  |
| `wc`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `wget`              |               |       ✅       |                 |                  |
| `which`             |      ✅       |       ✅       |                 |                  |
| `who`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `whoami`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `xargs`             |      ✅       |       ✅       |                 |                  |
| `xxd`               |      ✅       |       ✅       |                 |                  |
| `xz`                |               |       ✅       |                 |                  |
| `xzcat`             |      ✅       |       ✅       |                 |                  |
| `yes`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `zcat`              |      ✅       |       ✅       |                 |                  |

---

### Alpine compatibility
_Path: chainguard/containers/migration/compatibility/alpine-compatibility.md_

Chainguard Containers and Alpine base images have different binaries and scripts included in their respective `busybox` and `coreutils` packages.

The following table lists common tools and their corresponding package(s) in both Wolfi and Alpine distributions.

Note that `$PATH` locations like `/usr/bin` or `/sbin` are not included here. If you have compatibility issues with tools that are included in both `busybox` and `coreutils`, be sure to check `$PATH` order and confirm which version of a tool is being run.

Generally, if a tool exists in `busybox` but does not have a `coreutils` counterpart, there will be a specific package that includes it. For example the `zcat` utility is included in the `gzip` package in both Wolfi and Alpine.

Additionally, be aware that binaries are not compatible between Alpine and Wolfi. You **should not** attempt to copy Alpine binaries into a Wolfi-based container image.

You can use the `apk search` command in Wolfi and Alpine to find out which package includes a tool.

| Utility         | Wolfi busybox | Alpine busybox | Wolfi coreutils | Alpine coreutils |
| --------------- | :-----------: | :------------: | :-------------: | :--------------: |
| `[`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `[[`            |      ✅       |       ✅       |                 |                  |
| `acpid`         |               |       ✅       |                 |                  |
| `add-shell`     |      ✅       |       ✅       |                 |                  |
| `addgroup`      |      ✅       |       ✅       |                 |                  |
| `adduser`       |      ✅       |       ✅       |                 |                  |
| `adjtimex`      |      ✅       |       ✅       |                 |                  |
| `arch`          |      ✅       |       ✅       |                 |                  |
| `arp`           |               |       ✅       |                 |                  |
| `arping`        |      ✅       |       ✅       |                 |                  |
| `ash`           |      ✅       |       ✅       |                 |                  |
| `awk`           |      ✅       |       ✅       |                 |                  |
| `b2sum`         |               |                |       ✅        |        ✅        |
| `base32`        |               |                |       ✅        |        ✅        |
| `base64`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `basename`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `basenc`        |               |                |       ✅        |        ✅        |
| `bbconfig`      |      ✅       |       ✅       |                 |                  |
| `bc`            |      ✅       |       ✅       |                 |                  |
| `beep`          |      ✅       |       ✅       |                 |                  |
| `blkdiscard`    |               |       ✅       |                 |                  |
| `blkid`         |               |       ✅       |                 |                  |
| `blockdev`      |               |       ✅       |                 |                  |
| `brctl`         |               |       ✅       |                 |                  |
| `bunzip2`       |      ✅       |       ✅       |                 |                  |
| `bzcat`         |      ✅       |       ✅       |                 |                  |
| `bzip2`         |      ✅       |       ✅       |                 |                  |
| `cal`           |      ✅       |       ✅       |                 |                  |
| `cat`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `chattr`        |      ✅       |       ✅       |                 |                  |
| `chcon`         |               |                |       ✅        |        ✅        |
| `chgrp`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `chmod`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `chown`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `chpasswd`      |      ✅       |       ✅       |                 |                  |
| `chroot`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `chrt`          |      ✅       |                |                 |                  |
| `chvt`          |               |       ✅       |                 |                  |
| `cksum`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `clear`         |      ✅       |       ✅       |                 |                  |
| `cmp`           |      ✅       |       ✅       |                 |                  |
| `comm`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `coreutils`     |               |                |       ✅        |        ✅        |
| `cp`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `cpio`          |      ✅       |       ✅       |                 |                  |
| `crond`         |               |       ✅       |                 |                  |
| `crontab`       |               |       ✅       |                 |                  |
| `cryptpw`       |      ✅       |       ✅       |                 |                  |
| `csplit`        |               |                |       ✅        |        ✅        |
| `cut`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `date`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `dc`            |      ✅       |       ✅       |                 |                  |
| `dd`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `deallocvt`     |               |       ✅       |                 |                  |
| `delgroup`      |      ✅       |       ✅       |                 |                  |
| `deluser`       |      ✅       |       ✅       |                 |                  |
| `depmod`        |               |       ✅       |                 |                  |
| `df`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `diff`          |      ✅       |       ✅       |                 |                  |
| `dir`           |               |                |       ✅        |        ✅        |
| `dircolors`     |               |                |       ✅        |        ✅        |
| `dirname`       |      ✅       |       ✅       |       ✅        |        ✅        |
| `dmesg`         |      ✅       |       ✅       |                 |                  |
| `dnsdomainname` |      ✅       |       ✅       |                 |                  |
| `dos2unix`      |      ✅       |       ✅       |                 |                  |
| `du`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `dumpkmap`      |               |       ✅       |                 |                  |
| `echo`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `ed`            |      ✅       |                |                 |                  |
| `egrep`         |      ✅       |       ✅       |                 |                  |
| `eject`         |               |       ✅       |                 |                  |
| `env`           |      ✅       |       ✅       |       ✅        |                  |
| `ether-wake`    |               |       ✅       |                 |                  |
| `expand`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `expr`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `factor`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `fallocate`     |      ✅       |       ✅       |                 |                  |
| `false`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `fatattr`       |               |       ✅       |                 |                  |
| `fbset`         |               |       ✅       |                 |                  |
| `fbsplash`      |               |       ✅       |                 |                  |
| `fdflush`       |               |       ✅       |                 |                  |
| `fdisk`         |               |       ✅       |                 |                  |
| `fgrep`         |      ✅       |       ✅       |                 |                  |
| `find`          |      ✅       |       ✅       |                 |                  |
| `findfs`        |      ✅       |       ✅       |                 |                  |
| `flock`         |      ✅       |       ✅       |                 |                  |
| `fmt`           |               |                |       ✅        |                  |
| `fold`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `free`          |      ✅       |       ✅       |                 |                  |
| `fsck`          |               |       ✅       |                 |                  |
| `fstrim`        |               |       ✅       |                 |                  |
| `fsync`         |      ✅       |       ✅       |                 |                  |
| `fuser`         |      ✅       |       ✅       |                 |                  |
| `getopt`        |      ✅       |       ✅       |                 |                  |
| `getty`         |      ✅       |       ✅       |                 |                  |
| `grep`          |      ✅       |       ✅       |                 |                  |
| `groups`        |      ✅       |       ✅       |                 |                  |
| `gunzip`        |      ✅       |       ✅       |                 |                  |
| `gzip`          |      ✅       |       ✅       |                 |                  |
| `halt`          |               |       ✅       |                 |                  |
| `hd`            |      ✅       |       ✅       |                 |                  |
| `head`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `hexdump`       |      ✅       |       ✅       |                 |                  |
| `hostid`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `hostname`      |      ✅       |       ✅       |                 |                  |
| `hwclock`       |               |       ✅       |                 |                  |
| `id`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `ifconfig`      |               |       ✅       |                 |                  |
| `ifdown`        |               |       ✅       |                 |                  |
| `ifenslave`     |               |       ✅       |                 |                  |
| `ifup`          |               |       ✅       |                 |                  |
| `init`          |               |       ✅       |                 |                  |
| `inotifyd`      |      ✅       |       ✅       |                 |                  |
| `insmod`        |               |       ✅       |                 |                  |
| `install`       |      ✅       |       ✅       |       ✅        |        ✅        |
| `ionice`        |      ✅       |       ✅       |                 |                  |
| `iostat`        |      ✅       |       ✅       |                 |                  |
| `ip`            |               |       ✅       |                 |                  |
| `ipaddr`        |               |       ✅       |                 |                  |
| `ipcalc`        |               |       ✅       |                 |                  |
| `ipcrm`         |      ✅       |       ✅       |                 |                  |
| `ipcs`          |      ✅       |       ✅       |                 |                  |
| `iplink`        |               |       ✅       |                 |                  |
| `ipneigh`       |               |       ✅       |                 |                  |
| `iproute`       |               |       ✅       |                 |                  |
| `iprule`        |               |       ✅       |                 |                  |
| `iptunnel`      |               |       ✅       |                 |                  |
| `join`          |               |                |       ✅        |        ✅        |
| `kbd_mode`      |               |       ✅       |                 |                  |
| `kill`          |      ✅       |       ✅       |                 |                  |
| `killall`       |      ✅       |       ✅       |                 |                  |
| `killall5`      |      ✅       |       ✅       |                 |                  |
| `klogd`         |               |       ✅       |                 |                  |
| `last`          |               |       ✅       |                 |                  |
| `less`          |      ✅       |       ✅       |                 |                  |
| `link`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `linux32`       |      ✅       |       ✅       |                 |                  |
| `linux64`       |      ✅       |       ✅       |                 |                  |
| `ln`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `loadfont`      |               |       ✅       |                 |                  |
| `loadkmap`      |               |       ✅       |                 |                  |
| `logger`        |      ✅       |       ✅       |                 |                  |
| `login`         |      ✅       |       ✅       |                 |                  |
| `logname`       |               |                |       ✅        |        ✅        |
| `logread`       |               |       ✅       |                 |                  |
| `losetup`       |               |       ✅       |                 |                  |
| `ls`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `lsattr`        |      ✅       |       ✅       |                 |                  |
| `lsmod`         |               |       ✅       |                 |                  |
| `lsof`          |      ✅       |       ✅       |                 |                  |
| `lsusb`         |               |       ✅       |                 |                  |
| `lzcat`         |      ✅       |       ✅       |                 |                  |
| `lzma`          |      ✅       |       ✅       |                 |                  |
| `lzop`          |      ✅       |       ✅       |                 |                  |
| `lzopcat`       |      ✅       |       ✅       |                 |                  |
| `makemime`      |               |       ✅       |                 |                  |
| `md5sum`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `mdev`          |               |       ✅       |                 |                  |
| `mesg`          |               |       ✅       |                 |                  |
| `microcom`      |      ✅       |       ✅       |                 |                  |
| `mkdir`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkdosfs`       |               |       ✅       |                 |                  |
| `mkfifo`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkfs.vfat`     |               |       ✅       |                 |                  |
| `mknod`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkpasswd`      |      ✅       |       ✅       |                 |                  |
| `mkswap`        |               |       ✅       |                 |                  |
| `mktemp`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `modinfo`       |               |       ✅       |                 |                  |
| `modprobe`      |               |       ✅       |                 |                  |
| `more`          |      ✅       |       ✅       |                 |                  |
| `mount`         |               |       ✅       |                 |                  |
| `mountpoint`    |      ✅       |       ✅       |                 |                  |
| `mpstat`        |      ✅       |       ✅       |                 |                  |
| `mv`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `nameif`        |               |       ✅       |                 |                  |
| `nanddump`      |               |       ✅       |                 |                  |
| `nandwrite`     |               |       ✅       |                 |                  |
| `nbd-client`    |               |       ✅       |                 |                  |
| `nc`            |               |       ✅       |                 |                  |
| `netstat`       |      ✅       |       ✅       |                 |                  |
| `nice`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `nl`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `nmeter`        |      ✅       |       ✅       |                 |                  |
| `nohup`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `nologin`       |      ✅       |       ✅       |                 |                  |
| `nproc`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `nsenter`       |      ✅       |       ✅       |                 |                  |
| `nslookup`      |               |       ✅       |                 |                  |
| `ntpd`          |               |       ✅       |                 |                  |
| `numfmt`        |               |                |       ✅        |        ✅        |
| `od`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `openvt`        |               |       ✅       |                 |                  |
| `partprobe`     |               |       ✅       |                 |                  |
| `passwd`        |      ✅       |       ✅       |                 |                  |
| `paste`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `pathchk`       |               |                |       ✅        |        ✅        |
| `pgrep`         |      ✅       |       ✅       |                 |                  |
| `pidof`         |      ✅       |       ✅       |                 |                  |
| `ping`          |      ✅       |       ✅       |                 |                  |
| `ping6`         |      ✅       |       ✅       |                 |                  |
| `pinky`         |               |                |       ✅        |        ✅        |
| `pipe_progress` |      ✅       |       ✅       |                 |                  |
| `pivot_root`    |      ✅       |       ✅       |                 |                  |
| `pkill`         |      ✅       |       ✅       |                 |                  |
| `pmap`          |      ✅       |       ✅       |                 |                  |
| `poweroff`      |               |       ✅       |                 |                  |
| `pr`            |               |                |       ✅        |        ✅        |
| `printenv`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `printf`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `ps`            |      ✅       |       ✅       |                 |                  |
| `pscan`         |               |       ✅       |                 |                  |
| `pstree`        |      ✅       |       ✅       |                 |                  |
| `ptx`           |               |                |       ✅        |        ✅        |
| `pwd`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `pwdx`          |      ✅       |       ✅       |                 |                  |
| `raidautorun`   |               |       ✅       |                 |                  |
| `rdate`         |               |       ✅       |                 |                  |
| `rdev`          |      ✅       |       ✅       |                 |                  |
| `readahead`     |      ✅       |       ✅       |                 |                  |
| `readlink`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `realpath`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `reboot`        |               |       ✅       |                 |                  |
| `reformime`     |               |       ✅       |                 |                  |
| `remove-shell`  |      ✅       |       ✅       |                 |                  |
| `renice`        |      ✅       |       ✅       |                 |                  |
| `reset`         |      ✅       |       ✅       |                 |                  |
| `resize`        |      ✅       |       ✅       |                 |                  |
| `rev`           |      ✅       |       ✅       |                 |                  |
| `rfkill`        |               |       ✅       |                 |                  |
| `rm`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmdir`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmmod`         |               |       ✅       |                 |                  |
| `route`         |               |       ✅       |                 |                  |
| `run-parts`     |      ✅       |       ✅       |                 |                  |
| `runcon`        |               |                |       ✅        |        ✅        |
| `sed`           |      ✅       |       ✅       |                 |                  |
| `sendmail`      |               |       ✅       |                 |                  |
| `seq`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `setconsole`    |               |       ✅       |                 |                  |
| `setfont`       |               |       ✅       |                 |                  |
| `setkeycodes`   |               |       ✅       |                 |                  |
| `setlogcons`    |               |       ✅       |                 |                  |
| `setpriv`       |      ✅       |       ✅       |                 |                  |
| `setserial`     |      ✅       |       ✅       |                 |                  |
| `setsid`        |      ✅       |       ✅       |                 |                  |
| `sh`            |      ✅       |       ✅       |                 |                  |
| `sha1sum`       |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha224sum`     |               |                |       ✅        |        ✅        |
| `sha256sum`     |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha384sum`     |               |                |       ✅        |        ✅        |
| `sha3sum`       |      ✅       |       ✅       |                 |                  |
| `sha512sum`     |      ✅       |       ✅       |       ✅        |                  |
| `showkey`       |               |       ✅       |                 |                  |
| `shred`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `shuf`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `slattach`      |               |       ✅       |                 |                  |
| `sleep`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `sort`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `split`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `stat`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `stdbuf`        |               |                |       ✅        |        ✅        |
| `strings`       |      ✅       |       ✅       |                 |                  |
| `stty`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `su`            |      ✅       |       ✅       |                 |                  |
| `sum`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `swapoff`       |               |       ✅       |                 |                  |
| `swapon`        |               |       ✅       |                 |                  |
| `switch_root`   |               |       ✅       |                 |                  |
| `sync`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `sysctl`        |      ✅       |       ✅       |                 |                  |
| `syslogd`       |               |       ✅       |                 |                  |
| `tac`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `tail`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `tar`           |      ✅       |       ✅       |                 |                  |
| `tee`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `test`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `time`          |      ✅       |       ✅       |                 |                  |
| `timeout`       |      ✅       |       ✅       |       ✅        |        ✅        |
| `top`           |      ✅       |       ✅       |                 |                  |
| `touch`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `tr`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `traceroute`    |      ✅       |       ✅       |                 |                  |
| `traceroute6`   |      ✅       |       ✅       |                 |                  |
| `tree`          |      ✅       |       ✅       |                 |                  |
| `true`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `truncate`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `tsort`         |      ✅       |                |       ✅        |        ✅        |
| `tty`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `ttysize`       |      ✅       |       ✅       |                 |                  |
| `tunctl`        |      ✅       |       ✅       |                 |                  |
| `udhcpc`        |               |       ✅       |                 |                  |
| `udhcpc6`       |               |       ✅       |                 |                  |
| `umount`        |               |       ✅       |                 |                  |
| `uname`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `unexpand`      |      ✅       |       ✅       |       ✅        |        ✅        |
| `uniq`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `unix2dos`      |      ✅       |       ✅       |                 |                  |
| `unlink`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `unlzma`        |      ✅       |       ✅       |                 |                  |
| `unlzop`        |      ✅       |       ✅       |                 |                  |
| `unshare`       |               |       ✅       |                 |                  |
| `unxz`          |      ✅       |       ✅       |                 |                  |
| `unzip`         |      ✅       |       ✅       |                 |                  |
| `uptime`        |      ✅       |       ✅       |                 |                  |
| `users`         |               |                |       ✅        |        ✅        |
| `usleep`        |      ✅       |       ✅       |                 |                  |
| `uudecode`      |      ✅       |       ✅       |                 |                  |
| `uuencode`      |      ✅       |       ✅       |                 |                  |
| `vconfig`       |      ✅       |       ✅       |                 |                  |
| `vdir`          |               |                |       ✅        |        ✅        |
| `vi`            |      ✅       |       ✅       |                 |                  |
| `vlock`         |      ✅       |       ✅       |                 |                  |
| `volname`       |               |       ✅       |                 |                  |
| `watch`         |      ✅       |       ✅       |                 |                  |
| `watchdog`      |               |       ✅       |                 |                  |
| `wc`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `wget`          |               |       ✅       |                 |                  |
| `which`         |      ✅       |       ✅       |                 |                  |
| `who`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `whoami`        |      ✅       |       ✅       |       ✅        |        ✅        |
| `whois`         |               |       ✅       |                 |                  |
| `xargs`         |      ✅       |       ✅       |                 |                  |
| `xxd`           |      ✅       |       ✅       |                 |                  |
| `xzcat`         |      ✅       |       ✅       |                 |                  |
| `yes`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `zcat`          |      ✅       |       ✅       |                 |                  |
| `zcip`          |               |       ✅       |                 |                  |

---

### Debian compatibility
_Path: chainguard/containers/migration/compatibility/debian-compatibility.md_

Chainguard Containers and Debian base images have different binaries and scripts included in their respective `busybox` and `coreutils` packages.

The following table lists common tools and their corresponding package(s) in both Wolfi and Debian distributions.

Note that `$PATH` locations like `/usr/bin` or `/sbin` are not included here. If you have compatibility issues with tools that are included in both `busybox` and `coreutils`, be sure to check `$PATH` order and confirm which version of a tool is being run.

Generally, if a tool exists in `busybox` but does not have a `coreutils` counterpart, there will be a specific package that includes it. For example the `zcat` utility is included in the `gzip` package in both Wolfi and Debian.

You can use the `apk search` command in Wolfi, and the `apt-cache search` command in Debian to find out which package includes a tool.

If your workflow depends on tools or packages from the upstream Debian image, note that Chainguard offers *full* variants (tagged `-full`) for a number of our most popular Containers.These variants map to their upstream equivalent (often the Debian image on Docker Hub) and can ease migration before you move to a more minimal image. Refer to [Full container variants](/chainguard/containers/concepts/container-variants/#full-container-variants).

| Utility             | Wolfi busybox | Debian busybox | Wolfi coreutils | Debian coreutils |
| ------------------- | :-----------: | :------------: | :-------------: | :--------------: |
| `[`                 |      ✅       |       ✅       |       ✅        |        ✅        |
| `[[`                |      ✅       |       ✅       |                 |                  |
| `acpid`             |               |       ✅       |                 |                  |
| `add-shell`         |      ✅       |                |                 |                  |
| `addgroup`          |      ✅       |                |                 |                  |
| `adduser`           |      ✅       |                |                 |                  |
| `adjtimex`          |      ✅       |       ✅       |                 |                  |
| `ar`                |               |       ✅       |                 |                  |
| `arch`              |      ✅       |       ✅       |                 |        ✅        |
| `arp`               |               |       ✅       |                 |                  |
| `arping`            |      ✅       |       ✅       |                 |                  |
| `ascii`             |               |       ✅       |                 |                  |
| `ash`               |      ✅       |       ✅       |                 |                  |
| `awk`               |      ✅       |       ✅       |                 |                  |
| `b2sum`             |               |                |       ✅        |        ✅        |
| `base32`            |               |                |       ✅        |        ✅        |
| `base64`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `basename`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `basenc`            |               |                |       ✅        |        ✅        |
| `bbconfig`          |      ✅       |                |                 |                  |
| `bc`                |      ✅       |       ✅       |                 |                  |
| `beep`              |      ✅       |                |                 |                  |
| `bin`               |               |                |                 |        ✅        |
| `blkdiscard`        |               |       ✅       |                 |                  |
| `blkid`             |               |       ✅       |                 |                  |
| `blockdev`          |               |       ✅       |                 |                  |
| `brctl`             |               |       ✅       |                 |                  |
| `bunzip2`           |      ✅       |       ✅       |                 |                  |
| `bzcat`             |      ✅       |       ✅       |                 |                  |
| `bzip2`             |      ✅       |       ✅       |                 |                  |
| `cal`               |      ✅       |       ✅       |                 |                  |
| `cat`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `chattr`            |      ✅       |                |                 |                  |
| `chcon`             |               |                |       ✅        |        ✅        |
| `chgrp`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chmod`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chown`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `chpasswd`          |      ✅       |                |                 |                  |
| `chroot`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `chrt`              |      ✅       |                |                 |                  |
| `chvt`              |               |       ✅       |                 |                  |
| `cksum`             |      ✅       |                |       ✅        |        ✅        |
| `clear`             |      ✅       |       ✅       |                 |                  |
| `cmp`               |      ✅       |       ✅       |                 |                  |
| `comm`              |      ✅       |                |       ✅        |        ✅        |
| `coreutils`         |               |                |       ✅        |                  |
| `cp`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `cpio`              |      ✅       |       ✅       |                 |                  |
| `crc32`             |               |       ✅       |                 |                  |
| `cryptpw`           |      ✅       |                |                 |                  |
| `csplit`            |               |                |       ✅        |        ✅        |
| `cttyhack`          |               |       ✅       |                 |                  |
| `cut`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `date`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `dc`                |      ✅       |       ✅       |                 |                  |
| `dd`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `deallocvt`         |               |       ✅       |                 |                  |
| `delgroup`          |      ✅       |                |                 |                  |
| `deluser`           |      ✅       |                |                 |                  |
| `depmod`            |               |       ✅       |                 |                  |
| `devmem`            |               |       ✅       |                 |                  |
| `df`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `diff`              |      ✅       |       ✅       |                 |                  |
| `dir`               |               |                |       ✅        |        ✅        |
| `dircolors`         |               |                |       ✅        |        ✅        |
| `dirname`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `dmesg`             |      ✅       |       ✅       |                 |                  |
| `dnsdomainname`     |      ✅       |       ✅       |                 |                  |
| `dos2unix`          |      ✅       |       ✅       |                 |                  |
| `du`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `dumpkmap`          |               |       ✅       |                 |                  |
| `dumpleases`        |               |       ✅       |                 |                  |
| `echo`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `ed`                |      ✅       |                |                 |                  |
| `egrep`             |      ✅       |       ✅       |                 |                  |
| `env`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `expand`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `expr`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `factor`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `fallocate`         |      ✅       |       ✅       |                 |                  |
| `false`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `fatattr`           |               |       ✅       |                 |                  |
| `fdisk`             |               |       ✅       |                 |                  |
| `fgrep`             |      ✅       |       ✅       |                 |                  |
| `find`              |      ✅       |       ✅       |                 |                  |
| `findfs`            |      ✅       |       ✅       |                 |                  |
| `flock`             |      ✅       |                |                 |                  |
| `fmt`               |               |                |       ✅        |        ✅        |
| `fold`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `free`              |      ✅       |       ✅       |                 |                  |
| `freeramdisk`       |               |       ✅       |                 |                  |
| `fsfreeze`          |               |       ✅       |                 |                  |
| `fstrim`            |               |       ✅       |                 |                  |
| `fsync`             |      ✅       |                |                 |                  |
| `ftpget`            |               |       ✅       |                 |                  |
| `ftpput`            |               |       ✅       |                 |                  |
| `fuser`             |      ✅       |                |                 |                  |
| `getopt`            |      ✅       |       ✅       |                 |                  |
| `getty`             |      ✅       |       ✅       |                 |                  |
| `grep`              |      ✅       |       ✅       |                 |                  |
| `groups`            |      ✅       |       ✅       |                 |        ✅        |
| `gunzip`            |      ✅       |       ✅       |                 |                  |
| `gzip`              |      ✅       |       ✅       |                 |                  |
| `halt`              |               |       ✅       |                 |                  |
| `hd`                |      ✅       |                |                 |                  |
| `head`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `hexdump`           |      ✅       |       ✅       |                 |                  |
| `hostid`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `hostname`          |      ✅       |       ✅       |                 |                  |
| `httpd`             |               |       ✅       |                 |                  |
| `hwclock`           |               |       ✅       |                 |                  |
| `i2cdetect`         |               |       ✅       |                 |                  |
| `i2cdump`           |               |       ✅       |                 |                  |
| `i2cget`            |               |       ✅       |                 |                  |
| `i2cset`            |               |       ✅       |                 |                  |
| `i2ctransfer`       |               |       ✅       |                 |                  |
| `id`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `ifconfig`          |               |       ✅       |                 |                  |
| `ifdown`            |               |       ✅       |                 |                  |
| `ifup`              |               |       ✅       |                 |                  |
| `init`              |               |       ✅       |                 |                  |
| `inotifyd`          |      ✅       |                |                 |                  |
| `insmod`            |               |       ✅       |                 |                  |
| `install`           |      ✅       |                |       ✅        |        ✅        |
| `ionice`            |      ✅       |       ✅       |                 |                  |
| `iostat`            |      ✅       |                |                 |                  |
| `ip`                |               |       ✅       |                 |                  |
| `ipcalc`            |               |       ✅       |                 |                  |
| `ipcrm`             |      ✅       |                |                 |                  |
| `ipcs`              |      ✅       |                |                 |                  |
| `ipneigh`           |               |       ✅       |                 |                  |
| `join`              |               |                |       ✅        |        ✅        |
| `kill`              |      ✅       |       ✅       |                 |                  |
| `killall`           |      ✅       |       ✅       |                 |                  |
| `killall5`          |      ✅       |                |                 |                  |
| `klogd`             |               |       ✅       |                 |                  |
| `last`              |               |       ✅       |                 |                  |
| `less`              |      ✅       |       ✅       |                 |                  |
| `link`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `linux32`           |      ✅       |       ✅       |                 |                  |
| `linux64`           |      ✅       |       ✅       |                 |                  |
| `linuxrc`           |               |       ✅       |                 |                  |
| `ln`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `loadfont`          |               |       ✅       |                 |                  |
| `loadkmap`          |               |       ✅       |                 |                  |
| `logger`            |      ✅       |       ✅       |                 |                  |
| `login`             |      ✅       |       ✅       |                 |                  |
| `logname`           |               |       ✅       |       ✅        |        ✅        |
| `logread`           |               |       ✅       |                 |                  |
| `losetup`           |               |       ✅       |                 |                  |
| `ls`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `lsattr`            |      ✅       |                |                 |                  |
| `lsmod`             |               |       ✅       |                 |                  |
| `lsof`              |      ✅       |                |                 |                  |
| `lsscsi`            |               |       ✅       |                 |                  |
| `lzcat`             |      ✅       |       ✅       |                 |                  |
| `lzma`              |      ✅       |       ✅       |                 |                  |
| `lzop`              |      ✅       |       ✅       |                 |                  |
| `lzopcat`           |      ✅       |                |                 |                  |
| `md5sum`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `md5sum.textutils`  |               |                |                 |        ✅        |
| `mdev`              |               |       ✅       |                 |                  |
| `microcom`          |      ✅       |       ✅       |                 |                  |
| `mim`               |               |       ✅       |                 |                  |
| `mkdir`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkdosfs`           |               |       ✅       |                 |                  |
| `mke2fs`            |               |       ✅       |                 |                  |
| `mkfifo`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `mknod`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `mkpasswd`          |      ✅       |       ✅       |                 |                  |
| `mkswap`            |               |       ✅       |                 |                  |
| `mktemp`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `modinfo`           |               |       ✅       |                 |                  |
| `modprobe`          |               |       ✅       |                 |                  |
| `more`              |      ✅       |       ✅       |                 |                  |
| `mount`             |               |       ✅       |                 |                  |
| `mountpoint`        |      ✅       |                |                 |                  |
| `mpstat`            |      ✅       |                |                 |                  |
| `mt`                |               |       ✅       |                 |                  |
| `mv`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `nameif`            |               |       ✅       |                 |                  |
| `nc`                |               |       ✅       |                 |                  |
| `netstat`           |      ✅       |       ✅       |                 |                  |
| `nice`              |      ✅       |                |       ✅        |        ✅        |
| `nl`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `nmeter`            |      ✅       |                |                 |                  |
| `nohup`             |      ✅       |                |       ✅        |        ✅        |
| `nologin`           |      ✅       |       ✅       |                 |                  |
| `nproc`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `nsenter`           |      ✅       |       ✅       |                 |                  |
| `nslookup`          |               |       ✅       |                 |                  |
| `nuke`              |               |       ✅       |                 |                  |
| `numfmt`            |               |                |       ✅        |        ✅        |
| `od`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `openvt`            |               |       ✅       |                 |                  |
| `partprobe`         |               |       ✅       |                 |                  |
| `passwd`            |      ✅       |                |                 |                  |
| `paste`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `patch`             |               |       ✅       |                 |                  |
| `pathchk`           |               |                |       ✅        |        ✅        |
| `pgrep`             |      ✅       |                |                 |                  |
| `pidof`             |      ✅       |       ✅       |                 |                  |
| `ping`              |      ✅       |       ✅       |                 |                  |
| `ping6`             |      ✅       |       ✅       |                 |                  |
| `pinky`             |               |                |       ✅        |        ✅        |
| `pipe_progress`     |      ✅       |                |                 |                  |
| `pivot_root`        |      ✅       |       ✅       |                 |                  |
| `pkill`             |      ✅       |                |                 |                  |
| `pmap`              |      ✅       |                |                 |                  |
| `poweroff`          |               |       ✅       |                 |                  |
| `pr`                |               |                |       ✅        |        ✅        |
| `printenv`          |      ✅       |                |       ✅        |        ✅        |
| `printf`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `ps`                |      ✅       |       ✅       |                 |                  |
| `pstree`            |      ✅       |                |                 |                  |
| `ptx`               |               |                |       ✅        |        ✅        |
| `pwd`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `pwdx`              |      ✅       |                |                 |                  |
| `rdate`             |               |       ✅       |                 |                  |
| `rdev`              |      ✅       |                |                 |                  |
| `readahead`         |      ✅       |                |                 |                  |
| `readlink`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `realpath`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `reboot`            |               |       ✅       |                 |                  |
| `remove-shell`      |      ✅       |                |                 |                  |
| `renice`            |      ✅       |       ✅       |                 |                  |
| `reset`             |      ✅       |       ✅       |                 |                  |
| `resize`            |      ✅       |                |                 |                  |
| `resume`            |               |       ✅       |                 |                  |
| `rev`               |      ✅       |       ✅       |                 |                  |
| `rm`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmdir`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `rmmod`             |               |       ✅       |                 |                  |
| `route`             |               |       ✅       |                 |                  |
| `rpm`               |               |       ✅       |                 |                  |
| `rpm2cpio`          |               |       ✅       |                 |                  |
| `run-init`          |               |       ✅       |                 |                  |
| `run-parts`         |      ✅       |       ✅       |                 |                  |
| `runcon`            |               |                |       ✅        |        ✅        |
| `sbin`              |               |                |                 |        ✅        |
| `sed`               |      ✅       |       ✅       |                 |                  |
| `seq`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `setkeycodes`       |               |       ✅       |                 |                  |
| `setpriv`           |      ✅       |       ✅       |                 |                  |
| `setserial`         |      ✅       |                |                 |                  |
| `setsid`            |      ✅       |       ✅       |                 |                  |
| `sh`                |      ✅       |       ✅       |                 |                  |
| `sha1sum`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha224sum`         |               |                |       ✅        |        ✅        |
| `sha256sum`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `sha384sum`         |               |                |       ✅        |        ✅        |
| `sha3sum`           |      ✅       |       ✅       |                 |                  |
| `sha512sum`         |      ✅       |       ✅       |       ✅        |        ✅        |
| `shred`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `shuf`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `sleep`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `sort`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `split`             |      ✅       |                |       ✅        |        ✅        |
| `ssl_client`        |               |       ✅       |                 |                  |
| `start-stop-daemon` |               |       ✅       |                 |                  |
| `stat`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `stdbuf`            |               |                |       ✅        |        ✅        |
| `strings`           |      ✅       |       ✅       |                 |                  |
| `stty`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `su`                |      ✅       |                |                 |                  |
| `sum`               |      ✅       |                |       ✅        |        ✅        |
| `svc`               |               |       ✅       |                 |                  |
| `svok`              |               |       ✅       |                 |                  |
| `swapoff`           |               |       ✅       |                 |                  |
| `swapon`            |               |       ✅       |                 |                  |
| `switch_root`       |               |       ✅       |                 |                  |
| `sync`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `sysctl`            |      ✅       |       ✅       |                 |                  |
| `syslogd`           |               |       ✅       |                 |                  |
| `tac`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `tail`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `tar`               |      ✅       |       ✅       |                 |                  |
| `taskset`           |               |       ✅       |                 |                  |
| `tee`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `telnet`            |               |       ✅       |                 |                  |
| `test`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `tftp`              |               |       ✅       |                 |                  |
| `time`              |      ✅       |       ✅       |                 |                  |
| `timeout`           |      ✅       |       ✅       |       ✅        |        ✅        |
| `top`               |      ✅       |       ✅       |                 |                  |
| `touch`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `tr`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `traceroute`        |      ✅       |       ✅       |                 |                  |
| `traceroute6`       |      ✅       |       ✅       |                 |                  |
| `tree`              |      ✅       |                |                 |                  |
| `true`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `truncate`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `ts`                |               |       ✅       |                 |                  |
| `tsort`             |      ✅       |                |       ✅        |        ✅        |
| `tty`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `ttysize`           |      ✅       |                |                 |                  |
| `tunctl`            |      ✅       |                |                 |                  |
| `ubirename`         |               |       ✅       |                 |                  |
| `udhcpc`            |               |       ✅       |                 |                  |
| `udhcpd`            |               |       ✅       |                 |                  |
| `uevent`            |               |       ✅       |                 |                  |
| `umount`            |               |       ✅       |                 |                  |
| `uname`             |      ✅       |       ✅       |       ✅        |        ✅        |
| `uncompress`        |               |       ✅       |                 |                  |
| `unexpand`          |      ✅       |       ✅       |       ✅        |        ✅        |
| `uniq`              |      ✅       |       ✅       |       ✅        |        ✅        |
| `unix2dos`          |      ✅       |       ✅       |                 |                  |
| `unlink`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `unlzma`            |      ✅       |       ✅       |                 |                  |
| `unlzop`            |      ✅       |                |                 |                  |
| `unshare`           |               |       ✅       |                 |                  |
| `unxz`              |      ✅       |       ✅       |                 |                  |
| `unzip`             |      ✅       |       ✅       |                 |                  |
| `uptime`            |      ✅       |       ✅       |                 |                  |
| `users`             |               |                |       ✅        |        ✅        |
| `usleep`            |      ✅       |       ✅       |                 |                  |
| `usr`               |               |                |                 |        ✅        |
| `uudecode`          |      ✅       |       ✅       |                 |                  |
| `uuencode`          |      ✅       |       ✅       |                 |                  |
| `vconfig`           |      ✅       |       ✅       |                 |                  |
| `vdir`              |               |                |       ✅        |        ✅        |
| `vi`                |      ✅       |       ✅       |                 |                  |
| `vlock`             |      ✅       |                |                 |                  |
| `w`                 |               |       ✅       |                 |                  |
| `watch`             |      ✅       |       ✅       |                 |                  |
| `watchdog`          |               |       ✅       |                 |                  |
| `wc`                |      ✅       |       ✅       |       ✅        |        ✅        |
| `wget`              |               |       ✅       |                 |                  |
| `which`             |      ✅       |       ✅       |                 |                  |
| `who`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `whoami`            |      ✅       |       ✅       |       ✅        |        ✅        |
| `xargs`             |      ✅       |       ✅       |                 |                  |
| `xxd`               |      ✅       |       ✅       |                 |                  |
| `xz`                |               |       ✅       |                 |                  |
| `xzcat`             |      ✅       |       ✅       |                 |                  |
| `yes`               |      ✅       |       ✅       |       ✅        |        ✅        |
| `zcat`              |      ✅       |       ✅       |                 |                  |

---

### Chainguard Actions overview
_Path: chainguard/actions/overview.md_

Chainguard Actions are a set of hardened drop-in replacements for popular GitHub Actions. Each action preserves the same inputs and outputs as the upstream version, but has been examined and revised to better protect your CI/CD pipelines from supply chain attacks. The only change in your workflow configuration is the name of the action in the `uses:` line.

Coverage spans GitHub first-party (`actions/*`), cloud-provider (`aws-actions/*`, `azure/*`, `google-github-actions/*`), Docker, HashiCorp, and security tools actions (Trivy, Grype, CodeQL, Semgrep), as well as a growing catalog of community actions.

Each hardened action:

- Is built from source and evaluated through a rule-based and AI-powered hardening pipeline
- Has every internal `uses:` and container image reference pinned to an immutable SHA digest
- Ships with a `HARDENING.md` report documenting exactly what was checked and fixed
- Is re-reviewed and re-hardened whenever upstream publishes a new version or Chainguard adds a new rule

Chainguard Actions protect against common threats including tag hijacking, dependency confusion, `pull_request_target` abuse, and secret exfiltration.

This page provides enough to get you started. Refer to the [Chainguard Actions README](https://github.com/chainguard-actions) in GitHub for deeper technical details and some example migrations. You can also [use Chainguard Guardener to enable Chainguard Actions](/chainguard/guardener/github/actions-security/).

## Prerequisites

To follow this guide, you need:

- `chainctl` **v0.2.261** or later, installed and authenticated. Refer to [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't have it yet.
- An active Chainguard organization.
- Owner access on the organization.

## Preliminary steps

Before using Chainguard Actions, log in to Chainguard and enable the Chainguard Actions entitlement for your organization.

Authenticate using `chainctl`:

```shell
chainctl auth login
```

Create the Chainguard Actions entitlement to enable access to the hardened actions hosted at `github.com/chainguard-actions`:

```shell
chainctl actions entitlements create
```

The output confirms the entitlement:

```output
Enabled Actions product for org chainguard.edu ($ENTITLEMENT_ID) [entitlement id: $ENTITLEMENT_ID]
```

Confirm your entitlement:

```shell
chainctl actions entitlements list
```

```output
                    ID                    |         CREATED
------------------------------------------|-------------------------
 $ENTITLEMENT_ID                          | 2026-06-18 17:33:24 UTC
```

## Basic usage (quick start)

To use a Chainguard hardened action, edit your workflow's YAML configuration file and change the `uses:` line to match the location in `chainguard-actions`:

```yaml
- uses: chainguard-actions/<action-name>@main
```

Action names often have the upstream organization appended to the action name for clarity, for example, `tj-actions/changed-actions` becomes `tj-actions-changed-actions`. This prevents two different sources of a `changed-actions` action from clashing in the Chainguard Actions repository.

Search the Chainguard Actions repository, find the action you want to use, and then use the name you find there.

> **Note:** This example uses `@main`, a mutable reference, to illustrate the mechanics of switching organizations. For production workflows, pin to an immutable SHA digest instead. The [Configure your workflows](#configure-your-workflows-to-use-chainguard-actions) section covers the full migration.

The rest of this page goes a bit deeper into how to use Chainguard Actions.

## Configure your workflows to use Chainguard Actions

You can save some time by using the optional [cg-actions](https://github.com/chainguard-dev/cg-skills/tree/main/skills/cg-actions) skill, a Claude Code skill for auditing GitHub Actions usage and migrating to Chainguard hardened actions.

Following the steps in this section will achieve a similar result.

### Inventory the actions you currently use.

Run this from the root of your repository to get a deduplicated list of every `uses:` line across every workflow:

```shell
grep -rhE "uses:\s*[^@]+@" .github/workflows/ | sort -u
```

### Check the Chainguard Actions catalog for each action.

Browse [the Chainguard Actions repository](https://github.com/chainguard-actions) or use the GitHub search UI. Match by organization and action name — for example, if you use `tj-actions/changed-files`, search for `org:chainguard-actions tj-actions-changed-files`.

If the action isn't in the catalog, [open an issue](https://github.com/chainguard-actions/.github/issues/new?template=new-action.yml) to request it.

### Replace the `uses:` line in each workflow.

Change the `uses:` line to match the location in `chainguard-actions`. Find and pin to the commit SHA digest and preserve the original tag as a comment so Dependabot, Renovate, and human reviewers can track upgrades:

```yaml
# Before
- uses: tj-actions/changed-files@v47
```

```yaml
# After
- uses: chainguard-actions/tj-actions-changed-files@<SHA> # v47
# originally - uses: tj-actions/changed-files@v47
```

To find the SHA digest for a specific release, use the `gh` CLI:

```shell
gh api repos/chainguard-actions/tj-actions-changed-files/commits/v47 --jq '.sha'
```

```output
25a1eb5aa40568ec6f8c0e58f2e809ef4270ebfa
```

For the short SHA digest:

```shell
gh api repos/chainguard-actions/tj-actions-changed-files/commits/v47 --jq '.sha[:7]'
```

```output
25a1eb5
```

The resulting `uses:` line with the full SHA digest:

```yaml
- uses: chainguard-actions/changed-files@25a1eb5aa40568ec6f8c0e58f2e809ef4270ebfa # v47
```

### Update your allowed-actions list.

If your GitHub organization or repository restricts which actions can run (**Settings > Actions > General > Allow select actions**), add `chainguard-actions/*` to the allowed patterns. Without this, workflows fail with a policy error on first run.

> **Note:** It's a good idea to remove allowed actions that are no longer being used.

### Commit, open a PR, and verify that CI passes.

The action's inputs, outputs, and behavior are almost always identical to the upstream version, so no other workflow changes are typically needed.

However, read the `HARDENING.md` file for each Chainguard Action before migrating. In rare cases, the hardening process requires a change to inputs, outputs, or behavior — those changes are documented in this file.

If something breaks, [file an issue](https://github.com/chainguard-actions/.github/issues/new?template=action-issue.yml) with a reproducer.

## View the actions you are currently using in a repository

Use `chainctl` to scan every workflow and composite action in a repository and list all dependencies transitively:

```shell
chainctl actions discover $GIT_ORGANIZATION/$REPO
```

```output
    scanning $GIT_ORGANIZATION/$REPO for workflows and actions
               ACTION                    | REQUESTED | USED BY
    -------------------------------------|-----------|---------
     actions/checkout                    | v4        | 1
     chainguard-actions/actions-checkout | v6.0.2    | 1

    2 actions, 0 container images

```

## View the actions currently available

While you can search the [Chainguard Actions repository](https://github.com/chainguard-actions) directly in GitHub, you can also use `chainctl` to find an action.

```shell
chainctl actions catalog list --upstream-owner=$OWNER
```

For example, to list all the actions from the `tj-actions` source:

```shell
chainctl actions catalog list --upstream-owner=tj-actions
```

This example returns a list of all actions in the Chainguard Actions repository that originate from the `tj-actions` upstream source.

## Hardened action repository contents

The main branch of each hardened action repository contains:

- `HARDENING.md` — the authoritative, per-action record of what was checked, what was fixed, and how
- `action.yml` or `action.yaml` — the hardened action definition, preserving upstream inputs and outputs with fixes applied
- `LICENSE_CHAINGUARD` — the Chainguard license for the hardened variant
- `source.json` and `published.json` — manifests pointing at the upstream source and the upstream version being tracked (not yet present in all repos; some older repos don't include them)
- Some actions also include documentation from upstream that you can adapt to use with the Chainguard hardened version

Then, the version branches in the hardened action repos contain the hardened actions.

## The continuous re-hardening process

Chainguard Actions are continuously re-hardened:

- When upstream publishes a new version, the pipeline re-runs and publishes a new hardened version
- When the hardening ruleset is updated, affected actions are re-reviewed against the new rules
- The `HARDENING.md` report is regenerated on every hardening run, with its own policy SHA pinning the exact set of rules that were applied

## Request a new action or report an issue

To request a new action, [open an issue](https://github.com/chainguard-actions/.github/issues/new?template=new-action.yml).

## Report an issue

If an action isn't working as expected, [open an issue](https://github.com/chainguard-actions/.github/issues/new?template=action-issue.yml) with the action reference, a description of the problem, and steps to reproduce.

## Learn more

- [Chainguard Actions telemetry and privacy](/chainguard/actions/telemetry/)
- [Chainguard Actions product page](https://www.chainguard.dev/actions)
- For other questions, [contact Chainguard](https://www.chainguard.dev/contact?utm=docs).

---

### Chainguard Actions telemetry and privacy
_Path: chainguard/actions/telemetry.md_

Every Chainguard hardened action runs a best-effort "phone-home" pre-hook that records a usage event to `https://actions.enforce.dev/actions/v1/record`. The hook is fire-and-forget, with a 2 second timeout that fails open, so it cannot break your build.

## Why we collect this data

We collect this data for two reasons:

- **Billing**: usage events show which repositories use Chainguard hardened actions, so we can meter usage against your entitlements and bill accurately.
- **Security**: verified usage records help us confirm that requests come from legitimate workflows, identify where our actions run, and detect anomalous or unauthorized use.

## What we collect

What we collect depends on whether your workflow grants `id-token: write`:

- **Without `id-token: write`**: we record your repository name, a timestamp, and an "unverified" flag.
- **With `id-token: write`**: the hook mints a GitHub OIDC token scoped to the `actions.chainguard.dev` audience and sends it so we can verify the record. From that token we store metadata: repository, actor, ref, sha, workflow path, repository visibility, and run identifiers.

The hook never grants itself `id-token: write`. It only uses the permission if your workflow already grants it. If you would rather we receive only your repository name, do not grant `id-token: write` to that job.

## About the token

The token is a short-lived, audience-locked GitHub OIDC token. Because it is locked to the `actions.chainguard.dev` audience, it cannot be used against GitHub, a cloud provider, or any other service. The underlying `ACTIONS_ID_TOKEN_REQUEST_TOKEN` never leaves the runner; it is used locally only to mint the audience-scoped token.

## Learn more

- [Chainguard Actions overview](/chainguard/actions/overview/)
- For other questions, [contact Chainguard](https://www.chainguard.dev/contact?utm=docs).

---

### Chainguard VMs FAQ
_Path: chainguard/vms/faq.md_

## Which platforms and hypervisors are Chainguard VMs available for?

Chainguard VMs are available for AWS ([EC2](https://aws.amazon.com/ec2/) and [ECS](https://aws.amazon.com/ecs/)/[EKS](https://aws.amazon.com/eks/)), [GCP](https://cloud.google.com/?hl=en) (Compute Engine), and [Azure Compute](https://azure.microsoft.com/en-us/products/category/compute) cloud environments, and also for on-prem solutions based on KVM such as [QEMU](https://www.qemu.org/), [VMware](https://www.vmware.com/products/cloud-infrastructure/vsphere), [Nutanix](https://www.nutanix.com/), among others.

## What kinds of VMs are currently available?

As part of our initial offering, we’re providing Container Host VMs, Base VMs, and Application VMs. This list should expand as we fine tune the product based on customer feedback.

## What are Container Host VMs and which versions are available?

Container Host VMs allow you to run containerized workloads on a hardened VM runtime. We currently offer container host VMs for AWS Container Services ECS and EKS, and also for native compute instances on AWS EC2, Google Compute Engine, and Azure Compute.

## What are Base VMs and which versions are available?

Base VMs are general purpose VMs that can be customized to suit your application needs. Current offerings include Chainguard Base, Java Base, and Python Base VM images available for native compute instances on AWS EC2, Google Compute Engine, and Azure Compute.

## What are Application VMs and which versions are available?

Application VMs come pre-packaged with popular backend applications running as systemd services. We currently offer Nginx, Jenkins, and Squid Proxy Application VMs available for native compute instances on AWS EC2, Google Compute Engine, and Azure Compute.

## Which operating system is used by Chainguard VMs?

Chainguard VMs are based on [Chainguard OS](https://get.chainguard.dev/chainguard-your-os-whitepaper-0), our minimal Linux distribution initially designed to run on containers and now extended to include a kernel and other components.

## Which Linux kernel is used in Chainguard VMs?

The [Chainguard Factory](/platform/factory/overview/) tracks both the stable upstream and the latest LTS (for FIPS) versions of the kernel, building from source to provide the most up-to-date and patched versions.

## Do Chainguard VMs support in-place upgrades?

No, Chainguard VMs do not support in-place upgrades (e.g. via package upgrade). The upgrade strategy is based on node replacement.

## How does FIPS work on VMs?

In Virtual Machines, FIPS is traditionally dependent on the Linux kernel, which requires engineers to provision dedicated hardware and virtual machines (VMs) with the host kernel configured in FIPS mode in order to be compliant. Using a FIPS validated Linux kernel allows VMs to provide FIPS graded cryptography for use cases like Disk Encryption, IPSec, KMSV, dm-verity, dm-integrity, among others.

This design, which requires maintenance of FIPS cryptographic boundaries at the kernel-level, drives significant friction for vendors delivering FIPS compliant workloads for modern cloud-native applications, since it forces a dependence on a limited set of FIPS-enabled kernels. With kernel FIPS you often need separate, kernel-pinned images (and careful reboots) to keep the validated stack intact.

Making the cryptographic module user-space or [kernel independent](https://www.chainguard.dev/unchained/kernel-independent-fips-images) breaks that coupling, so the same validated module can serve many VMs and kernels with less toil and fewer surprises.

## Do Chainguard VMs support FIPS?

Yes, Chainguard VMs support **kernel independent FIPS**. This means that application workloads use a FIPS validated entropy source independent of the kernel. The advantage to this approach is that the certification of the entropy source does not need to be performed against a specific kernel, so customers can take advantage of new kernel features while remaining FIPS compliant. It also means that VMs no longer need to be booted in FIPS mode.

Note that with kernel independent FIPS, some low level operating system functions such as disk encryption, IPSEC, KMSV, among others do not use FIPS validated entropy. This is less relevant on cloud platforms, since disk volumes are encrypted with FIPS validated entropy, as is network and filesystem encryption. On the cloud, kernel independent FIPS is a more efficient way of servicing FIPS workloads in VMs.

---

### Chainguard VMs overview
_Path: chainguard/vms/overview.md_

Chainguard VMs offer a minimal and verifiable foundation for running ephemeral workloads in cloud and on-prem hypervisor deployments, designed to complement and extend the same secure-by-default philosophy found in [Chainguard Containers](https://edu.chainguard.dev/chainguard/containers/overview/). With a strong focus on rapid CVE remediation and a small attack surface, Chainguard VMs are purpose-built to service the target workload and include only the packages that are essential for its operation.

Built in the Chainguard Factory, Chainguard VMs benefit from a highly automated, secure-by-design build pipeline that ensures consistent, reproducible artifacts. This streamlined process enables the delivery of VM images that are continuously updated to eliminate known vulnerabilities.

## Why Chainguard VMs

Unlike traditional virtual machines, which are often burdened with legacy components, unnecessary packages, and opaque dependency chains, Chainguard VMs are designed for minimalism, security, and operational clarity. Based on Chainguard OS, Chainguard VMs include a kernel that closely tracks the upstream Linux stable tree, ensuring timely updates and compatibility, along with a minimal `systemd` for service management. Consistent with the principle of minimalism, only the essential systemd units required to support the VM’s intended workload are included. Every component is fully traceable, with SLSA guarantees and SBOMs generated at every step, providing end-to-end transparency and helping prevent CVEs from ever entering your environment.

For platform engineers and DevOps teams, this means:

* **Reduced Engineering Toil**: With no unnecessary software to maintain, you reduce noise from non-actionable CVEs and focus only on what matters.
* **Improved boot and runtime security**: Minimal, hardened images reduce the chances of privilege escalation, kernel exploits, and lateral movement.
* **Operational consistency**: The same secure-by-default toolchain that powers Chainguard Containers now extends to your VMs, making it easier to manage and audit infrastructure uniformly across environments.

## VMs and containers compared

To understand the applicability of Chainguard VMs to your organization, it might be helpful to compare the features of Chainguard VMs to Chainguard Containers. In a nutshell, the main differences come from the fact that Chainguard VMs boot from and run with their own hardened kernel as part of Chainguard OS, while Chainguard Containers rely on the host system's kernel.

| Feature | Chainguard Container | Chainguard VM |
| :---- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------- |
| Includes Kernel? | **No** – uses host’s kernel | **Yes** – ships and boots with its own hardened kernel |
| Environment | Userspace only, isolated via namespaces & cgroups | Full OS, boots in VM with kernel, init, userspace |
| Boot Process | Starts from container entrypoint, no bootloader/kernel | Full bootloader → kernel → init system |
| Security Boundaries | Dependent on host kernel isolation | Stronger isolation via hypervisor and custom kernel controls, secure boot, SELinux policies |
| Use Case Focus | Microservices, CI/CD, ephemeral workloads | Secure cloud workloads, edge VMs, kernel-level policy control, high performance |

## Chainguard VM types

We currently offer 3 distinct types of virtual machine images:

* **Container Host:** a versatile option to run containerized workloads, protecting how you deploy containers on underlying hosts
* **Base:** general purpose VM base images that can be customized to suit your application needs. Current offerings include Chainguard Base, Java Base, and Python Base.
* **Application:** pre-packaged with popular backend applications running as systemd services. We currently offer Nginx, Jenkins, and Squid Proxy Application VMs.

## Availability

Chainguard VMs are currently available for the following platforms / hypervisors:

* Google Cloud Platform (Compute Engine)
* AWS (EC2, ECS, and EKS)
* Microsoft Azure (Azure Compute)
* QEMU/KVM (qcow2/raw)
* VMware vSphere (VMDK)
* Nutanix (qcow2/raw)

Offering broad compatibility, Chainguard VMs allow for deployment in any environment, from public clouds to self-managed infrastructure. This flexibility facilitates one-click deployment across environments and helps prevent vendor lock-in.

## Compliance and SLAs

Chainguard VMs (running Chainguard OS) are intentionally designed to minimize risk, maximize transparency, and satisfy security standards such as [CIS Benchmarks](https://edu.chainguard.dev/compliance/cis-benchmarks/), [FedRAMP](https://edu.chainguard.dev/chainguard/containers/security-and-compliance/fedramp-considerations/), SOC 2, and others.

* CVE remediation backed by an [industry-leading SLA](https://www.chainguard.dev/legal/cve-policy): 7 days for critical, 14 days for all others
* Consistent, reproducible builds
* Enterprise-grade support for multi-cloud and on-prem
* Verifiable provenance for all included components

## Resources

* [Chainguard VMs](https://www.chainguard.dev/vms)
* [Unchained Blog: Announcing Chainguard VMs: Minimal, Zero-CVE Container Host Images](https://www.chainguard.dev/unchained/announcing-chainguard-vms-minimal-zero-cve-container-host-images)
* [Unchained Blog: Expanding Chainguard VMs: Zero-CVE Application & Base Virtual Machine Images](https://www.chainguard.dev/unchained/expanding-chainguard-vms-zero-cve-application-base-virtual-machine-images-for-cloud-and-on-prem)

---

### Chainguard VMs compliance features
_Path: chainguard/vms/compliance-features.md_

Chainguard VMs provide pre-hardened, audit-ready Linux virtual machine images designed for regulated and high-assurance environments (federal, defense, healthcare, financial services, and suppliers to those sectors). These images combine the following features:

| Feature                             | Description |
|:------------------------------------| :---- |
| **FIPS 140-3 validated cryptography**     | [NIST](https://www.nist.gov/) CMVP-validated software modules and [SP 800-90B](https://csrc.nist.gov/pubs/sp/800/90/b/final) compliant entropy, with runtime guardrails blocking non-FIPS crypto. |
| **STIG hardening**                  | Pre-configured to DISA [STIG](https://edu.chainguard.dev/chainguard/containers/security-and-compliance/stigs/) controls, delivered as production-ready images. |
| **CIS benchmark compliance**        | [CIS](https://www.cisecurity.org/cis-benchmarks/cis-benchmarks-faq) Level 1 hardened variants, hybrid STIG \+ CIS baseline. |
| **Secure Boot**                     | Secure Boot enabled by default across AWS, Azure, GCP, and on-prem. |
| **Compliance evidence & reporting** | FIPS certificates, OpenSSL docs, Security Content Automation Protocol (SCAP) scan results, and POA\&M-ready artifacts. |
| **CVE remediation SLA**             | 7 days for critical CVEs, 14 days for high, medium, and low. |

Chainguard FIPS 140-3 validated and hardened VM images serve as ready-to-use replacements for standard operating systems across AWS, Azure, and GCP, allowing organizations to maintain existing infrastructure and workflows while achieving immediate compliance. This guide outlines the compliance features of Chainguard VMs and how they can help reduce engineering toil for your organization.

## FIPS 140-3 validated cryptography

Chainguard VMs include FIPS 140-3 validated software cryptographic modules, backed by a NIST Cryptographic Module Validation Program (CMVP) certificate.

* **Validated modules**
    * Cryptographic modules are validated under FIPS 140-3 and integrated directly into the base image.
    * The images contain SP 800-90B compliant entropy sources for strong, standards-aligned randomness.
* **Runtime guardrails**
    * Guardrails prevent the use of non-FIPS-approved cryptography at runtime (for example, enforcing FIPS-approved ciphers and modes only).
* **Documentation for auditors**
    * FIPS integration documentation, including OpenSSL certificates and details on module configuration, is shipped as part of the deliverables to streamline audit review and ATO packages.

This setup allows teams to consume an OS image that is already FIPS-conformant at the platform layer rather than building and validating crypto modules in-house.

## STIG hardening

Chainguard VMs provide variants hardened to DISA Security Technical Implementation Guide (STIG) requirements which are used across U.S. federal and defense environments.

* 2000+ relevant system controls are pre-configured and validated in the image, not delivered as a checklist that the customer must implement.
* Images are designed as ready-to-use replacements for existing Linux OS images, enabling STIG-compliant baselines without re-architecting existing infrastructure.

Chainguard can also provide SCAP scan outputs aligned with STIG requirements, helping teams demonstrate compliance with control requirements during audits.

## CIS Benchmark compliance

For organizations standardizing on CIS controls, Chainguard offers images hardened to **CIS Level 1** benchmarks. Chainguard VMs use a hybrid baseline combining CIS Level 1 benchmarks with STIG requirements and industry-recognized secure defaults to provide defense-in-depth hardening.

This allows security and Governance, Risk, and Compliance teams to map infrastructure posture to both internal CIS-based policies and external STIG-based requirements without maintaining parallel baselines.

## Secure Boot

All Chainguard VM images support **Secure Boot enabled by default** across:

* AWS
* Microsoft Azure
* Google Cloud Platform
* On-premises platforms supporting Secure Boot

Secure Boot ensures only cryptographically signed and trusted components participate in the boot chain, preventing tampering with early-boot components such as the bootloader and kernel.

## Compliance evidence and reporting

Chainguard VMs are designed to simplify the generation of compliance artifacts often required in audits, ATO processes, and customer security reviews.

Available artifacts include:

* FIPS module documentation and integration details, including OpenSSL certificate documentation.
* SCAP/OpenSCAP scan results for STIG and CIS benchmarks.
* Plans of Action and Milestones (POA\&M) to support risk tracking and remediation planning.

By shipping this evidence with the images, Chainguard significantly shortens the time required to build audit packages and meet regulatory reporting needs.

## Vulnerability management and lifecycle

Chainguard VMs are built and maintained with an explicit [**CVE remediation SLA**](https://www.chainguard.dev/legal/cve-policy):

* **Critical CVEs**: patched within **7 days**
* **High, medium, and low CVEs**: patched within **14 days**

Chainguard VM images are updated regularly and made available to customers within these SLA windows, leaving them with a minimal, hardened footprint which reduces the volume of installed software and minimizes the attack surface. This leaves customers with a much smaller and more manageable CVE count.

This lifecycle management shifts ongoing compliance from a perpetual engineering project to a managed image-consumption model.

---

### Chainguard OS Packages
_Path: chainguard/chainguard-os/chainguard-os-packages.md_

{{< beta feature="Chainguard OS Packages" enroll="true" >}}

Chainguard OS Packages expands the packages available to your [private APK repository](/chainguard/containers/building-and-modifying/packages/private-apk-repos/) by giving you access to the full set of 30,000 enterprise-grade, zero-CVE packages built as part of Chainguard OS and Wolfi. It also includes a small set of Chainguard base images, for example, `chainguard-base`.

Chainguard OS Packages is designed for larger customers who already build their own images from packages using tools like Bazel, Dockerfiles, and rules\_apko, and want to use a wider set of packages from Chainguard. Because you are creating custom builds, you are responsible for the image builds, the build tooling, validation, and compatibility. You still benefit from the fact that Chainguard builds the packages in the Chainguard Factory with complete SBOMs and our standard enterprise-grade, zero-CVE process.

If you need to achieve FIPS compliance, the FIPS variant of Chainguard OS Packages includes access packages with the latest versions of Chainguard’s [FIPS-validated modules](https://www.chainguard.dev/legal/fips-commitment).

Chainguard OS Packages is not compatible with [Chainguard Custom Assembly](/chainguard/containers/custom-assembly/overview/).

---

### Chainguard OS FAQs
_Path: chainguard/chainguard-os/faq.md_

This FAQ addresses common questions about [Chainguard OS](/chainguard/chainguard-os/), the security-focused operating system that powers Chainguard's production container images and enterprise features.

## What is Chainguard OS?

Chainguard OS is a minimal, hardened Linux-based operating system designed for secure, containerized software delivery. Built in-house by Chainguard, it serves as the foundation for Chainguard’s container products and emphasizes continuous integration, immutable artifacts, and alignment with upstream software.

## What is the relationship between Chainguard OS and Wolfi?

Wolfi refers to the OS of Chainguard’s [free tier container images](/chainguard/containers/concepts/container-categories/#free-containers).

Chainguard OS refers to the production-grade distribution that powers all other Chainguard products.

Please note that mixing and matching content across Wolfi and Chainguard OS is not supported.

## What are the core principles behind Chainguard OS?

Chainguard OS is built around four core principles:

1. Continuous Integration and Delivery (CI/CD)
1. Nano Updates and Rebuilds
1. Minimal, Hardened, Immutable Artifacts
1. Delta Minimization

Each of these principles ensures that Chainguard OS can provide a more secure and efficient platform for software distribution.

## What makes Chainguard OS different from traditional Linux distributions?

Chainguard OS is designed specifically for more secure and containerized application delivery. Our approach differs from traditional distros in several key ways:

* No LTS model: instead of fixed major releases, Chainguard OS continuously delivers updates in alignment with upstream changes.
* Purpose-built containers: Chainguard OS is focused on “application systems” instead of a general-purpose operating system.
* Minimal package footprint: Chainguard OS ships only what is strictly needed, avoiding unnecessary libraries and tools.
* Automation-driven: using CI/CD pipelines, Chainguard OS delivers more secure, tested, and verifiable artifacts.
* Ephemeral design: Chainguard OS embraces container-native patterns, making updates and rollbacks trivial.

## What are the benefits of using Chainguard OS?

* Security — reduced attack surface, hardened builds, and continuous patching.
* Compliance — automatically generated SBOMs and provenance metadata for all artifacts.
* Operational efficiency — reduces long upgrade cycles and manual patching.
* Supply chain integrity — built using the [Chainguard Factory](https://www.youtube.com/watch?v=iU9hmW6hrGs) and adhering to [SLSA](https://slsa.dev/) standards.

---

### OpenSSL 4.0 Configuration
_Path: chainguard/chainguard-os/openssl-4.0.md_

This is a summary of available algorithms in Chainguard OpenSSL 4.0
(non-fips) and Chainguard FIPS Provider for OpenSSL 3.6.

The majority of the available algorithms are not enabled by default and are
only available with manual overrides, configuration, and reduction of
default security level of 2, to a lower value. Those that are
available in FIPS also require manual overrides and configuration.

The v4.0 and FIPS v3.6 columns read as follows:

- **Default**: negotiated by default under the shipped Chainguard OS
  crypto policy. For key exchange groups, **First** marks the most
  preferred group and **Preshare** the group whose key share is sent
  in the first ClientHello.
- **Available**: works, but only with manual configuration.
- **Non-TLS only**: the elliptic curve works for keys, signatures and
  certificates, but has no TLS supported group and so cannot be used
  in TLS.
- Blank: not available.

The tables are presented in the format similar to the [IANA TLS
Parameters](https://www.iana.org/assignments/tls-parameters).

For more information about Transport Layer Security (TLS) please see the following references:

- [NIST PQC](https://csrc.nist.gov/projects/post-quantum-cryptography)
- [RFC10024](https://www.rfc-editor.org/info/rfc10024/)
- [draft-ietf-tls-mldsa](https://www.ietf.org/archive/id/draft-ietf-tls-mldsa-05.html)
- [RFC10015](https://www.rfc-editor.org/rfc/rfc10015.html)
- [BCP 195](https://www.rfc-editor.org/info/bcp195/)
- [RFC 9846](https://www.rfc-editor.org/info/rfc9846/)
- [RFC 5246](https://www.rfc-editor.org/info/rfc5246/)
- [NIST SP 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final)
- [RFC 9151](https://www.rfc-editor.org/info/rfc9151/)
- [draft-becker-cnsa2-tls-profile](https://datatracker.ietf.org/doc/draft-becker-cnsa2-tls-profile/)

## TLS Cipher Suites

| Value | Cipher Suite | v4.0 | FIPS v3.6 | PQC |
|---|---|---|---|---|
| TLSv1.3 | | | | |
| 0x13,0x01 | TLS_AES_128_GCM_SHA256 | Default | Default | Yes |
| 0x13,0x02 | TLS_AES_256_GCM_SHA384 | **First** | **First** | Yes |
| 0x13,0x03 | TLS_CHACHA20_POLY1305_SHA256 | Default |  | Yes |
| TLSv1.2 | | | | |
| 0xC0,0x23 | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x24 | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0x27 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x28 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0x2B | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | Default | Default |  |
| 0xC0,0x2C | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | **First** | **First** |  |
| 0xC0,0x2F | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | Default | Default |  |
| 0xC0,0x30 | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | **First** | **First** |  |
| 0xC0,0x37 | TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x38 | TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0xAC | TLS_ECDHE_ECDSA_WITH_AES_128_CCM | Available | Available |  |
| 0xC0,0xAD | TLS_ECDHE_ECDSA_WITH_AES_256_CCM | Available | Available |  |
| 0xCC,0xA8 | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | Default |  |  |
| 0xCC,0xA9 | TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | Default |  |  |
| 0xCC,0xAC | TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |

## TLS Supported Groups

| Value | Supported Group | v4.0 | FIPS v3.6 | PQC |
|---|---|---|---|---|
| PQC TLSv1.3 | | | | |
| 512 | MLKEM512 | Available | Available | Yes |
| 513 | MLKEM768 | Available | Available | Yes |
| 514 | MLKEM1024 | Default | **First** | Yes |
| 4587 | SecP256r1MLKEM768 | Default | Default | Yes |
| 4588 | X25519MLKEM768 | **First** | Default | Yes |
| 4589 | SecP384r1MLKEM1024 | Default | Default | Yes |
| TLSv1.2 & TLSv1.3 | | | | |
| 23 | secp256r1 | Default | Default |  |
| 24 | secp384r1 | Default | Preshare |  |
| 25 | secp521r1 | Default | Default |  |
| 26, 31 | brainpoolP256r1 | Default |  |  |
| 27, 32 | brainpoolP384r1 | Default |  |  |
| 28, 33 | brainpoolP512r1 | Default |  |  |
| 29 | x25519 | Preshare |  |  |
| 30 | x448 | Default |  |  |

The brainpool rows combine two codepoints each: the first one (`brainpoolP256r1`, `brainpoolP384r1`, `brainpoolP512r1`) is what TLS 1.2 negotiates, the second one (`brainpoolP256r1tls13`, `brainpoolP384r1tls13`, `brainpoolP512r1tls13`) is the TLS 1.3 name of the same curve.

## TLS SignatureScheme

| Value | Signature Scheme | v4.0 | FIPS v3.6 | PQC |
|---|---|---|---|---|
| PQC TLSv1.3 | | | | |
| 0x0904 | mldsa44 | Default | Default | Yes |
| 0x0905 | mldsa65 | Default | Default | Yes |
| 0x0906 | mldsa87 | Default | Default | Yes |
| TLSv1.2 & TLSv1.3 | | | | |
| 0x0401 | rsa_pkcs1_sha256 | Default | Default |  |
| 0x0403 | ecdsa_secp256r1_sha256 | Default | Default |  |
| 0x0501 | rsa_pkcs1_sha384 | Default | Default |  |
| 0x0503 | ecdsa_secp384r1_sha384 | Default | Default |  |
| 0x0601 | rsa_pkcs1_sha512 | Default | Default |  |
| 0x0603 | ecdsa_secp521r1_sha512 | Default | Default |  |
| 0x0804 | rsa_pss_rsae_sha256 | Default | Default |  |
| 0x0805 | rsa_pss_rsae_sha384 | Default | Default |  |
| 0x0806 | rsa_pss_rsae_sha512 | Default | Default |  |
| 0x0807 | ed25519 | Default | Default |  |
| 0x0808 | ed448 | Default | Default |  |
| 0x0809 | rsa_pss_pss_sha256 | Default | Default |  |
| 0x080A | rsa_pss_pss_sha384 | Default | Default |  |
| 0x080B | rsa_pss_pss_sha512 | Default | Default |  |
| 0x081A | ecdsa_brainpoolP256r1tls13_sha256 | Default |  |  |
| 0x081B | ecdsa_brainpoolP384r1tls13_sha384 | Default |  |  |
| 0x081C | ecdsa_brainpoolP512r1tls13_sha512 | Default |  |  |

## Elliptic Curves

| OID | Elliptic Curve | v4.0 | FIPS v3.6 |
|---|---|---|---|
| 1.2.840.10045.3.1.7 | prime256v1 (P-256, secp256r1) | Default | Default |
| 1.3.36.3.3.2.8.1.1.7 | brainpoolP256r1 | Default |  |
| 1.3.36.3.3.2.8.1.1.11 | brainpoolP384r1 | Default |  |
| 1.3.36.3.3.2.8.1.1.13 | brainpoolP512r1 | Default |  |
| 1.3.132.0.10 | secp256k1 | Non-TLS only |  |
| 1.3.132.0.34 | secp384r1 (P-384) | Default | Default |
| 1.3.132.0.35 | secp521r1 (P-521) | Default | Default |

---

### OpenSSL 3.6 Configuration
_Path: chainguard/chainguard-os/openssl-3.6.md_

This is a summary of available algorithms in Chainguard OpenSSL 3.6
(non-fips) and Chainguard FIPS Provider for OpenSSL 3.4.

The majority of the available algorithms are not enabled by default and are
only available with manual overrides, configuration, and reduction of
default security level of 2, to a lower value. Those that are
available in FIPS also require manual overrides and configuration.

The v3.6 and FIPS v3.4 columns read as follows:

- **Default**: negotiated by default under the shipped Chainguard OS
  crypto policy. For key exchange groups, **First** marks the most
  preferred group and **Preshare** the group whose key share is sent
  in the first ClientHello.
- **Available**: works, but only with manual configuration.
- **Non-TLS only**: the elliptic curve works for keys, signatures and
  certificates, but has no TLS supported group and so cannot be used
  in TLS.
- **Verify only**: the FIPS provider verifies signatures on the curve
  but does not generate keys or sign with it.
- Blank: not available.

The tables are presented in the format similar to the [IANA TLS
Parameters](https://www.iana.org/assignments/tls-parameters).

For more information about Transport Layer Security (TLS) please see the following references:

- [NIST PQC](https://csrc.nist.gov/projects/post-quantum-cryptography)
- [RFC10024](https://www.rfc-editor.org/info/rfc10024/)
- [draft-ietf-tls-mldsa](https://www.ietf.org/archive/id/draft-ietf-tls-mldsa-05.html)
- [RFC10015](https://www.rfc-editor.org/rfc/rfc10015.html)
- [BCP 195](https://www.rfc-editor.org/info/bcp195/)
- [RFC 9846](https://www.rfc-editor.org/info/rfc9846/)
- [RFC 5246](https://www.rfc-editor.org/info/rfc5246/)
- [NIST SP 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final)
- [RFC 9151](https://www.rfc-editor.org/info/rfc9151/)
- [draft-becker-cnsa2-tls-profile](https://datatracker.ietf.org/doc/draft-becker-cnsa2-tls-profile/)

## TLS Cipher Suites

| Value | Cipher Suite | v3.6 | FIPS v3.4 | PQC |
|---|---|---|---|---|
| TLSv1.3 | | | | |
| 0x13,0x01 | TLS_AES_128_GCM_SHA256 | Default | Default | Yes |
| 0x13,0x02 | TLS_AES_256_GCM_SHA384 | **First** | **First** | Yes |
| 0x13,0x03 | TLS_CHACHA20_POLY1305_SHA256 | Default |  | Yes |
| TLSv1.2 | | | | |
| 0x00,0x2F | TLS_RSA_WITH_AES_128_CBC_SHA | Available |  |  |
| 0x00,0x32 | TLS_DHE_DSS_WITH_AES_128_CBC_SHA | Available |  |  |
| 0x00,0x33 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0x00,0x34 | TLS_DH_anon_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0x00,0x35 | TLS_RSA_WITH_AES_256_CBC_SHA | Available |  |  |
| 0x00,0x38 | TLS_DHE_DSS_WITH_AES_256_CBC_SHA | Available |  |  |
| 0x00,0x39 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0x00,0x3A | TLS_DH_anon_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0x00,0x3C | TLS_RSA_WITH_AES_128_CBC_SHA256 | Available |  |  |
| 0x00,0x3D | TLS_RSA_WITH_AES_256_CBC_SHA256 | Available |  |  |
| 0x00,0x40 | TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 | Available |  |  |
| 0x00,0x41 | TLS_RSA_WITH_CAMELLIA_128_CBC_SHA | Available |  |  |
| 0x00,0x44 | TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA | Available |  |  |
| 0x00,0x45 | TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA | Available |  |  |
| 0x00,0x46 | TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA | Available |  |  |
| 0x00,0x67 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0x00,0x6A | TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 | Available |  |  |
| 0x00,0x6B | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | Available | Available |  |
| 0x00,0x6C | TLS_DH_anon_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0x00,0x6D | TLS_DH_anon_WITH_AES_256_CBC_SHA256 | Available | Available |  |
| 0x00,0x84 | TLS_RSA_WITH_CAMELLIA_256_CBC_SHA | Available |  |  |
| 0x00,0x87 | TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA | Available |  |  |
| 0x00,0x88 | TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA | Available |  |  |
| 0x00,0x89 | TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA | Available |  |  |
| 0x00,0x8C | TLS_PSK_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0x00,0x8D | TLS_PSK_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0x00,0x90 | TLS_DHE_PSK_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0x00,0x91 | TLS_DHE_PSK_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0x00,0x94 | TLS_RSA_PSK_WITH_AES_128_CBC_SHA | Available |  |  |
| 0x00,0x95 | TLS_RSA_PSK_WITH_AES_256_CBC_SHA | Available |  |  |
| 0x00,0x9C | TLS_RSA_WITH_AES_128_GCM_SHA256 | Available |  |  |
| 0x00,0x9D | TLS_RSA_WITH_AES_256_GCM_SHA384 | Available |  |  |
| 0x00,0x9E | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | Available | Available |  |
| 0x00,0x9F | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | Available | Available |  |
| 0x00,0xA2 | TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 | Available |  |  |
| 0x00,0xA3 | TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 | Available |  |  |
| 0x00,0xA6 | TLS_DH_anon_WITH_AES_128_GCM_SHA256 | Available | Available |  |
| 0x00,0xA7 | TLS_DH_anon_WITH_AES_256_GCM_SHA384 | Available | Available |  |
| 0x00,0xA8 | TLS_PSK_WITH_AES_128_GCM_SHA256 | Available | Available |  |
| 0x00,0xA9 | TLS_PSK_WITH_AES_256_GCM_SHA384 | Available | Available |  |
| 0x00,0xAA | TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 | Available | Available |  |
| 0x00,0xAB | TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 | Available | Available |  |
| 0x00,0xAC | TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 | Available |  |  |
| 0x00,0xAD | TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 | Available |  |  |
| 0x00,0xAE | TLS_PSK_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0x00,0xAF | TLS_PSK_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0x00,0xB2 | TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0x00,0xB3 | TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0x00,0xB6 | TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 | Available |  |  |
| 0x00,0xB7 | TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 | Available |  |  |
| 0x00,0xBA | TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0x00,0xBD | TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0x00,0xBE | TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0x00,0xBF | TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0x00,0xC0 | TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 | Available |  |  |
| 0x00,0xC3 | TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 | Available |  |  |
| 0x00,0xC4 | TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 | Available |  |  |
| 0x00,0xC5 | TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 | Available |  |  |
| 0xC0,0x09 | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x0A | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x13 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x14 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x18 | TLS_ECDH_anon_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x19 | TLS_ECDH_anon_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x1D | TLS_SRP_SHA_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x1E | TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x1F | TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA | Available |  |  |
| 0xC0,0x20 | TLS_SRP_SHA_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x21 | TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x22 | TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA | Available |  |  |
| 0xC0,0x23 | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x24 | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0x27 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x28 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0x2B | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | Default | Default |  |
| 0xC0,0x2C | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | **First** | **First** |  |
| 0xC0,0x2F | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | Default | Default |  |
| 0xC0,0x30 | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | **First** | **First** |  |
| 0xC0,0x35 | TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | Available | Available |  |
| 0xC0,0x36 | TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | Available | Available |  |
| 0xC0,0x37 | TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 | Available | Available |  |
| 0xC0,0x38 | TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 | Available | Available |  |
| 0xC0,0x50 | TLS_RSA_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x51 | TLS_RSA_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x52 | TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x53 | TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x56 | TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x57 | TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x5C | TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x5D | TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x60 | TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x61 | TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x6A | TLS_PSK_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x6B | TLS_PSK_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x6C | TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x6D | TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x6E | TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 | Available |  |  |
| 0xC0,0x6F | TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 | Available |  |  |
| 0xC0,0x72 | TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x73 | TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x76 | TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x77 | TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x94 | TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x95 | TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x96 | TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x97 | TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x98 | TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x99 | TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x9A | TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 | Available |  |  |
| 0xC0,0x9B | TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 | Available |  |  |
| 0xC0,0x9C | TLS_RSA_WITH_AES_128_CCM | Available |  |  |
| 0xC0,0x9D | TLS_RSA_WITH_AES_256_CCM | Available |  |  |
| 0xC0,0x9E | TLS_DHE_RSA_WITH_AES_128_CCM | Available | Available |  |
| 0xC0,0x9F | TLS_DHE_RSA_WITH_AES_256_CCM | Available | Available |  |
| 0xC0,0xA0 | TLS_RSA_WITH_AES_128_CCM_8 | Available |  |  |
| 0xC0,0xA1 | TLS_RSA_WITH_AES_256_CCM_8 | Available |  |  |
| 0xC0,0xA2 | TLS_DHE_RSA_WITH_AES_128_CCM_8 | Available | Available |  |
| 0xC0,0xA3 | TLS_DHE_RSA_WITH_AES_256_CCM_8 | Available | Available |  |
| 0xC0,0xA4 | TLS_PSK_WITH_AES_128_CCM | Available | Available |  |
| 0xC0,0xA5 | TLS_PSK_WITH_AES_256_CCM | Available | Available |  |
| 0xC0,0xA6 | TLS_DHE_PSK_WITH_AES_128_CCM | Available | Available |  |
| 0xC0,0xA7 | TLS_DHE_PSK_WITH_AES_256_CCM | Available | Available |  |
| 0xC0,0xA8 | TLS_PSK_WITH_AES_128_CCM_8 | Available | Available |  |
| 0xC0,0xA9 | TLS_PSK_WITH_AES_256_CCM_8 | Available | Available |  |
| 0xC0,0xAA | TLS_PSK_DHE_WITH_AES_128_CCM_8 | Available | Available |  |
| 0xC0,0xAB | TLS_PSK_DHE_WITH_AES_256_CCM_8 | Available | Available |  |
| 0xC0,0xAC | TLS_ECDHE_ECDSA_WITH_AES_128_CCM | Available | Available |  |
| 0xC0,0xAD | TLS_ECDHE_ECDSA_WITH_AES_256_CCM | Available | Available |  |
| 0xC0,0xAE | TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 | Available | Available |  |
| 0xC0,0xAF | TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 | Available | Available |  |
| 0xCC,0xA8 | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | Default |  |  |
| 0xCC,0xA9 | TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | Default |  |  |
| 0xCC,0xAA | TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |
| 0xCC,0xAB | TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |
| 0xCC,0xAC | TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |
| 0xCC,0xAD | TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |
| 0xCC,0xAE | TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 | Available |  |  |

46 of the TLSv1.2 suites (those whose minimum protocol version is TLS 1.0) also negotiate on TLS 1.0 and TLS 1.1 in the non-FIPS build when the shipped policy, which sets the minimum protocol version to TLS 1.2, is bypassed. TLS 1.0 and TLS 1.1 never work with the FIPS provider.

## TLS Supported Groups

| Value | Supported Group | v3.6 | FIPS v3.4 | PQC |
|---|---|---|---|---|
| PQC TLSv1.3 | | | | |
| 512 | MLKEM512 | Available |  | Yes |
| 513 | MLKEM768 | Available |  | Yes |
| 514 | MLKEM1024 | Default |  | Yes |
| 4587 | SecP256r1MLKEM768 | Default |  | Yes |
| 4588 | X25519MLKEM768 | **First** |  | Yes |
| 4589 | SecP384r1MLKEM1024 | Default |  | Yes |
| TLSv1.2 & TLSv1.3 | | | | |
| 15 | secp160k1 | Available |  |  |
| 16 | secp160r1 | Available |  |  |
| 17 | secp160r2 | Available |  |  |
| 18 | secp192k1 | Available |  |  |
| 19 | secp192r1 | Available |  |  |
| 20 | secp224k1 | Available |  |  |
| 21 | secp224r1 | Available | Available |  |
| 22 | secp256k1 | Available |  |  |
| 23 | secp256r1 | Default | Default |  |
| 24 | secp384r1 | Default | **First** & Preshare |  |
| 25 | secp521r1 | Default | Available |  |
| 26, 31 | brainpoolP256r1 | Available |  |  |
| 27, 32 | brainpoolP384r1 | Available |  |  |
| 28, 33 | brainpoolP512r1 | Available |  |  |
| 29 | x25519 | Preshare |  |  |
| 30 | x448 | Default |  |  |
| 256 | ffdhe2048 | Available | Available |  |
| 257 | ffdhe3072 | Available | Available |  |
| 258 | ffdhe4096 | Available | Available |  |
| 259 | ffdhe6144 | Available | Available |  |
| 260 | ffdhe8192 | Available | Available |  |

The brainpool rows combine two codepoints each: the first one (`brainpoolP256r1`, `brainpoolP384r1`, `brainpoolP512r1`) is what TLS 1.2 negotiates, the second one (`brainpoolP256r1tls13`, `brainpoolP384r1tls13`, `brainpoolP512r1tls13`) is the TLS 1.3 name of the same curve.

## TLS SignatureScheme

| Value | Signature Scheme | v3.6 | FIPS v3.4 | PQC |
|---|---|---|---|---|
| PQC TLSv1.3 | | | | |
| 0x0904 | mldsa44 | Default |  | Yes |
| 0x0905 | mldsa65 | Default |  | Yes |
| 0x0906 | mldsa87 | Default |  | Yes |
| TLSv1.2 & TLSv1.3 | | | | |
| 0x0201 | rsa_pkcs1_sha1 | Available |  |  |
| 0x0202 | Reserved for backward compatibility (dsa_sha1) | Available |  |  |
| 0x0203 | ecdsa_sha1 | Available |  |  |
| 0x0301 | Reserved for backward compatibility (rsa_pkcs1_sha224) | Available | Available |  |
| 0x0302 | Reserved for backward compatibility (dsa_sha224) | Available |  |  |
| 0x0303 | Reserved for backward compatibility (ecdsa_sha224) | Available | Available |  |
| 0x0401 | rsa_pkcs1_sha256 | Default | Default |  |
| 0x0402 | Reserved for backward compatibility (dsa_sha256) | Available |  |  |
| 0x0403 | ecdsa_secp256r1_sha256 | Default | Default |  |
| 0x0501 | rsa_pkcs1_sha384 | Default | Default |  |
| 0x0502 | Reserved for backward compatibility (dsa_sha384) | Available |  |  |
| 0x0503 | ecdsa_secp384r1_sha384 | Default | Default |  |
| 0x0601 | rsa_pkcs1_sha512 | Default | Default |  |
| 0x0602 | Reserved for backward compatibility (dsa_sha512) | Available |  |  |
| 0x0603 | ecdsa_secp521r1_sha512 | Default | Default |  |
| 0x0804 | rsa_pss_rsae_sha256 | Default | Default |  |
| 0x0805 | rsa_pss_rsae_sha384 | Default | Default |  |
| 0x0806 | rsa_pss_rsae_sha512 | Default | Default |  |
| 0x0807 | ed25519 | Default | Default |  |
| 0x0808 | ed448 | Default | Default |  |
| 0x0809 | rsa_pss_pss_sha256 | Default | Default |  |
| 0x080A | rsa_pss_pss_sha384 | Default | Default |  |
| 0x080B | rsa_pss_pss_sha512 | Default | Default |  |
| 0x081A | ecdsa_brainpoolP256r1tls13_sha256 | Available |  |  |
| 0x081B | ecdsa_brainpoolP384r1tls13_sha384 | Available |  |  |
| 0x081C | ecdsa_brainpoolP512r1tls13_sha512 | Available |  |  |

## Elliptic Curves

| OID | Elliptic Curve | v3.6 | FIPS v3.4 |
|---|---|---|---|
| 1.2.840.10045.3.1.1 | prime192v1 (P-192, secp192r1) | Available | Verify only |
| 1.2.840.10045.3.1.2 | prime192v2 | Non-TLS only |  |
| 1.2.840.10045.3.1.3 | prime192v3 | Non-TLS only |  |
| 1.2.840.10045.3.1.4 | prime239v1 | Non-TLS only |  |
| 1.2.840.10045.3.1.5 | prime239v2 | Non-TLS only |  |
| 1.2.840.10045.3.1.6 | prime239v3 | Non-TLS only |  |
| 1.2.840.10045.3.1.7 | prime256v1 (P-256, secp256r1) | Default | Default |
| 1.3.36.3.3.2.8.1.1.1 | brainpoolP160r1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.2 | brainpoolP160t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.3 | brainpoolP192r1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.4 | brainpoolP192t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.5 | brainpoolP224r1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.6 | brainpoolP224t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.7 | brainpoolP256r1 | Available |  |
| 1.3.36.3.3.2.8.1.1.8 | brainpoolP256t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.9 | brainpoolP320r1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.10 | brainpoolP320t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.11 | brainpoolP384r1 | Available |  |
| 1.3.36.3.3.2.8.1.1.12 | brainpoolP384t1 | Non-TLS only |  |
| 1.3.36.3.3.2.8.1.1.13 | brainpoolP512r1 | Available |  |
| 1.3.36.3.3.2.8.1.1.14 | brainpoolP512t1 | Non-TLS only |  |
| 1.3.132.0.6 | secp112r1 | Non-TLS only |  |
| 1.3.132.0.7 | secp112r2 | Non-TLS only |  |
| 1.3.132.0.8 | secp160r1 | Available |  |
| 1.3.132.0.9 | secp160k1 | Available |  |
| 1.3.132.0.10 | secp256k1 | Available |  |
| 1.3.132.0.28 | secp128r1 | Non-TLS only |  |
| 1.3.132.0.29 | secp128r2 | Non-TLS only |  |
| 1.3.132.0.30 | secp160r2 | Available |  |
| 1.3.132.0.31 | secp192k1 | Available |  |
| 1.3.132.0.32 | secp224k1 | Available |  |
| 1.3.132.0.33 | secp224r1 (P-224) | Available | Available |
| 1.3.132.0.34 | secp384r1 (P-384) | Default | Default |
| 1.3.132.0.35 | secp521r1 (P-521) | Default | Default, TLS 1.3 only |
| 2.23.43.1.4.6 | wap-wsg-idm-ecid-wtls6 | Non-TLS only |  |
| 2.23.43.1.4.7 | wap-wsg-idm-ecid-wtls7 | Non-TLS only |  |
| 2.23.43.1.4.8 | wap-wsg-idm-ecid-wtls8 | Non-TLS only |  |
| 2.23.43.1.4.9 | wap-wsg-idm-ecid-wtls9 | Non-TLS only |  |
| 2.23.43.1.4.12 | wap-wsg-idm-ecid-wtls12 | Non-TLS only |  |

---

### Overview of Chainguard OS
_Path: chainguard/chainguard-os/overview.md_

Chainguard OS provides a more secure operating system that powers all Chainguard container images, built specifically to address modern supply chain security challenges. Unlike traditional Linux distributions designed for general-purpose computing, Chainguard OS focuses exclusively on container workloads, enabling faster security updates and significantly reduced attack surface.

Chainguard OS adheres to four key principles:

* Continuous Integration and Delivery
* Nano Updates and Rebuilds
* Minimal, Hardened, Immutable Artifacts
* Delta Minimization

On this page, we'll discuss each of these components and how Chainguard OS differs from the operating system status quo.

## Continuous integration and continuous delivery (CI/CD)

Chainguard OS emphasizes the continuous integration, testing, and release of upstream software packages, ensuring a streamlined and efficient development pipeline through automation.

Chainguard OS was built to privilege CI/CD of software artifacts so that thousands of independent (or loosely dependent) open source projects could be more securely built into hundreds of thousands of versioned "packages." Unlike traditional distros, there is no major OS version (such as RHEL7 or Ubuntu 22.04 LTS) with a pinned catalog of packages; every available package is always installable with Chainguard OS while also accepting a wide range of packaging ecosystems, including all of the language-specific package managers beyond Chainguard OS’s own package manager.

Leveraging event-driven automation, Chainguard OS ensures that every package in the catalog has a “release monitor” capturing new upstream releases right away. This monitor triggers automatic package recompiles, quality assurance and acceptance testing, security scanning, and publication. Chainguard container images that include that package will automatically benefit from updates due to our [multi-layer approach](/chainguard/containers/overview/#why-multi-layer-container-images) that ships updated versions to relevant images. These packages are also published to public and private registries at the same time.

With Chainguard OS, users can rely on products that take advantage of an ever-growing catalog of open source and enterprise software packages. Rather than picking a favorite version of every software project every couple of years and attempting to maintain that for a decade or more, Chainguard OS takes a different approach: it enables [continuous support and EOL](/chainguard/containers/concepts/lifecycle-and-eol/versions/) for the same versions that the upstream project maintainers recommend.

## Nano updates and rebuilds

Favoring incremental updates and rebuilds over major release upgrades, Chainguard OS supports smoother transitions that minimize disruptive changes. Our goal is for engineers adopting Chainguard products to never have to think about major OS version upgrades that dominate a roadmap for months at a time every two years. Through continuously introduced daily nano upgrades, paced through staging and testing gates, any offending regression can be readily pinpointed, reported, and addressed in subsequent updates hours or days later.

Both minor “updates” and major “upgrades” are simultaneously delivered through Chainguard OS. Chainguard Containers offer clear, firm, and distinct boundaries for each application, so that updates and upgrades are cleaner.

Chainguard OS takes advantage of the ephemeral application layer of container images being separate from the persistent storage and unique configuration data; it is able to simultaneously instantiate new containers running the updated and upgraded application and destroy the previous instantiation running the down-level application version. In this way, updates (patches) and upgrades (major changes) are introduced instantly, and rollbacks to previous versions can be done by launching the previous container’s image.

## Minimal, hardened, immutable artifacts

Chainguard OS produces container images that are minimal in scope, stripped of non-essential components, and hardened for secure use in production environments. The resulting artifacts are immutable and designed to include only the dependencies necessary for a given application to run.

Unlike traditional Linux distributions, which aim to be general-purpose and include a wide range of libraries and utilities, Chainguard OS builds _application systems_: minimal containers tailored to the specific runtime requirements of a single application. Optional complementary tools and packages can be added as needed, but they are not included by default.

This design reduces the system's overall attack surface, improves performance by eliminating unused software, and supports strict control over what is present in a given execution environment. All images are produced through hardened build processes and are validated against defined security policies.

## Delta minimization

Chainguard OS maintains a close alignment with upstream open source projects. Extra patches are introduced only when necessary, such as for addressing critical issues or applying hardening measures, and are kept in place only until equivalent changes are integrated upstream.

This approach reduces long-term maintenance overhead and avoids divergence from upstream. Chainguard OS implements frequent, incremental updates (what we call [nano updates, discussed in the section above](/chainguard/chainguard-os/overview/#nano-updates-and-rebuilds)) that closely track upstream releases. These updates are designed to preserve the intent and behavior of the original software while delivering improvements and security fixes on an almost daily cadence.

By integrating changes continuously and aligning with upstream maintainers’ development cycles, Chainguard OS ensures compatibility and reduces the risk of regressions. This model also helps downstream consumers benefit from the most recent updates without requiring wholesale system upgrades.

## Advantages of Chainguard OS

Chainguard OS is a minimal Linux-based operating system designed to support more secure deployment of containerized applications. It integrates tightly with Chainguard tooling to provide measurable improvements in vulnerability management, compliance, and software supply chain integrity.

### Vulnerability management

Chainguard OS minimizes exposure to known vulnerabilities by automating detection, triage, and remediation processes. It continuously rebuilds included applications and dependencies using up-to-date toolchains and a hardened image pipeline. The OS includes only essential packages, reducing the attack surface.

### Continuous compliance

The system architecture and toolchain used in Chainguard OS support the automation of compliance efforts. By consistently regenerating software artifacts in a controlled environment, Chainguard OS ensures that applications and their dependencies remain compliant with common security and regulatory frameworks.

### Software supply chain security

All software components in Chainguard OS are built from source in the [Chainguard Factory](https://www.youtube.com/watch?v=iU9hmW6hrGs) — a hardened build environment that conforms to [SLSA](https://slsa.dev/) standards. This process mitigates risks of tampering in the build and delivery pipeline. The system also generates cryptographically verifiable artifacts, including signed Software Bills of Materials ([SBOMs](/open-source/sbom/what-is-an-sbom/)) and provenance metadata.

### Operational efficiency

By integrating upstream open source updates directly into the build and delivery process, Chainguard OS reduces the need for manual patching and vulnerability triage. Engineering teams can allocate resources toward feature development rather than maintenance overhead.

## System architecture and design philosophy

Traditional Linux distributions often bundle a broad set of packages and features, which can introduce unnecessary complexity and security risk. Chainguard OS adopts a minimal and purpose-built approach, optimized for containerized environments.

The operating system is built to take advantage of modern containerization practices and supports declarative, reproducible builds. Combined with automated tooling, this design enables consistent delivery of secure, traceable container images.

Chainguard OS is not intended as a general-purpose distribution; instead, it serves as a foundational layer for secure application workloads, particularly in environments that require strict controls on software provenance, compliance, and runtime behavior.

---

### What is the Open Container Initiative?
_Path: open-source/oci/what-is-the-oci.md_

The [Open Container Initiative](https://opencontainers.org/) (OCI) is a Linux Foundation project dedicated to managing specifications and projects related to the storage, distribution, and execution of container images. The OCI was formed in 2015 when developers recognized that the quickly growing container industry needed standards to ensure the portability of containers across systems and platforms. As one of the most popular container developers, Docker was a key partner in the formation of the OCI and donated its specifications and associated code for OCI image formats and runtime specifications. Today, the OCI manages three specifications (the Image Specification, the Runtime Specification, and the Distribution Specification), which are evolving according to community participation and industry development.

The OCI is committed to promoting common, minimal, and open standards and specifications with the aim of protecting interoperability without sacrificing developers’ ability to innovate. These standards and specifications play a critical role in enabling developers to trust that their containers will work regardless of the infrastructure, cloud provider, and DevOps tooling they choose to use. They also are vital in modern software supply chain security as they provide a strong foundation for developing security tooling and best practices related to container technology. Understanding the purpose and use of OCI specifications can help you understand the conditions of container interoperability and prepare you to learn emerging methods for securing and trusting container applications.

## What are the OCI specifications?

The OCI currently manages three specifications: the Runtime Specification, the Image Specification, and the Distribution Specification. These specifications work together to ensure that any OCI-compliant image can be run on any OCI-compliant runtime, and that OCI-compliant registries (such as Docker, Amazon Elastic Container Registry, or Google Container Registry) are able to distribute OCI images according to OCI guidelines.

The OCI offers a testing and peer validation process for individuals and organizations to certify their images or runtime software as OCI compliant. You can find information about the certification process on the [OCI website](https://opencontainers.org/community/certified/).

The three OCI specifications are outlined in the following sections.

## OCI image format specification

This specification defines an OCI Image as consisting of an image manifest, an optional image index, a set of filesystem layers, and a configuration.

### Image manifest

This document provides a configuration and set of layers for a single container image for a specific architecture and operating system. Note that the manifest specification has three goals:

* Enabling _content-addressable_ images, which means an image can be referred to by a unique ID — or digital fingerprint — that is generated by hashing its contents. Hashing is generated using the SHA256 algorithm, which generates a unique 32-byte signature for an image based on the contents of the image. Changing even one byte on the original image would result in a different hash, enabling developers to know with certainty that an image has not been altered.  
* Allowing _multi-architecture_ images, or container images that can be used with different architectures such as AMD64 and ARM. Multi-architecture images enable a flexible approach to developing a container-based application or setting up CI/CD workflows without needing to commit to a specific architecture.  
* Ensuring that images are compatible with any OCI-compliant runtime.

For an example manifest document and a list of properties, you can read the [OCI’s Image Manifest Specifications](https://github.com/opencontainers/image-spec/blob/main/manifest.md).

### Image index (optional)

This document is an optional higher-level manifest which allows developers to point to multiple image manifests to allow compatibility with a variety of architectures and operating systems. For an example image index and a list of properties, you can read the [OCI’s Image Index specifications](https://github.com/opencontainers/image-spec/blob/main/manifest.md).

### A set of filesystem layers

An image is composed of one or more _filesystem layers_, each of which represent a change to the file system such as the addition of another image or one or more commands. These layers are unpacked by the container engine to build the image and are referred to by their `digest`, a hash generated by applying the SHA 256 algorithm to their contents. Layers are described in the image manifest as follows:

```json
 "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 32654,
      "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0"
    },
 ]
```

For OCI guidance on filesystem layers, you can visit their [Image Layer Filesystem Changeset Documentation](https://github.com/opencontainers/image-spec/blob/main/layer.md).

### Configuration  

The configuration document includes basic information like the author and creation date and describes execution parameters for translating the image to a container runtime. The configuration file is named after its cryptographic hash and can be located in the manifest as follows:  

```json
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 7023,
    "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
  },
```

For more guidance on image configuration, visit the [official OCI documentation](https://github.com/opencontainers/image-spec/blob/main/config.md).

## Runtime specification

A container runtime is the software used to run and manage containers; essentially they create and run containers using specified images. The goal of the OCI Runtime Specification is to ensure consistency between different runtime environments and define common actions to manage a container’s lifecycle. An OCI-compliant image should run reliably on any OCI-compliant runtime.  More information about the Runtime Specification can be found in the [OCI documentation](https://github.com/opencontainers/runtime-spec/blob/main/spec.md).

In addition to overseeing this specification, OCI develops the runtime `runc`, a command line client for creating, configuring, and managing containers. Originally developed by Docker, `runc` was donated to OCI as the reference for the specification and serves as the foundation for a variety of popular container tools such as containerd and Podman.

## Distribution specification

The OCI Distribution Specification aims to standardize the way container registries and runtime tools push and pull container images and other content types. It is based on the specification for the Docker Registry HTTP API V2 protocol apdx-1, and has been adopted by major registries such as Amazon Elastic Container Registry, Google Container Registry, Azure Container Registry, and Github Container Registry. Any registry that is OCI-compliant supports interactions outlined by this specification, such as pushing, pulling, or storing images.  More information about the Distribution Specification can be found in the OCI documentation [here](https://github.com/opencontainers/distribution-spec/blob/main/spec.md).

## How to know if an image is OCI compliant

Currently, most images encountered in the wild are either OCI or Docker images. You can determine whether an image is OCI compliant by inspecting the `mediatype` value located in the image’s manifest. If “oci” is included in the string set as the value of the `mediatype`, then it is an OCI image:

```json
 "mediaType": "application/vnd.oci.image.manifest.v1+json",
```

Otherwise, the mediatype string will likely include “docker” as follows:

```json
"mediaType": "application/vnd.docker.distribution.manifest.v2+json"
```

There are a few interesting nuances about OCI images that are worth pointing out. First, because Docker donated its image specifications to OCI, Docker and OCI image specifications are the same in substance. In fact, most images on Docker are _Docker_ images and not OCI images, which you can confirm by inspecting the image manifests. This is largely due to the fact that Docker’s tools for publishing and building images create _Docker_ images — not _OCI_ images — by default, a convention set by historical practice. If you want to build and publish OCI images, you must use tools that support OCI, such as [apko](/open-source/build-tools/apko/overview/), an open source OCI image builder.  

Relatedly, a final nuance to point out is that OCI-compliant registries are only required to _support_  OCI images, but may distribute other image types as well. Thus, you should not expect all images distributed on an OCI-compliant registry to be OCI compliant themselves, such as evidenced by Docker Hub in the example above.  

## Wrap up

You should now understand the purpose of OCI and the three container specifications it oversees. While the OCI’s core function is protecting interoperability across the complex container ecosystem, its protocols are being recognized as useful for _signing_ software, a method for authenticating that the software is from a trusted source and has not been tampered with by a third party. You can learn more about container signing and how to sign, verify, and store image artifacts in an OCI registry in our [introductory guide to Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/).

---

### Open Container Initiative
_Path: open-source/oci/_index.md_

The Open Container Initiative (OCI) is a Linux Foundation project dedicated to managing specifications and projects related to the storage, distribution, and execution of container images.

---

### What are OCI artifacts?
_Path: open-source/oci/what-are-oci-artifacts.md_

OCI artifacts are a way of using OCI registries, or container registries that are compliant with specifications set by the [Open Container Initiative](/open-source/oci/what-is-the-oci/), to store arbitrary files. They are useful to understand given their growing importance for software supply chain security and their general utility for container engineering. However, community usage of OCI artifacts is still actively evolving and differing opinions and understandings of their purpose can lead to confusion. In this guide, you will learn the difference between OCI "artifacts" and "Artifacts," their utility for software supply chain security, and some important considerations when using them.

## OCI "artifacts" versus "Artifacts"

The term "OCI artifact" is a general purpose way of referring to any object stored within a container registry, but is most often used to refer to objects stored in registries that are not images. Container registries were originally designed to store and distribute images, but software engineers soon saw their utility for storing non-image objects such as Helm charts, Tekton bundles, and policy modules. By storing these objects in the same infrastructure as their containers, software engineers are able to consolidate their security and management efforts. Another benefit of using OCI registries for artifacts is that registries provide a [content-addressable API](/open-source/oci/what-is-the-oci/#image-manifest), or a way of referring to files (like images and artifacts) that assures their authenticity and integrity.

OCI artifacts are sometimes misunderstood as a new OCI specification or format but they are in fact a way of using the [OCI Image Specification](https://github.com/opencontainers/image-spec) to store something other than an image in a container registry. Some software projects use OCI registries to store non-images without making any formal changes to the object's manifest. However, the OCI does provide guidance for formally specifying an object as an "OCI Artifact" (note the capital "A") by modifying its manifest in a particular way.

According to the OCI Image Specification, an [image manifest](/open-source/oci/what-is-the-oci/#image-manifest) needs to include the  OCI `mediaTypes` values `application/vnd.oci.image.config.v1+json` and `application/vnd.oci.image.layer.v1.tar+gzip` in the `config` and `layers` fields. When creating a manifest for an OCI **A**rtifact, however, you switch out both of these values with custom `mediaTypes` values as in the example below.

```json
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.yourcustomartifact+json",
    "size": 233,
    "digest": "sha245:..."
  },
  "layers": [{
    "mediaType": "application/vnd.yourcustomartifact.tar.gzip",
    "size": 680,
    "digest": "sha245:..."
  }]
}
```

In the example manifest above, the  `config` field contains the custom `mediaType` value `application/vnd.yourcustomartifact+json` and the `layers` fields contains the custom `mediaType` value `application/vnd.yourcustomartifact.tar.gzip`.

Some container tools make use of the OCI Artifacts format guidelines (such as Helm and Tekton), but using these guidelines comes with a serious drawback. Not all registries support OCI Artifacts (or manifests with a custom `mediaType`), and the [OCI Image Specification](https://github.com/opencontainers/image-spec) recommends avoiding the use of Artifacts if you are concerned about portability. As you will read about in the section below, this lack of portability is a reason why some software projects choose to store artifacts in an OCI registry without adding a custom `mediaType` to the manifest.

## OCI artifacts and software supply chain security

For software supply chain security, OCI artifacts offer a useful way to store [SBOMs](/open-source/sbom/what-is-an-sbom/) and signatures inside a container registry.

An **SBOM**, or software bill of materials, is a formally structured list of libraries, modules, licensing, and version information that make up any given piece of software. When a security advisory is issued, SBOMs enable software operators to quickly understand whether their codebase contains any components associated with the vulnerability described in the advisory. A [**signature**](/open-source/sigstore/cosign/an-introduction-to-cosign/) is a way of attesting to the fact that you are the author of your software, and enables the consumer to verify that the signature and software have not been tampered with by a third party.

The open source tool [Cosign](https://github.com/sigstore/cosign), part of the [Sigstore](https://www.sigstore.dev/) project, enables software engineers to store their SBOMs and signatures as artifacts in the same container registry where they store their associated images. However, given the lack of support for OCI Artifacts across registries, Cosign ships all SBOM and signature artifacts as OCI Images and not as OCI Artifacts. In this way, software engineers can take advantage of Cosign regardless of whether their container registry supports the OCI Artifact manifest format or not.

To learn more about storing signatures as artifacts, visit the [section on counter signing](
https://github.com/sigstore/cosign#counter-signing) in the Cosign repo. To learn more about storing SBOMs as artifacts, visit the [Cosign SBOM Specification](https://github.com/sigstore/cosign/blob/b6aaddc05cbf04819221f9c7084399d4615b9d27/specs/SBOM_SPEC.md) page on Github or the [section on signing SBOMs](https://docs.sigstore.dev/cosign/signing/other_types/#sboms-software-bill-of-materials) in Sigstore’s documentation.

## Considerations

Community usage and guidance of OCI artifacts and Artifacts are actively evolving and there are a few considerations to keep in mind when you are planning on using them. As noted earlier, not all registries support OCI Artifacts, and the [OCI Image Specification](https://github.com/opencontainers/image-spec) recommends avoiding the use of them if you are concerned about portability. Recommended practices are still also under debate, giving rise to the [OCI Reference Types Working Group](https://github.com/opencontainers/wg-reference-types), which is considering different ways of describing and handling objects stored in an OCI registry. You can read more about the proposals the group is currently considering by visiting the [Intro to OCI Reference Types](https://www.chainguard.dev/unchained/intro-to-oci-reference-types) post on Chainguard’s blog.

---

### Octo STS FAQ
_Path: open-source/octo-sts/faq.md_

This page answers frequently asked questions about Octo STS, including setup, security, troubleshooting, and common use cases.

## General questions

### What is Octo STS?

Octo STS is a GitHub App developed by Chainguard that acts as a Security Token Service for GitHub. It allows workloads with OIDC tokens from various identity providers (GitHub Actions, cloud providers, Kubernetes, etc.) to exchange those tokens for short-lived GitHub access tokens. The primary goal is to eliminate the need for long-lived Personal Access Tokens (PATs).

### Why should I use Octo STS instead of personal access tokens?

Personal Access Tokens pose security risks as they provide persistent access to resources and are not tied to a given workload. Attackers regularly abuse leaked PATs to gain access to systems and resources.

By comparison, Octo STS tokens are short-lived (1 hour) and typically tightly scoped to the workload in question. This vastly reduces the scope for abuse.

### How does Octo STS compare to GitHub's built-in GITHUB\_TOKEN?

GitHub Actions provides a `GITHUB_TOKEN` automatically, but it has limitations:

- Cannot update workflow files
- Cannot trigger other workflows
- Limited to a fixed set of permissions

Octo STS tokens can:

- Update workflow files (useful for Renovate)
- Have any permissions defined in your trust policy
- Work consistently across all automation platforms, not just GitHub Actions

### Is Octo STS free to use?

Yes, Octo STS is open source and the hosted service at octo-sts.dev is free to use. You can also self-host Octo STS if you prefer.

### Can I self-host Octo STS?

Yes, Octo STS is open source and can be self-hosted. Refer to the [Octo STS repository](https://github.com/octo-sts/app) for deployment instructions.

## Setup and configuration

### How do I install Octo STS?

Install the GitHub App:

1. Visit [https://github.com/apps/octo-sts](https://github.com/apps/octo-sts)
2. Click **Install**
3. Select the organization or user account
4. Choose which repositories to grant access
5. Approve the permissions

Then create trust policies in your repositories at `.github/chainguard/{name}.sts.yaml`.

### Why does Octo STS request so many permissions?

Octo STS requests a superset of permissions to support a large range of use cases. However, it only creates tokens with the specific permissions defined in your trust policies. The app needs `contents: read` to read trust policy files, but all other permissions are only granted based on your policies.

### What happens if I don't create any trust policies?

If you install Octo STS but don't create trust policies, the app cannot issue any tokens. Trust policies are required to specify which identities are trusted and what permissions to grant them.

### Can I use Octo STS with private repositories?

Yes, Octo STS works with both public and private repositories. The app needs access to read the repository's trust policy files.

### How do I update trust policy permissions?

Edit the trust policy file in your repository, commit, and push the changes. The new permissions take effect immediately for subsequent token exchanges. Existing tokens retain their original permissions until they expire.

### Can I have multiple trust policies in one repository?

Yes, you can create multiple policy files with different names:

- `.github/chainguard/renovate.sts.yaml`
- `.github/chainguard/deploy.sts.yaml`
- `.github/chainguard/ci.sts.yaml`

Each policy can have different identity requirements and permissions. Specify which policy to use via the `identity` parameter when exchanging tokens.

## Security

### Are Octo STS tokens safe?

Octo STS tokens are as safe as the trust policies you create. They're short-lived (1 hour), reducing the window of opportunity if compromised.

### Can Octo STS tokens bypass branch protection?

No. Branch protection rules are enforced by GitHub regardless of the token type. Even with `contents: write` permission, Octo STS tokens must follow branch protection requirements like pull request reviews and status checks.

### Should I use pattern matching or exact subjects?

Prefer exact subject matching when possible:

```yaml
# Better: Exact match
subject: repo:org@<owner-id>/repo@<repo-id>:ref:refs/heads/main
```

Use pattern matching only when you need flexibility:

```yaml
# When necessary: Pattern match
subject_pattern: "repo:org@<owner-id>/repo@<repo-id>:ref:refs/heads/.*"
```

Exact matching is more secure because it's harder to accidentally grant broader access than intended.

{{< note >}}
These subjects use GitHub's immutable format, which embeds the numeric owner ID and repository ID in the `sub` claim (for example, `repo:org@123456/repo@654321:ref:refs/heads/main`). This format is the default for repositories created after July 15, 2026, and an opt-in for older repositories. Match the exact subject your repository's token carries. For how to find the IDs, refer to [Finding your repository's numeric identifiers](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers).
{{< /note >}}

## Integration

### Can I use Octo STS from a CI/CD system other than GitHub Actions?

Yes, Octo STS works with any system that can:

1. Obtain OIDC tokens (Jenkins, GitLab CI, CircleCI, etc.)
2. Make HTTP requests to exchange tokens
3. Use the resulting GitHub token

The key is having an OIDC identity provider that Octo STS can validate.

### How do I use Octo STS with Terraform?

Use Terraform's `external` data source to exchange tokens:

```hcl
data "external" "github_token" {
  program = ["bash", "-c", <<-EOT
    OIDC_TOKEN=$(get_oidc_token)
    RESPONSE=$(curl -s -H "Authorization: Bearer $OIDC_TOKEN" \
      "https://octo-sts.dev/sts/exchange?scope=org/repo&identity=terraform")
    echo $RESPONSE | jq '{token: .access_token}'
  EOT
  ]
}

provider "github" {
  token = data.external.github_token.result.token
}
```

### Can I use Octo STS to access multiple repositories?

Yes, use organization trust policies with a `repositories` field:

```yaml
issuer: https://token.actions.githubusercontent.com
subject: repo:org@<owner-id>/automation-repo@<repo-id>:ref:refs/heads/main

permissions:
  contents: read

repositories:
  - org/repo-one
  - org/repo-two
  - org/repo-three
```

The resulting token can access all listed repositories.

## Troubleshooting

### Token exchange fails

Common causes:

- **Trust policy doesn't exist**: Verify the file exists at `.github/chainguard/{identity}.sts.yaml`
- **OIDC token doesn't match policy**: Check that issuer and subject match your OIDC token
- **App not installed**: Ensure Octo STS is installed and has access to the repository
- **Wrong branch**: Trust policies are typically read from the default branch (main/master)
- **Invalid permissions**: The policy requests permissions that don't exist or can't be granted by the app

## Operational questions

### How long do Octo STS tokens last?

By default, tokens expire after 1 hour.

### Can I refresh Octo STS tokens?

No, Octo STS tokens cannot be refreshed. When a token expires, exchange a new OIDC token with Octo STS to obtain a new GitHub token. This is intentional - short-lived tokens should be regularly renewed.

### What happens when Octo STS permissions are updated?

Octo STS periodically adds or removes GitHub permissions to support new use cases. When this happens:

- An issue is created in the Octo STS repository explaining the changes
- You'll receive a notification to approve the updated permissions in your GitHub App installation
- Updates are applied quarterly, with exceptions for critical changes

## Migration

### How do I migrate from PATs to Octo STS?

1. Identify where PATs are currently used
2. Determine if those systems can provide OIDC tokens
3. Create appropriate trust policies for each use case
4. Update automation to exchange OIDC tokens instead of using PATs
5. Test thoroughly in a non-production environment
6. Revoke PATs once Octo STS is working

### Can I use both PATs and Octo STS during migration?

Yes, you can use both during a transition period. This allows gradual migration and rollback capability if issues arise.

## Getting help

### Where can I report bugs?

Report bugs in the [Octo STS GitHub repository](https://github.com/octo-sts/app/issues).

### Where can I ask questions?

- GitHub Discussions in the [Octo STS repository](https://github.com/octo-sts/app/)
- Open an issue for specific problems
- Review existing FAQ and documentation

### How can I contribute to Octo STS?

Octo STS is open source. Contributions are welcome:

- Report bugs and request features
- Improve documentation
- Submit pull requests for code changes
- Share your use cases and integration patterns

Refer to the [repository](https://github.com/octo-sts/app) for contribution guidelines.

---

### Updating container images with Renovate (and no PATs!)
_Path: open-source/octo-sts/updating-container-images-with-renovate.md_

In this video, Developer Relations Engineer Adrian Mouat shows you how you can update container images using Renovate with Octo STS, eliminating the need for GitHub Personal Access Tokens.

## Video

{{< youtube I0hWRMtdUyI >}}

## What you'll learn

- How to set up Renovate as a GitHub Action
- Using Octo STS to eliminate Personal Access Tokens
- Configuring trust policies for automated workflows
- Setting up assumable identities for private registries
- Automating container image and GitHub Actions updates

## Transcript

In this video, I'm going to show you how you can use Renovate to update container images and GitHub actions. At Chainguard, we do talk a lot about the need to keep software up to date. And in my opinion, it's essential you do that for both security and maintainability. So, if you stay on an old version of a package for too long, there's a strong chance that you'll be bitten by an unpatched vulnerability. But also, the longer you stay on an old version, the harder updating becomes. So, it's much better to do frequent small updates than it is to occasionally be forced into having to do major breaking updates.

Another thing we talk a lot about is getting rid of long-lived tokens. So, long-lived tokens always come up when you look at reports on how cyber attacks occurred. And if you're a current Renovate user, I'm willing to bet that you probably gave it a PAT or personal access token for GitHub. And I'm going to show you how you can get rid of that PAT by using an open-source tool from Chainguard called Octo STS.

Do know in this video I'll be focusing on container images and updating container images, not packages. So the FROM lines in your Dockerfiles, not the APK add lines.

### Setting up the demo

Okay, let's jump to the demo. What I'm going to do is fork this demo application and set up Renovate to run as a GitHub action to update everything. And this demo application's a little bit old, so I know it needs updates to both the Dockerfiles and the GitHub action workflows. There is this version Dockerfile, and this one's interesting as it uses the cgr.dev organization. So that's going to require OAuth. So we'll see how to set up OAuth so Renovate can check out if there's new images available in this repo.

Yeah, let's just go ahead and try forking this. So click this big fork button. Could do it at the command line, but I'm here. We're going to call it "production builds renovate" and okay.

And then we're going to clone this and use GitHub CLI and we'll jump to the terminal. First thing: `git brief clone`.

I also want to set the default. I don't want to push up to the original project right now. So, we want this to be our mode production build with renovate. Good.

And now I do have some files we're going to copy over to set up Renovate.

### Configuring Renovate

Okay, so here's the `renovate.json` file. This is the configuration file for Renovate. We're basically going to use the default configuration. I have added a few things here. This one I'd really recommend trying: `pinDigests` equals true. That will add digests for any images or actions that don't have digests. And you'll see what that means later.

I've added these—this is just so that by default, Renovate will try not to overwhelm you and will only give you a couple of PRs at a time to update things. But we're saying here, hey, give us everything at once. And that's just sort of the purposes of this demo. So, I don't recommend you do that in your own projects.

The other thing I should say at this point is we're going to be running Renovate from a GitHub action. There are multiple ways to run Renovate. This is GitHub action on a schedule, which is great for small projects like this. For larger projects, you might want to look at running Renovate self-hosted, so it runs continuously or using a hosted service from the creators at Mend, which is a really great option as well.

We have some workflows for building images. There's also an old one for the Jester bot that we're not going to worry about in this talk. Dependabot does do something similar to Renovate and it helps you update image digests. So, do take a look at it if you're interested, but this video is going to focus on Renovate.

### The Renovate workflow

And we're going to copy our Renovate workflow over here. So let's take a look at that. Yeah. So, we schedule it to run at 3:00 a.m. every morning. It runs on Ubuntu latest. Because we're doing stuff with the GitHub token, we need to ask for write permissions to ID token. I know "write" sounds a bit weird, but that's the way GitHub does it and write permissions to the repo.

So, first thing we do is set up chainguard. This is to auth to the cgr.dev registry so that we can check for new versions of images in the cgr.dev organization. This identity is wrong. It's from a previous workflow. So, I'll show you how to update that in a second.

And then we've got Octo STS, which is the magic that allows us to get rid of the personal access token for Renovate. Finally, yeah, down here is basically where we run Renovate. A bit of magic to set up the password for cgr.dev. The Renovate token—that's actually a GitHub token. So maybe not the best named variable ever, but that's what they call it. I quite often have to set log level to debug to figure out what's going on. For this demo, hopefully we'll be able to leave it here.

Oh yeah. So that's about the Renovate JSON. Let's jump back.

### Setting up Chainguard identity

And what we're going to do is start by setting up chainctl. This is only for people—for Chainguard customers—that need to access a private registry. If you're just using a free tier of Chainguard images, you don't need this because you don't need to auth to the registry.

So, what we're going to do now is create something called an assumable identity that the GitHub action can use to access the cgr.dev repo. So what we're doing here is `chainctl create` this identity called `pb-renovate` and it's going to look at the GitHub token and it's going to say, "Is the GitHub repo that's asking for this identity amouat/production-builds-with-renovate?" If so, it's okay. And is the ref the main branch? So only the main branch on this repo can assume this identity. And yeah, here's the project we're using cgr.dev view.

Yes. Okay. So, that's created our identity and here is the ID. So, we can now put that into our workflow.

So, it's going to replace this one.

So, that should be all we need to set up the assumed identity.

### Setting up Octo STS

Next thing we're going to look at is setting up Octo STS. So let's jump back to the web browser so I can show you that. So this is the GitHub app page for Octo STS and it describes a bit about what it is, what it does, you know getting rid of personal access tokens, which is exactly what we're doing in this use case. Certain workload trust, trust policies, etc., and federating a token, which is exactly what we're going to be doing here. And some more low-level stuff. Also a link to the Octo STS page where you can go and look at all the source code. It's a relatively small project so you can actually look at the source code and understand what's going on and what's happening.

Now up here you'll see "install" in your case, probably—in my case it's "configure" so I can select which repositories can be used with Octo STS and things like that. In this case I've already set it up.

So the next thing we do is set up the trust policy for Octo STS. So we'll see here we've got given it this identity "renovate." So what that's going to mean is it's going to look in this directory `.github/chainguard` and it's going to look for a `renovate.sts.yaml` file. And it's going to use the values in that and compare it to the token it's given. So we need to create this value. I'm going to copy an existing file from earlier.

And this is what it looks roughly like. Now this is changed. Our repo name's different. So, `production-builds-with-renovate`. Got to make sure you get this right or it will break.

Right. So, issuer is the GitHub token issuer and the repo is `amouat/production-builds-renovate` and the refs is the main branch. So what we're saying here is issuer token has to be from GitHub and it has to be for this repo and it has to be for the main branch. You can use regex here. So you can be a bit more flexible in what the matches are.

And then we're going to say the permissions we are asking for. So in this case we're asking for quite a lot of permissions, which is all the stuff that Renovate needs for creating pull requests and checking projects etc. And that's about it.

### Testing the setup

So, I think the next step is just to check in this code and push it back up to the repo.

So, we'll add all these files.

If something looked a bit funny there, that was just me using git sign to sign this commit. Okay, there we go. So, I'm going to jump back to the GitHub repo now and see what that looks like. So, here's the repo. I did just push to main, which I know is dangerous, but it's just a demo.

Yeah, and you can see it's got this "configure renovate" PR. So, let's take a look in actions. We see a bunch of stuff for building images that was already there, but you've also got this Renovate one there. And I'm very hopeful if we click "run workflow," something will happen.

So if you go into it, you can see a bit more of what's happening. We can see Octo STS works. So it got the token. That's really good. It looks like it also got access to cgr.dev. And Renovate is running. It's downloaded the Renovate image.

It's looking at Dockerfile, GitHub actions, and Go dependencies. And there we go. So, that's run successfully. Let's go and take a look at what PRs it's created.

### Results

Yeah, a whole bunch here. So, I'm extremely happy this has worked. So, we have ones for our actions, for example. So, it's saying we're using an old version of the Cosign installer. We should update that.

But it also has things like here we have—you know this version of the static image—we're using an old version. So it's updated that by looking at what is the latest digest for or what's the newest digest for the latest tag.

And what else do we have? Where's cgr.dev?

Here. So we can see it's updated cgr.dev from 1.25.3 to 1.25.5 and it's pinned it to a digest. So that's both good for security and reproducibility and keeping everything up to date. So I'm really happy what's going on here.

One thing to note is I do have 15 PRs here which is a little bit hard to deal with because one problem is if I start merging some of these you'll probably get conflicts and because of that there is this really useful—if you want to rebase, retry this PR, click this checkbox which should kick off another build. Okay, so let's try merging this one.

Yeah, it looked like that works. It successfully updated our version of Go here. And we really did it with just a few clicks. So you can see it's really powerful, relatively easy to use once it's set up. We're using it here without the need for a PAT via Octo STS, which makes me very happy indeed. So please try it out. Let me know how you get on.

## Key takeaways

- Renovate can automatically update container images and GitHub Actions
- Octo STS eliminates the need for Personal Access Tokens by using OIDC federation
- Trust policies provide fine-grained control over what workloads can access
- Regular small updates are better than occasional large breaking updates
- Pinning to digests improves both security and reproducibility

## Related resources

- [FAQ](/open-source/octo-sts/faq/)
- [Octo STS GitHub Repository](https://github.com/octo-sts/app)
- [Renovate Documentation](https://docs.renovatebot.com/)

---

### Octo STS overview
_Path: open-source/octo-sts/overview/index.md_

Octo STS is a GitHub App developed by Chainguard that acts as a Security Token Service (STS) for the GitHub API. It enables workloads running anywhere that can produce OIDC tokens to federate with GitHub, exchanging those tokens for short-lived GitHub access tokens. The primary goal is to eliminate the need for GitHub Personal Access Tokens (PATs), which are long-lived credentials that pose significant security risks.

## Why Octo STS matters

Long-lived access tokens are a common target in security incidents. When attackers gain access to a PAT, they can exploit it to access repositories, make changes, and pivot to other resources. These tokens often have broad permissions and no expiration date, making them particularly dangerous if compromised.

Octo STS addresses this problem by:

- **Eliminating long-lived credentials**: No more PATs that sit around indefinitely
- **Enabling OIDC federation**: Leverage existing identity providers to authenticate workloads
- **Providing short-lived tokens**: Generated tokens expire automatically
- **Implementing fine-grained access control**: Grant only the permissions needed for specific tasks
- **Supporting multiple identity providers**: Works with GitHub Actions, cloud providers (AWS, GCP, Azure), Kubernetes, and any OIDC-compliant system

## How Octo STS works

Octo STS operates through a trust policy model. The steps to install and use Octo STS are:

1. **Install the GitHub App**: Add the [octo-sts](https://github.com/apps/octo-sts) GitHub App to your organization or repositories
2. **Define trust policies**: Create policy files (`.github/chainguard/{name}.sts.yaml`) that specify which identities can access which resources
3. **Exchange tokens**: Workloads present OIDC tokens to Octo STS
4. **Receive GitHub tokens**: If the identity matches the trust policy, Octo STS issues a short-lived GitHub token with specified permissions

The Octo STS app needs to request a large number of permissions. This set of permissions is reviewed on a quarterly basis to ensure it meets common use cases without being overly broad.

### The token exchange process

This sequence diagram outlines the token exchange process in Octo STS:

<center><img src="/open-source/octo-sts/overview/octo-arch.webp" alt="Octo STS sequence diagram showing order of network requests" style="width:950px;"></center>

## Common use cases

- Developing Actions that create Pull Requests (a PAT is required to trigger presubmit GitHub Actions)

- Developing Actions that interact across repositories (unsupported by built-in permissions)

- Developing Actions that interact with the GitHub organization level

- Providing external services (e.g. clouds) with access to repositories

## Learn more

Refer to our [Octo STS FAQ](/open-source/octo-sts/faq/) for answers to frequently asked questions and troubleshooting recommendations.

You may also find these resources to be useful:

- [Octo STS GitHub Repository](https://github.com/octo-sts/app)
- [Original Blog Post](https://www.chainguard.dev/unchained/the-end-of-github-pats-you-cant-leak-what-you-dont-have)
- [Trust Policy JSON Schema](https://raw.githubusercontent.com/octo-sts/app/refs/heads/main/pkg/octosts/octosts.TrustPolicy.json)

---

### How to set up an instance of Rekor locally
_Path: open-source/sigstore/rekor/install-a-rekor-instance.md_

_An earlier version of this material was published in the [Rekor chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@e785fae1be184e2c929db62dbe7444fa/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@a48c33126e2c4ee6ad3bfa6b7bc9c957) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

While individual developers may not generally need to set up their own instance of Rekor, it may be worthwhile to set up your own local instance in order to further understand how Rekor works under the hood. We will have multiple terminal sessions running to set up the Rekor server. You may want to use a tool such as [tmux](https://github.com/tmux/tmux/wiki) to keep terminal sessions running in the background within the same window.

## Create and run a database backend

To start, we’ll need to create a database backend; while Sigstore accepts several different databases, we’ll work with MariaDB here, so make sure you have it installed.

If you are on Debian or Ubuntu, you can install it with the following command.

```sh
sudo apt install -y mariadb-server
```

If you are on macOS, you can install it with Homebrew. If you don’t already have Homebrew installed, visit [brew.sh](https://brew.sh) to set it up.

```sh
brew install mariadb
```

If you’re using another operating system, review the [official MariaDB installation documentation](https://mariadb.com/docs/server/mariadb-quickstart-guides/installing-mariadb-server-guide).

With MariaDB installed, start the database.

For Debian or Ubuntu, you can run:

```sh
sudo mysql_secure_installation
```

For macOS, you can run:

```sh
brew services start mariadb && sudo mysql_secure_installation
```

Once you run the above command, you will be prompted to enter your system password, and then will receive a number of prompts as terminal output. You can answer “no” or `N` to the first question on changing the root password, and “yes” or `Y` to the remaining prompts.

```
Switch to unix_socket authentication [Y/n] n
…
Change the root password? [Y/n] n
…
Remove anonymous users? [Y/n] Y
…
Disallow root login remotely? [Y/n] Y
…
Remove test database and access to it? [Y/n] Y
…
Thanks for using MariaDB!
```

Once you receive the `Thanks for using MariaDB!` output, you’re ready to create your database. We’ll create a directory to store our work in this example, feel free to create a directory or move into a directory that is meaningful for you.

```sh
mkdir lf-sigstore && cd $_
```

From this directory, we’ll clone the Rekor GitHub repository.

```sh
git clone https://github.com/sigstore/rekor.git
```

Now, move into the directory of Rekor where the database creation script is held.

```sh
cd $HOME/lf-sigstore/rekor/scripts
```

From here, you can run the database creation script.

```sh
sudo sh -x createdb.sh
```

You should receive output that indicates that the test database and user were created.

```
+ DB=test
+ USER=test
+ PASS=zaphod
+ ROOTPASS=
+ echo -e 'Creating test database and test user account'
-e Creating test database and test user account
+ mysql
+ echo -e 'Loading table data..'
-e Loading table data..
+ mysql -u test -pzaphod -D test
```

At this point, we are ready to move onto installing Trillian.

## Install and set up Trillian

Trillian offers a transparent, append-only, and cryptographically verifiable data store. Trillian will store its records in the MariaDB database we just created. We can install Trillian with Go.

```sh
go install github.com/google/trillian/cmd/trillian_log_server@latest
go install github.com/google/trillian/cmd/trillian_log_signer@latest
go install github.com/google/trillian/cmd/createtree@latest
```

We’ll start the Trillian log server, providing the API used by Rekor and the Certificate Transparency frontend.

```sh
$(go env GOPATH)/bin/trillian_log_server --logtostderr \
  -http_endpoint=localhost:8090 -rpc_endpoint=localhost:8091
```

Your output will indicate that the server has started, and the session will hang.

```
I0629 18:11:27.222341    7395 quota_provider.go:46] Using MySQL QuotaManager
I0629 18:11:27.222847    7395 main.go:141]          HTTP server starting on localhost:8090
I0629 18:11:27.222851    7395 main.go:180]          RPC server starting on localhost:8091
I0629 18:11:27.223757    7395 main.go:188]          Deleted tree GC started
```

Next, let’s start the log signer in a new terminal session (while keeping the previous session running), which will sequence data into cryptographically verifiable Merkle trees and periodically check the database.

```sh
$(go env GOPATH)/bin/trillian_log_signer --logtostderr --force_master --http_endpoint=localhost:8190 -rpc_endpoint=localhost:8191
```

You’ll receive output that indicates that the log signer has started. This session will also hang.

```
I0629 18:13:42.226319    8513 main.go:98] **** Log Signer Starting ****
W0629 18:13:42.227281    8513 main.go:129] **** Acting as master for all logs ****
…
```

The Trillian system can support multiple independent Merkle trees. We’ll have Trillian send a request to create a tree and save the log ID for future use. Run the following command in a third terminal session (while keeping the previous two sessions running).

```sh
$(go env GOPATH)/bin/createtree --admin_server localhost:8091 \
  | tee $HOME/lf-sigstore/trillian.log_id
```

In the Trillian log server terminal, you should have output similar to the following:

```
Acting as master for 2 / 2 active logs: master for: <log-2703303398771250657> <log-5836066877012007666>
```

This log string will match the string output of the new terminal session. Trillian uses the gRPC API for requests, which is an open source Remote Procedure Call (RPC) framework that can run in any environment. We can now move onto the Rekor server.

## Install and set up Redis

Rekor server also requires a Redis instance. If you are on Debian or Ubuntu, you can install it with the following command.

```sh
sudo apt install -y redis-server
```

If you are on macOS, you can install it with Homebrew. If you don’t already have Homebrew installed, visit [brew.sh](https://brew.sh) to set it up.

```sh
brew install redis
```

If you’re using another operating system, review the [official Redis documentation](https://redis.io/docs/latest/operate/oss_and_stack/install/).

With Redis installed, start it.

For Debian or Ubuntu, you can run:

```sh
sudo systemctl start redis-server
```

For macOS, you can run:

```sh
brew services start redis
```

Now you can proceed to the next step, where you will install the Rekor server itself.

## Install Rekor server

Rekor provides a restful API-based server with a transparency log that allows for validating and storing. Let’s move into the main `rekor/` directory we set up.

```sh
cd $HOME/lf-sigstore/rekor
```

Now we’ll install the Rekor server from source with Go.

```sh
go install ./cmd/rekor-cli ./cmd/rekor-server
```

You can now start the Rekor server with Trillian and can leave this running.

```sh
$(go env GOPATH)/bin/rekor-server serve --trillian_log_server.port=8091 \
  --enable_retrieve_api=false
```

Next, we’ll ensure that Rekor is working correctly.

## Test Rekor

Let’s upload a test artifact to Rekor. Open another terminal session and ensure that you are in your main Rekor directory.

```sh
cd $HOME/lf-sigstore/rekor
```

Now, let’s upload a test artifact to our Rekor instance.

```sh
$(go env GOPATH)/bin/rekor-cli upload --artifact tests/test_file.txt \
  --public-key tests/test_public_key.key \
  --signature tests/test_file.sig \
  --rekor_server http://localhost:3000
```

Your terminal will output that you have created a log entry, and where it’s available. Note that your string will be different than what is indicated below. You can input the URL in a browser of your choice to inspect the resulting JSON.

Created entry at index 0, available at: http://localhost:3000/api/v1/log/entries/d2f305428d7c222d7b77f56453dd4b6e6851752ecacc78e5992779c8f9b61dd9

Next, we’ll upload the key to our Rekor instance and attach it to the container we built in the Cosign chapter. If you have not created a key or the container, you can do so now, or alternately use a key and software artifact of your choice.

```sh
$HOME/go/bin/cosign sign \
  --key $HOME/cosign.key \
  --rekor-url=http://localhost:3000 \
  docker-username/hello-container
```

Now you can verify the container against both the mutable OCI attestation and the immutable Rekor record. If you signed your container using Gmail account with Google as the OIDC issuer, you can verify the image with the following command:

```sh
$HOME/go/bin/cosign verify \
  --key $HOME/cosign.pub \
  --rekor-url=http://localhost:3000 \
  --certificate-identity username@gmail.com \
  --certificate-oidc-issuer https://accounts.google.com \
  docker-username/hello-container
```

If everything goes well, your resulting output after running the above command should be similar to this:

```
Verification for index.docker.io/docker-username/hello-container:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The claims were present in the transparency log
- The signatures were integrated into the transparency log when the certificate was valid
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
[{"critical":{"identity":{"docker-reference":"index.docker.io/docker-username/hello-container"},"image":{"docker-manifest-digest":"sha256:35b25714b56211d548b97a858a1485b254228fe9889607246e96ed03ed77017d"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEUCIG...yoIY=","Payload":{"body":"...","integratedTime":1643917737,"logIndex":1,"logID":"4d2e4...97291"}}}}]
```

You can now also review the logs of your Rekor server, which will give you a URL on your localhost for this second log entry (at log entry 1). Once you are done with your Rekor instance, it is safe to exit each of the terminal sessions.

Congratulations, you have set up your own Rekor server!

---

### Rekor
_Path: open-source/sigstore/rekor/_index.md_

An immutable, tamper-resistant ledger of metadata generated within a software project’s supply chain

---

### An introduction to Rekor
_Path: open-source/sigstore/rekor/an-introduction-to-rekor.md_

_An earlier version of this material was published in the [Rekor chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@e785fae1be184e2c929db62dbe7444fa/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@a48c33126e2c4ee6ad3bfa6b7bc9c957) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Rekor stores records of artifact metadata, providing transparency for signatures and therefore helping the open source software community monitor and detect any tampering of the software supply chain. On a technical level, it is an append-only (sometimes called “immutable”) data log that stores signed metadata about a software artifact, allowing software consumers to verify that a software artifact is what it claims to be. You could think of Rekor as a bulletin board where anyone can post and the posts cannot be removed, but it’s up to the viewer to make informed judgements about what to believe.

## Transparency log

Rekor’s role as a _transparency log_ is the source of its security benefits for the software supply chain. Because the Rekor log is tamper-evident — meaning that any tampering can be detected — malicious parties will be less likely to tamper with the software artifacts protected by sigstore.

In order to detect tampering, we can use _monitors_ — software that examines the Rekor log and searches for anomalies — to verify that nothing has been manipulated outside of standard practices. Additionally, downstream users can search Rekor for signatures associated with signed artifact metadata, can verify the signature, and can make an informed judgment about what security guarantees to trust about a signed artifact.

The Fulcio certificate authority enables a downstream user to trust that a public key associated with a particular artifact metadata entry from Rekor is associated with a particular identity, and Cosign performs this verification with a single convenient command.

## Public instance of Rekor

A public instance of Rekor is run as a non-profit, public good transparency service that the open source software community can use. The service lives at [https://rekor.sigstore.dev/](https://rekor.sigstore.dev/). Those who are interested in helping to operate or maintain the Rekor public instance, or those who would like to discuss a production use case of the public instance can reach out via the [mailing list](https://docs.sigstore.dev/about/contributing/#mailing-list).

The latest Signed Tree hashes of Rekor are published on Google Cloud Storage. These are stored in both unverified raw and verified decoded formats; the signatures can be verified by users against Rekor’s public key. Entries include a short representation of the state of Rekor, which is posted to GCS, and can be verified by users against Rekor's public key. These representations can be used to check that a given entry was in the log at a given time.

## Rekor usage

Rekor provides a restful API based server for validation and a transparency log for storage, accessible via a command-line interface (CLI) application: `rekor-cli`. You can install `rekor-cli` with Go, which we will discuss in the lab section below. Alternatively, you can navigate to the [Rekor release page](https://github.com/sigstore/rekor/releases) to grab the most recent release, or you can build the [Rekor CLI manually](https://docs.sigstore.dev/logging/installation/#build-rekor-cli-manually).

Through the CLI, you can make and verify entries, query the transparency log to prove the inclusion of an artifact, verify the integrity of the transparency log, or retrieve entries by either public key or artifact.

To access the data stored in Rekor, the `rekor-cli` requires either the log index of an entry or the universally unique identifier (UUID) of an artifact.

The log index of an entry identifies the order in which the entry was entered into the log. Someone who wants to collect all the log entries or perhaps a large subset of the entries might use the log index, and receive an object as below, in their standard output.

```
LogID: c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d
Index: 100
IntegratedTime: 2021-01-19T19:38:52Z
UUID: 2343d145e62b1051b6a2a54582b69a821b13f31054539660a020963bac0b33dc
Body: {
  "RekordObj": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "bf9f7899c65cc4decf96658762c84015878e5e2e41171bdb39e6ac39b4d6b797"
      }
    },
    "signature": {
      "content": "LS0tL…S0=",
      "format": "pgp",
      "publicKey": {
        "content": "LS…0tLS0="
      }
    }
  }
}
```

The `RekordObj` is indicated inside the body field, and is one of the standard formats used by Rekor to indicate a digital signature of an object. The signature in this entry was generated via PGP, a traditional method of creating digital signatures, sometimes also used to sign code artifacts. Many other digital signature types are accepted. The signature block contains content fields that are base64-encoded, a form of encoding that enables reliably sending binary data over networks.

There are a number of different formats stored in the Rekor log, each associated with a particular type of artifact and use case.

Users of Rekor also have an offline method for determining whether a particular entry exists in a Rekor log by leveraging inclusion proofs, which are enabled through Merkle trees. Merkle trees are a data structure that enable a party to use cryptographic hash functions — a way of mapping potentially large values to relatively short digests — to prove that a piece of data is contained within a much larger data structure. This proof is accomplished by providing a series of hashes to the user, hashes that if recombined prove to the user that an entry is indeed in the Rekor log. Sigstore users can “staple” such an inclusion proof to an artifact, attaching the inclusion proof next to an artifact in a repository, and therefore proving that the artifact is indeed included in Rekor. For a detailed description of Merkle trees and inclusion proofs, refer to the “helpful resources” section at the end of this chapter.

## Setting up an internal Rekor instance

Your organization can also set up its own instance of Rekor, or you can individually set up a Rekor server to more fully understand it. You can deploy the Rekor server through Project Sigstore’s [Docker Compose file](https://github.com/sigstore/rekor/blob/main/docker-compose.yml), through a [Kubernetes operator](https://github.com/sigstore/rekor-operator), with a [Helm chart](https://github.com/sigstore/helm-charts), or you can build a Rekor server yourself.

In order to build a Rekor server, you will need Go, a MySQL-compatible database, and you will need to build Trillian, an append-only log. In the lab section, we will walk through how to set up a Rekor server locally.

---

### How to install the Rekor CLI
_Path: open-source/sigstore/rekor/how-to-install-rekor.md_

_An earlier version of this material was published in the [Rekor chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@e785fae1be184e2c929db62dbe7444fa/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@a48c33126e2c4ee6ad3bfa6b7bc9c957) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Follow this tutorial for an overview of how to install `rekor-cli`.

To install the Rekor command line interface (rekor-cli) with Go, you will need Go version 1.16 or greater. For Go installation instructions, refer to the [official Go documentation](https://go.dev/doc/install). If you have Go installed already, you can check your Go version via this command.

```sh
go version
```

If Go is installed, you'll receive output similar to the following.

```
go version go1.13.8 linux/amd64
```

You will also need to set your `$GOPATH`, the location of your Go workspace.

```sh
export GOPATH=$(go env GOPATH)
```

You can then install `rekor-cli`:

```sh
go install -v github.com/sigstore/rekor/cmd/rekor-cli@latest
```

Check that the installation of `rekor-cli` was successful using the following command:

```sh
rekor-cli version
```

You should receive output similar to that of below:

```
GitVersion:    v0.4.0-59-g2025bf8
GitCommit:     2025bf8aa50b368fc3972bb276dfeae8b604d435
GitTreeState:  clean
BuildDate:     '2022-01-26T00:20:33Z'
GoVersion:     go1.17.6
Compiler:      gc
Platform:      darwin/arm64
```

Now that you have the Rekor CLI tool successfully installed, you can start working with it.

---

### How to query Rekor
_Path: open-source/sigstore/rekor/how-to-query-rekor.md_

_An earlier version of this material was published in the [Rekor chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@e785fae1be184e2c929db62dbe7444fa/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@a48c33126e2c4ee6ad3bfa6b7bc9c957) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Rekor is the transparency log of Sigstore, which stores records of artifact metadata. Before querying Rekor, you should have the `rekor-cli` installed, which you can achieve by following the "[How to install the Rekor CLI](/open-source/sigstore/rekor/how-to-install-rekor/)" tutorial.

In order to access the data stored in Rekor, the `rekor-cli` requires either the log index of an entry or the UUID of a software artifact.

For instance, to retrieve entry number 100 from the public log, use this command:

```sh
rekor-cli get --rekor_server https://rekor.sigstore.dev --log-index 100
```

An abridged version of the output is below:

```
LogID: c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d
Index: 100
IntegratedTime: 2021-01-19T19:38:52Z
UUID: 2343d145e62b1051b6a2a54582b69a821b13f31054539660a020963bac0b33dc
Body: {
  "RekordObj": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "bf9f7899c65cc4decf96658762c84015878e5e2e41171bdb39e6ac39b4d6b797"
      }
    },
    "signature": {
      "content": "LS0tL…S0=",
      "format": "pgp",
      "publicKey": {
        "content": "LS…0tLS0="
      }
    }
  }
}
```

The next command will produce the same output but uses the UUID to retrieve the artifact:

```sh
rekor-cli get --uuid 2343d145e62b1051b6a2a54582b69a821b13f31054539660a020963bac0b33dc
```

It is also possible to use a web API to return results that are similar to those above. For instance, we can use curl to fetch the same artifact by its UUID with the following query:

```sh
curl -X GET "https://rekor.sigstore.dev/api/v1/log/entries/2343d145e62b1051b6a2a54582b69a821b13f31054539660a020963bac0b33dc"
```

By appending the UUID value returned by the `rekor-cli` get command that we ran before, we can obtain detailed information about a specific artifact that has been previously registered within the Rekor public instance.

---

### How to sign and upload metadata to Rekor
_Path: open-source/sigstore/rekor/how-to-sign-and-upload-metadata-to-rekor.md_

_An earlier version of this material was published in the [Rekor chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@e785fae1be184e2c929db62dbe7444fa/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@a48c33126e2c4ee6ad3bfa6b7bc9c957) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

This tutorial will walk you through signing and uploading metadata to the Rekor transparency log, which is a project of Sigstore. In order to follow along, you'll need the `rekor-cli` installed, which you can accomplish by following the "[How to install the Rekor CLI](/open-source/sigstore/rekor/how-to-install-rekor/)" tutorial.

We will use SSH to sign a text document. SSH is often used to communicate securely over an unsecured network and can also be used to generate public and private keys appropriate for signing an artifact.

First, generate a key pair. This command will generate a public key and a private key file. You'll be able to easily identify the public key because it uses  the .pub extension. The command below will create a new file in ~/.ssh called id_ed25519 but you may want to call it something else; you can do that by passing a different filename after the -f flag.

```sh
ssh-keygen -t ed25519 -f id_ed25519
```

Then, create a text file called README.txt with your favorite text editor. You can enter as little or as much text in that file as you would like.

For example, we can use nano:

```sh
nano README.txt
```

Then within the file, we can type some text into it, such as the following.

```
[label README.txt]

Hello, Rekor!
```

Save and close the file.

Next, sign this file with the following command. This command produces a signature file ending in the .sig extension.

```sh
ssh-keygen -Y sign -n file -f id_ed25519 README.txt
```

You should receive the following output.

```
Signing file README.txt
Write signature to README.txt.sig
```

Then, upload this artifact to the public instance of the Rekor log.

```sh
rekor-cli upload --artifact README.txt --signature README.txt.sig --pki-format=ssh --public-key=id_ed25519.pub
```

The returned value will include a string similar to:

https://rekor.sigstore.dev/api/v1/log/entries/83140d699ebc33dc84b702d2f95b209dc71f47a3dce5cce19a197a401852ee97

Save the UUID returned after using this command. In this example, the UUID is `83140d699ebc33dc84b702d2f95b209dc71f47a3dce5cce19a197a401852ee97`.

Now you can query Rekor for your recently saved entry. Run the following command, replacing UUID with the UUID number obtained in the previous command.

```sh
rekor-cli get --uuid UUID
```

Once you receive output formatted as a JSON with details on the signature, you will know you have successfully stored a signed metadata entry in Rekor.

---

### How to generate a Fulcio certificate
_Path: open-source/sigstore/fulcio/how-to-generate-a-fulcio-certificate.md_

_An earlier version of this material was published in the [Fulcio chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@2fbe6328019c4b1fbf934bd3bfb7e308/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@1f71fcbe8219471fb82e25731b18be11) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

In this tutorial, we are going to create and examine a Fulcio certificate to demonstrate how Fulcio can work in practice. To follow along, you will need Cosign installed on your local system. If you haven't installed Cosign yet, you can follow the instructions described in [How to install Cosign](/open-source/sigstore/cosign/how-to-install-cosign/), or you can follow one of the installation methods described in the [official documentation](https://docs.sigstore.dev/cosign/system_config/installation/).

Please note that using Cosign requires Go v1.16 or higher. The Go Project provides [official download instructions](https://go.dev/doc/install).

To get started, place some text in a text file. For instance:

```sh
echo "test file contents" > test-file.txt
```

Next, let’s generate a key pair with Cosign:

```sh
cosign generate-key-pair
```

Enter and confirm a password after running this command.

Then, use Cosign to sign this test-file.txt, outputting a Fulcio certificate named “fulcio.crt.base64”. The sign-blob subcommand allows Cosign to sign a blob. This command will open a browser tab and will require you to sign in through one of the OIDC providers: GitHub, Google, or Microsoft. This step represents the user proving their identity.

```sh
cosign sign-blob test-file.txt --output-certificate fulcio.crt.base64 --output-signature fulcio.sig
```

After authentication, you can close the browser tab. In your terminal, you will receive output similar to this:

```
Using payload from: test-file.txt
Generating ephemeral keys...
Retrieving signed certificate...

 Note that there may be personally identifiable information associated with this signed artifact.
 This may include the email address associated with the account with which you authenticate.
 This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later.

By typing 'y', you attest that you grant (or have permission to grant) and agree to have this information stored permanently in transparency logs.
Are you sure you would like to continue? [y/N] y
```

If you agree, enter `y` and continue. You will receive output like this:

Your browser will now be opened to:
https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=...
Successfully verified SCT...
using ephemeral certificate:
-----BEGIN CERTIFICATE-----
(...)
-----END CERTIFICATE-----

tlog entry created with index: 2494952
Signature wrote in the file fulcio.sig
using ephemeral certificate:
-----BEGIN CERTIFICATE-----
(...)
-----END CERTIFICATE-----
Certificate wrote in the file fulcio.crt.base64

```

The output indicates that Sigstore is using ephemeral keys to generate a certificate for `test-file.txt`. The certificate, which we'll verify in the next section, is saved to a file named `fulcio.crt.base64`.

---

### How to inspect and verify Fulcio certificates
_Path: open-source/sigstore/fulcio/how-to-inspect-and-verify-fulcio-certificates.md_

_An earlier version of this material was published in the [Fulcio chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@2fbe6328019c4b1fbf934bd3bfb7e308/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@1f71fcbe8219471fb82e25731b18be11) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

To inspect a certificate generated by Fulcio, we will first decode it with the `base64` command line tool, which is used for encoding and decoding binary to text. Base64 is widely used on the world wide web for binary-to-text encoding. You can check whether the tool is installed by checking whether `base64 --help` will run. If not, install Base64 with the package manager of your choice, such as apt or [Homebrew for macOS](https://formulae.brew.sh/formula/base64).

We will also use a third-party tool called `step` to inspect the decoded certificate. To install `step`, which is a tool related to public key infrastructure workflows, follow the instructions from their [official documentation](https://smallstep.com/docs/step-cli/installation).

In addition to having `base64` and `step` installed on your machine, you should also have Cosign installed, which you can achieve by following the instructions described in [How to install Cosign](/open-source/sigstore/cosign/how-to-install-cosign/).

With these prerequisites in place, you are ready to begin.

First, we'll decode the certificate with Base64. If you don't have a certificate ready to inspect, you can generate one by following [How to generate a Fulcio certificate](/open-source/sigstore/fulcio/how-to-generate-a-fulcio-certificate/).

```sh
base64 -d < fulcio.crt.base64 > fulcio.crt
```

Then, inspect the certificate using `step`’s `inspect` command.

```sh
step certificate inspect fulcio.crt
```

A sample output is below. Pay attention especially to the `x509v3 Subject Alternative Name` field, which is the e-mail associated with the party that created the signature and the issuer, which is Sigstore. The ten minute time window of validity also details the period of time for which the signature is valid.

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 445971695346061852979091305347141417164194935 (0x13ff8105719cba6ad0caa5ce9f34603ce9c477)
    Signature Algorithm: ECDSA-SHA384
        Issuer: O=Sigstore.dev,CN=sigstore
        Validity
            Not Before: Mar 24 20:14:37 2022 UTC
            Not After : Mar 24 20:24:36 2022 UTC
        Subject:
        Subject Public Key Info:
            Public Key Algorithm: ECDSA
                Public-Key: (256 bit)
                X:
                    4b:fc:7d:9c:4a:56:30:75:67:fd:d6:1f:a6:f3:05:
                    04:ff:c8:ad:c6:2c:5f:ea:59:f9:ed:07:fa:c2:ae:
                    04:19
                Y:
                    15:44:38:f3:77:87:63:91:0c:08:b6:4f:ca:67:36:
                    3f:38:dc:fc:bc:07:5c:8f:ec:d3:b2:31:66:a8:3d:
                    fa:98
                Curve: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                Code Signing
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                5A:F0:DE:DA:CF:D0:73:F1:5A:88:B2:9F:8E:03:5F:51:6E:8C:57:19
            X509v3 Authority Key Identifier:
                keyid:58:C0:1E:5F:91:45:A5:66:A9:7A:CC:90:A1:93:22:D0:2A:C5:C5:FA
            X509v3 Subject Alternative Name: critical
                email:email@example.com
            1.3.6.1.4.1.57264.1.1:
                https://github.com/login/oauth
    Signature Algorithm: ECDSA-SHA384
         30:65:02:31:00:98:00:17:7a:98:f2:d4:89:05:d2:7a:91:93:
         73:92:e6:3f:9d:69:a5:7c:28:9f:60:72:29:e3:b7:d3:5e:2f:
         1a:00:35:99:4f:92:da:02:cd:ec:83:49:f3:27:3a:39:21:02:
         30:04:a6:0c:42:a4:38:d9:ac:da:8f:b5:2f:4c:f5:ad:4b:d4:
         c6:7d:8b:43:46:91:c1:9d:80:43:44:a9:26:26:26:0f:cf:e2:
         ab:aa:ef:6d:ec:1c:28:df:d3:ac:aa:fd:1b
```

We will then verify the certificate against the Fulcio certificate authority root, by using `step certificate verify` to execute the certificate path validation algorithm for x.509 certificates.

```sh
step certificate verify fulcio.crt --roots ~/.sigstore/root/targets/fulcio_intermediate_v1.crt.pem
```

The final command checks the signature in the `fulcio.sig` file, tracing the certificate up to the Fulcio root certificate. You'll need to use the identity flags `--certificate-identity` which corresponds to the email address of the signer, and `--certificate-oidc-issuer` which corresponds to the OIDC provider that the signer used. For example, a Gmail account using Google as the OIDC issuer, will be able to be verified with the following command:

```sh
cosign verify-blob test-file.txt \
  --signature fulcio.sig \
  --cert fulcio.crt.base64 \
  --certificate-identity username@gmail.com \
  --certificate-oidc-issuer https://accounts.google.com
```

You will receive output following this command.

You should receive a `Verified OK` message if the signature, certificate, and identities match.

---

### Fulcio
_Path: open-source/sigstore/fulcio/_index.md_

A new kind of root certificate authority for code signing

---

### An introduction to Fulcio
_Path: open-source/sigstore/fulcio/an-introduction-to-fulcio/index.md_

_An earlier version of this material was published in the [Fulcio chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@2fbe6328019c4b1fbf934bd3bfb7e308/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@1f71fcbe8219471fb82e25731b18be11) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Fulcio is a certificate authority that binds public keys to identities such as email addresses (such as a Google account) using OpenID Connect, essentially notarizing a short-lived key pair against a particular login. A certificate authority issues digital certificates that certify that a particular public key is owned by a particular entity. The certificate authority therefore serves as a trusted third party, helping parties that need to attest and verify identities.

By connecting their identity to a verified email or other unique identifier, Fulcio enables software developers to confirm certain credentials associated with themselves. Developers can attest that they truly did create their signed artifacts and later software consumers can then verify that the software artifacts they use really did come from the expected software developers.

## Certificates

A certificate is a signed document that associates a public key with an identity such as an email address. The term “document” refers to a file or any electronic representation of a paper document. That the document must be signed implies that some party uses a digital signature to certify the document. You could think of a certificate as the digital equivalent of a passport: a document from a trusted authority that links information to an identity.

Fulcio issues [X.509 certificates](https://sectigo.com/resource-library/what-is-x509-certificate). X.509 certificates are an [International Telecommunication Union (ITU)](https://www.itu.int/en/about/Pages/default.aspx) standard that defines the format of public keys, and they are commonly used in many internet protocols, such as those that enable HTTPS. These certificates are what bind a given identity to a public key by using a digital signature.

Below is an example of an X.509 certificate used to authenticate a secure website connection.

![Example of X.509 Certificate](Example_of_X.509_Certificate.png)

## Certificate authority

You rely on certificate authorities every time you open a browser and make a connection to a website. These certificate authorities, such as Let’s Encrypt, sign certificates that link a particular domain with a particular public key, allowing users to use HTTPS securely, knowing that a malicious third party is not pretending to be the real website. When a user visits a website, the user’s browser checks that a certificate authority trusted by the browser vouches for that certificate.

![Diagram of how a certificate authority issues certificates](fulcio-diagram.png)

As a certificate authority, Fulcio operates analogously to the certificate authorities that are responsible for web encryption. Fulcio does not, however, tie website domains to public keys. Instead, Fulcio creates and signs certificates that bind together email addresses and public keys. Binding an email address and public key is critical to how Sigstore works. Software developers want to attest that they were indeed responsible for publishing a particular software artifact. Fulcio lets these developers issue claims associated with their public identity. As a result, software consumers can later check the end-to-end integrity of the software artifacts they consume and know that this artifact was indeed created by the party that claims to have produced that artifact.

To return to the digital passport metaphor, each national government, the entities that issue passports, is equivalent to a certificate authority.

## OpenID Connect (OIDC) tokens

[OpenID Connect](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol) (or OIDC) is a protocol that enables authentication without the service provider having to store and manage passwords. Authentication refers to establishing that the person operating an application or using a browser is who they claim to be. Allowing the service, like Sigstore, to rely on OIDC means that the service transfers responsibility of authenticating the subject to other OIDC providers like GitHub, Google, and Microsoft, solving the key management issues that many online service providers prefer to avoid.

The use of the OIDC protocol by Sigstore means that a user can rely on workflows they are already familiar with, such as logging into Google, in order to prove their identity. The OIDC “provider” (Google in this example) then vouches on the user's behalf to Fulcio that the user is who they say they are.

Returning again to the digital passport metaphor, the OIDC protocol is similar to how a passport can be used at an airport to prove your identity. The airport did not issue the passport (that is, the certificate) but it trusts the proof provided via the certificate.

## How Fulcio issues certificates

The user initiates a login to Fulcio using an OIDC provider such as GitHub, Google, or Microsoft. The user and an OIDC provider (for instance, GitHub) then engage in the OIDC protocol where the user logs in to GitHub to prove their identity. The OIDC provider, if the login is successful, returns an “access token,” which proves to Fulcio that the user controls the email address they claim to control. Fulcio then creates a certificate and timestamps it, returning the timestamp to the user and placing the certificate in the Rekor transparency log too.

The process described above, in reality, can be decomposed into even more steps. For a full understanding with helpful diagrams, consult the [Fulcio documentation](https://github.com/sigstore/fulcio/blob/main/docs/how-certificate-issuing-works.md).

## The purpose and contributions of Fulcio

The main task of Fulcio is to link public keys to email addresses. The detailed explanation earlier simply elaborates on how Fulcio binds public keys to email addresses.

Why bind public keys to email addresses? Because third parties want to verify that an artifact was signed by the person who claimed they signed the artifact. Fulcio acts as a trusted party that vouches on behalf of its users that a certain user proved their identity at a certain time.

This timestamping is an essential part of the process. The timestamp proves that the signing happened at a particular time and it creates a short time window (about 20 minutes) for the user to sign the artifact that they are signing. A verifying party then needs to check that the artifact they are verifying was not only signed by the party that claims to have signed the artifact, but also that it was done within a valid time window.

---

### How to verify file signatures with Cosign
_Path: open-source/sigstore/cosign/how-to-verify-file-signatures-with-cosign.md_

Cosign can be used to verify binary artifacts ("blobs") using provided signatures as long as they are published to an OCI registry. In this tutorial, we’ll verify a binary artifact — in this case, a release of [`apko`](/open-source/build-tools/apko/overview/), a command-line tool for building container images using a declarative language based on YAML. The methods in this tutorial apply to any blob file Cosign has signed with a keyless signature.

This tutorial assumes you [have Cosign installed](/open-source/sigstore/cosign/how-to-install-cosign/).

## Verifying a binary with Cosign keyless signatures

All `apko` releases include [keyless signatures using Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/#keyless-signing). You can verify the signature for an apko release using the `cosign` tool directly, or by calculating the SHA256 hash of the release and finding the corresponding Rekor transparency log entry.

If you would like to learn how to verify a binary using Rekor or `curl`, follow the steps in our guide on [How to verify file signatures with Rekor or curl](/open-source/sigstore/rekor/how-to-verify-file-signatures-with-rekor-or-curl/).

We'll use the `apko_0.19.9_linux_arm64.tar.gz` tar archive from the `apko` [GitHub Release v0.19.9 page](https://github.com/chainguard-dev/apko/releases/tag/v0.19.9) in this example.

There are three URLs from the list of assets on that page that you will need to copy:

1. The release itself: `https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz`
2. The signature file: `https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz.sig`
3. The public certificate: `https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz.crt`

With these URLs, construct (or copy) the following command to verify the tar archive:

```sh
cosign verify-blob \
  --signature https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz.sig \
  --certificate https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz.crt \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  --certificate-identity "https://github.com/chainguard-dev/apko/.github/workflows/release.yaml@refs/heads/main" \
  https://github.com/chainguard-dev/apko/releases/download/v0.30.31/apko_0.30.31_linux_arm64.tar.gz
```

Running the command may take a moment, but when it completes you will receive the following output:

```output
Verified OK
```

If any of the URLs are incorrect, if there was a problem with the `apko` release file, if the signature or certificate identity don't match, or if the release file was not signed, you will receive an error like the following:

```output
Error: searching log query: [POST /api/v1/log/entries/retrieve][400] searchLogQueryBadRequest {"code":400,"message":"verifying signature: invalid signature when validating ASN.1 encoded signature"}
error during command execution: searching log query: [POST /api/v1/log/entries/retrieve][400] searchLogQueryBadRequest {"code":400,"message":"verifying signature: invalid signature when validating ASN.1 encoded signature"}
```

If you receive an error while verifying a binary with Cosign, then you know that there was a problem with creating the artifact, or that the file that you are verifying is corrupted or invalid. If that is the case, you should download a fresh copy and verify it again, or try a different version of the software with a working signature.

---

### Cosign: The manual way
_Path: open-source/sigstore/cosign/cosign-manual-way.md_

> **Note:** This tutorial is no longer actively maintained and may reference outdated versions of Cosign and related tools. While the underlying cryptographic concepts remain relevant, we recommend consulting the [current Cosign documentation](https://docs.sigstore.dev/cosign/signing/overview/) for up-to-date usage guidance. This content is preserved for educational purposes and may still provide value for those interested in understanding the mechanics of software signing.

When I first used [Cosign](https://github.com/sigstore/cosign), the software artifact signing CLI from the [Sigstore](https://www.sigstore.dev/) project, I was amazed at how painless signing and verifying could be.

For example, in the three commands below we create a public/private key pair, sign the text file, upload it to the [Rekor](https://github.com/sigstore/rekor) transparency log, and verify the signature of the message.

```bash
# create public/private keys
$ cosign generate-key-pair
Enter password for private key:
Enter password for private key again:
Private key written to cosign.key
Public key written to cosign.pub

# sign an artifact and output the signature
$ cosign sign-blob --key cosign.key --output-signature sig message.txt
Using payload from: message.txt
Enter password for private key:
tlog entry created with index: 2014997
Signature wrote in the file sig

# verify the signature
$ cosign verify-blob --key cosign.pub --signature sig message.txt
tlog entry verified with uuid: 7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e index: 7155742
Verified OK
```

These quick commands show how easily Sigstore can be integrated into software security practices for any developer. I am the kind of person who always wants to know what's going on under the hood. In this tutorial, I will walk you through doing Cosign the manual way so you too can understand the ins and outs of Cosign.

## Tools

If you want to follow along you’ll need the following installed from your package manager of choice. I’ve noted the version used in this post but different minor versions should be fine. However, keep in mind that OpenSSL can drastically vary per system.

* [openssl](https://www.openssl.org/source/) (3.0.8) Note: macOS uses libressl but it should still work
* [jq](https://stedolan.github.io/jq/download/) (jq-1.6)
* [curl](https://curl.se/download.html) (7.88.1)
* xxd (2022-01-14) Note: macOS requires [coreutils installed via Homebrew](https://formulae.brew.sh/formula/coreutils)
* [go](https://go.dev/doc/install) (go1.20.2)
* [cosign](/open-source/sigstore/cosign/how-to-install-cosign/) ([v2.0.0](https://github.com/sigstore/cosign/releases/tag/v2.0.0))
* [rekor-cli](/open-source/sigstore/rekor/how-to-install-rekor/) ([v1.0.1](https://github.com/sigstore/rekor/releases/tag/v1.0.1))

## The blob

A blob is an arbitrary collection of raw data like a picture or the executable binary that your source code produces. Cosign is capable of signing and verifying blobs.

In our case, we’ll be signing a spooky message. Let’s write that message to a file.

```bash
echo 'Beware The Blob!' > message.txt
```

We’ll be using Cosign to sign this `.txt` file blob.

## Keys

Before we can sign our message we need to generate a key pair. A key pair is a set of two keys, one private and one public, that can both sign/verify and encrypt/decrypt data. The private key is generated by some algorithm and the public key is derived from the private.

There are a handful of [different algorithms](https://youtu.be/T-Ncf628ZGQ) in use today, but the most common are RSA, ECDSA, and Ed25519. I fell deep down the rabbit hole learning about the differences between these algorithms, [potential NSA backdoors](https://youtu.be/nybVFJVXbww) and which versions of OpenSSL support a given algorithm. To keep things simple, we'll use RSA but I encourage you to chase the rabbit on your own.

The RSA algorithm in use today is defined by the Public Key Cryptography Standards #1 (PKCS1) specification. Let's generate a 4096 bit RSA private key with OpenSSL.

```bash
$ openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
......................................................................................................................
.............++++
.................++++
e is 65537 (0x010001)
```

And from that private key we can output the public key.

```
$ openssl rsa -in key.pem -pubout -out pub.pem
writing RSA key
```

```bash
$ cat key.pem
-----BEGIN RSA PRIVATE KEY-----
MIIJKgIBAAKCAgEA…
-----END RSA PRIVATE KEY-----

$ cat pub.pem
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A…
-----END PUBLIC KEY-----
```

We now have our keys but this is still a bit of magic. What is a PEM and what is this syntax? To answer that, let's look at doing the same thing we just did in Go (omitting errors for brevity).

```go
// main.go
package main

import (
 "crypto/rand"
 "crypto/rsa"
 "crypto/x509"
 "encoding/pem"
 "os"
)

func main() {
 key, _ := rsa.GenerateKey(rand.Reader, 4096)
 b := x509.MarshalPKCS1PrivateKey(key)
 priv := pem.EncodeToMemory(&pem.Block{
  Type:  "RSA PRIVATE KEY",
  Bytes: b,
 })
 os.WriteFile("key.pem", priv, 0600)

 b, _ = x509.MarshalPKIXPublicKey(key.Public())
 pub := pem.EncodeToMemory(&pem.Block{
  Type:  "PUBLIC KEY",
  Bytes: b,
 })
 os.WriteFile("pub.pem", pub, 0600)
}
```

Go's crypto library is a joy to work with and the [implementation for `rsa.GenerateKey`](https://github.com/golang/go/blob/df08c9a82152fd6f2b2811db03b40fea8b6e5e9e/src/crypto/rsa/rsa.go#L239-L346) is worth peeking at. After calling it to generate our private key, we have a bunch of mathy bits that we need to represent somehow — enter Abstract Syntax Notation number One (ASN.1) and Distinguished Encoding Rules (DER).

ASN.1 is the syntax we express our key in (think a .proto file) and DER is how we encode it (think Protobuf wire format). For a more detailed explanation, [Let's Encrypt has a great article](https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/). After calling `x509.MarshalPKCS1PrivateKey` our private key is an ASN.1 DER encoded PKCS1 byte array 😅.

We still have one last step, however. Byte arrays aren't human readable and are difficult to copypasta. As we often do when transmitting binary data we need to Base64 encode our bytes. Slapping on a header (`-----BEGIN RSA PRIVATE KEY------`) and footer (`-----END RSA PRIVATE KEY-----`) to help parsers identify our content finally leaves us with our Privacy-Enhanced Mail (PEM) file. PEM is a standard container for certificates and keys and was created to send binary data over email without messing with their contents.

Since PKCS1 is specific to RSA our public key is serialized to Public Key Infrastructure X.509 (PKIX) which is a generic public key representation that includes information like the key algorithm. X.509 is the standard that defines the format for public key certificates like those used in your web browser. You can see above that the header is the generic `-----BEGIN PUBLIC KEY-----`.

## Time to sign

With our keys created, we are ready to use them to sign our message. We could sign the file in its entirety, but that would require the full file when verifying the signature. This is fine for small text files but when signing and uploading 3 gigabyte containers, it's much more efficient to hash the payload and sign the digest. That way all that's needed to verify a signature is the public key and the hash value. SHA-256 is most commonly used today for computing a message digest.

```bash
openssl dgst -sha256 -sign key.pem -out message.txt.sig message.txt
```

We can confirm our signing was successful by verifying the signature with the public key.

```bash
openssl dgst -sha256 -verify pub.pem -signature message.txt.sig message.txt
Verified OK
```

## Get transparent

Now that we have our signature, we can upload everything to the Rekor transparency log so others can find and verify it. Rekor supports a handful of [different distinct](https://github.com/sigstore/rekor/tree/main/pkg/types) types including Java JARs and RPM packages. The basic type is known as a [Rekord](https://github.com/sigstore/rekor/blob/b14714fb19061381159abf1858af2f43aeb4112e/pkg/types/rekord/v0.0.1/rekord_v0_0_1_schema.json) but since we signed the hash of our file we'll use a [Hashed Rekord](https://github.com/sigstore/rekor/blob/b14714fb19061381159abf1858af2f43aeb4112e/pkg/types/hashedrekord/v0.0.1/hashedrekord_v0_0_1_schema.json).

Most of the fields in Rekor's types require Base64 encoding, so let's store these values in environment variables to make writing the payload easier.

```bash
SIGSTORE_SIG_CONTENT=$(cat message.txt.sig | base64 | tr -d '\n')
SIGSTORE_PUBLIC_KEY=$(cat pub.pem | base64 | tr -d '\n')
SIGSTORE_HASH_CONTENT=$(shasum -a 256 message.txt | cut -d " " -f 1)
```

Next, we'll write out the payload to a file to make it easier to inspect and use in a request.

```bash
$ cat <<EOF > hashedrekord.json
{
  "apiVersion": "0.0.1",
  "kind": "hashedrekord",
  "spec": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "$SIGSTORE_HASH_CONTENT"
      }
    },
    "signature": {
      "content": "$SIGSTORE_SIG_CONTENT",
      "publicKey": {
        "content": "$SIGSTORE_PUBLIC_KEY"
      }
    }
  }
}
EOF
```

Do a quick sanity check that our payload was created successfully.

```bash
$ cat hashedrekord.json
{
  "apiVersion": "0.0.1",
  "kind": "hashedrekord",
  "spec": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "d8d321
…
```

We're now ready to send our data off to Rekor. Let's save the response to a file so we can poke around.

```bash
curl -X POST -H "Content-Type: application/json" --data-binary @hashedrekord.json https://rekor.sigstore.dev/api/v1/log/entries > response.json
```

The top-level key of the response will be the database shard ID (16 characters) + entry UUID (64 characters) in the transparency log.

```bash
# top level key
$ jq -r 'keys[0]' response.json
24296fb24b8ad77a7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e

# shard id
$ jq -r 'keys[0]' response.json | cut -c -16
24296fb24b8ad77a

# entry uuid
$ jq -r 'keys[0]' response.json | cut -c 17-
7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e
```

The entry UUID is actually the hash of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree) leaf node for our entry. I won't attempt to explain Merkle Trees in depth, but the basic idea is that inclusion of a node can be cryptographically verified all the way up to the root hash of the tree. [RFC 6962](https://datatracker.ietf.org/doc/html/rfc6962) explains how this works and we'll step through this verification in a bit. For now, let's see where this hash comes from.

The RFC states that the hash of a leaf node is SHA-256(0x00 || d(n)). That is, the SHA 256 sum of the hex byte 0x00 concatenated to the contents of the entry, which in our case is the Hashed Rekord. We can do this in bash with process substitution.

```bash
$ shasum -a 256 <(cat <(printf '\x00') <(jq -rcj '.' hashedrekord.json )) | cut -d ' ' -f 1
7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e
```

Now let's retrieve the entry from Rekor using this ID and save it to a file. If you inspect the contents, you'll notice a handful of new fields.

```bash
curl https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77a7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e > entry.json
```

First, let's check that our Hashed Rekord is in the body.

```bash
diff <(jq -rc '.[].body' entry.json | base64 -d) <(jq -rcj '.' hashedrekord.json)
```

The body matches, which confirms that our entry was created, but how would the recipient of our message go about verifying and proving that for themselves? That’s where our next step comes in.

## Trust but verify

Well, there are a few important things they must check:

* That the message digest matches the signature for the public key inside the Hashed Rekord. (We'll leave this as an exercise for you, dear reader: you can reverse the steps from earlier.)
* That we were in possession of the key when the message was signed. (You could check AWS/GCP KMS access logs)
* That the entry is indeed included in the transparency log. (RFC 6962)

The next thing that we can verify in the entry is the Signed Entry Timestamp. I'll leave this explanation to our friend Hayden Blauzvern:

> As a transparency log, Rekor provides cryptographic proofs of inclusion in a log. Fetching an inclusion proof requires querying the log. The log returns a checkpoint (signed tree head) as a commitment to the current state of the log and the inclusion proof.
>
> Requiring an online lookup for every entry that you're verifying could cause a lot of increased latency in a verifier, and requires that the log have very high availability. Ideally, Rekor could provide an inclusion proof that could be verified offline – Rekor does this with a "signed entry timestamp" (SET).
>
> An SET is a structure signed with the same private key that signs Rekor's checkpoints. It is a "promise" of inclusion. It does not contain cryptographic proof, but since it is signed by the log, the log is committing to including the entry. A verifier that trusts Rekor can verify the SET without needing to do an online lookup. Asynchronously, for additional assurances, a log monitor can verify that an entry is truly present in the log for each SET a verifier views.

We can start by fetching Rekor's current public key.

```bash
curl https://rekor.sigstore.dev/api/v1/log/publicKey > rekor.pub
```

Next we can pull the SET out of the entry into its own file.

```bash
jq -r '.[].verification.signedEntryTimestamp' entry.json | base64 -d > set.sig
```

The attestation and verification fields in the entry are not included in what is signed by the timestamping authority, so let's remove them.

```bash
jq -cj '.[] | del(.attestation, .verification)' entry.json > set.json
```

Finally, we can verify the SET.

```bash
$ openssl dgst -sha256 -verify rekor.pub -signature set.sig set.json
Verified OK
```

The last thing we need to verify is that our entry was actually included in the Merkle tree. As mentioned earlier, this is defined in [RFC 6962](https://www.rfc-editor.org/rfc/rfc6962). [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162) will eventually replace 6962 and the [pseudocode](https://datatracker.ietf.org/doc/rfc9162/#:~:text=2.1.3.2.%20%20Verifying%20an%20Inclusion%20Proof) is easier to follow (read through it first).

What follows is a bash implementation of this algorithm that I am equally proud of and upset by. It builds on everything we've covered so far with the addition of the `xxd` tool. `xxd` is used to convert between binary and hex and we use it to build up the binary representation of our tree nodes from the hashes in our entry. These hashes should eventually compute to the `rootHash`.

```bash
#!/usr/bin/env bash

set -euo pipefail

# https://datatracker.ietf.org/doc/rfc9162/#:~:text=2.1.3.2.%20%20Verifying%20an%20Inclusion%20Proof

entry=$(cat entry.json)
mapfile -t hashes < <(jq -rc '.[].verification.inclusionProof.hashes | .[]' <<< "$entry")
rootHash=$(jq -r '.[].verification.inclusionProof.rootHash' <<< "$entry")
startHash=$(shasum -a 256 <(cat <(printf '\x00') <(jq -r '.[].body' <<< "$entry" | base64 -d)) | cut -d ' ' -f 1)
logIndex=$(jq -r '.[].verification.inclusionProof.logIndex' <<< "$entry")
treeSize=$(jq -r '.[].verification.inclusionProof.treeSize' <<< "$entry")

if [[ $logIndex -ge $treeSize ]]; then
  echo "verification failed! log index larger than tree size"
  exit 1
fi

echo -e "0x00 || leaf\nstart: ${startHash}\n\n"
echo -e "want: ${rootHash}\n\n"

r="${startHash}"
fn="${logIndex}"
sn=$(( treeSize - 1 ))

for i in "${!hashes[@]}"
do
  if [[ $sn -eq 0 ]]; then
    echo "verification failed! tree is incomplete"
    exit 1
  fi

  lsb=$(( fn & 1 ))

  if [[ ($lsb -eq 1) || ($fn -eq $sn) ]]; then
    echo "0x01 || ${hashes[i]} || ${r}"
    r=$(shasum -a 256 <(cat <(printf '\x01') <(xxd -r -p <<< "${hashes[i]}") <(xxd -r -p <<< "${r}")) | cut -d ' ' -f 1)
    while [[ ($lsb -eq 0) || $fn -eq 0 ]]; do
      fn=$(( fn >> 1 ))
      sn=$(( sn >> 1))
      lsb=$(( fn & 1 ))
    done
  else
    echo "0x01 || ${r} || ${hashes[i]}"
    r=$(shasum -a 256 <(cat <(printf '\x01') <(xxd -r -p <<< "${r}") <(xxd -r -p <<< "${hashes[i]}")) | cut -d ' ' -f 1)
  fi
  fn=$(( fn >> 1 ))
  sn=$(( sn >> 1))
  echo -e "${r}\n\n"
done

if [[ "${r}" == "${rootHash}" ]]; then
  echo "verification successful! got: ${r} want: ${rootHash}"
  exit 0
else
  echo "verification failed! got: ${r} want: ${rootHash}"
  exit 1
fi
```

Running this monstrosity, we can see that verification was successful!

```
$ ./verify.sh
./verify.sh
0x00 || leaf
start: 7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e

want: b054e63c475d8751b14b51a54255918e4ae0aa26e0ee60c9c7ee3e333396c4ad

0x01 || 2fb6c414fe3710a0ca820e20a352d827e920ef94de1a62cf032f0b508583d343 || 7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e
16e4d477cd081846cd410daf07299d17056dc5b31f77c40a716e8520a0457b1c

0x01 || af8df402b3a2f95a2e11e693d0401237c23ab1ef29844ff5b122ef7b868eb802 || 16e4d477cd081846cd410daf07299d17056dc5b31f77c40a716e8520a0457b1c
6e76df3263704eccc1c047bbc1704bbf8071a817a0c5626a2308da7d9bf3cae9

0x01 || 54b4fb9c6af94d6c8c9361176de175cb26334f26cf0c2238c8dda23ca256f7b1 || 6e76df3263704eccc1c047bbc1704bbf8071a817a0c5626a2308da7d9bf3cae9
dff1cbc7728565c69328b8618b14fe7033baa5e8936098ec8933009c3988104e

0x01 || dff1cbc7728565c69328b8618b14fe7033baa5e8936098ec8933009c3988104e || 7e12ab8d4338713ca3a427db4eb41ecdbe3e6ae15fd490716409d8c89c63ae1d
6ad77f4dcac7a5d47d3087283129429d50cd2d9a4410f5d4900afd78e33ad40a

0x01 || 94cc41349e90789f7f80dce5df0339373749400539d41c8a3ecca485e3c92603 || 6ad77f4dcac7a5d47d3087283129429d50cd2d9a4410f5d4900afd78e33ad40a
4fdd278ae02e4cbae8dbc0650e4d3282e208ffec9603c68f73bcafe328488ac7

0x01 || a50a2b2e4a506dd075f59dab6db168164eb52e437756f53162f04be6ce0b5c3b || 4fdd278ae02e4cbae8dbc0650e4d3282e208ffec9603c68f73bcafe328488ac7
65cfed18ce41b642653912e86402b45d5df0109de29edbf0cb20c62f3444fdc0

0x01 || 65cfed18ce41b642653912e86402b45d5df0109de29edbf0cb20c62f3444fdc0 || 52f10e8d704883a11ed3f157d079afffd814f563d5c013d5752ea81744aac4b5
749a1795a60841356d1928b78af94814b127b7fea9aede093eb39b410e166f27

0x01 || a0441f106e6bb9ec4acc5f3126beea2ae60b721648c3c7ba741368458cef89c6 || 749a1795a60841356d1928b78af94814b127b7fea9aede093eb39b410e166f27
5d0ebe394bc76ddf46868b03466d3042b4efcb70760f997731ee6758c272208f

0x01 || 5d0ebe394bc76ddf46868b03466d3042b4efcb70760f997731ee6758c272208f || df2f19f10ed0def555c68cda80b4fdd8f535ba929c1cfc36d9c789732d20e305
9138f73ed31973bab8e005465ee04bec1cfb2a56e0f6eb9f316d964127c9877e

0x01 || 9138f73ed31973bab8e005465ee04bec1cfb2a56e0f6eb9f316d964127c9877e || 93663301e472c817961f75499d26844b246665d275538e5a24e16b065cda7afe
874589aee5388025c078a59e1f6e66ac65d185cdc766620860ba0680cfbd26bc

0x01 || c2ed30483aafe58267a6740c2fb76408eb6366ceb48c9f0509c0f2c04b101f05 || 874589aee5388025c078a59e1f6e66ac65d185cdc766620860ba0680cfbd26bc
0926480781b8d7bc2790d7e63972846bf98b79b47a1968a47f9c0992f319da44

0x01 || b593f43b0ca6048ca4e1564817b0381f25f66d6c6b205673d6e6bc1c582a02bd || 0926480781b8d7bc2790d7e63972846bf98b79b47a1968a47f9c0992f319da44
1af9b80f354a6c824fe9893f7278ce192dea39f4cb800707681947408b9f8c60

0x01 || b8f5ef19b43c82a6deee74a4b36c41a4b7f030d46f9862913ae5ab74177d7a34 || 1af9b80f354a6c824fe9893f7278ce192dea39f4cb800707681947408b9f8c60
b76bf4a5ee7dbf09372243c01c86d620fc3581e8c4b5659ce549b397ec9608bc

0x01 || 0b4e9c3dce66ce4f393b3b3ae5f141a0d20902538d5fc99bd030348672b69b81 || b76bf4a5ee7dbf09372243c01c86d620fc3581e8c4b5659ce549b397ec9608bc
31fcf995aaadf0cc7ce249b3ae06fb73653648c6279dd8401a75e59538a85718

0x01 || 9a991dc567e6dd4fa21d6235df691252ca81eab5e1301c849c8aa2151363e6a7 || 31fcf995aaadf0cc7ce249b3ae06fb73653648c6279dd8401a75e59538a85718
36a05fd84e2e4f497a41a3e6e633b59a49873d731e1d4e2e5c91ecb5ece28091

0x01 || 732af72ebcc0c8a16dbdba657c7b755d2097691d08882f308dbc5b133372c170 || 36a05fd84e2e4f497a41a3e6e633b59a49873d731e1d4e2e5c91ecb5ece28091
5219998b60322aa7e1aa3c02cf15bedc67d89876dfc46f1b89937c8e496aa947

0x01 || 2747468d0ed5e5b1138bba7b7968367a9842437d9004b3166391f115cb867d1e || 5219998b60322aa7e1aa3c02cf15bedc67d89876dfc46f1b89937c8e496aa947
b054e63c475d8751b14b51a54255918e4ae0aa26e0ee60c9c7ee3e333396c4ad

verification successful! got: b054e63c475d8751b14b51a54255918e4ae0aa26e0ee60c9c7ee3e333396c4ad want: b054e63c475d8751b14b51a54255918e4ae0aa26e0ee60c9c7ee3e333396c4ad
```

This is the same flow that the Rekor CLI will step through.

```
$ rekor-cli verify --uuid 24296fb24b8ad77a7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e

Current Root Hash: f0e0de7e6b03385bc086c46703b7a2abbbd16ae10fc28b3f480125b1898536fb
Entry Hash: 24296fb24b8ad77a7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e
Entry Index: 7155742
Current Tree Size: 2995354
Checkpoint:
rekor.sigstore.dev - 2605736670972794746
2995354
8ODefmsDOFvAhsRnA7eiq7vRauEPwos/SAElsYmFNvs=
Timestamp: 1668548431487913062

— rekor.sigstore.dev wNI9ajBEAiB/Lcxmn82//9QIwqVPbVSgzEAfACmAnZNLD9RuIH9QiAIgLToW3Bd8Y26Wwz3JuuZBsC1/IhUExSbu1NET/nzoajc=

Inclusion Proof:
SHA256(0x01 | 24296fb24b8ad77a7e53fd5d089af142b7909598d214e13ca76001cc575fddaad3210adbee86363e | 2fb6c414fe3710a0ca820e20a352d827e920ef94de1a62cf032f0b508583d343) =
        768fdb04aac9d523a34adbfeecd3268f920ff250ffc809867bae28bd10eb5f15
…
```

Stay spooky…

_Special thanks to [Appu Goundan](https://github.com/loosebazooka) and Hayden Blauzvern._

---

### How to install Cosign
_Path: open-source/sigstore/cosign/how-to-install-cosign.md_

_An earlier version of this material was published in the [Cosign chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@204b98f35bca48c194d1868e0356bef1/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2f0ad9cb8f124a39ab555ac8bf1a114c) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Cosign supports software artifact signing, verification, and storage in an OCI (Open Container Initiative) registry. By signing software, you can authenticate that you are who you say you are, which can in turn enable a trust root so that developers and consumers who leverage your software can verify that you created the software artifact that you have said you’ve created. They can also ensure that that artifact was not tampered with by a third party. As someone who may use software libraries, containers, or other artifacts as part of your development lifecycle, a signed artifact can give you greater assurance that the code or container you are incorporating is from a trusted source.

There are a few different ways to install Cosign to your local machine or remote server. The approach you choose should be based on the way you set up packages, the tooling that you use, or the way that your organization recommends. We will go through several options. Please refer to the [official Cosign installation documentation](https://docs.sigstore.dev/cosign/system_config/installation/) for additional context and updates.

## Installing Cosign with Homebrew or Linuxbrew

Those who are running macOS locally may be familiar with Homebrew as a package manager. There is also a [Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux) version for those running a Linux distribution. If you are using macOS and would like to leverage a package manager, you can review the [official documentation to install Homebrew](https://brew.sh/) to your machine.

To install Cosign with Homebrew, run the following command:

```sh
brew install cosign
```

To update Cosign in the future, you can run `brew upgrade cosign` to get the newest version.

## Installing Cosign with Linux package managers

Cosign is supported by the Arch Linux, Alpine Linux, and Nix package managers.

You can check to ensure that Cosign is successfully installed using the `cosign version` command following installation. When you run the command, you should receive output that indicates the version you have installed.

### Arch Linux

To install Cosign on Arch Linux, use the `pacman` package manager:

```sh
pacman -S cosign
```

### Alpine Linux

If you are using Alpine Linux or an Alpine Linux image, you can add Cosign with `apk`:

```sh
apk add cosign
```

### NixOS

For NixOS, you can install Cosign with the following command:

```sh
nix-env -iA nixpkgs.cosign
```

And for NixOS Linux, you can install Cosign using `nixos.cosign` with the `nix-env` package manager:

```sh
nix-env -iA nixos.cosign
```

### `dpkg` and `rpm`

On the [releases page](https://github.com/sigstore/cosign/releases), you’ll also find `.deb` and `.rpm` packages for manual download and installation.

Both examples in this section assume you've found the latest version of Cosign and set it to an environment variable named `LATEST_VERSION`:

```sh
LATEST_VERSION=$(curl https://api.github.com/repos/sigstore/cosign/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")
```

For Ubuntu and Debian distributions, download and install the latest `.deb` package:

```sh
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign_${LATEST_VERSION}_amd64.deb"
sudo dpkg -i cosign_${LATEST_VERSION}_amd64.deb
```

For CentOS and Fedora, download the latest `.rpm` package from the releases page and install Cosign with:

```sh
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-${LATEST_VERSION}-1.x86_64.rpm"
sudo rpm -ivh cosign-${LATEST_VERSION}-1.x86_64.rpm
```

## Installing Cosign with Go

You can install Cosign using the Go package manager. Installing with Go will work across different operating systems and distributions. First, check that you have Go installed on your machine, and ensure that it is Go version `1.22.7` or later:

```sh
go version
```

```output
go version go1.25.4 linux/amd64
```

If you run into an error or don’t receive output like the above, you’ll need to install Go in order to install Cosign with Go. Navigate to the official Go website in order to download the appropriate version of Go for your machine.

With Go installed, you are ready to install Cosign using the following command:

```sh
go install github.com/sigstore/cosign/v3/cmd/cosign@latest
```

The resulting binary from this installation will be placed at `$GOPATH/bin/cosign`.

### Installing a Cosign release with Go

You can install Cosign with Go directly from the [Cosign GitHub releases page](https://github.com/sigstore/cosign/releases).

At the time of writing, the newest release is [v3.1.3](https://github.com/sigstore/cosign/releases/tag/v3.1.3). You can download this version with the following command:

```sh
go install github.com/sigstore/cosign/v3/cmd/cosign@v3.1.3
```

The resulting binary from this installation will be placed at `$GOPATH/bin/cosign`. Check the [Cosign GitHub releases page](https://github.com/sigstore/cosign/releases) for additional releases.

## Installing Cosign with the Cosign binary

Installing Cosign via its binary offers you greater control over your installation, but this method also requires you to manage your installation yourself. In order to install via binary, check for the most updated version in the open source GitHub repository for Cosign under the [releases page](https://github.com/sigstore/cosign/releases).

You can use the `curl` command to install the most recent binary:

```sh
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
```

Next, move the Cosign binary to your bin folder:

```sh
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
```

Finally, update permissions so that Cosign can execute within your filesystem:

```sh
sudo chmod +x /usr/local/bin/cosign
```

You’ll need to ensure that you keep Cosign up to date if you install via binary. You can always later opt to use a package manager to update Cosign in the future.

---

### Verifying signatures in air-gapped environments
_Path: open-source/sigstore/cosign/verifying-in-air-gapped-environments.md_

Cosign verifies keyless signatures against the public Sigstore infrastructure, which an air-gapped environment can't reach. You can still verify signatures and attestations there. You need to carry two things across the air gap ahead of time: the Sigstore trust root, and the signatures themselves.

This guide uses Chainguard Containers as the example artifact, but the technique applies to any container image signed with Cosign.

## What Cosign needs from the network

A keyless verification normally makes three kinds of network request. Only the first blocks you in a disconnected environment:

- **The Sigstore trust root**, fetched over [The Update Framework](https://theupdateframework.io/) (TUF) from `tuf-repo-cdn.sigstore.dev`. Cosign refreshes this metadata on every verification, so an air-gapped run fails unless you supply the trust root from a file.
- **The registry**, to fetch the image and its signature. Inside the air gap, this is your internal registry or a directory on disk.
- **The Rekor transparency log**, to confirm the signature was logged. Cosign doesn't need this. A Chainguard signature carries a signed entry timestamp alongside it, which proves the log entry exists and which Cosign checks offline.

The last point matters: you keep transparency-log verification in an air-gapped environment. You don't need `--insecure-ignore-tlog`, and you shouldn't use it, because it discards a check that still works.

## Prerequisites

- [Cosign](/open-source/sigstore/cosign/how-to-install-cosign/) v3.0.3 or later, installed on both a connected machine and inside the air-gapped environment. Cosign v3.0.3 fixed several problems with offline verification. Earlier releases need different flags, so upgrade rather than work around them.
- A connected machine that can reach `cgr.dev` and the public Sigstore infrastructure.
- An approved way to move files into the air-gapped environment.

## Export the Sigstore trust root

Run this on the connected machine. `cosign initialize` downloads the current TUF metadata and writes it to a local cache:

```sh
cosign initialize
```

Copy the trust root out of that cache:

```sh
cp ~/.sigstore/root/tuf-repo-cdn.sigstore.dev/targets/trusted_root.json .
```

The file is about 7 KB. It holds the Fulcio certificate authorities, the Rekor transparency log keys, the certificate transparency log keys, and the timestamp authority certificates that Cosign checks a signature against.

{{< note >}}
Copying the whole `~/.sigstore` directory into the air-gapped environment doesn't work. Cosign refreshes its TUF metadata over the network on every verification, so a copied cache still fails. Pass the trust root as a file with `--trusted-root` instead.
{{< /note >}}

## Move the images and their signatures

A Cosign signature is a separate artifact in the registry, stored under a tag derived from the image digest. Copying an image alone leaves the signature behind, and verification inside the air gap then fails with `no signatures found`.

To see what's attached to an image, run `cosign tree` on the connected machine:

```sh
cosign tree cgr.dev/chainguard/go:latest
```

The output lists the signature and attestation tags attached to the image:

```
📦 Supply Chain Security Related artifacts for an image: cgr.dev/chainguard/go:latest
└── 💾 Attestations for an image tag: cgr.dev/chainguard/go:sha256-6be282d9e6dc....att
   ├── 🍒 sha256:475e95ecb3900fbf479c31b79527c8d1a8f85445dd44caaf21310fb8cd56fdad
   ├── 🍒 sha256:ae3c33f8f466481133b4826e165f09cdd11bb76a93f6a6af3429e41c887b0109
   └── 🍒 sha256:4f3c43079eed9885ebe77b787604e98ebf0f8020f61002efb70f5fda091ed27b
└── 🔐 Signatures for an image tag: cgr.dev/chainguard/go:sha256-6be282d9e6dc....sig
   └── 🍒 sha256:f0e210a4dfafc1188c7a9ab97b3e01082a7a9ebbbb98174292bedc8ddca71b61
```

Choose one of the following two transports.

### Option 1: Copy into a mirrored registry

Use `cosign copy`, which carries the image, its signatures, and its attestations together. For a multi-architecture image it also copies the per-platform signatures, which matters if the air-gapped environment pulls a single architecture:

```sh
cosign copy cgr.dev/chainguard/go:latest registry.internal/chainguard/go:latest
```

Confirm the signature arrived before you rely on the mirror:

```sh
cosign tree registry.internal/chainguard/go:latest
```

{{< note >}}
General-purpose copy tools don't carry Cosign signatures for Chainguard Containers. Chainguard stores signatures and attestations under `.sig` and `.att` tags rather than in the OCI referrers graph, so tools that walk referrers report success and copy the image bytes alone. Use `cosign copy`, or copy the `.sig` and `.att` tags explicitly.
{{< /note >}}

### Option 2: Save to a directory

If the air-gapped environment has no registry, `cosign save` writes the image and its attached artifacts to an OCI layout on disk:

```sh
cosign save cgr.dev/chainguard/go:latest --dir ./transfer
```

Move the `transfer` directory and `trusted_root.json` across the air gap together. On the other side you can verify the directory in place, or load it into a registry with `cosign load`.

## Verify inside the air-gapped environment

Pass the trust root with `--trusted-root`. Everything else matches a connected verification.

### Verify a mirrored image

```sh
cosign verify \
  --trusted-root ./trusted_root.json \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  registry.internal/chainguard/go:latest
```

A successful run reports the offline transparency-log check:

```
Verification for registry.internal/chainguard/go:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority certificates
```

{{< note >}}
The verified output still reports a `docker-reference` of `cgr.dev/chainguard/go`, even though you verified a mirrored copy. This is expected. The signature covers the image digest, not the registry it's served from.
{{< /note >}}

### Verify a saved directory

Point Cosign at the directory with `--local-image`:

```sh
cosign verify \
  --local-image \
  --trusted-root ./trusted_root.json \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  ./transfer
```

### Verify attestations

`cosign verify-attestation` works the same way. This example checks the SPDX SBOM attestation:

```sh
cosign verify-attestation \
  --trusted-root ./trusted_root.json \
  --type https://spdx.dev/Document \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  --certificate-identity=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main \
  registry.internal/chainguard/go:latest
```

### Verify images from a private registry

Images in your organization's registry are signed by your organization's `image-syncer` and `custom-image-builder` identities rather than by Chainguard's public signing identity. Resolve those identifiers on the connected machine, because `chainctl` needs to reach the Chainguard control plane:

```sh
PARENT=your-organization
IMAGE_SYNCER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.CATALOG_SYNCER')
CUSTOM_IMAGE_BUILDER=$(chainctl iam account-associations describe $PARENT -o json | jq -r '.[].chainguard.service_bindings.APKO_BUILDER')
```

Record both values and carry them across the air gap with the trust root. Verification then uses them in place of the public identity:

```sh
cosign verify \
  --trusted-root ./trusted_root.json \
  --certificate-oidc-issuer=https://issuer.enforce.dev \
  --certificate-identity-regexp="https://issuer.enforce.dev/(${IMAGE_SYNCER}|${CUSTOM_IMAGE_BUILDER})" \
  registry.internal/chainguard/go:latest
```

For more on these identities, see [Verifying Chainguard Containers and metadata signatures with Cosign](/chainguard/containers/how-to-use/verifying-chainguard-images-and-metadata-signatures-with-cosign/).

### Store signatures in a separate repository

Some registry layouts keep signatures apart from the images they sign. Set `COSIGN_REPOSITORY` to tell Cosign where to look:

```sh
export COSIGN_REPOSITORY=registry.internal/signatures
```

Without it, Cosign looks beside the image and reports `no signatures found`.

## Refresh the trust root

Sigstore rotates the keys and certificate authorities in the trust root from time to time. A trust root you exported months ago can fail to verify a signature made after a rotation.

Re-export `trusted_root.json` from a connected machine on the same schedule you use to refresh images, and move the two together. Treat the trust root as part of every transfer rather than as one-time setup.

## Re-signing with your own key

Some organizations verify Chainguard signatures on the connected side, then re-sign the images with an internally managed key before import. Inside the air gap, admission policies check only that internal key.

That's a decision about trust domains and key custody, not a technical requirement. The verification described earlier works with no outbound connectivity, so you can also keep verifying Chainguard's signatures directly. If you do re-sign, see [How to sign a container with Cosign](/open-source/sigstore/cosign/how-to-sign-a-container-with-cosign/).

## Troubleshooting

| Message | Cause |
|---------|-------|
| `tuf: failed to download 13.root.json` | Cosign tried to refresh TUF metadata over the network. Pass `--trusted-root`. |
| `no signatures found` | The signature wasn't copied with the image, or it lives in another repository. Check with `cosign tree` and set `COSIGN_REPOSITORY` if needed. |
| `none of the expected identities matched what was in the certificate` | The `--certificate-identity` or `--certificate-oidc-issuer` value doesn't match the signer. The error lists the subject that was found. |
| `Flag --offline has been deprecated` | Remove `--offline`. Supplying `--trusted-root` covers this case. |
| `if any flags in the group [local-image new-bundle-format] are set none of the others can be` | Remove `--new-bundle-format`. Older guides pair it with `--local-image`, which Cosign v3.0.3 rejects. |

## Learn more

For background on how Cosign verification works, read [An introduction to Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/). To verify Chainguard Containers in a connected environment, see [Verifying Chainguard Containers and metadata signatures with Cosign](/chainguard/containers/how-to-use/verifying-chainguard-images-and-metadata-signatures-with-cosign/). For mirroring Chainguard Containers into an internal registry, see the [pull-through guides](/chainguard/containers/chainguard-registry/pull-through-guides/).

---

### Cosign
_Path: open-source/sigstore/cosign/_index.md_

A Sigstore tool used to sign and verify software artifacts

---

### How to sign an SBOM with Cosign
_Path: open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign.md_

_An earlier version of this material was published in the [Cosign chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@204b98f35bca48c194d1868e0356bef1/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2f0ad9cb8f124a39ab555ac8bf1a114c) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

[Cosign](https://github.com/sigstore/cosign), developed as part of the [Sigstore project](https://www.sigstore.dev/), is a command line utility for signing, verifying, storing, and retrieving software artifacts through interface with an OCI (Open Container Initiative) registry. Cosign can be used to sign attestations, or a verifiable assertion or statement about a software artifact.

{{< details "What is an Attestation?" >}}
{{< blurb/attestation >}}
{{< /details >}}

One common use case for attestations is associating a software artifact, such as an OCI container image, with a [software bill of materials (SBOM)](/open-source/sbom/what-is-an-sbom/), an inventory of the components that make up a given software artifact. Increasingly, SBOMs are considered an essential component in maintaining a secure software supply chain.

{{< details "What is a Software Bill of Materials (SBOM?" >}}
{{< blurb/sbom >}}
{{< /details >}}

Including an SBOM with software you ship can help others trust the provenance and contents of the software. Including your SBOM as an attestation verifies that the SBOM was generated by the same trusted organization that created the software artifact, and that neither the artifact nor its associated metadata and documents have been tampered with.

In the following, we'll generate an SBOM and associate it with a specific OCI container using an attestation generated by Cosign.

## Creating a demonstration image

Since we'll be attaching an SBOM to a container image, we'll first need to create an example image. We'll base this image on Chainguard's [`wolfi-base`](/open-source/wolfi/overview/), and add a single additional package, the venerable `cowsay` utility that prints a message along with some ASCII art. We then set the entrypoint so that, when the image is run, a message will be displayed.

Create a new folder for our Dockerfile build and change your working directory to that folder:

```sh
mkdir -p ~/example-image && cd ~/example-image
```

Create a new `Dockerfile` in the folder using Nano or your preferred text editor:

```sh
nano Dockerfile
```

Paste the following commands into the file:

```Dockerfile
FROM cgr.dev/chainguard/wolfi-base
RUN apk add cowsay
ENTRYPOINT ["cowsay", "-f", "tux", "I love FOSS!"]
```

Save the file and close Nano by pressing `CTRL + X`, `y`, and `ENTER` in succession.

Since we'll be pushing to a repository on your Docker Hub account, let's set a variable to your Docker Hub username that we can use in further commands.

```sh
DH_USERNAME=<your-username>
```

You can find your username on your Docker Hub account page. If you're logged in on the command line, you can also run the following command to find your username:

```sh
docker info | sed '/Username:/!d;s/.* //' 2> /dev/null
```

Finally, let's build and tag the image with:

```sh
docker build . -t $DH_USERNAME/example-image
```

You can test out the image by running it:

```sh
docker run $DH_USERNAME/example-image
```

This will display the "I love FOSS!" message along with some ASCII art:

```output
 ______________
< I love FOSS! >
 --------------
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

```

## Generating an SBOM with Syft

[Syft](https://github.com/anchore/syft) is a tool that allows us to create SBOMs. If you don't already have Syft, use the following instructions to install this utility.

{{< details "How to Install Syft" >}}
{{% blurb/install_syft %}}
{{< /details >}}

Once you have Syft installed, you can generate an SBOM with the `syft` command, passing in the target image as an argument. For example, the following will use Syft to generate a list of packages present in the official `python` image on Docker Hub:

```sh
syft python
```

Now let's generate an SBOM for `example-image`, the image we built in the previous section. Run the following Syft command to generate an SBOM in SPDX format:

```sh
syft $DH_USERNAME/example-image:latest -o spdx-json > example-image.spdx.json
```

{{< details "What is SPDX?" >}}
{{% blurb/spdx %}}
{{< /details >}}

If you take a look at the contents of the file, you will find our installed package, `cowsay`, represented alongside the other packages already in our base image, `wolfi-base`. You can also check that `cowsay` is detected by Syft with the following:

```sh
syft --quiet $DH_USERNAME/example-image:latest | grep cowsay
```

```output
cowsay                  3.04-r4       apk
```

In the next section, we'll associate this SBOM with our container image using Cosign.

## Attesting to the SBOM

Now that we have our SBOM file, let's associate it with our image using an attestation. In this attestation, the image will be our subject, and the generated SBOM will serve as our predicate (an assertion about the subject). In this case, we will be attesting that the image contains the packages listed in our SBOM file.

Before proceeding, let's push our image to Docker Hub, since the following commands will refer to the image on the OCI repository.

```sh
docker push $DH_USERNAME/example-image
```

Our `example-image` still has attestations derived from our base image, since all Chainguard Containers come with SBOM and SLSA provenance attestations. Let's remove these attestations with the `cosign clean` command:

```sh
cosign clean $DH_USERNAME/example-image
```

We're now ready to add our attestation. Sigstore recommends referring to the image by digest and not by tag to avoid attesting to the wrong image, and attesting by tag will be removed in a future version of Cosign. The following command will set a variable to the digest of our newly pushed image:

```sh
DIGEST=$(docker inspect $DH_USERNAME/example-image |jq -c 'first'| jq .RepoDigests | jq -c 'first' | tr -d '"')
```

Alternatively, you can find the digest manually by visiting your repository on Docker Hub.

We can now attest using our image as the subject and our generated SBOM as the predicate:

```sh
cosign attest --type spdxjson \
 --predicate example-image.spdx.json \
 $DIGEST
```

You will receive the following prompt:

```output
Generating ephemeral keys...
Retrieving signed certificate...

    The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
    Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
    This may include the email address associated with the account with which you authenticate your contractual Agreement.
    This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N]
```

Note the warnings — a record of the attestation will be recorded to an immutable log maintained by the Sigstore project. When you're ready, press `y` to agree and attest.

## Verifying an attestation

Cosign can also be used to verify the identity of the person or entity issuing an attestation. The following assumes you used GitHub to authenticate when attesting in the previous step.

To verify that an attestation was issued by a specific entity, we use the `cosign verify-attestation` command, specifying the email address of the issuer:

```sh
cosign verify-attestation \
 --certificate-oidc-issuer=https://github.com/login/oauth \
 --type https://spdx.dev/Document \
 --certificate-identity=emailaddress@emailprovider.com \
 $DIGEST
```

If the identity is successfully verified, an initial message similar to the following is printed to `stderr`:

```
Verification for $DH_USERNAME/example-image@sha256:545a731e803b917daf44e292b03b427427f8090c4e6c4a704e4c18d56c38539f --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority certificates
Certificate subject: <you@domain.com>
Certificate issuer URL: https://github.com/login/oauth
```

The remainder of the message consists of an `in-toto attestation` envelope encoded in base64. If you wish, you can retrieve the predicate from this response:

```sh
cosign verify-attestation \
 --certificate-oidc-issuer=https://github.com/login/oauth \
 --type https://spdx.dev/Document \
 --certificate-identity=emailaddress@emailprovider.com \
 $DIGEST | \
 jq -r .payload | \
 base64 -d | jq .predicate
```

At this point, you have successfully created an image, generated an SBOM for that image, associated the SBOM with the image as an attestation, and verified the identity of the issuer of the attestation. Using this workflow, you can attest to the contents of images you create, allowing others to understand the provenance of software you ship and enabling others to verify that software artifacts and associated documents originate from you.

---

### An introduction to Cosign
_Path: open-source/sigstore/cosign/an-introduction-to-cosign.md_

_An earlier version of this material was published in the [Cosign chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@204b98f35bca48c194d1868e0356bef1/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2f0ad9cb8f124a39ab555ac8bf1a114c) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Cosign supports software artifact signing, verification, and storage in an OCI (Open Container Initiative) registry. While Cosign was developed with containers and container-related artifacts in mind, it can also be used for open source software packages and other file types. Cosign can therefore be used to sign blobs (binary large objects), files like READMEs, SBOMs (software bills of materials), Kubernetes Helm Charts, Tekton bundles (an OCI artifact containing Tekton CI/CD resources like tasks), and more.

By signing software, you can authenticate that you are who you say you are, which can in turn enable a trust root so that developers and consumers who leverage your software can verify that you created the software artifact that you have said you’ve created. They can also ensure that the artifact was not tampered with by a third party. As someone who may use software libraries, containers, or other artifacts as part of your development lifecycle, a signed artifact can give you greater assurance that the code or container you are incorporating is from a trusted source.

## Code signing with Cosign

Software artifacts are distributed widely, can be incorporated into the software of other individuals and organizations, and are often updated throughout their life spans. End users and developers who build upon existing software are increasingly aware of the possibility of threats and vulnerabilities in packages, containers, and other artifacts. How can users and developers decide whether to use software created by others? One answer that has been increasingly gaining traction is _code signing_.

While code signing is not new technology, the growing prevalence of software in our everyday lives coupled with a rising number of attacks like [SolarWinds](https://www.businessinsider.com/solarwinds-hack-explained-government-agencies-cyber-security-2020-12) and [Codecov](https://www.reuters.com/technology/codecov-hackers-breached-hundreds-restricted-customer-sites-sources-2021-04-19/) has created a more pressing need for solutions that build trust, prevent forgery and tampering, and ultimately lead to a more secure software supply chain.

Similar in concept to a signature on a document that was signed in the presence of a notary or other professional who can certify your identity, a signature on a software artifact attests that you are who you say you are and that the code was not altered after signing. Instead of a recognized notary when you sign software, it is a recognized **certificate authority** (CA) that validates your identity. These checks that go through recognized bodies able to establish a developer’s identity support the root of trust that security relies on so that bad actors cannot compromise software.

Code signing involves a developer, software publisher, or entity (like an automated workload) digitally signing a software artifact to confirm their identity and ensure that the artifact was not tampered with since having been signed. Code signing has several implementations, and Cosign is one such implementation, but all code signing technology follows a similar process as Cosign.

The recommended practice for a developer (or organization) looking to sign their code with Cosign is to use _keyless signing_. This process will first generate an ephemeral key pair which will then be used to create a digital signature for a given software artifact. A _key pair_ is a combination of a signing key to sign data, and a verification key that is used to verify data signed with the corresponding signing key. With the `cosign sign` command, the developer will sign their software artifact, and that signature will be stored in the registry (if applicable). This signature can later be verified by others through searching for an artifact, finding its signature, and then verifying it.

## Keyless signing

Code signing is a solution for many use cases related to attestation and verification with the goal of a more secure software supply chain. While key pairs are a technology standard that have a long history in technology (SSH keys, for instance), they create their own challenges for developers and engineering teams. The contents of a public key are very opaque; humans cannot readily discern who the owner of a given key is. Traditional public key infrastructure, or PKI, has done the work to create, manage, and distribute public-key encryption and digital certificates. A new form of PKI is keyless signing, which prevents the challenges of long-lived and opaque signing keys.

In keyless signing, short-lived certificates are generated and linked into the chain of trust through completing an identity challenge that confirms the identity of the signer. Because these keys persist only long enough for signing to take place, signature verification ensures that the certificate was valid at the time of signing. Policy enforcement is supported through an encoding of the identity information onto the certificate, allowing others to verify the identity of the developer who signed.

Through offering short-lived credentials, keyless signing can support the recommended practice of operating your build environment like a production environment. This prevents the opportunity for long-lived keys to be stolen and used to sign malicious artifacts. Even if these short-lived keys used in keyless signing were stolen, they’d be useless!

While keyless signing can be used by individuals in the same manner as long-lived key pairs, it is also well suited for continuous integration and continuous deployment workloads. Keyless signing works by sending an OpenID Connect (OIDC) token to a certificate authority like [Fulcio](/open-source/sigstore/fulcio/) to be signed by a workload’s authenticated OIDC identity. This allows the developer to cryptographically demonstrate that the software artifact was built by the continuous integration pipeline of a given repository, for example.

Cosign uses ephemeral keys and certificates, gets them signed automatically by the Fulcio root certificate authority, and stores these signatures in the [Rekor](/open-source/sigstore/rekor/) transparency log, which automatically provides an attestation at the time of creation.

You can manually create a keyless signature with the following `cosign` command. In our example, we’ll use [Docker Hub](https://hub.docker.com/) to store the signature. If you would like to follow along, ensure you are logged into Docker Hub on your local machine and that you have a Docker repository with an image available. The following example assumes a username of `docker-username` and a repository name of `demo-container`:

```sh
cosign sign docker-username/demo-container
```

You'll be taken through a workflow that requests you to grant permission to have your information stored permanently in transparency logs, and moves to a workflow with an OIDC provider:

```output
    The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
    Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
    This may include the email address associated with the account with which you authenticate your contractual Agreement.
    This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
Your browser will now be opened to:
...
```

At this point, a browser window will open and you will be directed to a page that asks you to log in to Sigstore. You can authenticate with GitHub, Google, or Microsoft. Note that the email address that is tied to these credentials will be permanently visible in the Rekor transparency log. This makes it publicly visible that you are the one who signed the given artifact, and helps others trust the given artifact. That said, it is worth keeping this in mind when choosing your authentication method. Once you log in and are authenticated, you’ll receive feedback of “`Sigstore Authentication Successful!`”, and you may now safely close the window.

If you followed along with Docker Hub, you can check the user interface of your repository and verify that you pushed a signature.

You can then further verify that the keyless signature was successful by using `cosign verify` to check. You will need to know some information in order to verify the entry. You'll need to use the identity flags `--certificate-identity` which corresponds to the email address of the signer, and `--certificate-oidc-issuer` which corresponds to the OIDC provider that the signer used. For example, a Gmail account using Google as the OIDC issuer, will be able to be verified with the following command:

```sh
cosign verify \
    --certificate-identity username@gmail.com \
    --certificate-oidc-issuer https://accounts.google.com \
    docker-username/demo-container
```

```output
Verification for index.docker.io/docker-username/demo-container:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority certificates

[{"critical":{"identity":{"docker-reference":"index.docker.io/docker-username/demo-container"},"image":{"docker-manifest-digest":"sha256:e..."},"type":"cosign container image signature"},"optional":{"1.3.6.1.4.1.57264.1.1":"https://accounts.google.com","Bundle":{"SignedEntryTimestamp":"...","Payload":{"body":"eyJhcGlWZX...X19","integratedTime":...,"logIndex":...,"logID":"..."}},"Issuer":"https://accounts.google.com","Subject":"username@gmail.com"}}]
```

As part of the JSON output, you should get feedback on the issuer that you used and the email address associated with it. For example, if you used Google as your OIDC provider, you will have `"Issuer":"https://accounts.google.com","Subject":"username@gmail.com"}}]` as the last part of your output.

## Cosign with keys

You can also use Cosign with long-lived key pairs. If you would like to follow along, please first [install Cosign](/open-source/sigstore/cosign/how-to-install-cosign/):

```sh
cosign generate-key-pair
```

```output
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
```

You can sign a container and store the signature in the registry with the cosign sign command:

```sh
cosign sign --key cosign.key docker-username/demo-container
```

```output
Enter password for private key:
Pushing signature to: index.docker.io/sigstore-course/demo:sha256-87ef60f558bad79beea6425a3b28989f01dd417164150ab3baab98dcbf04def8.sig
```

Finally, you can verify a software artifact against a public key with the cosign verify command. This command will return 0 if at least one Cosign formatted signature for the given artifact is found that matches the public key. Any valid formats are printed to standard output in a JSON format:

```sh
cosign verify --key cosign.pub docker-username/demo-container
```

```output
The following checks were performed on these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:87ef60f558bad79beea6425a3b28989f01dd417164150ab3baab98dcbf04def8"},"Type":"cosign container image signature"},"Optional":null}
```

You should now have some familiarity with the process of signing and verifying code in Cosign. For a more thorough tutorial, please review [How to sign a container with Cosign](/open-source/sigstore/cosign/how-to-sign-a-container-with-cosign/).

Code signing provides developers and others who release code a way to attest to their identity, and in turn, those who are consumers (whether end users or developers who incorporate existing code) can verify those signatures to ensure that the code is originating from where it is said to have originated, and check that that particular developer (or vendor) is trusted.

---

### How to sign a container with Cosign
_Path: open-source/sigstore/cosign/how-to-sign-a-container-with-cosign.md_

_An earlier version of this material was published in the [Cosign chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@204b98f35bca48c194d1868e0356bef1/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2f0ad9cb8f124a39ab555ac8bf1a114c) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Cosign is a tool you can use to sign software artifacts, which in turn allows you to verify that you are who you say you are, instilling trust across the software ecosystem. Signing software also allows people to understand the provenance of the software, and prevents tampering.

Let’s step through signing a container with Cosign. We are using a container to provide a sense of how you may use Sigstore with containerized workloads, but the steps we are taking to sign a container are very similar to the steps that we would take to sign any other software artifact that can be published in a container registry, and we will discuss signing blobs a little later.

## Prerequisites

Before beginning this section, ensure that you have Docker installed and that you are running Docker Desktop if that is relevant for your operating system. For guidance on installing and using Docker, refer to the [official Docker documentation](https://docs.docker.com/get-docker/). In order to push to the Docker container registry, you will need a [Docker Hub account](https://hub.docker.com/signup). If you are familiar with using a different container registry, feel free to use that.

Additionally, you will need Cosign installed, which you can achieve by following our [How to install Cosign guide](/open-source/sigstore/cosign/how-to-install-cosign/).

## Creating a container

You’ll now be creating a new container. Create a new directory within your user directory that is the same as your Docker username and, within that, a directory called `hello-container`. If you will be opting to use a registry other than Docker, feel free to use the relevant username for that registry:

```sh
mkdir -p ~/docker-username/hello-container
```

Move into the directory:

```sh
cd ~/docker-username/hello-container
```

Let’s create the Dockerfile that describes the container. This will be essentially a “Hello, World” container for demonstration purposes.

Use the text editor of your choice to create the Dockerfile. You can use [Visual Studio Code](https://code.visualstudio.com/) or a command line text editor like nano. Just ensure that the file is called exactly `Dockerfile` with a titlecase and no extension:

```sh
nano Dockerfile
```

Type the following into your editor:

```Dockerfile
FROM alpine
CMD ["echo", "Hello, Cosign!"]
```

This file is instructing the container to use the Alpine Linux distribution, which is lightweight and secure. Then, it prints a “Hello, Cosign!” message onto the command-line interface.

Once you are satisfied that your Dockerfile is the same as the text above, you can save and close the file. Now you are ready to build the container.

## Building and running a container

Within the same `hello-container` directory, you can build the container. You should use the format `docker-username/image-name` to tag your image, since you'll be publishing it to a registry:

```sh
docker build -t docker-username/hello-container .
```

If you receive an error message or a “failed” message, check that your user is part of the `docker` group and that you have the right permissions to run Docker. For testing, you may also try to run the above command with `sudo`.

You should get guidance in the output that your build was successful when you receive no errors:

```output
=> => naming to docker.io/docker-username/hello-container
```

At this point your container is built and you can verify that the container is working as expected by running the container:

```sh
docker run docker-username/hello-container
```

You should receive the expected output of the echo message you added to the Dockerfile:

```output
Hello, Cosign!
```

You can further confirm that the Docker container is among your listed containers by listing all of your active containers:

```sh
docker ps -a
```

```output
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                     PORTS     NAMES
c828db494203   hello-container   "echo 'Hello, Cosign…"   13 seconds ago   Exited (0) 9 seconds ago             confident_lamarr
```

Your output will be similar to the above, but the timestamps and name will be different.

Now that you have built your container and are satisfied that it is working as expected, you can publish and sign your container.

## Publishing a container to a registry

We will be publishing our container to the Docker registry. If you are opting to use a different registry, your steps will be similar.

At this point, you can access the Docker container registry at [hub.docker.com](https://hub.docker.com/) and create a new repository under your username called `hello-container`. We will be making this public, but you can make it private if you prefer. If you are happy for it to be public, you can skip this step as the repository will be created when pushing the container. In any case, you can delete this once you are satisfied that you have signed the container.

Once this is set up, you can push the container you created to the Docker Hub repository:

```sh
docker push docker-username/hello-container
```

You should be able to now access your published container via your Docker Hub account. Once you ensure that this is there, you are ready to push a signature to the container.

## Signing a container and pushing the signature to a registry

Now that the container is in a registry (in our example, it is in Docker Hub), you are ready to sign the container and push that signature to the registry.

You will call your registry user name and container name with the following `cosign` command. Note that we are signing the image in Docker Hub keylessly with Cosign:

```sh
cosign sign docker-username/hello-container
```

You will be asked to verify that you agree with having your information in the transparency log and will be taken through an OIDC workflow:

```output
    The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
    Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
    This may include the email address associated with the account with which you authenticate your contractual Agreement.
    This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
Your browser will now be opened to:
...
```

In the case of Docker Hub, on the web interface there should be a SHA (secure hash algorithm) added to the tag, enabling you to confirm that your pushed signature was registered. We’ll now manually verify the signature with Cosign.

## Verify a container’s signature

We’ll be demonstrating this on the container we just pushed to a registry, but you can also verify a signature on any other signed container using the same steps. While you will more likely be verifying signatures in workloads versus manually, it is still helpful to understand how everything works and is formatted.

Let’s use Cosign to verify that the signature exists on the transparency log and matches our expected information. You will need to know some information in order to verify the entry. You'll need to use the identity flags `--certificate-identity` which corresponds to the email address of the signer, and `--certificate-oidc-issuer` which corresponds to the OIDC provider that the signer used. For example, a Gmail account using Google as the OIDC issuer, will be able to be verified with the following command:

```sh
cosign verify \
    --certificate-identity username@gmail.com \
    --certificate-oidc-issuer https://accounts.google.com \
    docker-username/hello-container
```

Here, we are passing the public key contained in the cosign.pub file to the `cosign verify` command.

You will receive output indicating that the Cosign claims were validated:

```output
Verification for index.docker.io/docker-username/hello-container:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"index.docker.io/docker-username/hello-container"},"image":{"docker-manifest-digest":"sha256:690ecfd885f008330a66d08be13dc6c115a439e1cc935c04d181d7116e198f9c"},"type":"cosign container image signature"},"optional":null}]
```

The whole output will include JSON format which includes the digest of the container image, which is how we can be sure these detached signatures cover the correct image.

---

### How to sign blobs and standard files with Cosign
_Path: open-source/sigstore/cosign/how-to-sign-blobs-with-cosign.md_

_An earlier version of this material was published in the [Cosign chapter](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@204b98f35bca48c194d1868e0356bef1/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2f0ad9cb8f124a39ab555ac8bf1a114c) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

Cosign can sign more than just containers. Blobs, or binary large objects, and standard files can be signed in a similar way. You can publish a blob or other artifact to an OCI (Open Container Initiative) registry with Cosign. This tutorial assumes you have a Cosign key pair set up, which you can achieve by following our [Introduction to Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/) guide.

Navigate to the directory which contains your `cosign.pub` and `cosign.key` key pair as generated in the [Introduction to Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/#cosign-with-keys) guide. We’ll create an artifact (in this case, a standard file that contains text). We’ll call the file `artifact` and fill it with the “hello, cosign” text:

```sh
echo "hello, cosign" > artifact
```

Cosign offers support for signing blobs with the `cosign sign-blob` and `cosign verify-blob` commands. To sign our file, we’ll pass our signing key and the name of our file to the `cosign sign-blob` command:

```sh
cosign sign-blob --key cosign.key --bundle artifact.sigstore.json artifact
```

Note that this command includes the `--bundle` flag, which writes everything required to verify the blob to a file named `artifact.sigstore.json`.

You’ll get output similar to the following, including prompts asking you to confirm that you'd like to sign the artifact and to enter your password for your signing key:

```output
Are you sure you would like to continue? [y/N] y
Enter password for private key:
Using payload from: artifact
Wrote bundle to file artifact.sigstore.json
```

You'll need your signature, which this command writes to the `artifact.sigstore.json` bundle, to verify the artifact signature. Retrieve it with the following command:

```sh
cat artifact.sigstore.json | jq | grep signature
```

```output
   "signature": "MEQCI************************************************************************************G0knw=="
```

With this signature in hand, run the `cosign verify-blob` command and pass in the public key, the signature, and the name of your file:

```sh
cosign verify-blob --key cosign.pub --signature MEQCI************************************************************************************G0knw== artifact
```

Note that the full signature must be passed to this command. You’ll get feedback that the blob’s signature was verified:

```output
Verified OK
```

You can also publish the artifact to a container registry such as Docker Hub and sign the artifact’s generated image with Cosign. Running this command will create a new repository in your Docker Hub account . We will call this `artifact` but you can use any name you choose:

```sh
cosign upload blob -f artifact docker-username/artifact
```

You’ll receive feedback that the file was uploaded, and it will already have the SHA signature as part of the artifact:

```output
Uploading file from [artifact] to [index.docker.io/docker-username/artifact:latest] with media type [text/plain]
File [artifact] is available directly at [index.docker.io/v2/docker-username/artifact/blobs/sha256:dcf8ff…
Uploaded image to:
index.docker.io/docker-username/artifact@sha256:d10846…
```

Being able to sign blobs provides you with the opportunity to sign README files and scripts rather than just containers. This can ensure that every piece of a software project is accounted for through signatures and provenance.

---

### Policy Controller
_Path: open-source/sigstore/policy-controller/_index.md_

A Kubernetes admission controller used to validate signatures and attestations on container images as well as enforce policies using CUE or Rego languages.

---

### How to install Sigstore Policy Controller
_Path: open-source/sigstore/policy-controller/how-to-install-policy-controller.md_

The [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) is a Kubernetes [admission controller](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/) that can verify image signatures and policies. You can define policies using the [CUE](https://cuelang.org/) or [Rego](https://www.openpolicyagent.org/docs/latest/policy-language/) policy languages.

This guide will demonstrate how to install the Policy Controller in your Kubernetes cluster and enable policy enforcement.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* The [Helm](https://helm.sh) command line tool to install the Policy Controller.

Once you have everything in place you can continue to the next step and install the Policy Controller.

## Step 1 — Creating the `cosign-system` Kubernetes namespace

The first step that you need to complete is to create a Kubernetes `namespace` for the Policy Controller to run in. Call it `cosign-system` and run the following command to create it:

```bash
kubectl create namespace cosign-system
```

Now you can move on to the next step, which is installing the Policy Controller into the namespace you just created.

## Step 2 — Installing the Policy Controller

In this step we'll use the `helm` command line tool to install the Policy Controller.

First, add the [Sigstore Helm Repository](https://sigstore.github.io/helm-charts) to your system with the following command:

```bash
helm repo add sigstore https://sigstore.github.io/helm-charts
```

You should receive output like this:

```output
"sigstore" has been added to your repositories
```

Next, update your local Helm repository information using the `helm repo update` command:

```bash
helm repo update
```

You'll receive output like the following:

```output
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "sigstore" chart repository
Update Complete. ⎈Happy Helming!⎈
```

Now install the Policy Controller into the `cosign-system` namespace that you created in the first step of this guide:

```bash
helm install policy-controller -n cosign-system sigstore/policy-controller --devel
```

The `--devel` flag will include any alpha, beta, or release candidate versions of a chart. You can specify a particular version with the `--version` flag if you prefer.

It may take a few minutes for your cluster to deploy all of the manifests needed for the Policy Controller. Check the status of your cluster using the `kubectl wait` command like this:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

Once the Policy Controller deployments are done you will receive output like the following:

```output
deployment.apps/policy-controller-webhook condition met
deployment.apps/policy-controller-policy-webhook condition met
```

A full list of the resources that the Policy Controller deploys into your cluster is available at the end of this guide in [Appendix — Resource types](#appendix--resource-types).

You have now deployed the Policy Controller into your cluster. The next step is to enable it for the namespaces that you want to enforce policies in.

## Step 3 — Enabling the Policy Controller

Now that you have the Policy Controller installed into your cluster, the next step is to decide which namespaces should use it. By default, namespaces must enroll into enforcement, so you will need to label any namespace that you will use with the Policy Controller.

Run the following command to include the `default` namespace in image validation and policy enforcement:

```bash
kubectl label namespace default policy.sigstore.dev/include=true
```

Apply the same label to any other namespace that you want to use with the Policy Controller.

Now you can test enforcement by running a sample pod:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

The Policy Controller will deny the admission request with a message like the following:

```output
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
cgr.dev/chainguard/nginx@sha256:628a01724b84d7db2dc3866f645708c25fab8cce30b98d3e5b76696291d65c4a
```

The image is not admitted into the cluster because there are no `ClusterImagePolicy` (CIP) definitions that match it. In the next step you will define a policy that allows specific images and apply it to your cluster.

## Step 4 — Defining a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

The following policy will allow any [Chainguard Image](https://www.chainguard.dev/chainguard-images) hosted on the `cgr.dev/chainguard` registry to run on a cluster, while denying any other images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```yaml
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: chainguard-image-policy
spec:
  images:
    - glob: "cgr.dev/chainguard/**"
  authorities:
    - static:
        action: pass
```

The `glob: "cgr.dev/chainguard/**"` line in combination with the `action: pass` portion of the `authorities` section will allow any image in the `cgr.dev/chainguard` image registry to be admitted into your cluster.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```output
clusterimagepolicy.policy.sigstore.dev/chainguard-image-policy created
```

Now run the `cgr.dev/chainguard/nginx:latest` image again:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since the image matches the policy, you will receive a message that the pod was created successfully:

```output
pod/nginx created
```

Delete the pod once you're done experimenting with it:

```shell
kubectl delete pod nginx
```

To learn more about how the Policy Controller admits images, review the [Admission of images page](https://docs.sigstore.dev/policy-controller/overview/#admission-of-images) Sigstore documentation.

## Appendix — Resource types

A complete Policy Controller installation consists of the following resources in a cluster:

| Type | Name |
| ---------- | ----- |
| ClusterRole | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| ClusterRoleBinding | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| ConfigMap | `config-image-policies` |
| | `config-policy-controller` |
| | `policy-controller-policy-webhook-logging` |
| | `policy-controller-webhook-logging` |
| CustomResourceDefinition | `clusterimagepolicies.policy.sigstore.dev` |
| Deployment | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| MutatingWebhookConfiguration | `defaulting.clusterimagepolicy.sigstore.dev` |
| | `policy.sigstore.dev` |
| Role | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| RoleBinding | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| Secret | `policy-webhook-certs` |
| | `webhook-certs` |
| Service | `policy-webhook` |
| | `policy-controller-policy-webhook-metrics` |
| | `policy-controller-webhook-metrics` |
| | `webhook` |
| ServiceAccount | `policy-controller-policy-webhook` |
| | `policy-controller-webhook` |
| ValidatingWebhookConfiguration | `validating.clusterimagepolicy.sigstore.dev` |
| | `policy.sigstore.dev` |

---

### Disallowing unsafe sysctls
_Path: open-source/sigstore/policy-controller/policies/disallowing-unsafe-sysctls-with-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to only allow pods that use `sysctls` to modify kernel behaviour to run with the [safe set](https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/#safe-and-unsafe-sysctls) of parameters. You will create a `ClusterImagePolicy` that uses the [CUE](https://cuelang.org/) language to examine a pod spec that uses sysctls, and only allow admission into a cluster if the pod is running a safe set parameters.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image docker.io/ubuntu ubuntu
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
index.docker.io/library/ubuntu@sha256:854037bf6521e9c321c101c269272f756e481fb5f167ae032cb53da08aebcd5a
```

In the next step, you will define a `ClusterImagePolicy` that verifies a pod spec is using safe sysctl parameters.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: unsafe-sysctls-mask-cue
spec:
  match:
  - version: "v1"
    resource: "pods"
  images: [glob: '**']
  authorities: [static: {action: pass}]
  mode: enforce
  policy:
    includeSpec: true
    type: "cue"
    data: |
      spec: {
        securityContext:
          sysctls: [...{
            name: "kernel.shm_rmid_forced" |
                  "net.ipv4.ip_local_port_range" |
                  "net.ipv4.ip_unprivileged_port_start" |
                  "net.ipv4.tcp_syncookies" |
                  "net.ipv4.ping_group_range"
          }]
      }
```

This policy will ensure that any pod that has a sysctl defined in its spec will only be admitted if it matches a parameter from the list.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/unsafe-sysctls-mask-cue
```

Next, you will test the policy with a failing pod spec. Once you have confirmed that the admission controller is rejecting pods using unsafe sysctls, you'll create a pod with a safe parameter and admit it into your cluster.

## Step 3 — Testing the `ClusterImagePolicy`

Now that you have a policy defined, you can test that it successfully rejects or accepts admission requests.

Use `nano` or your preferred editor to create a new file `/tmp/pod.yaml` and copy in the following pod spec that uses an unsafe sysctl:

```
apiVersion: v1
kind: Pod
metadata:
  name: yolo
spec:
  securityContext:
    sysctls:
    - name: kernel.msgmax
      value: "65536"
  containers:
  - name: "app"
    image: docker.io/ubuntu
```

Apply the pod spec and check for the Policy Controller admission denied message:

```
kubectl apply -f /tmp/pod.yaml
```

```
Error from server (BadRequest): error when creating "/tmp/pod.yaml": admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: unsafe-sysctls-mask-cue: spec.containers[0].image
index.docker.io/library/ubuntu@sha256:854037bf6521e9c321c101c269272f756e481fb5f167ae032cb53da08aebcd5a failed evaluating cue policy for ClusterImagePolicy: failed to evaluate the policy with error: spec.securityContext.sysctls.0.name: 5 errors in empty disjunction: (and 5 more errors)
```

The first line shows the error message and the failing `ClusterImagePolicy` name. The second line contains the image ID, along with the specific CUE error message showing the policy violation.

Edit the `/tmp/pod.yaml` file and change the `sysctls` section to use the following safe parameter:

```yaml
sysctls:
- name: net.ipv4.tcp_syncookies
  value: "1"
- name: net.ipv4.tcp_syncookies
  value: "1"
```

```

Save and apply the spec:

```

kubectl apply -f /tmp/pod.yaml

```

The pod will be admitted into the cluster with the following message:

```

pod/yolo created

```

Since the `net.ipv4.tcp_syncookies` sysctl is considered safe and only runs in specific Kubernetes namespaces, the Policy Controller evaluates the pod spec against the CUE policy and admits the pod into the cluster.

Delete the pod once you're done experimenting with it:

```

kubectl delete pod yolo

```

---

### Disallowing run as root user
_Path: open-source/sigstore/policy-controller/policies/disallowing-run-as-root-user-with-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to prevent running containers as the `root` user in a Kubernetes cluster. You will create a `ClusterImagePolicy` that uses the [CUE](https://cuelang.org/) language to examine a pod spec, and only allow admission into a cluster if the pod is running as a non-root user.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
cgr.dev/chainguard/nginx@sha256:628a01724b84d7db2dc3866f645708c25fab8cce30b98d3e5b76696291d65c4a
```

In the next step, you will define a policy that ensures pods do not run as the root user and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: disallow-runasuser-root-cue
spec:
  match:
  - version: "v1"
    resource: "pods"
  images: [glob: '**']
  authorities: [static: {action: pass}]
  mode: enforce
  policy:
    includeSpec: true
    type: "cue"
    data: |
      spec: {
        initContainers: [...{
          securityContext: {
            runAsUser: != 0
          }
        }]
        containers: [...{
          securityContext: {
            runAsUser: != 0
          }
        }]
        ephemeralContainers: [...{
          securityContext: {
            runAsUser: != 0
          }
        }]
      }
```

This policy will ensure that any kind of container in a pod spec will only be admitted if the user is not root.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/disallow-runasuser-root-cue
```

Next you will test the policy with a failing pod spec. Once you have confirmed that the admission controller is rejecting pods running as root, you'll create a pod that runs as a non-root user and admit it into your cluster.

## Step 3 — Testing a `ClusterImagePolicy`

Now that you have a policy defined, you can test that it successfully rejects or accepts admission requests.

Use `nano` or your preferred editor to create a new file `/tmp/pod.yaml` and copy in the following pod spec that runs as root:

```
apiVersion: v1
kind: Pod
metadata:
  name: yolo
spec:
  containers:
  - name: "app"
    image: docker.io/ubuntu
    securityContext:
      # Violates restricted-capabilities
      runAsUser: 0
```

Apply the pod spec and check for the Policy Controller admission denied message:

```
kubectl apply -f /tmp/pod.yaml
```

```
Error from server (BadRequest): error when creating "/tmp/pod.yaml": admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: disallow-runasuser-root-cue: spec.containers[0].image
index.docker.io/library/ubuntu@sha256:2adf22367284330af9f832ffefb717c78239f6251d9d0f58de50b86229ed1427 failed evaluating cue policy for ClusterImagePolicy: failed to evaluate the policy with error: spec.containers.0.securityContext.runAsUser: invalid value 0 (out of bound !=0)
```

The first line shows the error message and the failing `ClusterImagePolicy` name. The second line contains the image ID, along with the specific CUE error message showing the policy violation.

Edit the `/tmp/pod.yaml` file and change the `runAsUser` setting to use a non-root user:

```
    - runAsUser: 65532
```

Save and apply the spec:

```
kubectl apply -f /tmp/pod.yaml
```

The pod will be admitted into the cluster with the following message:

```
pod/yolo created
```

Since the pod spec now uses a non-root user to run its processes, the Policy Controller evaluates the pod spec against the CUE policy and admits the pod into the cluster.

Delete the pod once you're done experimenting with it:

```
kubectl delete pod yolo
```

---

### Rego policies
_Path: open-source/sigstore/policy-controller/policies/chainguard-enforce-rego-policies.md_

The [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) supports the [Rego Policy Language](https://www.openpolicyagent.org/docs/latest/policy-language/), which is a declarative policy language that is used to evaluate structured input data such as Kubernetes manifests and JSON documents. This feature enables users to apply policies that can evaluate Kubernetes admission requests and object metadata to make comprehensive decisions about the workloads that are admitted to their clusters. Rego support also enables users to enhance existing cloud-native policies by adding additional software supply chain security checks.

If you would like to write a Rego policy from scratch, or learn more about how to use this format, you can follow this guide.

## Rego policy template

```bash
# Copyright 2022 Chainguard, Inc.
# SPDX-License-Identifier: Apache-2.0

apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: my-rego-policy

spec:
  images: [glob: '**']
  authorities: [static: {action: pass}]
  mode: warn
  policy:
    includeSpec: true
    type: rego
    data: |
      package sigstore
      default isCompliant = false
      isCompliant {

        # Rego logic goes here; must evaluate to true for policy to pass

      }
```

In this policy, you should change the `name` to be meaningful to you. The `spec` fields are defined at [ClusterImagePolicySpec](https://github.com/sigstore/policy-controller/blob/main/docs/api-types/index.md#clusterimagepolicyspec). By default, this policy will apply to all images, as noted with the `glob: '**'` parameter. If we keep this as is, this means that we are evaluating everything running in our cluster.

The `authorities` field is used in evaluating image signatures. Since we aren’t using signatures in this policy, we will set it to pass. This will be a common setting in Rego-based policies unless you are also evaluating signatures simultaneously.

The policy is being implemented in `warn` mode, which can generate an alert through `CloudEvents` to notify administrators of violations without blocking deployments. You can alternatively use `mode: enforce` to block deployments that violate the policy.

The Rego policy itself is defined within the `policy` section. The first requirement is to include the input data that is to be evaluated. By default, the image in the registry is available. To include additional metadata, one of more of the following should be set:

* `includeSpec:` allows you to access the fields in the `spec` portion of the Kubernetes manifest, including the container configuration, image names, replicas, resources, and more.
* `includeObjectMeta:` allows you to access the fields in the `metadata:` portion of the manifest, including the object’s name and labels.
* `includeTypeMeta:` allows access to the top level fields in the manifest, such as the `kind` and `apiVersion`.
* `fetchConfigFile:` fetches the OCI config file from the registry, which contains metadata about the image in the registry.

Rego policies must specify `type: rego` and the `data` field must contain `package sigstore`.

For the policy to pass, the `isCompliant` field must evaluate to `true` within the curly braces. The `isCompliant` Boolean is set to `false` by default, and the logic in the braces must flip the boolean to `true` for the policy to pass.

If you define multiple conditions within the `isCompliant` braces, these can be combined using the `AND` keyword to the Boolean logic, meaning that each condition must pass for `isCompliant` to resolve to `true`. You can also define multiple evaluations (meaning, multiple sets of `isCompliant` braces) in the same policy. You would combine these in your policy with the `OR` keyword, meaning that if _any_ of the stated conditions evaluate to `true`, then the `isCompliant` Boolean will _also_ be `true`.

This same structure must be present in all Rego-based policies.

## Rego policy to check metadata labels

You can set a Rego policy to ensure that it is compliant with certain labels within your metadata.

For example, within the production environment (with the "production" label) you can ensure that the compliance team is the approver.

```sh
      isCompliant {

        input.metadata.labels.env == "production"
        input.metadata.labels.approved-by == "compliance-team"
      }
```

Here, the policy is requiring and checking that the labels exist in the `ObjectMeta` data. This policy will evaluate to true only if both labels exist in the metadata portion of the manifest.

## Rego policy to check Kubernetes pod security

As a cluster-level resource, a Kubernetes Pod Security Policy allows a cluster administrator to control security-sensitive aspects of a Pod's specification. This defines a set of conditions that a Pod must meet so that it can be allowed into the cluster. You can think of it as a built-in admission controller which enforces security policies on Pods across a cluster.

This policy checks to make sure our Pod security specifications are properly set.

 ```sh
       isCompliant {

        input.spec.hostNetwork == "false"
        input.spec.hostPID == "false"
        input.spec.hostIPC == "false"
      }
```

Here, `hostNetwork` refers to the host's networking namespace, `hostPID` refers to the host process ID namespace, and `hostPIC` refers to the IPC (interprocess communication) namespace.

This policy will pass if all the restricted values are set to `false`.

## Rego Policy that Disallows Specified Images

In some cases, you may want to evaluate an item elsewhere in the manifest, such as an image source that is included within the container specs of the same manifest. For example, a manifest may have a snippet with a disallowed NGINX image from Docker Hub:

```sh
spec:
  containers:
  - name: "your-container-name"
    image: nginx:latest
  - name: "another-container-name"
    image: nginx
```

In this case, within the `policy` section of your Rego policy, you’ll need to iterate over the image array and check all the relevant fields for the restricted value. You can use the `[_]` syntax to iterate through the array. You can use the `not` keyword in conjunction with the `contains()` built-in function to evaluate all the items within the array.

```sh
      isCompliant {

        result:= input.spec.containers.image[_]
        not contains(result,"docker.io")

      }
```

This policy will not admit Pods that come from docker.io.

## Rego Policy that Disallows Privilege Escalation in Pods

This example Rego policy will disallow privilege escalation in Pods following the [Kubernetes Pod Security Baseline](https://kubernetes.io/docs/concepts/security/pod-security-standards/) Standard. The Baseline Standard is a minimally restrictive policy which prevents known privilege escalations and allows the default and minimally specified Pod configuration.

```sh
      isCompliant {

        filteredContainers = [c | c := input.spec.containers[_]; c.securityContext.allowPrivilegeEscalation == true ]
        filteredInitContainers = [c | c := input.spec.initContainers[_]; c.securityContext.allowPrivilegeEscalation == true ]
        filteredEphemeralContainers = [c | c := input.spec.ephemeralContainers[_]; c.securityContext.allowPrivilegeEscalation == true ]
        (count(filteredContainers) + count(filteredInitContainers) + count(filteredEphemeralContainers)) == 0

      }
```

Setting the `allowPrivilegeEscalation` Boolean controls whether a process can gain more privileges than its parent process. This value will evaluate to `true` when the container is run as privileged. You can review more information about [how to configure a security context for a Pod or Container](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) on the Kubernetes docs.

This Rego policy shows a method of declaring a variable and using it to count up all the instances of privilege escalation across Pod types, and evaluate that the final count is `0` in order for the policy to pass.

## Rego Policy that Checks Maximum Age of Images

This example Rego policy checks the maximum age (in days) allowed for an image running in your cluster. Policy Controller measures this through the `created` field of a container image's configuration. This ensures that your images are regularly updated and maintained.

Note that some build tools may fail this check due to using a fixed time (like the Unix epoch) for creation in their reproducible builds. However, many of these tools support specifying `SOURCE_DATE_EPOCH`, which aligns creation time with the date of the source commit.

```sh
  policy:
    fetchConfigFile: true
    type: "rego"
    data: |
      package sigstore

      nanosecs_per_second = 1000 * 1000 * 1000
      nanosecs_per_day = 24 * 60 * 60 * nanosecs_per_second

      # Change this to the maximum number of days you would like to allow
      maximum_age = 30 * nanosecs_per_day

      default isCompliant = false
      isCompliant {
        created := time.parse_rfc3339_ns(input.config[_].created)
        time.now_ns() < created + maximum_age
      }
```

Here, the policy defines a variable for the `maximum_age`, in this case set to `30`, which you can change to the number of days old you would permit an image to be.

Within the `isCompliant` braces, the Rego policy leverages `time` to evaluate whether the current time is less than the maximum allowed age. To review the different methods of implementing `time` within Rego, review the [Time reference documentation](https://www.openpolicyagent.org/docs/latest/policy-reference/#time).

## Rego Policies that Define Custom Error and Warning Messages

Rego policies have the added benefit of allowing you to define custom error and warning messages.

This example `attestations` block requires clusters to have a vulnerability report in order to be deemed compliant. Notice, though, that it also defines an `errorMsg` string.

```
  attestations:
    - name: must-have-vuln-report
      predicateType: vuln
      policy:
        type: rego
        data: |
          package sigstore
          isCompliant[response] {
            result = (input.predicateType == "chainguard.dev/attestation/vuln/v1")
            errorMsg = "Not found expected predicate type 'chainguard.dev/attestation/vuln/v1'"
            warnMsg = ""
            response := {
              "result" : result,
              "error" : errorMsg,
              "warning" : warnMsg
            }
          }
```

Here, the custom error message reads `Not found expected predicate type 'chainguard.dev/attestation/vuln/v1'`. Rather than returning the default error, Policy Controller will return this string as a custom error message.

Notice, too, that the previous example defines a `warnMsg` variable. Policy Controller will only return a warning message to the caller if the policy in question is in `warn` mode, so in that case it was left as an empty string.

The following `attestations` block is similar to the previous one, but this time it defines the `warnMsg` variable to be used as a custom warning message.

```
  attestations:
    - name: must-have-vuln-report
      predicateType: vuln
      policy:
        type: rego
        data: |
          package sigstore
          isCompliant[response] {
            result = (input.predicateType == "cosign.sigstore.dev/attestation/vuln/v1")
            errorMsg = ""
            warnMsg = "WARNING: Found an attestation with predicate type 'cosign.sigstore.dev/attestation/vuln/v1'"
            response := {
              "result" : result,
              "error" : errorMsg,
              "warning" : warnMsg
            }
          }
```

Defining custom error and warning messages with Rego can help with troubleshooting, as they can explain specific policy issues that otherwise may not be clearly understandable.

## Learn More

To understand more about the Rego policy format, you can review the [Rego Policy Reference](https://www.openpolicyagent.org/docs/latest/policy-reference/) which includes details on assignment and equality, arrays, objects, sets, and rules.

---

### Sigstore Policy Controller policies
_Path: open-source/sigstore/policy-controller/policies/_index.md_

Documentation and resources relating to policies in Sigstore Policy Controller.

---

### Limit high or critical CVEs in your images workloads
_Path: open-source/sigstore/policy-controller/policies/critical-cve-policy.md_

While Common Vulnerabilities and Exposures (CVEs) are undesirable at any time, the software security standards of certain industries strictly regulate the allowance of _high_ or _critical_ CVEs.  For example, in the payment industry, the [PCI Security Standards Council](https://www.pcisecuritystandards.org/) requires that all vulnerabilities with a Common Vulnerability Scoring System (CVSS) score higher than 4 are addressed.

For engineers and security professionals working in these contexts, it’s essential to know if container images have high or critical CVEs before deploying them. But tracking these CVEs manually can be difficult, especially when regularly pulling or updating large numbers of images for your workloads.

## Policy solution: vulnerability attestation with no high or critical CVEs

One way of addressing this concern is to use Chainguard’s policy that checks an image’s attestation to determine whether the image has any high or critical CVEs. Used with an admissions controller or the open source [Sigstore policy-controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/)), this policy enables you to restrict images or receive a warning whenever an image fails to meet the policy’s requirements.

For this policy to work, the image under inspection must have an attached attestation containing output from its vulnerability scan. These vulnerability attestations are typically generated by the upstream maintainer who inserts the output of an image’s vulnerability scan into a vulnerability attestation and then signs the attestation to assure downstream users of its integrity. If the image doesn’t have a vulnerability attestation or you want to double check the attestation, you can also create a vulnerability attestation yourself using a scanner like [Trivy](https://trivy.dev/). In either case, the vulnerability attestation is checked by this policy to determine whether the image contains any high or critical vulnerabilities.

Here is the policy in full:

```
#############################################################################################
# To generate an attestation with a scan report and attest it to an image follow these steps:
# $ trivy image --format cosign-vuln --output vuln.json <IMAGE>
# $ cosign attest --key /path/to/cosign.key --type https://cosign.sigstore.dev/attestation/vuln/v1 --predicate vuln.json <IMAGE>
#
# $ cosign verify-attestation --key /path/to/cosign.pub --type --type https://cosign.sigstore.dev/attestation/vuln/v1 <IMAGE>
#############################################################################################
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: vuln-no-high-or-critical-rego
  annotations:
    catalog.chainguard.dev/title: Fail on high or critical CVEs
    catalog.chainguard.dev/description: Vulnerability attestation with no High or Critical CVEs
    catalog.chainguard.dev/labels: attestation,rego
spec:
  images:
    - glob: "**"
  authorities:
    - name: my-authority
      key:
          # REPLACE WITH YOUR PUBLIC KEY!
          data: |
            -----BEGIN PUBLIC KEY-----
            MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESWmPfv6b083TNcwY4SlYcZULn7jX
            /vfUyU7CPr2zssLc3+8SWAv2ZY59pofKnvYBp9dNiNwVTkrxab1bcpocVg==
            -----END PUBLIC KEY-----
      attestations:
        - name: must-not-have-high-critical-cves
          predicateType: https://cosign.sigstore.dev/attestation/vuln/v1
          policy:
            type: rego
            data: |
              package sigstore
              isCompliant[response] {
                input.predicateType = "https://cosign.sigstore.dev/attestation/vuln/v1"
                filteredHighSeverity = [c | c := input.predicate.scanner.result.Results[_].Vulnerabilities[_]; c.Severity == "HIGH"]
                filteredCriticalSeverity = [c | c := input.predicate.scanner.result.Results[_].Vulnerabilities[_]; c.Severity == "CRITICAL"]
                result = ((count(filteredHighSeverity) + count(filteredCriticalSeverity)) == 0)
                errorMsg = sprintf("Found HIGH '%d' and CRITICAL '%d' vulnerabilities", [count(filteredHighSeverity) ,count(filteredCriticalSeverity)])
                warnMsg = ""
                response := {
                  "result" : result,
                  "error" : errorMsg,
                  "warning" : warnMsg
                }
              }
```

## Implementing this policy

You can use this policy freely with the open source [Sigstore policy-controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) to block new deployments of images that don’t meet the policy’s requirements.

---

### Disallowing non-default capabilities
_Path: open-source/sigstore/policy-controller/policies/disallowing-non-default-capabilities-with-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to prevent running containers with extra capabilities. You will create a `ClusterImagePolicy` that uses the [CUE](https://cuelang.org/) language to examine a pod spec, and only allow admission into a cluster if the pod is running with one or many [Linux capabilities](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container) from defined set of safe capabilities flags.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```shell
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```output
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
cgr.dev/chainguard/nginx@sha256:628a01724b84d7db2dc3866f645708c25fab8cce30b98d3e5b76696291d65c4a
```

In the next step, you will define a policy that ensures pods only run with safe capabilities and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: non-default-capabilities-cue
spec:
  match:
  - version: "v1"
    resource: "pods"
  images: [glob: '**']
  authorities: [static: {action: pass}]
  mode: enforce
  policy:
    includeSpec: true
    type: "cue"
    data: |
      #Allowed: "AUDIT_WRITE" |
                "CHOWN" |
                "DAC_OVERRIDE" |
                "FOWNER" |
                "FSETID" |
                "KILL" |
                "MKNOD" |
                "NET_BIND_SERVICE" |
                "SETFCAP" |
                "SETGID" |
                "SETPCAP" |
                "SETUID" |
                "SYS_CHROOT"
      spec: {
        initContainers: [...{
          securityContext: {
            capabilities: {
              add: [...#Allowed]
            }
          }
        }]
        containers: [...{
          securityContext: {
            capabilities: {
              add: [...#Allowed]
            }
          }
        }]
        ephemeralContainers: [...{
          securityContext: {
            capabilities: {
              add: [...#Allowed]
            }
          }
        }]
      }
```

The Policy Controller will check each type of container's definition (`initContainers`, `containers`, and `ephemeralContainers`) in a pod spec for any added capabilities. The controller will only admit a pod if the added capabilities are in the `#Allowed` set.

The set of allowed capabilities is defined in this portion of the CUE policy and can be added to or changed to match your specific workload's needs:

```
#Allowed: "AUDIT_WRITE" |
                "CHOWN" |
. . .
```

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/non-default-capabilities-cue
```

Next you will test the policy with a failing pod spec. Once you have confirmed that the admission controller is rejecting pods running with privileges, you'll create a pod that runs without unnecessary capabilities and admit it into your cluster.

## Step 3 — Testing a `ClusterImagePolicy`

Now that you have a policy defined, you can test that it successfully rejects or accepts admission requests.

Use `nano` or your preferred editor to create a new file `/tmp/pod.yaml` and copy in the following pod spec that runs with elevated privileges:

```
apiVersion: v1
kind: Pod
metadata:
  name: yolo
spec:
  containers:
  - name: "app"
    image: docker.io/ubuntu
    securityContext:
      capabilities:
        add:
        # Violates restricted-capabilities
        - NET_ADMIN
        drop:
        - ALL
```

Apply the pod spec and check for the Policy Controller admission denied message:

```
kubectl apply -f /tmp/pod.yaml
```

```
Error from server (BadRequest): error when creating "pod.yaml": admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: non-default-capabilities-cue: spec.containers[0].image
index.docker.io/library/ubuntu@sha256:2adf22367284330af9f832ffefb717c78239f6251d9d0f58de50b86229ed1427 failed evaluating cue policy for ClusterImagePolicy: failed to evaluate the policy with error: spec.containers.0.securityContext.capabilities.add.0: 12 errors in empty disjunction: (and 12 more errors)
```

The first line shows the error message and the failing `ClusterImagePolicy` name. The second line contains the image ID, along with the specific CUE error message showing the policy violation.

Edit the `/tmp/pod.yaml` file and remove or edit the `add` portion of the `capabilities` section. If there are no extra capabilities then the section should look like the following:

```
    capabilities:
        drop:
        - ALL
```

Save and apply the spec:

```
kubectl apply -f /tmp/pod.yaml
```

The pod will be admitted into the cluster with the following message:

```
pod/yolo created
```

Since the pod spec now ensures the container does not have and extra capabilities, or only those from the `#Allowed` set, the Policy Controller evaluates the pod spec against the CUE policy and admits the pod into the cluster.

Delete the pod once you're done experimenting with it:

```
kubectl delete pod yolo
```

---

### Verify signed Chainguard Containers
_Path: open-source/sigstore/policy-controller/policies/using-policy-controller-to-verify-signed-chainguard-images.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to verify image signatures before admitting an image into a Kubernetes cluster. In this guide, you will create a `ClusterImagePolicy` that checks for a keyless Cosign image signature, and then test the admission controller by running a signed `nginx` image.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
cgr.dev/chainguard/nginx@sha256:628a01724b84d7db2dc3866f645708c25fab8cce30b98d3e5b76696291d65c4a
```

In the next step, you will define a policy that verifies Chainguard Containers are signed and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```yaml
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: chainguard-images-are-signed
  annotations:
    catalog.chainguard.dev/title: Chainguard Containers
    catalog.chainguard.dev/description: Enforce Chainguard Containers are signed
    catalog.chainguard.dev/labels: chainguard
spec:
  images:
    - glob: cgr.dev/chainguard/**
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
        identities:
          - issuer: https://token.actions.githubusercontent.com
            subject: https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main
      ctlog:
        url: https://rekor.sigstore.dev
      name: authority-0
```

The `glob: cgr.dev/chainguard/**` line, working in combination with the `authorities` section, will allow any image in the `cgr.dev/chainguard` image registry that has a [keyless signature](https://docs.sigstore.dev/cosign/signing/overview/) to be admitted into your cluster.

The `- keyless` options instruct the Policy Controller what to check for when it examines the signature on any image from the `cgr.dev/chainguard` registry. The specific fields are:

* `url`: this setting tells the Policy Controller where to find the Certificate Authority (CA) that issued an image signature.
* `issuer`: the [issuer field](https://github.com/sigstore/fulcio/blob/main/docs/oid-info.md#1361415726411--issuer) contains the URI of the OpenID Connect (OIDC) Identity Provider that digitally signed the identity token.
* `subject`: the [subject field](https://github.com/sigstore/fulcio/blob/main/docs/certificate-specification.md#issued-certificate) must contain a URI or an email address that identifies where the signed image originated.
* `ctlog`: this setting tells the Policy Controller which [Certificate Transparency log](/open-source/sigstore/rekor/an-introduction-to-rekor/#transparency-log) to query when it is validating a signature.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/chainguard-images-are-signed created
```

Now run the `cgr.dev/chainguard/nginx:latest` image again:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since the image matches the policy, you will receive a message that the pod was created successfully:

```
pod/nginx created
```

In the background, the Policy Controller queries the specified `ctlog` from the policy that you created to find a record in the log that matches the image being requested (`cgr.dev/chainguard/nginx:latest`). The Policy Controller ensures that the SHA256 hash of the image matches the hash that is recorded in the certificate issued by the OIDC `issuer` when the image was first signed. Finally, the Policy Controller verifies the issued certificate was signed by the specified Certiciate Authority's (`https://fulcio.sigstore.dev`) root signing certificate. Once the Policy Controller verifies the signature of the image's hash in the transparency log matches the computed hash of the image, and the certificate's validity based on the CA chain of trust, it will admit the pod into the cluster.

Delete the pod once you're done experimenting with it:

```
kubectl delete pod nginx
```

To learn more about how the Policy Controller uses Cosign to verify and admit images, review the [Cosign](https://docs.sigstore.dev/cosign/signing/overview/) Sigstore documentation.

---

### Maximum container image age
_Path: open-source/sigstore/policy-controller/policies/maximum-image-age-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to verify image signatures before admitting an image into a Kubernetes cluster. In this guide, you will create a `ClusterImagePolicy` that checks the maximum age of a container image verifying that isn’t older than 30 days. For that, we’ll attempt to create two distroless images one older than 30 days and a fresh one.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image ghcr.io/distroless/static myoldimage
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will allow the admission request.

In the next step, you will define a policy that verifies Chainguard Containers has an age below 30days and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```yaml
# Copyright 2022 Chainguard, Inc.
# SPDX-License-Identifier: Apache-2.0

apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: maximum-image-age-rego
  annotations:
    catalog.chainguard.dev/title: Maximum image age
    catalog.chainguard.dev/description: |
      This checks that the maximum age an image is allowed to
      have is 30 days old.  This is measured using the container
      image's configuration, which has a "created" field.

      Some build tools may fail this check because they build
      reproducibly, and use a fixed date (e.g. the Unix epoch)
      as their creation time, but many of these tools support
      specifying SOURCE_DATE_EPOCH, which aligns the creation
      time with the date of the source commit.

    catalog.chainguard.dev/labels: rego
spec:
  images: [{ glob: "**" }]
  authorities: [{ static: { action: pass } }]
  mode: enforce
  policy:
    fetchConfigFile: true
    type: "rego"
    data: |
      package sigstore

      nanosecs_per_second = 1000 * 1000 * 1000
      nanosecs_per_day = 24 * 60 * 60 * nanosecs_per_second

      # Change this to the maximum number of days to allow.
      maximum_age = 30 * nanosecs_per_day

      isCompliant[response] {
        created := time.parse_rfc3339_ns(input.config[_].created)

        response := {
          "result" : time.now_ns() < created + maximum_age,
          "error" : "Image exceeds maximum allowed age."
        }
      }
```

The `glob: **` line, working in combination with the `authorities` and `policy` sections, will allow any image that has been built in the last 30 days to be admitted into your cluster.

The `fetchConfigFile` options instruct the Policy Controller to check the image configuration looking for the age of the image. The rest of fields are:

* `authorities`: this setting tells the Policy Controller to skip any verification looking for the presence of an image signature.
* `mode`: this blocks the creation of any image older than 30days.
* `policy.data`: contains the rego policy itself that verifies when the image has been created.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/maximum-image-age-rego created
```

Now run the `cgr.dev/chainguard/static` image again:

```bash
kubectl run --image cgr.dev/chainguard/static mydailyfreshimage
```

Since the image is built on daily basis, you will receive a message that the pod was created successfully:

```
pod/mydailyfreshimage created
```

However, if we now create a pod using our old image `myoldimage`, PolicyController rejects the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: ghcr.io/distroless/static@sha256:a9650a15060275287ebf4530b34020b8d998bd2de9aea00d113c332d8c41eb0b failed evaluating rego policy for type ClusterImagePolicy: policy is not compliant for query 'isCompliant = data.sigstore.isCompliant' with errors: Image exceeds maximum allowed age.
```

Delete the pod once you're done experimenting with it:

```
kubectl delete pod mydailyfreshimage
```

To learn more about how the Policy Controller uses Cosign to verify and admit images, review the [Cosign](https://docs.sigstore.dev/cosign/signing/overview/) Sigstore documentation.

---

### Example policies
_Path: open-source/sigstore/policy-controller/policies/chainguard-enforce-policy-examples.md_

The [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) allows users to create their own security policies that they can be enforced on Kubernetes clusters. Here are a few example policies to help you get started.

You may also review the [Sigstore Policy Controller documentation](https://docs.sigstore.dev/policy-controller/overview). In particular, we encourage you to review the Policy Controller documentation relating to the [Admission of images](https://docs.sigstore.dev/policy-controller/overview/#admission-of-images) to learn how to admit images through the cluster image policy.

## Policy enforcing signed containers

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: signed-keyless
spec:
  images:
    # All images
    - glob: "**"
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
      ctlog:
        url: https://rekor.sigstore.dev
```

Example using Chainguard Containers from Chainguard's registry:

```
...
  images:
    - glob: cgr.dev/chainguard/**
...
```

An example using Docker Hub images:

```
...
  images:
    - glob: "index.docker.io/*"
    - glob: "index.docker.io/*/*"
...
```

An example using Google Cloud Registry:

```
...
  images:
    - glob: gcr.io/your-image-here/*
...
```

## Policy enforcing signer identity through an OIDC provider and subject

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: enforce-signer-oidc
spec:
  images:
    - glob: "**"
  authorities:
    - keyless:
        identities: # <<<-- REPLACE the following with your OIDC provider & subject --> #
          - issuer: https://token.actions.githubusercontent.com
            subject: https://github.com/chainguard-dev/gke-demo/.github/workflows/release.yaml@refs/heads/main
```

An alternate issuer and subject:

```
...
      - issuer: https://accounts.google.com
        subject: your-gmail@gmail.com
```

## Policy enforcing that images have a signed SPDX SBOM attestation from a custom key

This policy asserts that all images must have a signed SPDX SBOM attestation from a custom key.

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: custom-key-attestation-sbom-spdxjson
spec:
  images:
    - glob: gcr.io/your-image-here/*
  authorities:
    - name: custom-key
      key:
        data: |
          -----BEGIN PUBLIC KEY-----
          ...
          -----END PUBLIC KEY-----
      attestations:
        - name: must-have-spdxjson
          predicateType: spdxjson
          policy:
            type: cue
            data: |
              predicateType: "https://spdx.dev/Document"
```

Set the `POLICY` and `IMAGES` environment variables appropriately, pointing to the sample policy and the image you would like to test.

```sh
POLICY="policies/custom-key-attestation-sbom-spdxjson.yaml"
```

Generate an SPDX SBOM, then attach the SBOM to your image:

```sh
cosign attest --type spdxjson
```

Next, sign it with a private key (for example, one located in a keys directory as in `keys/cosign.key`).

```sh
export COSIGN_PASSWORD=""

cosign attest --yes --type spdxjson \
  --predicate sboms/example.spdx.json \
  --key keys/cosign.key \
  "${IMAGE}"
```

## Policy enforcing that releases are signed by GitHub Actions

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: image-is-signed-by-github-actions
spec:
  images:
    # This is the release v0.3.0
    - glob: "gcr.io/projectsigstore/policy-webhook@sha256:d1e7af59381793687db4673277005276eb73a06cf555503138dd18eaa1ca47d6"
  authorities:
    - keyless:
        # Signed by Fulcio
        url: https://fulcio.sigstore.dev
        identities:
          # Matches the Github Actions OIDC issuer
          - issuer: https://token.actions.githubusercontent.com
            # Matches a specific GitHub workflow on main branch. Here we use the
            # Sigstore policy controller example testing workflow as an example.
            subject: "https://github.com/sigstore/policy-controller/.github/workflows/release.yaml@refs/tags/v0.3.0"
```

## Policy allowing trusted GKE images

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: gke-trusted
spec:
  images:
    - glob: gke.gcr.io/**
    - glob: gcr.io/gke-release/*
  authorities:
    - static:
        action: pass
```

## Enforce that cert-manager is signed

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: certmanager-signed
spec:
  images:
    - glob: quay.io/jetstack/cert-manager-*
  authorities:
    - key:
        data: |
          -----BEGIN PUBLIC KEY-----
          MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsZZKaaIRjOpzbiWYIDKO
          yry9XGBqAfve1iOGmt5VO1jpjNoEseT6zewozHfWTM7osxayy2WjN8G+QV39MlT3
          Vxo91/31g+Zcq8KcvxG+iB8GRaD9pNgLmghorv+eYDiPYMO/+fhsLImyG5WEoPct
          MeCBD7umZ/A2t96U9DQxVDqQbTHlsNludno1p1wsgRnfUM3QHexNljDvJg5FcDMo
          dCpVLpRNvbw0lbJVfybJ4siJ5o/MmXzy0QCJpw+yMIqvqMc8qgKJ1yooJtuTVF4t
          4/luP+EG/oVIiSWCFeRMqYdbJ3R+CJi+4LN7vFNYQM1Q/NwOB52RteaR7wnqmcBz
          qSYK32MM8xdPCQ5tioWwnPTRbPZuzsZsRmJsKBO9JUrBYdDntZX1xY5g4QNSufxi
          QgJgJSU7E4VGMvagEzB1JzvOr6A/qNFCO1Z6JsA3jw3cJLV1rSHfxqfSXBACTLDf
          6bOPWRILRKydTJA6uLKNKmo1/nFm3jvd5tHKOjy4VAQLJ/Vx9wBsAAiLa+06veun
          Oz3AJ9sNh3wLp21RL11u9TuOKRBipE/TYsBYp8jpIyWPXDSV+JcD/TZqoT8y0Z6S
          0damfUmspuK9DTQFL2crpeaqJSG9RA+OuPZLxGD1IMURTsPJB7kXhPtmceeirBnw
          sVcRHHDitVt8oO/x4Wus1c0CAwEAAQ==
          -----END PUBLIC KEY-----
        hashAlgorithm: sha512
```

## Enforce that Chainguard agent is signed

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: chainguard-agent-is-signed
spec:
  images:
    - glob: us.gcr.io/prod-enforce-fabc/**
  authorities:
    - ctlog:
        url: https://rekor.sigstore.dev
      keyless:
        identities:
          - issuer: https://token.actions.githubusercontent.com
            subject: https://github.com/chainguard-dev/mono/.github/workflows/.release-drop.yaml@refs/heads/main
          - issuer: https://token.actions.githubusercontent.com
            subject: https://github.com/chainguard-dev/mono/.github/workflows/.build-drop.yaml@refs/heads/main
        url: https://fulcio.sigstore.dev
```

## Enforce that Google's distroless images are signed

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: google-distroless-signed
spec:
  images:
    - glob: gcr.io/distroless/static*
  authorities:
    - ctlog:
        url: https://rekor.sigstore.dev
      keyless:
        identities:
          - issuer: https://accounts.google.com
            subject: keyless@distroless.iam.gserviceaccount.com
        url: https://fulcio.sigstore.dev
```

## Enforce that Istio images are signed

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: istio-signed
spec:
  images:
    - glob: index.docker.io/istio/*
  authorities:
    - key:
        data: |
          -----BEGIN PUBLIC KEY-----
          MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEej5bv2n2vOecKineYGWwq1WaQa7C
          7HTEVN+BkNI4D1+66ufzn1eGTrbaC9dceJqCAkhp37vMxhWOrGufpBUokg==
          -----END PUBLIC KEY-----
```

---

### Enforce SBOM attestation with Policy Controller
_Path: open-source/sigstore/policy-controller/policies/enforce-sbom-attestation-with-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to verify image attestations before admitting an image into a Kubernetes cluster. In this guide, you will create a `ClusterImagePolicy` that checks the existence of a SBOM attestation attached to a container image, and then test the admission controller by running a `registry.enforce.dev/chainguard/node` image with SBOM attestations.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image k8s.gcr.io/pause:3.9 test
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
k8s.gcr.io/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097
```

In the next step, you will define a policy that verifies Chainguard Containers have a SBOM attestation and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```yaml
# Copyright 2022 Chainguard, Inc.
# SPDX-License-Identifier: Apache-2.0
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: must-have-spdx-cue
  annotations:
    catalog.chainguard.dev/title: Enforce SBOM attestation
    catalog.chainguard.dev/description: Enforce a signed SPDX SBOM attestation from a custom key
    catalog.chainguard.dev/labels: attestation,cue
spec:
  images:
    - glob: "**"
  authorities:
    - name: my-authority
      keyless:
        identities:
          - issuer: "https://token.actions.githubusercontent.com"
            subject: "https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main"
      attestations:
        - name: must-have-spdx-attestation
          predicateType: https://spdx.dev/Document
          policy:
            type: cue
            data: |
              predicateType: "https://spdx.dev/Document"
```

The `glob: **` line, working in combination with the `authorities` and `policy` sections, will allow any image that has at least a SBOM attestation with predicate type `https://spdx.dev/Document` to be admitted into your cluster.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/must-have-spdx-cue created
```

Now run the `k8s.gcr.io/pause:3.9` image which does not have a SBOM attestation:

```bash
kubectl run --image k8s.gcr.io/pause:3.9 noattestedimage
```

Since the image does not contain any attached SBOM, you will receive a message that the pod was rejected:

```
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: demo: spec.containers[0].image
k8s.gcr.io/pause:3.9 no matching attestations with type https://spdx.dev/Document
```

Finally, we run `registry.enforce.dev/chainguard/node` image which contains a SBOM attestation of type `https://spdx.dev/Document`:

```bash
kubectl run --image registry.enforce.dev/chainguard/node mysbomattestedimage
```

Since the image has now a SBOM attestation, you will receive a message that the pod was created successfully:

```
pod/mysbomattestedimage created
```

Delete the pod once you're done experimenting with it:

```
kubectl delete pod mysbomattestedimage
```

To learn more about how the Policy Controller uses Cosign to verify and admit images, review the [Cosign](https://docs.sigstore.dev/cosign/signing/overview/) Sigstore documentation.

---

### Disallowing privileged pods
_Path: open-source/sigstore/policy-controller/policies/disallowing-privileged-containers-with-policy-controller.md_

This guide demonstrates how to use the [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) to prevent running containers with elevated privileges. You will create a `ClusterImagePolicy` that uses the [CUE](https://cuelang.org/) language to examine a pod spec, and only allow admission into a cluster if the pod is running without the `privileged: true` setting.

## Prerequisites

To follow along with this guide, you will need the following:

* A Kubernetes cluster with administrative access. You can set up a local cluster using [**kind**](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) or use an existing cluster.
* **kubectl** — to work with your cluster. Install `kubectl` for your operating system by following the official [Kubernetes kubectl documentation](https://kubernetes.io/docs/tasks/tools/#kubectl).
* [Sigstore Policy Controller](https://docs.sigstore.dev/policy-controller/overview/) installed in your cluster. Follow our [How to install Sigstore Policy Controller](/open-source/sigstore/policy-controller/how-to-install-policy-controller/) guide if you do not have it installed, and be sure to label any namespace that you intend to use with the `policy.sigstore.dev/include=true` label.

Once you have everything in place you can continue to the first step and confirm that the Policy Controller is working as expected.

## Step 1 - Checking the Policy Controller is denying admission

Before creating a `ClusterImagePolicy`, check that the Policy Controller is deployed and that your `default` namespace is labeled correctly. Run the following to check that the deployment is complete:

```bash
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-webhook && \
kubectl -n cosign-system wait --for=condition=Available deployment/policy-controller-policy-webhook
```

When both deployments are finished, verify the `default` namespace is using the Policy Controller:

```shell
kubectl get ns -l policy.sigstore.dev/include=true
```

You should receive output like the following:

```output
NAME      STATUS   AGE
default   Active   24s
```

Once you are sure that the Policy Controller is deployed and your `default` namespace is configured to use it, run a pod to make sure admission requests are handled and denied by default:

```bash
kubectl run --image cgr.dev/chainguard/nginx:latest nginx
```

Since there is no `ClusterImagePolicy` defined yet, the Policy Controller will deny the admission request with a message like the following:

```output
Error from server (BadRequest): admission webhook "policy.sigstore.dev" denied the request: validation failed: no matching policies: spec.containers[0].image
cgr.dev/chainguard/nginx@sha256:628a01724b84d7db2dc3866f645708c25fab8cce30b98d3e5b76696291d65c4a
```

In the next step, you will define a policy that only admits unprivileged pods and apply it to your cluster.

## Step 2 — Creating a `ClusterImagePolicy`

Now that you have the Policy Controller running in your cluster, and have the `default` namespace configured to use it, you can now define a `ClusterImagePolicy` to admit images.

Open a new file with `nano` or your preferred editor:

```shell
nano /tmp/cip.yaml
```

Copy the following policy to the `/tmp/cip.yaml` file:

```
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: privileged-containers-cue
spec:
  match:
  - version: "v1"
    resource: "pods"
  images: [glob: '**']
  authorities: [static: {action: pass}]
  mode: enforce
  policy:
    includeSpec: true
    type: "cue"
    data: |
      spec: {
        initContainers: [...{
          securityContext: {
            privileged: false
          }
        }]
        containers: [...{
          securityContext: {
            privileged: false
          }
        }]
        ephemeralContainers: [...{
          securityContext: {
            privileged: false
          }
        }]
      }
```

This policy will ensure that any kind of container in a pod spec will only be admitted if the `privileged` setting is not set, or is set to `false`.

Save the file and then apply the policy:

```bash
kubectl apply -f /tmp/cip.yaml
```

You will receive output showing the policy is created:

```
clusterimagepolicy.policy.sigstore.dev/privileged-containers-cue
```

Next you will test the policy with a failing pod spec. Once you have confirmed that the admission controller is rejecting pods running with privileges, you'll create a pod that runs without elevated privileges and admit it into your cluster.

## Step 3 — Testing a `ClusterImagePolicy`

Now that you have a policy defined, you can test that it successfully rejects or accepts admission requests.

Use `nano` or your preferred editor to create a new file `/tmp/pod.yaml` and copy in the following pod spec that runs with elevated privileges:

```
apiVersion: v1
kind: Pod
metadata:
  name: yolo
spec:
  containers:
  - name: "app"
    image: docker.io/ubuntu
    securityContext:
      privileged: true
```

Apply the pod spec and check for the Policy Controller admission denied message:

```
kubectl apply -f /tmp/pod.yaml
```

```
Error from server (BadRequest): error when creating "pod.yaml": admission webhook "policy.sigstore.dev" denied the request: validation failed: failed policy: privileged-containers-cue: spec.containers[0].image
index.docker.io/library/ubuntu@sha256:2adf22367284330af9f832ffefb717c78239f6251d9d0f58de50b86229ed1427 failed evaluating cue policy for ClusterImagePolicy: failed to evaluate the policy with error: spec.containers.0.securityContext.privileged: conflicting values false and true
```

The first line shows the error message and the failing `ClusterImagePolicy` name. The second line contains the image ID, along with the specific CUE error message showing the policy violation.

Edit the `/tmp/pod.yaml` file and change the `privileged` setting to `false`:

```
    privileged: false
```

Save and apply the spec:

```
kubectl apply -f /tmp/pod.yaml
```

The pod will be admitted into the cluster with the following message:

```
pod/yolo created
```

Since the pod spec now ensures the container does not have elevated privileges, the Policy Controller evaluates the pod spec against the CUE policy and admits the pod into the cluster.

Delete the pod once you're done experimenting with it:

```
kubectl delete pod yolo
```

---

### How to keyless sign a container image with Sigstore
_Path: open-source/sigstore/how-to-keyless-sign-a-container-with-sigstore/index.md_

_An earlier version of this material was published in the [lab in chapter 5](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/block-v1:LinuxFoundationX+LFS182x+2T2022+type@sequential+block@5fb8482a3b764ce0903e2c424842d32f/block-v1:LinuxFoundationX+LFS182x+2T2022+type@vertical+block@2e3388391d6040f5beb5bacbf19f96f5) of the Linux Foundation [Sigstore course](https://learning.edx.org/course/course-v1:LinuxFoundationX+LFS182x+2T2022/home)._

This tutorial will bring some of the components of Sigstore together in an example project. In this demonstration, we’ll be using GitHub Actions to perform keyless signing on a sample container. In this example, we’ll use a Django container that displays a generic “Hello, World” style landing page. Django is a Python web framework.

## Prerequisites

You should have the following in place before continuing:

* The latest version of [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) installed, and an account on Docker Hub. At the time of writing (June 2022), Docker Engine should be version 20.10 and Docker Compose should be version 2.6. If you are on macOS, you will need to use [Docker Desktop; refer to the official documentation](https://docs.docker.com/desktop/) for your operating system to ensure that your system meets the necessary requirements. Docker Desktop should be version 4.8 or higher.
* Cosign installed, follow [How to install Cosign](/open-source/sigstore/cosign/how-to-install-cosign/).
* The Rekor CLI installed, follow the [installation guide](/open-source/sigstore/rekor/how-to-install-rekor/)
* Familiarity with Git, GitHub, and GitHub Actions is helpful, but we'll provide some context and also walk you through setting up a GitHub account.

With these prerequisites in place, let's begin.

## Sign up for GitHub

To create a GitHub account, navigate to https://github.com/join and fill in a valid username, email address, and password. For a username, you may want to think about whether you want a name that represents your name, or a more anonymous one. You may want to click off the email marketing box. You should also verify your account.

GitHub provides additional documentation on [signing up for an account](https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account). You’ll be using a [free personal account](https://github.com/pricing) to work with GitHub.

If you are not familiar with Git and GitHub, you can review the official GitHub official docs on [About Git](https://docs.github.com/en/get-started/using-git/about-git). We will walk you through the relevant commands in this section.

[GitHub Actions](https://docs.github.com/en/actions) can perform CI/CD on your repository. You can learn more about GitHub Actions through the official GitHub docs. We will walk you through the relevant files here.

## Create a GitHub repository

When you are logged into GitHub, create a new repository by clicking on the **+** button in the upper right-hand corner of the page (next to your user icon). The menu will drop down and you can select **New repository**.

On the Create a new repository page, you can create a repository, you can leave the defaults, but write a meaningful name for the Repository name field, such as django-keyless-signing. Note that you’ll need to keep the repository public so that the signed image you build will be able to be uploaded to Rekor’s public transparency log.

## Create a local directory for the repository

Now, you’ll need to create a local directory for this repository. For our example, we’ll want our path to be `~/Documents/GitHub/django-keyless-signing`, but you can choose an alternate path. Create the GitHub directory if necessary, and then navigate into that folder.

```sh
cd ~/Documents/GitHub
```

Within the GitHub folder, create the new directory for your repository, and move into it.

```sh
mkdir django-keyless-signing && cd $_
```

You’ll be making a few files in this directory that you’ll then push up to the GitHub repository.

## Create Django container files

First, create a `requirements.txt` file for your Django container. This is a common file in Python projects that you can run to get the necessary dependencies at the right versions. The Django Docker container will pull from this file to set up the image.

You need the Django package, and Psycopg, which is a PostgreSQL database adapter for Python.

Create your file with a text editor like nano.

```sh
nano requirements.txt
```

Once the file is open, write the following into it to set and pin your dependencies.

```
Django>=3.0,<4.0
psycopg2>=2.8
```

Save and close the file.

Next, create your `Dockerfile`, again with a text editor like nano.

```sh
nano Dockerfile
```

Within this file you will set up the version of Python, the environments, and tell the container to install the dependencies in `requirements.txt`.

```js
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

Once you are satisfied that your `Dockerfile` reflects the content above, you can save and close the file.

Finally, you’ll create a `docker-compose.yml` file. This file allows you to document and configure all of your application’s service dependencies. If you would like to read more about [Docker Compose](https://docs.docker.com/compose/), please refer to the official Docker documentation.

Again, use nano or similar text editor to create your file.

```sh
nano docker-compose.yml
```

You can add the following contents to this file. This sets up the environment and Postgres database, and can build the web server on port 8000 of the present machine.

```js
version: "3.9"

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db
```

At this point, your Django container is set up. You can run the `tree` command to review the file structure. Note, `tree` may not come automatically installed on your machine; use your package manager to install it if you would like to run this optional command.

```sh
tree
```

```
.
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

0 directories, 4 files
```

If your output matches the output above, you are all set to continue.

## Steps to automate keyless signing

We next create a GitHub Actions YAML file. There is some boilerplate in this file common to GitHub Actions, but the high-level overview of this is that we need to enable OIDC, install Cosign, build and push the container image, and then sign the container image.

We’ll discuss each of these steps here, and then write the entire file in the next section.

After a cron job to automate the Actions, your first step will be to enable GitHub Actions OIDC tokens. Fulcio is a free root certificate authority that issues certificates based on an OIDC email address. This is essentially enabling the certificate step of our action.

The key piece here is `id-token: write`, which you will have under `build` and under `jobs` in your Actions workflow.

```js
jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
        contents: read
        packages: write
        id-token: write
```

The rest of this build is telling us that the container is running on the latest version of Ubuntu, that the contents are to be read, and the packages are to be written.

The `id-token: write` line enables our job to create tokens as this workflow. This permission may only be granted to workflows on the main repository, so it cannot be granted during pull request workflows. You can learn more about GitHub Actions’s OIDC support from their document on “[Security hardening your deployments](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#updating-your-actions-for-oidc).”

The next major part of this YAML file is installing Cosign.

```js
      - name: Install cosign
        uses: sigstore/cosign-installer@main
```

Cosign is available through the [GitHub Action Marketplace](https://github.com/marketplace/actions/cosign-installer), which is why we can add it to our GitHub Action as above.

You can pin your workflow to a particular release of Cosign. For example, here you will use version 2.1.1.

```js
      - name: Install cosign
        uses: sigstore/cosign-installer@main
        with:
          cosign-release: 'v2.1.1'
```

After this step, there will be some actions to setup the Docker build, log into the GitHub Container Registry, and build and push the container image. The next piece that is most relevant to our work with Sigstore is signing the container image.

```js
      - name: Sign the container image
        run: cosign sign --yes ghcr.io/${{ github.repository }}@${{ steps.push-step.outputs.digest }}
```

Here you’ll run the `cosign sign` command on the container we are pushing to GitHub Container Registry with the relevant variable calling our repository and digest.

Because we are doing a public repository, this will automatically be pushed to the public instance of the Rekor transparency log

Now that you understand the main pieces of the YAML file, let’s create it and review the contents of the entire file.

## Create GitHub Actions file

You’ll next create a hidden directory called `.github` and a subdirectory called workflows. Ensure that you are in your `django-keyless-signing` and create these two directories.

```sh
mkdir .github && cd $_
mkdir workflows && cd $_
```

Within this directory, you’ll be creating a YAML file to run a GitHub Action Workflow.

```sh
nano docker-publish.yml
```

This is how we will be building, publishing, and signing the container. We will start by naming it **Publish and Sign Container Image** and then will set up a scheduled cron job for continuous running, and also when there is a push to the main branch or pull request that is merged into the main branch.

The rest of the file will follow what we discussed in the previous section.

```js
name: Publish and Sign Container Image

on:
  schedule:
    - cron: '32 11 * * *'
  push:
    branches: [ main ]
    # Publish semver tags as releases.
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      id-token: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Install cosign
        uses: sigstore/cosign-installer@main
        with:
          cosign-release: 'v1.4.1'

      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v2

      - name: Log into ghcr.io
        uses: docker/login-action@master
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push container image
        id: push-step
        uses: docker/build-push-action@master
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:latest

      - name: Sign the container image
        run: cosign sign ghcr.io/${{ github.repository }}@${{ steps.push-step.outputs.digest }}
```

Now, your demo Django container project is complete and ready for GitHub Actions to run on it.

Verify that your project is configured correctly. Run the `tree` command with the `-a` flag from your project’s root directory to view invisible directories.

```sh
cd ~/Documents/GitHub/django-keyless-signing
tree -a
```

```
.
├── .github
│   └── workflows
│       └── docker-publish.yml
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

2 directories, 4 files
```

If your setup matches, we can proceed.

## Generate GitHub personal access token

In order to use GitHub on the command line and run GitHub Actions, you’ll need a personal access token.

In your web browser, navigate to https://github.com/settings/tokens in order to set those up.

You’ll click on the **Generate new token** button and fill out the form on the next page.

Fill in the Note field about what the token is for, the 30 days expiration is adequate, and you’ll need to select the **repo**, **workflow**, and **write:packages** scopes, as indicated in the screenshot below.

![GitHub Generate New Token Example](github-token.png)

With this filled out, you can click on the green **Generate token** button at the bottom of the page and then your token will display on the page.

_Be sure to copy this token_; you won’t have access to it again. You’ll be using this token to authenticate on the command line.

## Initialize Git repository and push changes

From your local repository of `django-keyless-signing` you will be initializing your repository to use with Git.

```sh
git init
```

Next, you will add the files you created to the Git stage.

```sh
git add .github Dockerfile docker-compose.yml requirements.txt
```

At this point, you can check that your Git stage is all set for committing and then pushing your changes to the remote GitHub repository.

```sh
git status
```

```
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   .github/workflows/docker-publish.yml
    new file:   Dockerfile
    new file:   docker-compose.yml
    new file:   requirements.txt
```

The output indicates that changes are ready to be committed. You will now commit with a message, as in the next command.

```sh
git commit -m "first commit"
```

```
[main (root-commit) 301800b] first commit
 4 files changed, 93 insertions(+)
 create mode 100644 .github/workflows/docker-publish.yml
 create mode 100644 Dockerfile
 create mode 100644 docker-compose.yml
 create mode 100644 requirements.txt
```

Now, set up the main branch as main.

```sh
git branch -M main
```

So far we have not connected to the remote repository. You should add that repository now. This will be the URL for your repository plus `.git` at the end. Ensure that you replace `github-username` with your actual username on GitHub.

```sh
git remote add origin https://github.com/github-username/django-keyless-signing.git
```

With this set up, you’ll be able to push your changes to the remote repository that’s hosted on GitHub.

```sh
git push -u origin main
```

With this command, you will be prompted to enter your GitHub username and the GitHub personal access token. In the first prompt, enter your GitHub username, where it reads `Username`. In the second prompt, where it reads `Password`, enter your personal access token, _not your GitHub password_.

Username for 'https://github.com':
Password for 'https://github-username@github.com':

Once you enter these, you’ll receive output that your changes were committed to the remote repository.

```
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 10 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 1.62 KiB | 1.62 MiB/s, done.
Total 8 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/github-username/django-keyless-signing.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
```

With this complete, you can navigate to the URL of your GitHub repository.

## Confirm keyless signing via GitHub Actions

With your repository set up, you can move to the **Actions** tab of your GitHub repository.

Here, you’ll be able to inspect the workflows that have run. Since there is only one workflow in this repo, you can inspect the one for `first commit`.

Here, a green checkmark and **build** will be displayed on the page under `docker-publish.yml`. This action ran when you pushed your code into the repository. You can click on **build** and inspect the steps of the action.

Your page will appear similar to the following. Ensure that your action ran and that your output is similar.

![First commit example](first-commit-example.png)

From here, you can click into each step of the build process and dial in further. Click into **Sign the container image**.

This will dropdown and provide you with more information, like so.

```
Run cosign sign ghcr.io/github-username/django-keyless-signing@sha256:a53e24bd4ab87ac4764fb8736dd76f388fd2672c1d372446c9a2863e977f6e54
Generating ephemeral keys...
Retrieving signed certificate...
client.go:196: root pinning is not supported in Spec 1.0.19
Successfully verified SCT...
tlog entry created with index: XXXXXXX
Pushing signature to: ghcr.io/github-username/django-keyless-signing
```

This provides a bit of information, including the SHA, the Rekor log index number (as indicated by `tlog entry created with index`), and the URL of the container that the signature was pushed to.

You can also inspect the image itself under **Packages** on the main page of your repository. If you would like, you can pull down the Docker image. This is not necessary for our next step, where we will check that the signature was signed and that the signature is in the Rekor transparency log.

## Verify signatures

With your container signed by Cosign keyless signing in GitHub Actions, you next need to verify that everything worked as expected and that the container is indeed signed, and that an entry for that was generated in Rekor.

You can do that by using the `cosign verify` command against the published container image.

```sh
cosign verify ghcr.io/github-username/django-keyless-signing \
  --certificate-identity https://github.com/github-username/django-keyless-signing/.github/workflows/docker-publish.yml@refs/heads/main \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com | jq
```

Your output should be similar to the following, though note that the strings are abbreviated.

```
Verification for ghcr.io/github-username/django-keyless-signing:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - Any certificates were verified against the Fulcio roots.
[
  {
    "critical": {
      "identity": {
        "docker-reference": "ghcr.io/github-username/django-keyless-signing"
      },
      "image": {
        "docker-manifest-digest": "sha256:a4aa08ce4593"
      },
      "type": "cosign container image signature"
    },
    "optional": {
      "Bundle": {
        "SignedEntryTimestamp": "8XFlAArYeA",
        "Payload": {
          "body": "E5ha0V5VFVSTmVFNXFSWGROUkZwaFJuY3dlVTFxUVRKTlJFMTRUbXBKZDAxRVZtRk5",
          "integratedTime": 1654272608,
          "logIndex": XXXXXXX,
          "logID": "a4aa08ce4593"
        }
      },
      "Issuer": "https://token.actions.githubusercontent.com",
      "Subject": "https://github.com/github-username/django-keyless-signing/.github/workflows/docker-publish.yml@refs/heads/main"
    }
  }
]
```

You can also review the log on Rekor by using the logIndex as above, which matches the `tlog entry created with index` you found in the output from the GitHub Actions.

You can use either `verify` or `get` with the Rekor CLI. In the first case, your command will be formatted like so and provide a lot of output with a full inclusion proof. Note that this output is abbreviated. Substitute the Xs in the command for your log index number.

```sh
rekor-cli verify --rekor_server https://rekor.sigstore.dev --log-index XXXXXX
```

```
Current Root Hash: 1ce1a05f2ec146e503d78649c093
Entry Hash: e739fb04525a9e8a0d590b9f944714ce469c
Entry Index: XXXXXX
Current Tree Size: 2251200

Inclusion Proof:
SHA256(0x01 | 3742364ed095572728c5c4c6abcc55cda3111833bb01260b6dfd50ce0214bbfe | b0f3127874d6ce2ca520797f4ab9e739fb04525a9e8a0d590b9f944714ce469c) =
    b94433c839343e37b42cdf2281731571971202c77defdae51a6c386a4d1bfb7b
…
SHA256(0x01 | efb36cfc54705d8cd921a621a9389ffa03956b15d68bfabadac2b4853852079b | 5a35a58d7624edfb9adf6ea9f0cbed558f5e5d45ca91acb5243757d72f1b2454) =
    2c0c0e511e071ab024da0ebd89f67b39ae7a1ce1a05f2ec146e503d78649c093
```

In the second instance, you’ll receive JSON formatted output. Note the output here is abbreviated. Substitute the Xs in the command for your log index number.

```sh
rekor-cli get --rekor_server https://rekor.sigstore.dev --log-index XXXXXX
```

```
LogID: c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d
Index: XXXXXXX
IntegratedTime: 2022-06-03T17:12:38Z
UUID: 0d590bf944714ce469c
Body: {
  "HashedRekordObj": {
    "data": {
      "hash": {
        "algorithm": "sha256",
        "value": "abb1bef9a31c634cfc"
      }
    },
    "signature": {
      "content": "RxAva1EnlCS5AIhAN",
      "publicKey": {
        "content": "jeTlvWldGa2N5OXRZV2x1TUM0fNpc0dBUVFCZzc4d0FRUUVJRkIxWW14cGMyZ2cKWVc1"
      }
    }
  }
}
```

Congratulations! You have signed a container with Cosign through GitHub Actions by using OIDC through Fulcio, and can verify this on the Rekor log.

---

### Getting started with OpenVEX and vexctl
_Path: open-source/sbom/getting-started-openvex-vexctl.md_

The `vexctl` CLI is a tool to make VEX work. As part of the open source [OpenVex](/open-source/sbom/what-is-openvex/) project, `vexctl` enables you to create, apply, and attest VEX (Vulnerability Exploitability eXchange) data in order to filter out false positive security alerts.

The `vexctl` tool was built to help with the creation and management of VEX documents, communicate transparently to users as time progresses, and enable the "turning off" of security scanner alerts of vulnerabilities known not to affect a given product. Using VEX, software authors can communicate to their users that an otherwise vulnerable component has no security implications for their product.

This tutorial will walk you through some common commands in `vexctl`.

## Installing vexctl

If you would like to install `vexctl` on your local or virtual machine, you will need a current, supported release of Go. You can install it by following the official [Go documentation](https://go.dev/doc/install).

Using Go, run the following to install `vexctl`:

```sh
go install github.com/openvex/vexctl@latest
```

This command will install the latest version of `vexctl` on your machine.

## Confirming installation

You can confirm that `vexctl` was installed and is ready to use by running the following command:

```sh
vexctl version
```

You should receive output similar to the following.

```output
 _   _  _____ __   __ _____  _____  _
| | | ||  ___|\ \ / //  __ \|_   _|| |
| | | || |__   \ V / | /  \/  | |  | |
| | | ||  __|  /   \ | |      | |  | |
\ \_/ /| |___ / /^\ \| \__/\  | |  | |____
 \___/ \____/ \/   \/ \____/  \_/  \_____/
vexctl: A tool for working with VEX data

GitVersion:   ...
...
Platform:     ...
```

This indicates the current version of `vexctl` on your working machine. You are ready to proceed with working with `vexctl`.

## Creating VEX documents

With `vexctl`, VEX data can be created to a file on disk, or it can be captured in a signed attestation that can be attached to a container image. You can create a VEX document by using the `vexctl create` command.

For example, to create a VEX document with a single statement asserting that the [WolfiOS](https://github.com/wolfi-dev/) package `git-2.38.1-r0` is not affected by a given common vulnerability and exposure (CVE) — let's say,  `CVE-2014-123456` — because it has already been mitigated in the distribution, you can run the following.

```sh
vexctl create --product="pkg:apk/wolfi/git@2.38.1-r0?arch=x86_64" \
               --vuln="CVE-2014-123456" \
               --status="not_affected" \
               --justification="inline_mitigations_already_exist"
```

This command notes the following:

* The software product — `product` — in this case a Wolfi package
* The vulnerability — `vuln` — in this case a specific CVE
* The current status — `status` — which can be `not_affected`, `affected`, `fixed`, or `under_investigation`
* When the `status` is noted as `not_affected`, the reason for the status — `justification` — must be included, and can read `inline_mitigations_already_exist` or `component_not_present`

The `vexctl create` command renders a document similar to the following. The `@id` and timestamps will differ on each run.

```json
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/public/vex-b6081638d51cd5cdf2e810d120353dd48d3c829c169123df3037979ec824df94",
  "author": "Unknown Author",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "name": "CVE-2014-123456"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/git@2.38.1-r0?arch=x86_64"
        }
      ],
      "status": "not_affected",
      "justification": "inline_mitigations_already_exist",
      "timestamp": "2026-07-27T15:46:08.152188473Z"
    }
  ],
  "timestamp": "2026-07-27T15:46:08Z"
}
```

You can also create a VEX document with abbreviated information. For instance, when a given CVE was addressed in the image and you want to attest that it has been fixed.

```sh
vexctl create "pkg:apk/wolfi/git@2.39.0-r1?arch=x86_64" CVE-2023-12345 fixed
```

The above workflow demonstrates how to create a VEX document with `vexctl` on the command line.

## Merging existing VEX documents

When more than one stakeholder is issuing VEX metadata about a piece of software, `vexctl` can merge the documents to get the most up-to-date impact assessment of a vulnerability.

Let's begin with two test documents. You can create these two test documents with a CLI editor such as nano.

The first document is `document1.vex.json`:

```json
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/public/vex-0f3be8817faafa24e4bfb3d17eaf619efb1fe54923b9c42c57b156a936b91431",
  "author": "John Doe",
  "role": "Senior Trusted VEX Issuer",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "name": "CVE-1234-5678"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/bash@1.0.0"
        }
      ],
      "status": "under_investigation",
      "timestamp": "2023-12-05T05:04:34.77929922Z"
    }
  ],
  "timestamp": "2023-12-05T05:04:34.77929844Z"
}
```

The second document is `document2.vex.json`:

```json
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/public/vex-3cd938c9a706eba0915883640116cfe813f7d59150cf758b8c869b4926a7cf11",
  "author": "John Doe",
  "role": "Senior Trusted VEX Issuer",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "name": "CVE-1234-5678"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/bash@1.0.0"
        }
      ],
      "status": "fixed",
      "timestamp": "2023-12-05T05:06:38.099731287Z"
    }
  ],
  "timestamp": "2023-12-05T05:06:38.099730576Z"
}
```

The two files are generated from a known rule set, also known as "golden data" or a "golden file," which is reused and reapplied to new releases of the same project.

We can merge the two VEX documents with the `vexctl merge` command:

```sh
vexctl merge --product=pkg:apk/wolfi/bash@1.0.0 \
             document1.vex.json \
             document2.vex.json
```

The resulting document combines the VEX statements that express data about `bash@1.0.0` into a single document.

```json
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "merged-vex-6b33f63783819578804350ba1cde277ddd8f90aa2bbcb706d19a61d211a8443f",
  "author": "Unknown Author",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "name": "CVE-1234-5678"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/bash@1.0.0"
        }
      ],
      "status": "under_investigation",
      "timestamp": "2023-12-05T05:04:34.77929922Z"
    },
    {
      "vulnerability": {
        "name": "CVE-1234-5678"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/bash@1.0.0"
        }
      ],
      "status": "fixed",
      "timestamp": "2023-12-05T05:06:38.099731287Z"
    }
  ],
  "timestamp": "2026-07-27T15:46:08Z"
}
```

This final document tells the whole story of how `CVE-1234-5678` was `under_investigation` and then `fixed` about two minutes later, all documented in a single VEX file that was merged with `vexctl`. The merged document preserves each statement's original timestamp, so the order of events is retained.

## Attesting and attaching VEX documents

To attest to and attach VEX statements within a given document to a container image, you can use the `vexctl attest` command with the `--attach` and `--sign` flags.

For example, if you have a container image `your-username/your-container-image:latest` in a container registry, and a related VEX document `hello.vex.json`, you can run the following command to attest to that document, attach the document and sign that attestation. If you want to try this example, make sure to replace `your-username/your-container-image:latest` with the path to your container.

```sh
vexctl attest --attach --sign hello.vex.json your-username/your-container-image:latest
```

Upon running this command, you'll be taken through a signing workflow with [Sigstore](https://www.sigstore.dev/). Your terminal output will indicate your progress.

```output
Generating ephemeral keys...
Retrieving signed certificate...
```

A browser window will open for you to select an OIDC provider. When the attestation is complete, you'll receive feedback that it was successful.

```output
Successfully verified SCT...
{"payloadType":"application/vnd.in-toto+json","payload":"e...o=","signatures":[{"keyid":"","sig":"MEY...z"}]}
```

This attestation with `.att` extension will now live in the container registry as an attachment to your container.

## Chronology and VEX documents

Assessing the impact of CVEs on a software product is a process that takes time and the status will change over time. VEX is designed to communicate with users as the status changes, and there may therefore be multiple VEX documents associated with a product.

To understand how this may work in practice, below is an example timeline for the VEX documents associated with a given product and CVE.

1. The software product _Linky App_ becomes aware of `CVE-2014-123456`, associated with one of its components.
2. _Linky App_ developers issue a VEX data file with a status of `under_investigation` to inform their users that they are aware of the CVE, but are reviewing whether it has an impact on _Linky App_.
3. After investigation, the developers determine the CVE has no impact on _Linky App_ because the vulnerable function in the component is never executed.
4. The developers issue a second VEX document with a status of `not_affected` using the `vulnerable_code_not_in_execute_path` justification.

When analyzing the VEX documents associated with _Linky App_, `vexctl` will review them chronologically and "replay" the known impact statuses in the order they were found, effectively computing the `not_affected` status.

If a SARIF report is formatted as a VEX document with `vexctl`, any entries alerting of `CVE-2014-123456` will be filtered out.

## Learn more

The `vexctl` tool is open source, you can review the [`vexctl` repository on GitHub](https://github.com/openvex/vexctl), as well as the [`go-vex` Go library](https://github.com/openvex/go-vex) for generating, consuming, and operating on VEX documents.

The following blog posts have some background about VEX and OpenVEX:

* [What is OpenVex](/open-source/sbom/what-is-openvex/)
* [Putting VEX To Work](https://www.chainguard.dev/unchained/putting-vex-to-work)
* [Reflections on Trusting VEX (or when humans can improve SBOMs)](https://www.chainguard.dev/unchained/reflections-on-trusting-vex-or-when-humans-can-improve-sboms)
* [Understanding The Promise of VEX](https://www.chainguard.dev/unchained/understanding-the-promise-of-vex)

The [OpenVEX Specification](https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md) is owned and steered by the community. You can find the organization page with additional repositories at [openvex.dev](https://openvex.dev).

---

### The differences between SBOMs and attestations
_Path: open-source/sbom/sboms-and-attestations.md_

One of the first steps to improving your software supply chain security is to establish a process for creating quality *Software Bills of Materials* (SBOMs). An [SBOM](/open-source/sbom/) is a formal record that contains the details and supply chain relationships (such as dependencies) of the components used in building software.

[Cosign](/open-source/sigstore/cosign/an-introduction-to-cosign/) — a part of the Sigstore project — supports software artifact signing, verification, and storage in an [OCI (Open Container Initiative)](/open-source/oci/) registry. The `cosign` command line tool offers two subcommands that you can use to associate an SBOM with a container image and then upload them to a registry: `cosign attach` and `cosign attest`.

However, these commands don't work the same way. This guide outlines the differences between these two subcommands and provides guidance for when you might want to use one over the other.

## SBOMs vs. attestations

An SBOM is essentially an electronic packing slip: it's a list of all the components that went into making a given piece of software. But unless you have some indication of when the software was produced, who produced it, and how it was produced, then you can't say with any certainty that the components listed in the SBOM are actually part of the software you're running.

An *attestation* allows the end users or consumers of a software artifact (in the context of this guide, an SBOM) to verify — independently of the producer — that the contents of the artifact haven't been changed since it was produced. It also requires software producers to provide verifiable proof of the quality of their software.

Put differently, an attestation is a written assurance of a software artifact's *provenance*, or the verifiable information about the artifact describing where, when, and how it was produced. You can think of an attestation as a proclamation that "software artifact X" was produced by "person Y" at "time Z". Because of this extra provenance information, attestations are generally seen as being more trustworthy than SBOMs since you can identify who signed them and when.

Both `cosign attest` and `cosign attach` associate an artifact with an image and upload it to a registry. However, `cosign attest` generates an [in-toto attestation](https://in-toto.io/) while `cosign attach` does not. `cosign attest` then attaches it to the provided image and uploads it to a registry as an OCI artifact with a `.att` extension.

In the following example, `image.sbom` is an SBOM file that was previously created, `$IMAGE` is the image that will be attached to the SBOM, and `cosign.key` is the signer's private key.

```sh
cosign attest --key cosign.key --predicate image.sbom $IMAGE
```

Note that after creating an attestation, you can verify it with Cosign's `verify-attestation` subcommand.

```sh
cosign verify-attestation $IMAGE
```

`cosign attach`, on the other hand, only attaches an SBOM to an image and uploads it to a registry. In this case the SBOM isn't signed, meaning that there's no way to confidently verify its authenticity.

```sh
cosign attach sbom --sbom image.sbom $IMAGE
```

This will upload the SBOM to the registry as an OCI artifact with a `.sbom` extension.

Be aware that there is also the `cosign sign` command. After running `cosign attach` to attach an SBOM and upload it to a registry, you can then run `cosign sign` to sign the SBOM, and upload the signature to the registry as a separate OCI artifact, this time with the `.sig` extension.

If you'd like to learn more about working with SBOMs and Cosign, we encourage you to check out our tutorial on [How to sign an SBOM with Cosign](/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/).

## A note on generating SBOMs

There are many tools available today — both proprietary and open source — that allow you to generate SBOMs. However, these tools do not generate SBOMs in the same way or at the same point in the development process. As with signed versus unsigned SBOMs, an organization may find SBOMs generated by one tool as more trustworthy than those from others.

For example, SBOMs generated from source code can be valuable. But ultimately, you have no way of knowing whether the image has been tampered with between the time the SBOM was generated and the time you actually run the image.

[apko](/open-source/build-tools/apko/overview/) is a command-line tool that allows users to build container images using a declarative language based on YAML. When building a container image, apko will generate an SBOM outlining each of the apks it uses to build it. When combined with [melange](/open-source/build-tools/melange/overview/), an apk builder tool that uses declarative pipelines to create apk packages, these tools can serve as a good starting point for a secure container image factory. Checkout ["Secure Your Software Factory with melange and apko"](https://www.chainguard.dev/unchained/secure-your-software-factory-with-melange-and-apko) to learn more.

---

### SBOMs
_Path: open-source/sbom/_index.md_

A software bill of materials, or an SBOM (pronounced s-bomb), is a key resource for enabling visibility into the different software components of a codebase.

---

### What is an SBOM (software bill of materials)?
_Path: open-source/sbom/what-is-an-sbom.md_

Modern software applications contain hundreds to thousands of open source and third-party components, creating significant security challenges that SBOMs help address - which is why Chainguard includes comprehensive SBOMs with every container image. Without structured visibility into these components, organizations struggle to identify and respond to vulnerabilities, even when patches are available. This lack of transparency leaves systems vulnerable to exploitation, making SBOMs essential for maintaining secure software supply chains.

A software bill of materials, or an SBOM (pronounced s-bomb), is a key resource for enabling visibility into the different software components of a codebase. Often described as a list of software “ingredients,” an SBOM is a formally structured list of libraries, modules, licensing, and version information that make up any given piece of software. An SBOM’s purpose is to enable software operators (or any type of software user) to have a comprehensive view of their codebase so that they can quickly identify software components that have known vulnerabilities, or investigate other tracked features like patch status, supplier, license, or version.

## SBOM use cases

SBOMs are leveraged for a variety of purposes, which will likely continue to evolve as new use cases are identified. Some of the most prominent uses of SBOMs today are:

* **Supply chain security**: One of the most common uses of SBOMs is enabling users to check for security vulnerabilities in their codebase’s dependencies or base images. If you learn of a vulnerability in one of the libraries your codebase depends on, you can inspect your SBOM to investigate whether your projects are affected. This security utility is further strengthened when used with [VEX](https://www.chainguard.dev/unchained/understanding-the-promise-of-vex), the Vulnerability Exploitability eXchange, which enables you to efficiently filter out security alerts that pose no threat to your codebase.
* **Identify software suppliers**: SBOMs can be used to identify the _suppliers_ of software components, such as a software author or the individual or entity repackaging the software for redistribution. Supplier identity is often investigated for legal or procurement reasons and there is an evolving debate about which types of distributors should be formally considered as "suppliers".
* **Licensing**: Software projects often pull from tens or hundreds of dependencies whose different licenses may have different restrictions on the use of the code. Being able to track the licenses of your dependencies allows you to stay informed about legal restrictions and licensing compatibility issues, and help you decide which dependencies work best for your project needs.
* **Automate alerts**: The machine readable format of SBOMs enables you to create automated alerts to inform you of important events in your codebase, such as security vulnerabilities, missing components, or incompatible dependency licensing.
* **Make open source funding decisions**: By understanding which open source software components are used and how frequently across an organization's codebases, an organization can make more informed decisions about providing funding to open source projects.
* **Find abandoned dependencies**: Assuming that an SBOM's components contain sufficient information (such as [package URLs](https://github.com/package-url/purl-spec)) to link packages with external data, an SBOM consumer could discover if any of the components are open source projects that are abandoned or archived. The user could then take actions such as forking the abandoned project or removing that project as a dependency.

## The evolution and growing importance of SBOMs

For more than a decade, a variety of communities have worked on standards for generating and sharing SBOMs or SBOM-relevant resources, with institutional support from organizations and government agencies like the [Linux Foundation](https://www.linuxfoundation.org/) and the [Department of Commerce](https://ntia.gov/page/software-bill-materials). Discussion of SBOMs grew significantly after the White House signed a [cybersecurity executive order in May 2021](https://web.archive.org/web/20250119085114/https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/), which in turn led the National Institute of Standards and Technology (NIST) and Department of Commerce to recommend the requirement of SBOMs for all software used by the federal government. This recommendation was based on the logic that SBOMs, had they been in use, would have helped minimize damage of recent large scale software supply chain security incidents such as SolarWinds.  More recently, the Department of Homeland Security demonstrated the U.S. government’s sustained interest in SBOMs by supporting and funding the SBOM community’s research and development. The Cybersecurity and Infrastructure Security Agency (CISA), part of the Department of Homeland Security, now leads much of this work and published an updated [_Framing Software Component Transparency_](https://www.cisa.gov/sites/default/files/2024-10/SBOM%20Framing%20Software%20Component%20Transparency%202024.pdf) report in 2024.

Even without requirements, [SBOMs are becoming increasingly popular in industry](https://www.linuxfoundation.org/press/press-release/the-linux-foundation-releases-the-state-of-software-bill-of-materials-sbom-and-cybersecurity-readiness-research) given their utility for managing security risks and licensing, and providing greater visibility into an organization’s codebase. SBOM tools and practices, however, are still maturing and have yet to realize their full potential as an industry practice. While there has been an uptick in the creation and use of SBOMs, many of these SBOMs fail to meet the minimum requirements set forth by the [Department of Commerce](https://ntia.gov/sites/default/files/publications/sbom_minimum_elements_report_0.pdf). For example, [in an analysis of 3,000 SBOMs](https://www.chainguard.dev/unchained/are-sboms-good-enough-for-government-work) taken from a list of popular Docker containers, Chainguard Labs found that only one percent of SBOMs conformed with the minimum required elements. Nonetheless, proponents of SBOMs (such as Chainguard) remain optimistic about their potential. As industry strengthens SBOM tooling and practices, SBOMs continue to hold great promise for helping secure software supply chains.

## Open source SBOM tools

### SBOM creation tools

Currently, most SBOMs are generated after the build process using a variety of tools that can scan the software for packages, licensing info, and other information relevant to an SBOM. [Syft](https://github.com/anchore/syft) and [Trivy](https://github.com/aquasecurity/trivy) are two popular open source tools for generating SBOMs for containers after the build process, along with [bom](https://github.com/kubernetes-sigs/bom), an open source tool for creating, viewing, and transforming SBOMs for Kubernetes and other projects.

One downside of generating SBOMs after the build process is that [scanners typically do not recognize components that are not registered with a package management system](https://www.chainguard.dev/unchained/not-all-sboms-are-created-equal). Thus, locally built software components can be missed by the scanner and result in the generation of an SBOM that is missing critical information about the software’s inventory.

Ideally, SBOMs should be generated during the build process, which enables a higher level of accuracy given that the SBOM can be generated directly from the software inventory rather than from database records. Though build systems do not typically provide support for this approach, more build tools are beginning to integrate features for generating SBOMs, such as [apko](https://github.com/chainguard-dev/apko), a tool for building and publishing OCI container images.

### SBOM formats

When selecting an SBOM generation tool, it’s important to make sure it supports the format you wish to use. Though there are a variety of available SBOM formats, most SBOMs follow either CycloneDX or SPDX, both of which are approved by the National Telecommunications and Information Administration for fulfilling the executive order’s SBOM requirement.

Your choice of format also affects which downstream tools can read the SBOM. Vulnerability scanners and software composition analysis (SCA) tools vary in how completely they parse each format, so confirm that the tools in your pipeline support the format you generate or consume.

### Quality measurement tools

An SBOM’s utility is dependent on the quality and comprehensiveness of the information it contains. As noted above, many SBOMs available today fail to meet the NTIA’s minimum requirements. The following tools are helpful for assessing the quality of SBOMs you use or create:

* The open source [SBOM Scorecard](https://github.com/eBay/sbom-scorecard), created by eBay, analyzes SPDX and CycloneDX formats according to evolving key fields such as spec compliance, licensing information, and package data.
* The open source [NTIA Conformance Checker](https://github.com/spdx/ntia-conformance-checker) analyzes whether an SPDX SBOM meets the NTIA’s minimum elements, such as supplier’s name, dependency relationship, and timestamp.

### Signing SBOMs

[Signing your SBOM](/open-source/sigstore/cosign/an-introduction-to-cosign/) is an important way of assuring end users that it has not been tampered with by a third party and that it comes from a trusted source (you). You can learn more about how to use [Cosign](https://github.com/sigstore/cosign), an open source tool for signing containers and other software artifacts, to sign your SBOM [in our tutorial](/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/).

## Learn more

In this guide, you have learned about the purpose of SBOMs and why proponents see them as a critical building block for software supply chain security. You have also learned about key tools and formats used in SBOM production and consumption, and how to measure the quality of the SBOMs you generate or consume.

SBOM practices and tooling are actively evolving. To learn more about SBOMs, check out related research by Chainguard Labs, such as:

* [What makes a good SBOM?](/open-source/sbom/what-makes-a-good-sbom/)
* [Are SBOMs Any Good? Preliminary Measurement of the Quality of Open Source Project SBOMs](https://www.chainguard.dev/unchained/are-sboms-any-good-preliminary-measurement-of-the-quality-of-open-source-project-sboms)
* [Are SBOMs Good Enough for Government Work?](https://www.chainguard.dev/unchained/are-sboms-good-enough-for-government-work)

---

### What makes a good SBOM?
_Path: open-source/sbom/what-makes-a-good-sbom.md_

A [software bill of materials](/software-security/glossary/#sbom), or an SBOM (pronounced s-bomb), is a formal record of the components contained in a piece of software. It is analogous to an ingredients list for a recipe. And it has become recognized as one of the key building blocks of software supply chain security. Proponents rightfully point out that organizations can't secure their software if they don't know what's inside their software.

As awareness and adoption of SBOM has grown, there has been a gradual acknowledgement that [not all SBOMs are created equal](https://www.chainguard.dev/unchained/not-all-sboms-are-created-equal), some are more or less useful, depending on the goals of the SBOM user and the contents of the SBOM. This guide exists to provide some guidance on evaluating the quality of an SBOM, suggesting common use cases and the data fields that support these use cases and open source SBOM quality tools.

## Basic SBOM use cases and required SBOM data

**Identifying Vulnerable Components**: SBOMs can help organizations and individuals know the unfixed vulnerabilities in their software. By providing an inventory of components, this allows a software maintainer to check whether the versions of their component are associated with any known vulnerabilities. The software maintainer can then update or patch any components with known vulnerabilities.

To enable this use case, SBOMs must contain information, at a minimum, about the component name and version. Because there are many different open source software package ecosystems, it is also advantageous to include information about the package ecosystem from which a component originates. This reduces the chances of a false positive when identifying potential vulnerabilities. A [package URL](https://github.com/package-url/purl-spec) (or purl) provides this ecosystem information. Additionally, SBOMs ought to include all transitive dependencies, dependencies of dependencies.

**Identifying Licenses**: SBOMs can also help organizations and individuals use open source software consistent with the licensing terms of all components. By identifying all components and associated licenses, software teams can understand the legal implications of any decision related to incorporating a particular component. Some organization also wish to track, often for legal or procurement purposes, the "supplier" of a particular component.

To enable license analysis, an SBOM must contain information about the license or licenses associated with all components. Additionally, there is a supplier data field that can help organizations understand component suppliers.

**Ensuring Software Integrity**: SBOMs can also help organizations and individuals ensure software integrity, discovering instances of tampering where a party has introduced malicious functionality.

Providing checksums for packages or files within the SBOM enables machine-verification of software integrity.

Note: There are [other SBOM use cases](https://www.atlanticcouncil.org/in-depth-research-reports/issue-brief/the-cases-for-using-sboms/), such as mapping broader ecosystem risks, but this guide currently focuses on the arguably three relatively well-established SBOM use cases.

## Measuring SBOM quality

The tools for measuring SBOM quality — like the overall concept of SBOM quality itself — are nascent. There are currently two tools that are worth watching to evaluate SBOMs.

[SBOM Scorecard](https://github.com/eBay/sbom-scorecard) analyzes both major SBOM formats and returns a composite quality score indicating the extent to which an SBOM possesses key fields, including whether the components in the SBOM contain a purl and whether there are licenses associated with each component.

[NTIA Conformance Checker](https://github.com/spdx/ntia-conformance-checker) analyzes whether [SPDX](https://spdx.dev/) SBOM documents possess the data fields associated with the so-called "NTIA minimum elements." [The U.S. National Telecommunications and Information Administration "minimum elements"](https://ntia.gov/sites/default/files/publications/sbom_minimum_elements_report_0.pdf) include the data fields deemed essential for basic SBOM use cases, including the identification of vulnerable components and the identification of component licenses.

Stewardship of this guidance has since moved from the NTIA to the U.S. Cybersecurity and Infrastructure Security Agency (CISA), which published an updated [_Framing Software Component Transparency_](https://www.cisa.gov/sites/default/files/2024-10/SBOM%20Framing%20Software%20Component%20Transparency%202024.pdf) report in 2024 and released a draft update to the minimum elements in 2025. The core data fields remain consistent, so an SBOM that satisfies the NTIA minimum elements is a sound baseline today.

## Learn more

Check out Chainguard's blog post on ["Are SBOMs Any Good?"](https://www.chainguard.dev/unchained/are-sboms-any-good-preliminary-measurement-of-the-quality-of-open-source-project-sboms) to see an application of these SBOM quality tools to a dataset of open source project SBOMs. You can also learn about the complications for SBOM quality created by ["software dark matter."](https://www.chainguard.dev/unchained/software-dark-matter-is-the-enemy-of-software-transparency).

---

### What is OpenVEX?
_Path: open-source/sbom/what-is-openvex.md_

[OpenVEX](https://github.com/openvex) is an open source specification, library, and suite of tools designed to enable software users to eliminate vulnerability noise and focus their security efforts on vulnerabilities that pose an immediate risk. [Released by Chainguard in January 2023](https://www.chainguard.dev/unchained/accelerate-vex-adoption-through-openvex), it’s the first set of open source tools to support the VEX specification championed by the [United States National Telecommunications and Information Administration (NTIA)](https://ntia.gov/) and the [Cybersecurity and Infrastructure Security Agency (CISA)](https://www.cisa.gov/).

With OpenVEX, stakeholders from across the software supply chain can collaborate on identifying and remediating exploitable vulnerabilities and use automation to enable more precise and efficient methods of security management. In this guide, you will learn more about the emerging supply chain security standards that OpenVEX supports, as well as how OpenVEX tooling can help you leverage them in your security management processes.

## SBOMs and VEX

One of the most important ways you can protect your codebase from cyberattacks is to have timely and precise information about whether it contains known vulnerabilities. Unfortunately, many cyberattacks are able to broaden the scope of their damage *after* a vulnerability is publicly identified because individual software operators and end users are unaware that their codebase contains a known vulnerability and requires a patch. Many codebases are too complex and contain too many dependencies for their maintainers to have a comprehensive awareness of their contents.

Incorporating [software bills of materials (SBOMs)](/open-source/sbom/what-is-an-sbom/) is a powerful way of improving visibility into your codebase so that vulnerabilities can be identified in a timely manner. When vulnerabilities are made known through security advisories, code owners and other users can refer to the tool's SBOM to see if they have dependencies associated with the specified vulnerability.

In this way, SBOMs represent a significant step forward in security management by enabling software users to quickly identify vulnerabilities, which can otherwise require a significant amount of labor. For example, [one federal agency reportedly spent 33,000 hours responding to the Log4j vulnerability](https://federalnewsnetwork.com/commentary/2023/01/application-security-a-pillar-of-zero-trust/) at the expense of other priorities.

Though the SBOM's improvement of visibility can greatly improve an organization's security posture, it can also be accompanied by an overproduction of false positives. In this context, [false positives](/chainguard/containers/security-and-compliance/working-with-scanners/false-results/) are vulnerabilities that are associated with an organization's codebase but have been determined to not be exploitable in specific circumstances.

This increase in false positives can hinder an SBOM's security utility as organizations are tasked with investigating the broadened list of vulnerabilities to see which ones pose genuine threats to their codebase. In cases like this, organizations may once again struggle to efficiently identify and respond to vulnerabilities before it is too late.

When publishing a VEX document for a known software vulnerability, the author assigns the product a status drawn from the following list:

* NOT AFFECTED — No remediation is required regarding this vulnerability.
* AFFECTED — Actions are recommended to remediate or address this vulnerability.
* FIXED — These product versions contain a fix for the vulnerability.
* UNDER INVESTIGATION — It is not yet known whether these product versions are affected by the vulnerability. An update will be provided in a later release.

Once published, downstream software users (such as operators or developers) can use these VEX documents to determine whether they are impacted by a vulnerability and what steps they might need to take to address it.

Though VEX documents do not need to be used with an SBOM, together they offer a powerful and efficient way to comprehensively scan your codebase for vulnerabilities that matter. An SBOM helps you know whether you have dependencies associated with a vulnerability, while a VEX document tells you which of those vulnerabilities you can ignore. A further benefit of VEX documents is that they are machine readable, enabling users to integrate them into automated workflows and broader tooling to support efficient security management.

VEX has value for stakeholders across the supply chain, enabling collaboration across suppliers, operators, and end users that can save the community significant amounts of time investigating and mitigating vulnerabilities. Software suppliers can use VEX to let their users know when they’ve already investigated a vulnerability and whether that vulnerability affects the product or if further action needs to be taken by the user. And in the case that end users investigate potential vulnerabilities without a security advisory, they can encode their findings in a VEX document to share with the supplier or track for future or ongoing investigations.

## How to leverage VEX and SBOMs with OpenVEX

To help software suppliers and users leverage VEX, Chainguard developed OpenVEX, an open source specification, library, and suite of tools based on the VEX standard. Developed in collaboration with CISA’s VEX Working Group, OpenVEX is the first format to meet the VEX Minimum Requirements and is designed to be lightweight in order to help support community adoption.

### A specification

OpenVEX documents are JSON-LD files that capture the minimal requirements for VEX as defined by the VEX working group organized by CISA. You can think of the VEX minimal requirements as the “specification of specifications”, and the OpenVEX format as a lightweight, embeddable, integration-friendly spec that complies with the VEX specification.

VEX documents are composed of metadata (such as the author and timestamp) and a series of statements that link together a software product (with an identifier that can be traced to an SBOM, such as a Package URL), a vulnerability (using a vuln identifier such as CVE or OSV) , and one of the four impact statuses defined by VEX (“not affected”, “affected”, “fixed”, and “under investigation”).

For example, an OpenVEX document with one statement could be written like this:

```json
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/example/vex-9fb3463de1b57",
  "author": "Wolfi J Inkinson",
  "role": "Document Creator",
  "timestamp": "2023-01-08T18:02:03.647787998-06:00",
  "version": 1,
  "statements": [
    {
      "vulnerability": {
        "name": "CVE-2023-12345"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/git@2.39.0-r1?arch=armv7"
        },
        {
          "@id": "pkg:apk/wolfi/git@2.39.0-r1?arch=x86_64"
        }
      ],
      "status": "fixed"
    }
  ]
}
```

The OpenVEX specification details additional information you can include in an OpenVEX document. For example, certain statuses require additional statement information. A statement with a `not_affected` status must include a status justification or an `impact_statement` describing why the product is not affected. A statement with a `not_affected` status might be written like this:

```json
  {
      "vulnerability": {
        "name": "CVE-2023-12345"
      },
      "products": [
        {
          "@id": "pkg:apk/wolfi/product@1.23.0-r1?arch=armv7"
        }
      ],
      "status": "not_affected",
      "justification": "component_not_present",
      "impact_statement": "The vulnerable code was removed with a custom patch"
    }
```

These additional fields allow users to include valuable context and justification for VEX statements that can help users prioritize vulnerabilities and know what further action they need to take.

You can learn more about the OpenVEX Specification in the [OpenVEX repo](https://github.com/openvex/spec/blob/main/OPENVEX-SPEC.md).

### A Go library

The project has a Go library (openvex/go-vex) that lets projects generate, transform and consume OpenVEX files. It enables the ingestion of VEX metadata expressed in other VEX implementations.

You can learn more about `go-vex` in the [OpenVEX repo](https://github.com/openvex/go-vex).

### A set of tools

OpenVEX is also committed to building out tools that will allow software authors and consumers to work with VEX metadata. The first project in this initiative is `vexctl`, a CLI to create, merge and attest VEX documents. This tool can also be used to apply VEX documents to scanner results in order to filter out false positives.

For example, you can create a VEX document using a `vexctl create` command like the following:

```shell
vexctl create --product="pkg:apk/wolfi/git@2.38.1-r0?arch=x86_64" \
               --vuln="CVE-2014-123456" \
               --status="not_affected" \
               --justification="inline_mitigations_already_exist"
```

This code snippet will create the following OpenVEX document:

```Output
{
  "@context": "https://openvex.dev/ns/v0.2.0",
  "@id": "https://openvex.dev/docs/public/vex-783356508926ad84f48fa51480d2ed85476160dd3d4169eb0024c346edd1f10b",
  "author": "Unknown Author",
  "timestamp": "2024-11-21T15:52:42.58376093-08:00",
  "version": 1,
  "statements": [
 {
   "vulnerability": {
     "name": "CVE-2014-123456"
   },
   "timestamp": "2024-11-21T15:52:42.583761761-08:00",
   "products": [
     {
       "@id": "pkg:apk/wolfi/git@2.38.1-r0?arch=x86_64"
     }
   ],
   "status": "not_affected",
   "justification": "inline_mitigations_already_exist"
 }
  ]
}
```

Or, to filter out vulnerabilities from security scanner results that are fixed or not exploitable, you can use the `vexctl filter` command.  In this example, `scan_results.sarif.json` is the file with the scanner results and `vex_data.csaf` contains the VEX information:

```shell
vexctl filter scan_results.sarif.json vex_data.csaf
```

This command will return output showing vulnerabilities from the scanner that are not resolved by the VEX document.

To learn about other commands and capabilities of the `vexctl` tool, visit the [OpenVEX repo](https://github.com/openvex/vexctl).

## Learn more

OpenVEX is actively evolving to support VEX adoption across the community, and will continue building out tooling and adjusting its specification to meet community needs.

To learn more about VEX, check out related resources on Chainguard’s blog:

* [Reflections on Trusting VEX (or when humans can improve SBOMs)](https://www.chainguard.dev/unchained/reflections-on-trusting-vex-or-when-humans-can-improve-sboms)
* [Putting VEX to work](https://www.chainguard.dev/unchained/putting-vex-to-work)
* [Understanding the Promise of VEX](https://www.chainguard.dev/unchained/understanding-the-promise-of-vex)
* [What is VEX and Why Should I Care?](https://www.endorlabs.com/blog/what-is-vex-and-why-should-i-care)

You can also read more about VEX use cases in [this report published by the Cybersecurity and Infrastructure Security Agency](https://www.cisa.gov/sites/default/files/publications/VEX_Use_Cases_Aprill2022.pdf).

---

### Build tools
_Path: open-source/build-tools/_index.md_

The open source tools that were developed for the [Wolfi](/open-source/wolfi/) operating system.

---

### Troubleshooting melange builds
_Path: open-source/build-tools/melange/troubleshooting.md_

## Debug options

To include debug-level information on melange builds, edit your `melange.yaml` file and include `set -x` in your pipeline. You can add this flag at any point of your pipeline commands to further debug a specific section of your build.

```yaml
...
pipeline:
  - name: Build Minicli application
    runs: |
      set -x
      APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
```

## Common errors

When melange is unable to finish a build successfully, you will get an error similar to this:

{{< alert context="danger" text="Error: failed to build package: unable to run pipeline: exit status 127" />}}

The build could not be completed due to an error at some point of your pipeline. Enable debug by including `set -x` at the beginning of your build pipeline so that you can nail down where the issue occurs.

### Missing QEMU user-space emulation packages

Linux users using the Docker melange image may get errors when building packages for other architectures than `x86` and `x86_64`. This won't happen for Docker Desktop users, since the additional architectures are automatically enabled upon installation.

To enable additional architectures, you'll need to enable them within your kernel with the following command:

```shell
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
```

An alternate approach to achieve the same result is to run the following command:

```shell
docker run --privileged --rm tonistiigi/binfmt --install all
```

### Missing build-time dependencies

You may get errors from missing build-time dependences such as `busybox`. In this case you may get "No such file or directory" errors when enabling debug with `set -x`. To fix this, you'll need to locate which package has the commands that your build needs, and add it to the list of your build-time dependencies.

## Further resources

For additional guidance, please refer to the [melange repository](https://github.com/chainguard-dev/melange) on GitHub, where you can find [more examples](https://github.com/chainguard-dev/melange/tree/main/examples) or [open an issue](https://github.com/chainguard-dev/melange/issues/new/choose) in case of problems.

---

### melange FAQs
_Path: open-source/build-tools/melange/faq.md_

## Do I need to understand melange to use Chainguard Containers?

No. Chainguard built [melange](https://github.com/chainguard-dev/melange) as part of its open source tooling used for the [Wolfi](/open-source/wolfi/) operating system. While you can check out the [project on GitHub](https://github.com/chainguard-dev/melange) and learn more, it’s not a prerequisite for using or working with [Chainguard Containers](/chainguard/containers/).

## How are melange packages defined?

melange apks are defined declaratively using a YAML file.

## Is melange compatible with Alpine?

Yes, melange is built to be compatible with apk-based systems including Alpine.

## Can I mix Alpine and Wolfi package repositories to create my melange build environment?

No, it's not possible to mix Alpine apks with Wolfi apks.

## Is it mandatory to sign packages with a melange key?

Signing packages is not mandatory, but it is a recommended practice, because it allows users and automated systems to verify that the package they downloaded was built by the same person who signed it, and that it hasn't been tampered with.

## What happens if I don't provide a key to sign my package(s)?

Some systems may prevent installation of your apk if they can't attest the package provenance. This is the case with [apko](https://github.com/chainguard-dev/apko), which by default will fail any builds that reference unsigned packages.

## Can I create custom pipelines and embed them into my main pipeline?

Although melange supports inclusion of sub-pipelines, this feature currently only supports the built-in pipelines (such as `make`, `split` and others) that can be found at the [pkg/build/pipelines](https://github.com/chainguard-dev/melange/tree/main/pkg/build/pipelines) directory on the main project repository.

---

### melange
_Path: open-source/build-tools/melange/_index.md_

melange is an apk builder tool that uses declarative pipelines to create apk packages.

---

### Getting started with melange
_Path: open-source/build-tools/melange/getting-started-with-melange.md_

[melange](https://github.com/chainguard-dev/melange) is an [apk](https://wiki.alpinelinux.org/wiki/Package_management) builder tool that uses declarative pipelines to create apk packages. From a single YAML file, users are able to generate multi-architecture apks that can be injected directly into [apko](https://github.com/chainguard-dev/apko) builds.

Understanding melange can help you better understand the [Wolfi](/open-source/wolfi/) operating system and how [Chainguard Containers](/chainguard/containers/) are made to be minimal and secure, but it is not necessary to have a background in melange in order to use Chainguard Containers.

In this guide, you'll learn how to build a software package with melange. To demonstrate the versatile combination of melange and apko builds, we'll package a small command-line PHP script and build a minimalist container image based on Wolfi with the generated apk. All files used in this demo are open source and available at the [melange-php-demos](https://github.com/chainguard-dev/melange-php-demos/tree/main/hello-minicli) repository.

## Requirements

Our guide is compatible with operating systems that support Docker and shared volumes. Please follow the [appropriate Docker installation instructions](https://docs.docker.com/get-docker/) for your operating system.

You won't need PHP or Composer installed on your system, since we'll be using Docker to build the demo app.

### Note for Linux users

In order to be able to build apks for multiple architectures using Docker, you may need to register additional QEMU headers within your kernel. This is done automatically for Docker Desktop users, so if you are on macOS you don't need to run this additional step.

Run the following command to register the necessary handlers within your kernel, using the [multiarch/qemu-user-static](https://github.com/multiarch/qemu-user-static) image.

```shell
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
```

You should now be able to build apks for all architectures supported by melange.

## 1 — Downloading the melange image

The fastest way to get melange up and running on your system is by using the [official melange image](https://images.chainguard.dev/directory/image/melange/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-open-source-build-tools-melange-getting-started-with-melange) with Docker. Start by pulling the melange image into your local system:

```shell
docker pull cgr.dev/chainguard/melange:latest
```

This will download the latest version of the melange image, which is rebuilt every night for extra freshness.

Check that you're able to run melange with `docker run`.

```shell
docker run --rm cgr.dev/chainguard/melange version
```

You should get output similar to the following:

```output
  __  __   _____   _          _      _   _    ____   _____
 |  \/  | | ____| | |        / \    | \ | |  / ___| | ____|
 | |\/| | |  _|   | |       / _ \   |  \| | | |  _  |  _|
 | |  | | | |___  | |___   / ___ \  | |\  | | |_| | | |___
 |_|  |_| |_____| |_____| /_/   \_\ |_| \_|  \____| |_____|
melange

GitVersion:    v0.11.1
GitCommit:     a52edcc075ebf1dc89aea87893e3821944171ee3
GitTreeState:  clean
BuildDate:     '2024-07-19T16:04:17Z'
GoVersion:     go1.22.5
Compiler:      gc
Platform:      linux/amd64

```

With melange installed, you’re ready to proceed.

## 2 — Cloning the demo repository

To demonstrate melange's features with a minimalist application that has real-world functionality, our demo consists of a PHP command line app that queries the [Slip advice](https://api.adviceslip.com/) API and outputs a random piece of advice. The app is a single-file script built with [Minicli](https://github.com/minicli).

Start by cloning the demo repository to your local machine and navigating to the `melange-php-demos/hello-minicli` directory:

```shell
git clone git@github.com:chainguard-dev/melange-php-demos.git
cd melange-php-demos/hello-minicli
```

Run the following command, which will use the official Composer image to generate a composer.json file and download minicli/minicli:

```shell
docker run --rm -it -v "${PWD}":/app composer require minicli/minicli
```

Once you receive confirmation that the download was completed, you'll need a second dependency to query the Advice Slip API. Run the following command to include `minicli/curly`, a `curl` wrapper for Minicli:

```shell
docker run --rm -it -v "${PWD}":/app composer require minicli/curly
```

Now you can run the application to make sure it's functional. You can do that using Docker and Chainguard's PHP image:

```shell
docker run --rm -it -v "${PWD}":/app cgr.dev/chainguard/php /app/minicli advice
```

You should get a random piece of advice such as:

```
Gratitude is said to be the secret to happiness.
```

With the application ready, you can start building your package.

## 3 — The melange YAML file

The `melange.yaml` file is where you declare the details and specifications of your apk package. For code that generates self-contained binaries, this is typically where you'll build your application artifacts with compiler tools. In the case of interpreted languages, you'll likely build your application by downloading vendor dependencies, setting up relevant paths, and setting the environment up for production.

The melange specification file contains three main sections:

- **package**: defines package specs, such as name, license, and runtime dependencies. Runtime dependencies will be brought into the system automatically as dependencies when the apk is installed.
- **environment**: defines how the environment should be prepared for the build, including required packages and their source repositories. Anything that is only required at build time goes here, and shouldn't be part of the runtime dependencies.
- **pipeline**: defines the build pipeline for this package.

One of the best advantages of using melange is to be able to control all steps of your build pipeline, and include only what's necessary. This way, you'll be able to build smaller and more secure container images by removing unnecessary dependencies.

This is what the `melange.yaml` included in our demo looks like, for your reference:

```yaml
package:
  name: hello-minicli
  version: 0.1.0
  description: Minicli melange demo
  target-architecture:
    - all
  copyright:
    - license: MIT
  dependencies:
    runtime:
      - php
      - php-curl

environment:
  contents:
    keyring:
      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
      - ./melange.rsa.pub
    repositories:
      - https://packages.wolfi.dev/os
    packages:
      - ca-certificates-bundle
      - busybox
      - curl
      - git
      - php
      - php-phar
      - php-iconv
      - php-openssl
      - php-curl
      - composer

pipeline:
  - name: Build Minicli application
    runs: |
      MINICLI_HOME="${{targets.destdir}}/usr/share/minicli"
      EXEC_DIR="${{targets.destdir}}/usr/bin"
      mkdir -p "${MINICLI_HOME}" "${EXEC_DIR}"
      cp ./composer.json "${MINICLI_HOME}"
      /usr/bin/composer install -d "${MINICLI_HOME}" --no-dev
      cp ./minicli "${EXEC_DIR}"
      chmod +x "${EXEC_DIR}/minicli"

```

Our build pipeline will set up two distinct directories, separating the application dependencies from its executable entry point. The executable `minicli` script will be copied into `/usr/bin`, while the vendor files will be located at `/usr/share/minicli`.

## 4 — Building the minicli apk with melange

Before building the package, you'll need to create a temporary keypair to sign it. You can use the following command for that:

```shell
docker run --rm -v "${PWD}":/work cgr.dev/chainguard/melange keygen
```

This will generate a `melange.rsa` and `melange.rsa.pub` files in the current directory.

```
2024/08/01 16:55:31 INFO generating keypair with a 4096 bit prime, please wait...
2024/08/01 16:55:33 INFO wrote private key to melange.rsa
2024/08/01 16:55:33 INFO wrote public key to melange.rsa.pub
```

Next, build the apk defined in the `melange.yaml` file with the following command:

```shell
docker run --privileged --rm -v "${PWD}":/work \
  cgr.dev/chainguard/melange build melange.yaml \
  --arch amd64,aarch64 \
  --signing-key melange.rsa
```

This will set up a volume sharing your current folder with the location `/work` inside the container. We'll build packages for `amd64` and `aarch64` platforms and sign them using the `melange.rsa` key created in the previous command.

When the build is finished, you should be able to find a `packages` folder containing the generated apks (and associated apk index files):

```
packages
├── aarch64
│   ├── APKINDEX.json
│   ├── APKINDEX.tar.gz
│   └── hello-minicli-0.1.0-r0.apk
└── x86_64
    ├── APKINDEX.json
    ├── APKINDEX.tar.gz
    └── hello-minicli-0.1.0-r0.apk

3 directories, 6 files
```

You have successfully built a multi-architecture software package with melange!

## 5 — Building a container image with apko

With the apk packages and apk index in place, you can now build a container image and have your apk(s) installed within it.

The following `apko.yaml` file will create a container image tailored to the application we built in the previous steps. Because we defined the PHP dependencies as runtime dependencies within the apk, you don't need to require these packages again here. The container entrypoint command will be set to `/usr/bin/minicli`, where the application executable is located.

One important thing to note is how we reference the `hello-minicli` apk as a local package within the `repositories` section of the YAML file. The `@local` notation tells apko to search for apks in the specified directory, in this case `/work/packages`.

This is what the `apko.yaml` file included in our demo looks like, for your reference:

```yaml
contents:
  keyring:
    - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
    - ./melange.rsa.pub
  repositories:
    - https://packages.wolfi.dev/os
    - '@local /work/packages'
  packages:
    - wolfi-base
    - ca-certificates-bundle
    - hello-minicli@local
accounts:
  groups:
    - groupname: nonroot
      gid: 65532
  users:
    - username: nonroot
      uid: 65532
  run-as: 65532
entrypoint:
  command: /usr/bin/minicli advice
```

The following command will set up a volume sharing your current folder with the location `/work` in the apko container, running the `apko build` command to generate an image based on your `apko.yaml` definition file.

```shell
docker run --rm --workdir /work -v ${PWD}:/work cgr.dev/chainguard/apko \
  build apko.yaml hello-minicli:test hello-minicli.tar --arch host
```

This will build an OCI image based on your host system's architecture (specified by the `--arch host` flag). If you receive warnings at this point, those are likely related to the types of SBOMs being uploaded and can be safely ignored.

The command will generate a few new files in the app's directory:

- `hello-minicli.tar` — the packaged OCI image that can be imported with a `docker load` command
- `sbom-%host-architecture%.spdx.json` — an SBOM file for your host architecture in `spdx-json` format

Next, load your image within Docker:

```shell
docker load < hello-minicli.tar
```

```
7cbaefdf1c30: Loading layer   13.7MB/13.7MB
Loaded image: hello-minicli:test-%host-architecture%
```

Note that the `%host-architecture%` will vary, and there may be multiple images loaded into your Docker daemon. Be sure to edit the variable in the following `docker run` command to match your target architecture.

Now you can run your Minicli program with:

```shell
docker run --rm hello-minicli:test-%host-architecture%
```

The demo should output an advice slip such as:

```
Only those who attempt the impossible can achieve the absurd.
```

You have successfully built a minimalist container image with your apk package installed on it. This image is fully [OCI](https://opencontainers.org/) compatible and can be signed with [Cosign](/open-source/sigstore/cosign/how-to-sign-a-container-with-cosign/) for provenance attestation.

## Conclusion

In this guide, we packaged a PHP command-line app with melange. We also built a container image to install and run our custom apk, using the apko tool. For more information about apko, check our [Getting started with apko](/open-source/apko/getting-started-with-apko/) guide.

The demo files are available at the [melange-php-demos](https://github.com/chainguard-dev/melange-php-demos) repository, in the `hello-minicli` subfolder. For additional information on how to debug your builds and other features, check the [melange](https://github.com/chainguard-dev/melange) and [apko](https://github.com/chainguard-dev/apko) repositories on GitHub.

---

### melange overview
_Path: open-source/build-tools/melange/overview/index.md_

[melange](https://github.com/chainguard-dev/melange) is an [apk](https://wiki.alpinelinux.org/wiki/Package_management) builder tool that uses declarative pipelines to create apk packages. It is part of the open source tooling used for [Wolfi](/open-source/wolfi/), which is the operating system used to power [Chainguard Containers](/chainguard/containers/).

From a single YAML file, users are able to generate multi-architecture apks that can be injected directly into [apko](https://github.com/chainguard-dev/apko) builds.

The following diagram contains an overview of the apko and melange ecosystem and how they work together to compose apk-based images, using either Wolfi or Alpine as base system.

![The diagram shows an overview of the apko and melange ecosystem and their relationships. melange apks can be used to compose both Wolfi-based and Alpine-based container images using apko.](apko_melange_ecosystem.png)

For more information and up-to-date examples on how to use melange, please refer to the [melange repository on GitHub](http://github.com/chainguard-dev/melange).

---

### Getting started with apko
_Path: open-source/build-tools/apko/getting-started-with-apko.md_

[apko](http://github.com/chainguard-dev/apko) is a command-line tool to build container images using a declarative language based on YAML. apko is so named as it uses the [apk](https://wiki.alpinelinux.org/wiki/Package_management) package format and is inspired by the [ko](https://github.com/google/ko) build tool. It is part of the open source tooling Chainguard developed to create the [Wolfi](/open-source/wolfi/) operating system which is used in [Chainguard Containers](/chainguard/containers/).

## Why apko

Container images are typically assembled in multiple steps. A tool like Docker, for example, combines building steps (as in, running commands to copy files, build and deploy applications) and composition (as in, composing a base image with pre-built packages) in a single piece of software. apko, on the other hand, is solely a **composition** tool that focuses on producing lightweight, "flat" base images that are fully reproducible and contain auto generated [SBOM](https://www.cisa.gov/sbom) files for every successful build.

Instead of building your application together with your components and system dependencies, you can build your application once and compose it into different architectures and distributions, using a tool such as [melange](https://github.com/chainguard-dev/melange) in combination with apko. For more information on how melange and apko work together, you can check this blog post: [Secure your Software Factory with melange and apko](https://www.chainguard.dev/unchained/secure-your-software-factory-with-melange-and-apko).

In this guide, we'll learn how to use apko to build a base [Wolfi](/open-source/wolfi/overview/) image.

## Requirements

The fastest way to get apko up and running on your system is by using the [official apko image](https://images.chainguard.dev/directory/image/apko/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-open-source-build-tools-apko-getting-started-with-apko) with Docker. This method is compatible with all operating systems that support Docker and shared volumes. Please follow the [appropriate Docker installation instructions](https://docs.docker.com/get-docker/) for your operating system.

If you want to run apko on CI/CD pipelines built on top of GitHub Actions, check the [apko build action](https://github.com/chainguard-images/actions/tree/main/apko-build) on GitHub.

The instructions in this document were validated on an Ubuntu 22.04 workstation running Docker 20.10.

## Step 1 — Download the apko image

Start by pulling the official apko image into your local system:

```shell
docker pull cgr.dev/chainguard/apko
```

This will download the latest version of the distroless apko image, which is rebuilt every night for extra freshness.

Check that you're able to run apko with:

```shell
docker run --rm cgr.dev/chainguard/apko version
```

You should get output similar to this:

```output
     _      ____    _  __   ___
    / \    |  _ \  | |/ /  / _ \
   / _ \   | |_) | | ' /  | | | |
  / ___ \  |  __/  | . \  | |_| |
 /_/   \_\ |_|     |_|\_\  \___/
apko

GitVersion:    v0.6.0
...
```

In the next step, you'll build your first apko image.

## Step 2 — Build a test image

To test that you're able to build images, you can use one of the example `yaml` definition files that are included in the [official apko code repository](https://github.com/chainguard-dev/apko/tree/main/examples). Here we'll use the `wolfi-base.yaml` for demonstration.

Create a new folder to save your image files, then move to that directory:

```shell
mkdir ~/apko
cd ~/apko
```

Next, create a file named `wolfi-base.yaml` to save your image definition. You can use `nano` for that:

```shell
nano wolfi-base.yaml
```

The `wolfi-base.yaml` example image is defined as follows:

```yaml
contents:
  keyring:
    - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
  repositories:
    - https://packages.wolfi.dev/os
  packages:
    - ca-certificates-bundle
    - wolfi-base

entrypoint:
  command: /bin/sh -l

archs:
  - x86_64
```

The `contents` node is used to define allowed package sources and which packages should be included in the image. Here we'll be using only packages from the main Wolfi APK repository. In the `packages` section, we require the [wolfi-base](https://github.com/wolfi-dev/os/blob/main/wolfi-base.yaml) package, which is a meta-package to set up a bare minimum Wolfi system.

The `command` field within the `entrypoint` node defines the image entry point command `/bin/sh -l`, which will land you in a shell prompt whenever the image is executed. Finally, the `archs` node specifies that this image will be built for the `x86-64` architecture.

Save and close the file after you're done including these contents. With `nano`, you can do that by pressing `CTRL+X`, then confirming with `Y` and `ENTER`.

The only thing left to do now is run apko to build this image. The following build command will:

- set up a volume share in the current directory, synchronizing its contents with apko's image workdir; this way, the generated artifacts will be available on your host system.
- execute the `cgr.dev/chainguard/apko` image with the `build` command, tagging the image as `wolfi-base:test-amd64` and saving the build as `wolfi-test.tar`.

```shell
docker run --rm -v ${PWD}:/work -w /work cgr.dev/chainguard/apko build wolfi-base.yaml wolfi-base:test wolfi-test.tar
```

You should get output similar to this:

```output
. . .
Mar 15 20:17:02.023 [INFO] [arch:x86_64] Building images for 1 architectures: [amd64]
Mar 15 20:17:02.023 [INFO] [arch:x86_64] building tags [wolfi-base:test]
. . .
Mar 15 20:17:04.261 [INFO] loading config file: wolfi-base.yaml
Mar 15 20:17:04.416 [INFO] [arch:x86_64] adding amd64 to index
Mar 15 20:17:04.419 [INFO] [arch:x86_64] Generating index SBOM
Mar 15 20:17:04.420 [INFO] [arch:x86_64] Final index tgz at: wolfi-test.tar
```

From the output, you can notice that the image was successfully built as `wolfi-test.tar` in the container, which is shared with your local folder on the host thanks to the volume you created when running the `docker run` command.

## Step 3 — Test the image with Docker

To test the generated image with Docker, you'll need to use the `docker load` command and import the `.tar` file you created in the previous step:

```shell
docker load <  wolfi-test.tar
```

You'll get output like this:

```
bf6e72d71c13: Loading layer [==================================================>]  5.491MB/5.491MB
Loaded image: wolfi-base:test-amd64
```

You can check that the image is available at the host system with:

```shell
docker image list
```

You should be able to find the `wolfi-base` image with the `test-amd64` tag among the results.

Now you can run the image with:

```shell
docker run -it wolfi-base:test-amd64
```

This will get you into a container running the apko-built image `wolfi-base:test-amd64`. It's a regular shell that you can explore to see what's included - just keep in mind that this is a minimalist image with only the base Wolfi system. To include additional software packages, check the [Wolfi repository](https://github.com/wolfi-dev/os) to find the packages you'll need for your specific use case, or check out [melange](/open-source/melange/), apko's companion project that allows users to build their own APK packages from source.

## Conclusion

In this guide, you learned what apko is and what makes it a powerful resource in your cloud-native tooling.

If you need help debugging your build, check our [Troubleshooting apko](/open-source/apko/troubleshooting/) page for more information.
Check the [official apko repository](https://github.com/chainguard-dev/apko/) if you want to report an issue or suggest new features.

---

### Troubleshooting apko builds
_Path: open-source/build-tools/apko/troubleshooting.md_

## Debug options

To include debug-level information on apko builds, add `--debug` to your build command:

```shell
docker run --rm -v ${PWD}:/work cgr.dev/chainguard/apko build --debug \
  apko.yaml hello-minicli:test hello-minicli.tar \
  -k melange.rsa.pub
```

## Common errors

When the apk package manager is unable to resolve your requirements to a set of installable packages, you will get an error similar to this:

{{< alert context="danger" text="Error: failed to build layer image: initializing apk: failed to fixate apk world: exit status 1" />}}

There are two main root causes for this error, which we'll explain in more detail in the upcoming section:

- apk cannot find the package in the included repositories, or
- apk cannot find the apk index for your custom-built packages.

### The requested package is not in the included repositories

Make sure you've added the relevant package repositories you need and the package name is correct.
Check the [Wolfi repository](https://github.com/wolfi-dev/os) for available packages if you are building Wolfi images,
or the [Alpine APK index](https://pkgs.alpinelinux.org/packages) if you are using Alpine as base.

If this is your case, you should find error messages similar to this when enabling debug info with the `--debug` flag:

{{< alert context="danger" text="ERROR: unable to select packages: hello-minicli (no such package)" />}}

### apko is unable to find the local packages folder

With melange-built package(s), make sure you have a volume sharing your apko / melange files with the location `/work` inside the apko container.

### The apk index is missing

If you have a functional volume sharing your packages with the apko container and you're still getting this error, make sure you built a valid apk index as described in [step 4 of the Getting started with melange guide](/open-source/build-tools/melange/getting-started-with-melange/#4--building-the-minicli-apk-with-melange).

If this is your case, you should find error messages similar to this when enabling debug info with the `--debug` flag:

{{< alert context="danger" text="ERROR: Not committing changes due to missing repository tags. Use --force-broken-world to override." />}}

This is how your packages directory tree should be set up, including the `APKINDEX.tgz` file for each architecture:

```
packages
├── aarch64
│   ├── APKINDEX.tar.gz
│   └── hello-minicli-0.1.0-r0.apk
├── armv7
│   ├── APKINDEX.tar.gz
│   └── hello-minicli-0.1.0-r0.apk
├── x86
│   ├── APKINDEX.tar.gz
│   └── hello-minicli-0.1.0-r0.apk
└── x86_64
    ├── APKINDEX.tar.gz
    └── hello-minicli-0.1.0-r0.apk

4 directories, 8 files
```

## Further resources

For additional guidance, please refer to the [apko repository](https://github.com/chainguard-dev/apko) on GitHub, where you can find [more examples](https://github.com/chainguard-dev/apko/tree/main/examples) or [open an issue](https://github.com/chainguard-dev/apko/issues/new/choose) in case of problems.

---

### apko FAQs
_Path: open-source/build-tools/apko/faq.md_

## Do I need to understand apko to use Chainguard Containers?

No. Chainguard built [apko](https://github.com/chainguard-dev/apko) as part of its open source tooling around the [Wolfi](/open-source/wolfi/) operating system. While you can check out the [project on GitHub](https://github.com/chainguard-dev/apko) and learn more, it's not a prerequisite for [using Chainguard Containers](/chainguard/containers/using-and-deploying/).

## How are apko images defined?

apko images are defined declaratively using a YAML file. It was designed this way to facilitate reproducible builds — run apko twice, and you'll get the same output.

## Does apko provide SBOMs?

Yes, apko builds include high-quality [SBOMs](/open-source/sbom/what-is-an-sbom/) (software bills of materials) for all builds. This is a key feature of the tooling that Chainguard has developed to ensure that users can trust the software they are running.

## Can I use apko images with Docker?

Yes, images built with apko are fully OCI compliant and can be used with any container runtime that supports the OCI image format.

## Can I mix Wolfi and Alpine package repositories to create my apko build environment?

No, it's not possible to mix Wolfi apks with Alpine apks.

## Can I execute arbitrary commands in apko builds such as in RUN steps in Dockerfiles?

No, you can't execute arbitrary commands in apko builds. apko provides directives for creating users and setting up directories and permissions, but any additional steps necessary at build time, such as the installation of packages and execution of shell commands, must be defined in apk packages that should be included in the list of build dependencies. This is an implementation feature to allow for reproducible builds and high-quality SBOMs.

---

### Bazel rules for apko
_Path: open-source/build-tools/apko/bazel-rules.md_

`rules_apko` is an open source plugin for Bazel that makes it possible to build
secure, minimal Wolfi-based container images using the Bazel build system. It
wraps the [apko](https://github.com/chainguard-dev/apko) tool for use under
Bazel, providing hermetic, reproducible image builds with full Bazel caching
support.

By the end of this guide you will have a working Bazel project that builds a
minimal Wolfi-based container image using `rules_apko`.

## How to build a container with Bazel using `rules_apko`

This page covers `rules_apko` version `1.5.37` with Bazel `9.0.1` using
**Bzlmod**, which is the only supported dependency management method in Bazel 9.
If you are on an earlier version of Bazel, you should upgrade to Bazel 9 before
following this guide.

> Note: You do not need to install `apko` separately. `rules_apko` manages
> its own hermetic `apko` toolchain and automatically downloads `apko v1.1.12`
> on first build.

### Prerequisites

Before you begin, ensure you have the following:

- **Bazel 9.x** installed. This page was written and tested against Bazel
  `9.0.1`. Follow the [Bazel installation guide](https://bazel.build/install)
  for details. Note the Bazel version in use by confirming the
  `dev.chainguard.package.main` label on your image is `bazel-9`.
- **`chainctl`** installed and authenticated. `chainctl` is the Chainguard
  command line tool. See the
  [chainctl documentation](/platform/chainctl/) for
  installation instructions.
- **`rules_apko` version `1.5.37`** available in the
  [Bazel Central Registry](https://registry.bazel.build/modules/rules_apko).
  No separate download is required — Bazel fetches it automatically when you
  declare it in `MODULE.bazel`.

### Project structure

A complete `rules_apko` project requires the following files:

```
my-apko-image/
├── .bazelrc                 ← create manually
├── MODULE.bazel             ← create manually, updated in two stages
├── BUILD.bazel              ← create manually, updated in two stages
├── apko.yaml                ← create manually
├── apko.lock.json           ← generated by bazel run //:lock
├── MODULE.bazel.lock        ← auto-generated by Bazel, do not edit
└── .apko/
    ├── .bazelrc             ← generated by bazel run //:apko_bazelrc
    └── range.sh             ← generated by bazel run //:apko_bazelrc
```

The files marked "generated" should be committed to your repository after
generation. The files marked "create manually" are written by you as part of
this guide.

## Setup

### Step 1: Create your project directory

Create a new directory for your project and change into it:

```shell
mkdir my-apko-image && cd my-apko-image
```

### Step 2: Create the root .bazelrc file

Create a root `.bazelrc` file in your project directory. This file does two
things:

- It activates the apko credential helpers for partial HTTP range
requests (once they are generated in a later step)
- It keeps the Bazel repository cache outside your project directory,
which is required by Bazel 9:

```
# Import apko credential helper configuration for partial package fetches
try-import .apko/.bazelrc

# Keep Bazel repo cache outside the project directory (required by Bazel 9)
build --repo_contents_cache=/tmp/bazel-cache
```

> Note: The try-import directive tells Bazel to load `.apko/.bazelrc` if
it exists. This file is generated in a later step by running
`bazel run //:apko_bazelrc`. Until that step is complete the directive is
safely ignored.

### Step 3: Create the stage 1 MODULE.bazel file

Create a `MODULE.bazel` file in your project directory. This file declares your
project's external dependencies and sets up the `apko` toolchain. At this stage
it does not yet include the lock file translation — that is added after the lock
file is generated:

```shell
module(
    name = "my-apko-image",
    version = "0.0.0",
)

bazel_dep(name = "rules_apko", version = "1.5.37")

# Set up the apko toolchain.
# apko v1.1.12 is downloaded automatically — no separate installation needed.
toolchain = use_extension("@rules_apko//apko:extensions.bzl", "apko")
toolchain.toolchain(apko_version = "v1.1.12")
use_repo(toolchain, "apko_toolchains")
register_toolchains("@apko_toolchains//:all")
```

### Step 4: Create the stage 1 BUILD.bazel file

Create a `BUILD.bazel` file in your project directory. At this stage it contains
only the `apko_bazelrc` and `apko_lock`rules. The `apko_image` rule is added
after the lock file is generated:

```shell
load("@rules_apko//apko:defs.bzl", "apko_bazelrc", "apko_lock")

# Generates .apko/.bazelrc and .apko/range.sh for partial package fetches.
# Run with: bazel run //:apko_bazelrc
apko_bazelrc()

# Generates the lock file that pins all package versions and checksums.
# Run with: bazel run //:lock
apko_lock(
    name = "lock",
    config = "apko.yaml",
    lockfile_name = "apko.lock.json",
)
```

> Note: The reason `apko_image` is not included at this stage is that the
`apko_image` rule checks for `apko.lock.json` at Bazel load time — before any
targets are run. Since the lock file does not exist yet, including a `apko_image`
at this stage would cause a load-time error. Once the lock file exists you will
add `apko_image` in a later step.

### Step 5: Create the apko.yaml configuration file

Create an `apko.yaml` file in your project directory. This file defines the
container image — its base packages, repository, signing key, and target
architectures. The following example builds a minimal Wolfi-based image:

```yaml
contents:
  keyring:
    - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
  repositories:
    - https://packages.wolfi.dev/os
  packages:
    - wolfi-base

entrypoint:
  command: /bin/sh

archs:
  - aarch64
  - x86_64
```

## Generating configuration and the lock file

With your project files in place, run the following two commands in order.

### Step 6: Generate the credential helper configuration

Run the `apko_bazelrc` target to generate `.apko/.bazelrc` and `.apko/range.sh`:

```shell
bazel run //:apko_bazelrc
```

You will see output similar to the following:

```shell
INFO: Analyzed target //:apko_bazelrc (6 packages loaded, 14 targets configured).
INFO: Found 1 target...
Target //:apko_bazelrc up-to-date:
  bazel-bin/apko_bazelrc_update.sh
INFO: Build completed successfully, 2 total actions
INFO: Running command line: bazel-bin/apko_bazelrc_update.sh
Copying file .../range.sh to .apko/range.sh in /home/user/my-apko-image
Copying file .../apko_bazelrc_bazelrc to .apko/.bazelrc in /home/user/my-apko-image
```

This generates two files in the `.apko/` subdirectory:

- `.apko/.bazelrc` — configures Bazel credential helpers for the Wolfi and
Alpine package repositories, enabling partial HTTP range requests so Bazel
fetches only the specific byte ranges of APK packages it needs
- `.apko/range.sh` — the credential helper script used by Bazel when making
range requests

Both files should be committed to your repository. They are activated by the
try-import `.apko/.bazelrc` directive in your root `.bazelrc` file.

> Note: By default, `apko_bazelrc` configures credential helpers for
`dl-cdn.alpinelinux.org` and `packages.wolfi.dev`. If you are using additional
repositories, pass them to the repositories attribute:
`apko_bazelrc(repositories = ["my.repo.example.com"])`.

### Step 7: Generate the lock file

Run the lock target to generate apko.lock.json:

```shell
bazel run //:lock
```

You will see output similar to the following:

```shell
INFO: Analyzed target //:lock (84 packages loaded, 487 targets configured).
INFO: Found 1 target...
Target //:lock up-to-date:
  bazel-bin/_lock_run.sh
INFO: Build completed successfully, 1 total action
INFO: Running command line: bazel-bin/_lock_run.sh
2026/03/12 13:07:06 INFO Determining packages for 2 architectures: [arm64 amd64]
2026/03/12 13:07:06 INFO Discovered 0 auto-discovered keys
```

This generates `apko.lock.json` in your project directory. The lock file pins
the exact versions and checksums of all packages required to build your image
for each target architecture. Commit this file to your repository to ensure
reproducible builds.

> Note: The `DEBUG` message `apko toolchain apko has multiple versions ["v1.1.12", "v1.1.12"], selected v1.1.12` may appear in your output. This is
normal and expected — it occurs because both the toolchain setup and the lock
translation in `MODULE.bazel` reference the same `apko` extension. It does not
indicate a problem.

## Building the image

Now that the lock file exists, update your project files to add the image build
target.

### Step 8: Update MODULE.bazel to add lock file translation

Add the translate_lock extension call to the end of your `MODULE.bazel` file:

```
module(
    name = "my-apko-image",
    version = "0.0.0",
)

bazel_dep(name = "rules_apko", version = "1.5.37")

# Set up the apko toolchain.
# apko v1.1.12 is downloaded automatically — no separate installation needed.
toolchain = use_extension("@rules_apko//apko:extensions.bzl", "apko")
toolchain.toolchain(apko_version = "v1.1.12")
use_repo(toolchain, "apko_toolchains")
register_toolchains("@apko_toolchains//:all")

# Translate the lock file into Bazel repository targets.
# Add this section after apko.lock.json has been generated.
apk = use_extension("@rules_apko//apko:extensions.bzl", "apko")
apk.translate_lock(
    name = "wolfi_base_lock",
    lock = "//:apko.lock.json",
)
use_repo(apk, "wolfi_base_lock")
```

### Step 9: Update BUILD.bazel to add the image target

Add the `apko_image` rule to your `BUILD.bazel` file:

```shell
load("@rules_apko//apko:defs.bzl", "apko_bazelrc", "apko_image", "apko_lock")

# Generates .apko/.bazelrc and .apko/range.sh for partial package fetches.
# Run with: bazel run //:apko_bazelrc
apko_bazelrc()

# Generates the lock file that pins all package versions and checksums.
# Run with: bazel run //:lock
apko_lock(
    name = "lock",
    config = "apko.yaml",
    lockfile_name = "apko.lock.json",
)

# Builds the container image from the lock file contents.
# Run with: bazel build //:wolfi_base
apko_image(
    name = "wolfi_base",
    config = "apko.yaml",
    contents = "@wolfi_base_lock//:contents",
    tag = "wolfi-base:latest",
)
```

The `contents` attribute references `@wolfi_base_lock//:contents` — this is the
Bazel repository generated by the `translate_lock` call in `MODULE.bazel`. The
name `wolfi_base_lock` in both files must match.

### Step 10: Build the image

Run the build:

```shell
bazel build //:wolfi_base
```

You will see output similar to the following:

```shell
INFO: Analyzed target //:wolfi_base (123 packages loaded, 656 targets configured).
INFO: From Action wolfi_base:
2026/03/12 12:46:27 INFO installing wolfi-keys (1-r13) arch=aarch64
2026/03/12 12:46:27 INFO installing wolfi-baselayout (20230201-r28) arch=aarch64
2026/03/12 12:46:27 INFO installing wolfi-keys (1-r13) arch=x86_64
2026/03/12 12:46:27 INFO installing wolfi-baselayout (20230201-r28) arch=x86_64
2026/03/12 12:46:27 INFO installing ca-certificates-bundle (20251003-r4) arch=x86_64
...
2026/03/12 12:46:27 INFO installing wolfi-base (1-r7) arch=x86_64
2026/03/12 12:46:27 INFO layer digest: sha256:44cc053506b4e236f7e32026147836ce082fa58d0a329ff2aab1bb61d0c6bcfc arch=x86_64
INFO: Found 1 target...
Target //:wolfi_base up-to-date:
  bazel-bin/wolfi_base
INFO: Build completed successfully, 128 total actions
```

The built image is available at `bazel-bin/wolfi_base`.

> Note: You may see `INFO` messages about duplicate package IDs in the SBOM
during the build, for example:
`INFO duplicate package ID found in SBOM, deduplicating package...`
These are normal and expected — `apko` deduplicates packages that appear
multiple times in the dependency graph when generating the Software Bill of
Materials (SBOM). They do not indicate a problem with your build.

On subsequent builds, Bazel's caching means most actions will be
retrieved from cache rather than rebuilt. You will see output like
`127 action cache hit, 1 internal` — this is expected and demonstrates one
of the key benefits of building images with Bazel.

## Updating the lock file

When you update `apko.yaml` to add, remove, or change packages, regenerate the
lock file by running:

```shell
bazel run //:lock
```

Then rebuild the image:

```shell
bazel build //:wolfi_base
```

## Rules reference

### `apko_image`

Builds an OCI container image from APK packages using an apko.yaml
configuration file and a pre-generated lock file.

```shell
apko_image(
    name = "my_image",
    config = "apko.yaml",
    contents = "@my_image_lock//:contents",
    tag = "my-image:latest",
)
```

An example demonstrating usage with `rules_oci`:

```shell
apko_image(
    name = "wolfi_base",
    config = "apko.yaml",
    contents = "@wolfi_base_lock//:contents",
    tag = "wolfi-base:latest",
)

oci_image(
    name = "app",
    base = ":wolfi_base",
)
```

#### Attributes

| Name | Description | Type | Mandatory | Default |
| :--- | :--- | :--- | :--- | :--- |
| `name` | A unique name for this target. | Name | required | |
| `architecture` | The CPU architecture this image should be built for. Refer to [apko architecture documentation](https://github.com/chainguard-dev/apko/blob/main/docs/apko_file.md#archs-top-level-element). | String | optional | `""` |
| `args` | Additional arguments to pass to the `apko build` command. | List of strings | optional | `[]` |
| `config` | Label to the `apko.yaml` configuration file. | Label | required | |
| `contents` | Label to the contents repository generated by `translate_lock`. Refer to [Generating Configuration and the Lock File](#generating-configuration-and-the-lock-file). | Label | required | |
| `output` | Output format for the image. | String | optional | `"oci"` |
| `tag` | Tag to apply to the resulting image. Only applicable when `output` is `docker`. | String | required | |

### `apko_lock`

Generates a lock file that pins the exact versions and checksums of all packages
required to build your image. The lock file is written directly into your
project directory and should be committed to your repository.

```shell
apko_lock(
    name = "lock",
    config = "apko.yaml",
    lockfile_name = "apko.lock.json",
)
```

Run with:

```shell
bazel run //:lock

```

#### Parameters

| Name | Description | Default |
| :--- | :--- | :--- |
| `name` | Name of the target. | required |
| `config` | Label to the `apko.yaml` configuration file. | required |
| `lockfile_name` | Name of the generated lock file. | required |

### `apko_bazelrc`

Generates `.apko/.bazelrc` and `.apko/range.sh` to enable partial HTTP range
requests when fetching APK packages. This significantly reduces download size by
fetching only the byte ranges of each package that Bazel needs.

```shell
apko_bazelrc()
```

Run with:

```shell
bazel run //:apko_bazelrc
```

The generated `.apko/.bazelrc` file configures Bazel credential helpers for the
specified repositories. Activate it by adding the following to your root
`.bazelrc`:

```shell
try-import .apko/.bazelrc
```

#### Parameters

| Name | Description | Default |
| :--- | :--- | :--- |
| `name` | Name of the target. | `"apko_bazelrc"` |
| `repositories` | List of package repository hostnames to configure credential helpers for. | `["dl-cdn.alpinelinux.org", "packages.wolfi.dev"]` |
| `kwargs` | Standard Bazel attributes such as `tags` and `testonly`. | none |

## Using private APK repositories

If you are using a private Chainguard APK repository, you need to provide your
Chainguard token to the `apko` runtime via the `HTTP_AUTH` environment variable.
Set it before running any `bazel run` or `bazel build` commands:

```shell
export HTTP_AUTH="basic:apk.cgr.dev:user:$(chainctl auth token --audience apk.cgr.dev)"
```

In your apko.yaml, reference your private repository using your Chainguard
organization name:

```yaml
contents:
  repositories:
    - https://apk.cgr.dev/$ORGANIZATION
  packages:
    - your-package
```

Replace `$ORGANIZATION` with your Chainguard organization name.
For full details on setting up and using private APK repositories with
Chainguard, including how to configure your organization and authenticate, see
[Chainguard's private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/).

---

### apko overview
_Path: open-source/build-tools/apko/overview/index.md_

[apko](http://github.com/chainguard-dev/apko) is a command-line tool designed to create single-layer container images based on the [apk](https://wiki.alpinelinux.org/wiki/Package_management) package format. It was so named as it uses the apk package format and is inspired by the [ko](https://github.com/google/ko) build tool.

apko is part of the open source toolkit developed by Chainguard to build [Chainguard Containers](/chainguard/containers/overview/). The following diagram contains an overview of the apko ecosystem and how it interacts with [melange](/open-source/build-tools/melange/overview/) for building apk-based images, using either [Wolfi](/open-source/wolfi/overview/) or Alpine as base system.

![The following image contains an overview of the apko ecosystem and how it interacts with melange for building apk-based images, using either Alpine or Wolfi as base system.](apko_melange_ecosystem.png)

For more information and up-to-date examples on how to use apko, please refer to the [apko repository on GitHub](http://github.com/chainguard-dev/apko).

---

### Why apk
_Path: open-source/wolfi/apk-package-manager.md_

[apko](/open-source/build-tools/apko/getting-started-with-apko/) uses the [apk](https://wiki.alpinelinux.org/wiki/Package_management) package manager to compose container images based on declarative pipelines.
The apk format was introduced by [Alpine Linux](https://www.alpinelinux.org/) to address specific design requirements that could not be met by existing package managers such as `apt` and `dnf`. But what makes it different, and why does that matter in the context of apko?

## Manipulating the desired state

In traditional package managers like `dnf` and `apt`, requesting the installation or removal of packages causes those packages to be directly installed or removed, after a consistency check.

In `apk`, when you run `apk add package1` to add a package or `apk del package2` to delete a package, `package1` and `package2` are added (or removed) as a dependency constraint in `/etc/apk/world`, which describes the desired system state. Package installation or removal is done as a side effect of modifying this system state. It is also possible to edit `/etc/apk/world` with the text editor of your choice and then use `apk fix` to synchronize the installed packages with the desired system state.

Because of this design, you can also add conflicts to the desired system state to prevent bringing in certain packages. For example, there was [a bug in Alpine in 2021](https://gitlab.alpinelinux.org/alpine/apk-tools/-/issues/10742) where `pipewire-pulse` was preferred over `pulseaudio` because the former had a simpler dependency graph. This did not prove to be a problem though, as users could add a conflict against `pipewire-pulse` by running `apk add !pipewire-pulse`, thus preventing the package from being brought in.

Another result of this design is that `apk` will never commit a change to the system that leaves it unbootable. If it cannot verify the correctness of the requested change, it will back out adding the constraint before attempting to change what packages are actually installed on the system. This allows the apk dependency solver to be rigid: there is no way to override or defeat the solver other than providing a scenario that results in a valid solution.

## Verification and unpacking in parallel to package fetching

Unlike other package managers, `apk` is completely driven by the package fetching I/O when installing or upgrading packages. When the package data is fetched, it is verified and unpacked on the fly. This allows package installations and upgrades to be extremely fast.

To make this safe, package contents are initially unpacked to temporary files and then atomically renamed once the verification steps are complete and the package is ready to be committed to disk.

## Constrained solver

Lately, traditional package managers have promoted their advanced [SAT solvers](https://en.wikipedia.org/wiki/SAT_solver) for resolving complicated constraint issues automatically. For example, [aptitude is capable of solving Sudoku puzzles](https://web.archive.org/web/20080823224640/http://algebraicthunk.net/~dburrows/blog/entry/package-management-sudoku/). `apk`'s lack of these solvers can actually be considered a feature.

While it is true that `apk` does have a deductive dependency solver, it does not perform backtracking. The solver is also constrained: it is not allowed to make changes to the `/etc/apk/world` file. This ensures that the solver cannot propose a solution that will leave your system in an inconsistent state.

Trying to make a smart solver instead of appropriately constraining the problem can indicate a poor design choice. The fact that `apt`, `aptitude`, and `dnf` have all written code to constrain their SAT solvers in various ways proves this point.

## Fast and safe package management

Package managers can be made to go fast — and can be safe while doing so — but require a careful design that is well-constrained. `apk` makes its own tradeoffs: a less powerful but easy to audit solver, trickier parallel execution instead of phase-based execution. These were the right decisions for `apk`, but may not be the right decisions for other distributions.

## Final considerations

The reproducible nature of apk makes it the ideal solution for declarative pipelines, since it allows you to describe your desired system state without having to implement a series of individual steps that are not guaranteed to reach completion. When the apk dependency solver is unable to reach an installable set of packages, the build fails, without causing incomplete system changes.
This is the ideal behavior for automated pipelines since it eliminates the need for rollbacks, in addition to avoiding the risks of inconsistent environments.

_An earlier version of this article was published on [Ariadne Conill's Blog](https://ariadne.space/2021/04/24/why-apktools-is-different-than.html)._

---

### Hello Wolfi workshop
_Path: open-source/wolfi/hello-wolfi.md_

## Introduction

Software supply chain threats have been growing exponentially in the last few years, according to [industry leaders and security researchers (PDF)](https://www.usenix.org/system/files/login/articles/login_winter20_17_geer.pdf).
With the popularization of automated workflows and cloud native deployments, it is more important than ever to provide users with the ability to attest the provenance of all relevant software artifacts that compose the container images being used as build and production runtimes.

In this workshop, you'll learn more about Wolfi, a community Linux _undistro_ designed for the container and cloud-native era. You'll also learn about melange and apko, Chainguard's open source toolkit created to build more secure container images.

{{< note >}}
This presentation was recorded on November 16, 2022. Although most of the content holds true to date, some commands and configurations have changed, which caused the demo to become obsolete. For a more up-to-date resource on how to build Wolfi packages, check the [Building a Wolfi package](/open-source/wolfi/building-a-wolfi-package/) guide. If you are looking for Wolfi-based images for your containerized workloads, check our [Images Directory](https://images.chainguard.dev/directory/image/php/overview).
{{< /note >}}

{{< youtube 2pqhLXA6NaI >}}

---

### Wolfi FAQs
_Path: open-source/wolfi/faq.md_

## What is Wolfi and how does it compare to Alpine?

Wolfi is our Linux _undistro_  designed from the ground up to support newer computing paradigms such as containers. Although Wolfi has a few similar design principles as Alpine (such as using apk), it is a different distribution that is focused on supply chain security. Unlike Alpine, Wolfi does not currently build its own Linux kernel, instead relying on the host environment (e.g. a container runtime) to provide one.

## Why build a new Linux distribution from scratch?

Without building packages from source, you are at the mercy of an intermediary provider (such as Debian or Alpine) for obtaining the software you need, and none of those intermediaries offer our SLA around zero CVEs. Each intermediary also joins your supply chain’s root of trust. We built Wolfi to achieve an unmatched CVE SLA where Chainguard is the only intermediary you need to trust. The following resources have more details around why and how we built  Wolfi:

1. [Building the first memory safe distro](https://www.chainguard.dev/unchained/building-the-first-memory-safe-distro)
2. [Building Wolfi from the ground up](https://www.chainguard.dev/unchained/building-wolfi-from-the-ground-up-and-announcing-arm64-support)
3. [Wolfi: a new paradigm in Linux for containers](https://www.chainguard.dev/unchained/wolfi-a-new-paradigm-in-linux-for-containers)
4. [Fully bootstrapping Java from source in Wolfi](https://www.chainguard.dev/unchained/fully-bootstrapping-java-from-source-in-wolfi)
5. [Fully bootstrapping Go from source in Wolfi](https://www.chainguard.dev/unchained/fully-bootstrapping-go-from-source-in-wolfi)

## Is Wolfi free to use?

Yes, Wolfi is free and will always be.

## Can I mix packages from Alpine repositories into a Wolfi-based image?

No, it's not possible to mix Alpine apks with Wolfi apks. If your image requires dependencies that are currently only available for Alpine, you might consider opening a new issue in the [wolfi-os](https://github.com/chainguard-dev/wolfi-os/) repository to suggest the new package addition, or use [melange](https://github.com/chainguard-dev/melange) to build a custom apk for your image.

## How can I find which packages are available in Wolfi?

You can search for available packages using the `apk search` command from within a Wolfi container, as explained in the [Searching for packages](https://edu.chainguard.dev/chainguard/containers/migration/migrating-to-chainguard-images/#searching-for-packages) section of our Migrating to Chainguard Containers guide. You can also use our [APK Explorer](https://apk.dag.dev/) tool for a web-based search on the Wolfi repositories.

## Can I use Wolfi on the desktop?

No. Wolfi is an un-distro, or distroless base to be used within the container / OCI ecosystem. Desktop distributions require additional software that is out of scope for Wolfi's roadmap.

## Who maintains Wolfi?

Wolfi was created and is currently maintained by [Chainguard](https://chainguard.dev).

## What are the plans for long-term Wolfi governance?

We intend for Wolfi to be a community-driven project, which means over time it will have multi-vendor governance and maintainers. For now we're focused on building the project and community, and will revisit this in several months when a community has formed.

## Where can I get security feeds for Wolfi?

Refer to [SECURITY.md](https://github.com/wolfi-dev/.github/blob/main/SECURITY.md) for information about reporting security incidents concerning and consuming security data about Wolfi.

---

### Wolfi
_Path: open-source/wolfi/_index.md_

Wolfi is a Linux undistro designed to support the creation of container images that meet the requirements of a secure software supply chain.

---

### Creating Wolfi images with Dockerfiles
_Path: open-source/wolfi/wolfi-with-dockerfiles.md_

## Introduction

[Wolfi](/open-source/wolfi/overview/) is a minimal open source Linux distribution created specifically for cloud workloads, with an emphasis on software supply chain security. Using [apk](https://wiki.alpinelinux.org/wiki/Package_management) for package management, Wolfi differs from Alpine in a few important aspects, most notably the use of glibc instead of musl and the fact that Wolfi doesn't have a kernel as it is intended to be used with a container runtime. This minimal footprint makes Wolfi an ideal base for both _distroless_ images and fully-featured builder images.

A distroless image is a minimal container image that typically doesn't include a shell or package manager. The extra tightness improves security in several aspects, but it requires a more sophisticated strategy for image composition since you can't install packages so easily. Wolfi-based builder images are still a better and more secure option to use as base images in your Dockerfile than using a full-fledged Linux distribution, as they are smaller and have fewer CVEs. You can learn more about distroless in our [Going distroless](https://edu.chainguard.dev/chainguard/containers/getting-started-distroless/) guide.

The [wolfi-base](https://github.com/chainguard-images/images/tree/main/images/wolfi-base) image, which we'll be using in this tutorial, is not distroless because it includes `apk-tools` and `bash`. In some cases, it can still be used to build a final distroless image, when combined with a distroless runtime in a [Docker multi-stage build](https://docs.docker.com/build/building/multi-stage/). That depends on the complexity of the image, the number of dependencies required, and whether these dependencies are system libraries or language ecosystem packages, for example.

In this article, we'll learn how to leverage Wolfi to create safer runtime environments based on containers. To demonstrate Wolfi usage in a Dockerfile workflow (using a Dockerfile to build your image), we'll create an image based on the [wolfi-base](https://github.com/chainguard-images/images/tree/main/images/wolfi-base) image maintained by Chainguard. The goal is to have a final runtime image able to execute a Python application. [Step 4](#step-4-optional-composing-distroless-images-in-a-docker-multi-stage-build) of this guide, which is optional, demonstrates how to turn that into a distroless image by combining it with a Python distroless image, also provided by Chainguard.

## Requirements

You'll need Docker to build and run the application.

## Step 1: Obtaining the demo application

We'll use the same demo application from the [Getting started with the Python Chainguard Container](/chainguard/containers/getting-started/languages-and-runtimes/python/) tutorial to demonstrate how to build a Wolfi Python image with a Dockerfile. The application files are available in the [edu-images-demos](https://github.com/chainguard-dev/edu-images-demos) repository. We'll start by cloning that repository in a temporary folder so that we can obtain the relevant application files to run the **second** demo from that tutorial.

The following command will clone the demos repository in your `/tmp` folder:

```shell
mkdir /tmp/images-demos &&  \
  git clone https://github.com/chainguard-dev/edu-images-demos.git \
  /tmp/images-demos
```

We'll now copy the demo application to a location inside your home folder.

```shell
mkdir ~/linky && cp -R /tmp/images-demos/python/linky/* ~/linky/
```

You can now enter the newly created directory in your home folder and inspect its contents:

```shell
cd ~/linky && ls -la
```

This application will take in an image (`linky.png`) file and convert it to ANSI escape sequences to render it on the CLI. The code is on the `linky.py` file, while the `requirements.txt` file has the dependencies required by the application: [setuptools](https://pypi.org/project/setuptools/) and [climage](https://pypi.org/project/climage/).

For your reference, here is the complete `linky.py` script:

```python
'''import climage module to display images on terminal'''
from climage import convert

def main():
    '''Take in PNG and output as ANSI to terminal'''
    output = convert('linky.png', is_unicode=True)
    print(output)

if __name__ == "__main__":
    main()
```

You'll notice that there's already a Dockerfile in that directory, but it uses the [Python Chainguard image](https://images.chainguard.dev/directory/image/python/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-open-source-wolfi-wolfi-with-dockerfiles) in a multi-stage build. In the next step, we'll replace that with a new Dockerfile that uses the [Wolfi-base](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-open-source-wolfi-wolfi-with-dockerfiles) image to build a Python image from scratch, using Wolfi apks.

## Step 2: Creating the Dockerfile

Now we'll create the Dockerfile to run the application. This Dockerfile will set up a new user and WORKDIR, copy relevant files, and install dependencies with Pip. It will also define the entry point that will be executed when we run this image with `docker run`.

You can rename the old Dockerfile if you want to keep it for tests later.

```shell
mv Dockerfile _DockerfileBkp
```

Then, create a new Dockerfile:

```shell
nano Dockerfile
```

Copy the following content to it:

```Dockerfile
FROM cgr.dev/chainguard/wolfi-base

ARG version=3.12
WORKDIR /app

RUN apk add python-${version} py${version}-pip && \
 chown -R nonroot:nonroot /app/

USER nonroot
COPY requirements.txt linky.png linky.py /app/
RUN  pip install -r requirements.txt --user

ENTRYPOINT [ "python", "/app/linky.py" ]
```

This Dockerfile uses a variable called `version` to define which Python version is going to be installed in the resulting image. You can change this to one of the Python versions available in Wolfi. To find out which versions are available, please refer to the [Searching for packages](https://edu.chainguard.dev/chainguard/containers/migration/migrating-to-chainguard-images/#searching-for-packages) section of our migration guide.

Save the file when you're done. In the next step, we'll build and run the image with `docker`.

## Step 3: Building and running the image

With the Dockerfile ready, you can now build your application runtime. If you're on macOS, make sure Docker is running.

Build your image with:

```shell
docker build . -t linky-demo
```

If you run into issues, try using `sudo`.

Finally, run the image with:

```shell
docker run --rm linky-demo
```

You’ll receive a representation of the Chainguard Linky logo on the command line.

## Step 4 (optional): Composing distroless images in a Docker multi-stage build

As discussed in the introduction, in some cases it is possible to combine your fully-featured image with a distroless runtime in a Docker multistage build, and this will give you a final image that is also distroless. Keep in mind that this technique for building distroless images is only viable when there aren't additional system dependencies that require installation via `apk`.

The [Getting started with Python](/chainguard/containers/getting-started/languages-and-runtimes/python/) tutorial shows in detail how to accomplish that using a `-dev` variant as **builder**, and the distroless Chainguard Python image as production image. You can also accomplish the same results by using your newly-built image based on `wolfi-base` in place of the `-dev` variant of the Python image. We'll change the build to use a virtual environment to package the dependencies and add an extra step to create the final image.

The following Dockerfile uses a multi-stage build to obtain a final distroless image that contains everything the application needs to run. The build requires additional software that is not carried along to the final image.

Open a new file and call it `DockerfileDistroless`:

```shell
nano DockerfileDistroless
```

Copy the following code into your new file:

```Dockerfile
FROM cgr.dev/chainguard/wolfi-base AS builder

ARG version=3.12

ENV LANG=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/venv/bin:$PATH"

WORKDIR /app

RUN apk update && apk add python-$version py${version}-pip && \
 chown -R nonroot:nonroot /app/
USER nonroot
RUN python -m venv /app/venv

COPY requirements.txt /app/
RUN  pip install --no-cache-dir -r requirements.txt

FROM cgr.dev/chainguard/python:latest

ENV PYTHONUNBUFFERED=1
ENV PATH="/app/bin:$PATH"

WORKDIR /app

COPY --from=builder /app/venv /app

COPY linky.py linky.png /app/

ENTRYPOINT [ "python", "/app/linky.py" ]
```

Save and close the file when you're finished.

Now, build this image using a custom tag so that you can compare the previously built `linky-demo` image with its distroless version:

```shell
docker build . -f DockerfileDistroless -t linky-demo:distroless
```

If you run the new image, it should give you the same result as before.

```shell
docker run --rm linky-demo:distroless
```

But these images are not the same. The following command will give you a glimpse of their differences:

```shell
docker images linky-demo
```

```output
REPOSITORY   TAG          IMAGE ID       CREATED         SIZE
linky-demo    distroless   619ef9b6c52d   6 seconds ago   90.3MB
linky-demo    latest       4832e9093348   4 minutes ago   110MB
```

You'll notice that the `:distroless` version is significantly smaller, because it doesn't carry along all the software necessary to build the application. More important than size, however, is the smaller attack surface that results in fewer CVEs.

## Final considerations

In this tutorial, we've demonstrated how to build a Python image from scratch using the `wolfi-base` image. We've also shown how to compose a distroless image using a multi-stage build. This technique is useful when you need to reduce the attack surface of your application runtime, which is especially important in security-sensitive environments.

If your application runtime requires system dependencies that are not already included within a distroless variant available in our [images directory](https://images.chainguard.dev), you can still use a builder image (identified by the `-dev` suffix) or the `wolfi-base` image in a standard Dockerfile to build a suitable runtime. These images come with `apk` and a shell, allowing for further customization based on your application's requirements.

If you can't find an image that is a good match for your use case, or if your build has dependencies that cannot be met with the regular catalog, [get in touch with us](https://www.chainguard.dev/contact?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) for alternative options.

---

### Wolfi overview
_Path: open-source/wolfi/overview.md_

[Wolfi](https://github.com/wolfi-dev) is a community Linux [undistro](#why-undistro) designed for the container and cloud-native era. Chainguard started the Wolfi project to build [Chainguard Containers](/chainguard/containers/overview/), our collection of curated [distroless](/chainguard/containers/getting-started-distroless/) images that meet the requirements of a secure software supply chain. This required a Linux distribution with components at the appropriate granularity and with support for [glibc](https://www.gnu.org/software/libc/).

Building our own undistro also allows us to ensure packages have full provenance and metadata for supporting modern supply-chain security needs.

## Why undistro

We call Wolfi an undistro because unlike a [typical Linux distribution](https://en.wikipedia.org/wiki/Linux_distribution) designed to run on bare-metal, Wolfi is a stripped-down distro designed for the cloud-native era. It doesn't have a kernel of its own, instead relying on the environment (such as the container runtime) to provide one. This separation of concerns in Wolfi means it is adaptable to a range of environments.

Wolfi is the base we use to build [Chainguard Containers](/chainguard/containers/overview/), our open source distroless images that are available free of charge.

## Wolfi features

Wolfi, whose name was inspired by the [world's smallest octopus](https://en.wikipedia.org/wiki/Octopus_wolfi), has some key features that differentiates it from other distributions that focus on container/cloud-native environments:

- Provides a high-quality, build-time SBOM as standard for all packages
- Packages are designed to be granular and independent, to support minimal images
- Uses the proven and reliable apk package format
- Fully declarative and reproducible build system
- Designed to support glibc

Wolfi enables Chainguard to solve the software supply chain security problem from the outside in. It gives developers the secure-by-default base they need to build software, it scales to support organizations running massive environments and provides the control needed to fix most modern supply chain threats. Wolfi builds all packages directly from source, allowing us to fix vulnerabilities or apply customizations that improve the supply chain security posture of everything from compilers to language package managers.

## Quickstart

This site's [Wolfi section](/open-source/wolfi/) contains full information on Wolfi and how to build Wolfi packages, but if you
would like to quickly review how to work with Wolfi, try the [wolfi-base
image](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-open-source-wolfi-overview). You can run it with:

```sh
docker run -it cgr.dev/chainguard/wolfi-base
```

This should start a Wolfi container where you can explore the file system and investigate which
packages are available. This container is intentionally minimal - it includes the filesystem for
Wolfi, a package manager (apk) and a shell, but not much else. You will need to use apk to install
any tools you need. Here is an example session:

```
docker run -it cgr.dev/chainguard/wolfi-base
ce557598406a:/# cat /etc/os-release
ID=wolfi
NAME="Wolfi"
PRETTY_NAME="Wolfi"
VERSION_ID="20230201"
HOME_URL="https://wolfi.dev"
ce557598406a:/# apk update
fetch https://packages.wolfi.dev/os/aarch64/APKINDEX.tar.gz
 [https://packages.wolfi.dev/os]
OK: 15046 distinct packages available
ce557598406a:/# curl
/bin/sh: curl: not found
ce557598406a:/# apk add curl
(1/5) Installing libbrotlicommon1 (1.0.9-r3)
(2/5) Installing libbrotlidec1 (1.0.9-r3)
(3/5) Installing libnghttp2-14 (1.55.1-r0)
(4/5) Installing libcurl-openssl4 (8.2.1-r0)
(5/5) Installing curl (8.2.1-r0)
OK: 13 MiB in 19 packages
ce557598406a:/# curl google.com
...
```

---

### Building a Wolfi package
_Path: open-source/wolfi/building-a-wolfi-package.md_

Wolfi is a Linux distro created specifically for building stripped-down container images that only include the essential packages needed to run applications in containers. This makes it more secure, as there are fewer potential attack vectors due to the reduced surface area.

Thanks to a fine-tuned maintenance process combining top-notch automation and established best practices from maintainers, Wolfi packages are updated quickly. This ensures that Wolfi users get patches and latest versions of packages at a much faster pace than other distributions. Additionally, Wolfi includes a number of features that help to ensure the provenance and authenticity of packages. For example, all packages are built directly from source and signed with cryptographic signatures. This helps to prevent malicious code from being introduced into the system. Wolfi also provides a high-quality build-time [SBOM](https://edu.chainguard.dev/open-source/sbom/what-is-an-sbom/) as standard for all packages.

That being said, it's important to note that Wolfi is rather new; it just recently crossed the mark of 1,000 packages in the Wolfi OS repository. That means some packages that you would find in a more established distro won't be available yet in Wolfi. In this article, we'll cover the whole process involved in building a new Wolfi package, or how a Wolfi package comes to be.

> Note: Many of the examples shown in this article are based on the [Wolfi PHP package](https://github.com/wolfi-dev/os/blob/main/php-8.2.yaml), which is a slightly complex build that generates several subpackages from a single melange YAML file. You can keep that link open in a separate tab to use as reference as you go through this guide.

## How does it compile?

The first step in building a new Wolfi package is finding official documentation with guidance on how to build the package from source. All Wolfi packages need to be built from source in order to assure provenance and authenticity of package contents.

Because Wolfi uses [apk](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper) and thus has some similar design principles to Alpine, it is a good idea to review the [Alpine package index](https://pkgs.alpinelinux.org/packages) to find out how the package is built there. This can give you insights about configuration options, dependencies, and eventual subpackages that can be stripped from the main package. For example, when compiling PHP from source, you have the choice of compiling several extensions either as built-in or as shared libraries. Although compiling said extensions as built-in packages makes for a simpler build, it also increases the size of the original package and creates a wider surface for possible vulnerabilities.

If you aren't very familiar with building packages from source using tools such as `cmake` and `autoconf`, it's a good idea to compile the package locally first - you don't need to run `make install`  at the end to get the package installed on your own system, but running the `configure` and `make` processes will give you a better understanding of the build requirements and configure options.

## The melange YAML file

The melange YAML file is where you'll define the details about the package and its build pipeline. If you are familiar with GitHub Actions, you'll find out that melange definitions are very similar to GitHub Actions workflows.

### The `package` section

The melange YAML file starts with a `package` section, used to define metadata information and runtime dependencies. The following excerpt demonstrates how this section is declared in the Wolfi [PHP package](https://github.com/wolfi-dev/os/blob/34aa71ac4898c2b7c529548eafa51b0ea7a4dbd3/php.yaml#L1C3-L1C3) YAML:

```yaml
package:
  name: php
  version: 8.2.8
  epoch: 0
  description: the PHP programming language
  copyright:
    - license: PHP-3.01
  dependencies:
    runtime:
      - libxml2
```

- **Package name**: the current convention is to use the same name as the YAML file without extension. This is what people will search for, so it's a good idea to keep it consistent with how the package is named in other distributions.
- **Description**: this information shows up when searching for the package with apk.
- **Version**: the version of the package.
- **Epoch**: a numeric field set to zero by default; this only needs to be incremented when there is a non-version change in the package. For instance, when build options such as compiler flags have changed or new subpackages have been added but the upstream package version hasn't changed — in such cases, you'd need to "bump the epoch" in order to trigger the build.
- **License**: the package license. It is important to note that only packages with OSI-approved licenses can be included in Wolfi. You can check the relevant package info in the [licenses page at opensource.org](https://opensource.org/licenses/).
- **Runtime dependencies**: any dependencies needed by your package at runtime. Not to be confused with build dependencies, these will come up in the environment section of the file.

### The `environment` section

The next section is the `environment` section. It defines how the build environment should look in order to build your package. Packages listed in this section won't be included in the final package, because they are only needed at build time.

When building locally, you'll also need to include information about where to find Wolfi packages. This is not needed when submitting the package to the Wolfi OS repository. The `contents` node is used for that:

```yaml
environment:
  contents:
    repositories:
      - https://packages.wolfi.dev/os
    keyring:
      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
```

The `packages` section is where you can define dependencies. The following example is an excerpt from the Wolfi PHP package, which is a fairly complex build with many dependencies:

```yaml
environment:
  contents:
    packages:
      - build-base
      - busybox
      - file
      - bison
      - libtool
      - ca-certificates-bundle
      - bzip2-dev
      - libxml2-dev
      - curl-dev
      - openssl-dev
      - readline-dev
      - sqlite-dev
      - libsodium-dev
      - libpng-dev
      - libjpeg-turbo-dev
      - libavif-dev
      - libwebp-dev
      - libxpm-dev
      - libx11-dev
      - freetype-dev
      - gmp-dev
      - icu-dev
      - openldap-dev
      - oniguruma-dev
      - libxslt-dev
      - postgresql-15-dev
      - libzip
```

Don't worry if you don't know everything you'll need upfront at build time. Even if you build the package locally first, your system most likely has many dependencies already installed; by paying attention to the output provided by melange, you will be able to figure out what is missing, and iterate until your build environment looks right.

One thing that may happen during this process is finding out that one or more dependencies needed by your package are not yet available in Wolfi, so they need to be built first. It is a normal part of the process, so don't worry — you will be able to build incrementally and test everything locally.

### The `pipeline` section

With package metadata and build environment defined, it's time to create the pipeline that will build your package. The `pipeline` section has a structure similar to a GitHub Actions workflow, defining a series of steps that must be executed in the same order they are defined, creating output that will be packaged into one or more apk packages.

A package build pipeline typically starts with fetching the package (as a tarball or directly from a Git branch) and matching the downloaded artifact against an expected sha hash.

Some of the actions executed in build pipelines are very similar across packages: downloading a package, running configure and make, fetching a package from git, etc. Luckily for us, melange bakes a lot of repetitive tasks into reusable [pipelines](https://github.com/chainguard-dev/melange/tree/main/pkg/build/pipelines):

- Downloading Packages
    - `fetch`
    - `git-checkout`
- Autoconf
    - `autoconf/configure`
    - `autoconf/make`
    - `autoconf/make-install`
- Cmake
    - `cmake/build`
    - `cmake/configure`
    - `cmake/install`
- Go
    - `go/build`
    - `go/install`
- Meson
    - `meson/compile`
    - `meson/configure`
    - `meson/install`
- Ruby
    - `ruby/build`
    - `ruby/clean`
    - `ruby/install`
- Split
    - `split/debug`
    - `split/dev`
    - `split/infodir`
    - `split/locales`
    - `split/manpages`
    - `split/static`
- Other
    - `strip`
    - `patch`

Each pipeline can have one or more parameters that should be provided as keypairs in a `with` entry. For example, a download-and-check has the following structure in the melange YAML, using the built-in pipeline `fetch`:

```yaml
  - uses: fetch
    with:
      uri: https://libzip.org/download/libzip-${{package.version}}.tar.gz
      expected-sha256: 52a60b46182587e083b71e2b82fcaaba64dd5eb01c5b1f1bc71069a3858e40fe
```

Naturally, you can also run raw bash commands in your pipeline. The following example shows the build of [Composer](https://getcomposer.org/), the PHP package manager, which is not compiled as a typical package:

```yaml
  - name: Install Composer
    runs: |
      EXEC_DIR="${{targets.destdir}}/usr/bin"
      mkdir -p "${EXEC_DIR}"
      mv composer.phar "${EXEC_DIR}/composer"
      chmod +x "${EXEC_DIR}/composer"
```

As indicated, a pipeline step will have either a `uses` or a `run` directive. You can have as many steps as you need, and you can use special variable substitutions inside steps:

- `${{package.name}}`: Package name.
- `${{package.version}}`: Package version.
- `${{package.epoch}}`: Package epoch.
- `${{targets.destdir}}`: Directory where final package files will be stored. Everything that lives here will be packed into your final apk.
- `${{targets.subpkgdir}}`: Directory where final subpackage files will be stored. Works the same way as `targets.destdir`, but for subpackages.

You can find more details about available pipelines in the [melange pipelines documentation](https://github.com/chainguard-dev/melange/blob/main/docs/PIPELINES.md).

### The `subpackages` section

As mentioned previously, a package may extract parts of its contents into subpackages in order to make for a slimmer final apk. Many packages have resources that are not required at execution time, including development headers, man pages, shared libraries that are optional. This part is really important in Wolfi, because we want packages to be minimal. The `subpackages` section of the melange YAML file looks a lot like the pipeline section, and it essentially works the same way. You'll just have to make sure you place any subpackage files in the `targets.subpkgdir` location.

The `split` built-in pipelines were created to facilitate the creation of subpackages. They implement code to remove development headers (`split/dev`), man pages (`split/manpages`), among other resources that aren't typically required at runtime. You can experiment with those, just be aware that they use standard path locations and some compiled packages may use different paths for certain resources.

For example, this is how a step in the subpackages section would be written, using the `split/dev` built-in pipeline to generate the `php-dev` subpackage:

```yaml
  - name: php-dev
    description: PHP 8.2 development headers
    pipeline:
      - uses: split/dev
```

### Looping with ranges

In some cases, you may find yourself repeating the same task over and over with just a couple different values (such as package names). In such scenarios, you can define a range of data that you can "loop" through in a step. For example, let's have a look at how the PHP package uses this feature to create its subpackages.

First, we define an `extensions` range. This should go on a `data` node at the same level as the `pipelines` section of your YAML:

```yaml
data:
  - name: extensions
    items:
      bz2: Bzip2
      curl: cURL
      gd: GD imaging
      gmp: GNU GMP support
      ldap: LDAP
      mysqlnd: MySQLnd
      openssl: OpenSSL
      pdo_mysql: MySQL driver for PDO
      pdo_sqlite: SQLite 3.x driver for PDO
      soap: SOAP
      sodium: Sodium
      calendar: Calendar
```

In the subpackages section, we define a pipeline for that range:

```yaml
  - range: extensions
    name: "php-${{range.key}}"
    description: "The ${{range.value}} extension"
    pipeline:
      - runs: |
        export EXTENSIONS_DIR=usr/lib/php/modules
        export CONF_DIR="${{targets.subpkgdir}}/etc/php/conf.d"
        mkdir -p "${{targets.subpkgdir}}"/$EXTENSIONS_DIR $CONF_DIR
        mv "${{targets.destdir}}/$EXTENSIONS_DIR/${{range.key}}.so" \
          "${{targets.subpkgdir}}/$EXTENSIONS_DIR/${{range.key}}.so"
        prefix=
        [ "${{range.key}}" != "opcache" ] || prefix="zend_"
        echo "${prefix}extension=${{range.key}}.so" > $CONF_DIR/"${{range.key}}.ini"
```

And this will loop through all values of the `extensions` range and execute the described pipeline.

### The `update` section

This final section of the YAML file is only required when submitting the package to the Wolfi OS repository. The `update` section is used by Wolfi CI/CD systems to detect new package releases.

Wolfi uses multiple tools and services to keep track of upstream releases, including the [Release Monitoring](https://release-monitoring.org/) service. For packages that are released via GitHub, tracking occurs using the project org/name and a monitored tag.

Here's an example of the update section of the PHP package, which uses the Release Monitoring service:

```yaml
update:
  enabled: true
  release-monitor:
    identifier: 3627
```

You can obtain the identifier from the [release monitoring page](https://release-monitoring.org/) - search for the package and grab the ID that shows up at the URL.

Here is another example, this time from a package that is released via GitHub:

```yaml
update:
  enabled: true
  github:
    identifier: php-amqp/php-amqp
    strip-prefix: v
    tag-filter: v
```

Again, this section is only required when submitting the package to Wolfi. For more details about Wolfi's automated package updates, check [the official docs](https://github.com/wolfi-dev/os/blob/main/docs/UPDATES.md) on the subject.

## Building packages

When you feel your YAML is good for a first run, it's time to build the package with melange. In this guide we'll use Docker to execute melange in a local environment, using [Wolfi's SDK](https://github.com/wolfi-dev/tools/pkgs/container/sdk) image. This image contains everything you need to build Wolfi packages with melange and Wolfi-based images with apko.

The procedure to build apk packages with melange is explained in more detail in our [Getting started with melange](/open-source/build-tools/melange/getting-started-with-melange/) tutorial.

### Setting up a local development environment

Start by cloning the [Wolfi-os](https://github.com/wolfi-dev/os) repository to your local machine. If you plan on sending a pull request to Wolfi later, you may want to create a fork now and clone your fork instead.

```shell
git clone https://github.com/wolfi-dev/os.git
```

From the root of the project, run the following command to build your Docker-based development environment:

```shell
make dev-container
```

This will create an ephemeral container based on the Wolfi SDK image, with a few predefined settings. We'll call this your **Wolfi development environment**.

```
❯ make dev-container
docker run --privileged --rm -it \
    -v "/home/erika/Projects/os:/home/erika/Projects/os" \
    -w "/home/erika/Projects/os" \
    -e SOURCE_DATE_EPOCH=0 \
    ghcr.io/wolfi-dev/sdk:latest@sha256:99babbe4897d68ec1a342bd958fda7274a072bf112670fa691f64753b04774a9

Welcome to the development environment!

[sdk] ❯
```

You are now ready to build your Wolfi package.

### Building a package

To build a package, run the following command from your Wolfi SDK environment:

```shell
make package/<your-package-name>
```

For instance, to build PHP 8.3, which is defined in a file named `php-8.3.yaml`, you would run `make package/php-8.3`:

```
[sdk] ❯ make package/php-8.3
make yamlfile=php-8.3.yaml pkgname=php-8.3 packages/x86_64/php-8.3-8.3_rc3-r1.apk
make[1]: Entering directory '/home/erika/Projects/os'
##############################################################
#          build output - removed for readability            #
##############################################################
ℹ️            | signing apk index at packages/x86_64/APKINDEX.tar.gz
ℹ️            | signing index packages/x86_64/APKINDEX.tar.gz with key local-melange.rsa
ℹ️            | appending signature to index packages/x86_64/APKINDEX.tar.gz
ℹ️            | writing signed index to packages/x86_64/APKINDEX.tar.gz
ℹ️            | signed index packages/x86_64/APKINDEX.tar.gz with key local-melange.rsa
make[1]: Leaving directory '/home/erika/Projects/os'
[sdk] ❯
```

When the build is finished, you can find the newly built apk(s) in a `./packages` directory, in the root of your cloned Wolfi repository.

### When the build fails

It is likely that your build won't work on the first run, and that is completely normal because there are many moving parts and hidden dependencies when building packages from source.

In this scenario, it is often useful to check the build environment, which is preserved for debugging. The build output will inform you where to find these files in your development environment.

```output
2023/10/25 15:37:27 ERROR: failed to build package. the build environment has been preserved:
ℹ️  x86_64    |   workspace dir: /tmp/melange-workspace-4269468499
ℹ️  x86_64    |   guest dir: /tmp/melange-guest-3734950176
```

The **workspace dir** is where you will find the `melange_out` directory, which contains the output of your package. The **guest dir** directory contains the filesystem of your build environment.

Another useful strategy is to include `set -x` before commands in your pipeline, in order to get extended debug information.

```yaml
  - name: Install Composer
    runs: |
      set -x
      EXEC_DIR="${{targets.destdir}}/usr/bin"
      mkdir -p "${EXEC_DIR}"
      mv composer.phar "${EXEC_DIR}/composer"
      chmod +x "${EXEC_DIR}/composer"
```

Most build issues are caused by missed dependencies, even when the error message might be misleading. Another common reason for build errors are wrong file or directory paths. The [melange documentation](https://edu.chainguard.dev/open-source/melange/troubleshooting/) has more pointers to help with debugging, in case you need it.

As mentioned before, there might be cases where you'll need to first build a dependency, and then use this dependency to build the package you need.

When working with local dependencies, use the following notation in your `packages` list, inside the `environment` section:

```yaml
environment:
  contents:
    repositories:
      - https://packages.wolfi.dev/os
      - '@local /work/packages'
    keyring:
      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
    packages:
      - busybox
      - mypackage@local
```

This will look for a package named "mypackage" in your local packages/ folder.

### When the build is successful

First of all, celebrate! 🎉

Check the packages folder, you should find a directory for each built architecture (in my case I get x86_64) with your built apks (package + subpackages) along with an `APKINDEX.tar.gz` file:

```shell
./php-full-wolfi-demo/packages/x86_64
├── APKINDEX.tar.gz
├── php-8.2.7-r1.apk
├── php-amqp-1.11.0-r0.apk
├── php-bcmath-8.2.7-r1.apk
├── php-bz2-8.2.7-r1.apk
├── php-calendar-8.2.7-r1.apk
├── php-cgi-8.2.7-r1.apk
├── php-ctype-8.2.7-r1.apk
├── php-curl-8.2.7-r1.apk
├── php-dbg-8.2.7-r1.apk
├── php-dev-8.2.7-r1.apk
├── php-dom-8.2.7-r1.apk
├── php-exif-8.2.7-r1.apk
…
```

In the next section, we'll demonstrate how you can use the Wolfi SDK for running these checks.

## Testing your packages

With a successful build, it's time to test the packages to make sure they are installable and functional, and also to verify they are free of CVEs.

### Local installation

The first test you'll want to run with your package is to check if you can use `apk` to install it without errors. For that, we'll use the `local-wolfi` environment, which brings up a new container environment using the Wolfi-base image, with additional settings to make your new package available in the test environment alongside the melange keys that were created to sign your package at build time. We'll call this your **Wolfi Test Environment**.

```
❯ make local-wolfi
docker run --rm -it \
 --mount type=bind,source="/home/erika/Projects/os/packages",destination="/work/packages",readonly \
 --mount type=bind,source="/home/erika/Projects/os/local-melange.rsa.pub",destination="/etc/apk/keys/local-melange.rsa.pub",readonly \
 --mount type=bind,source="/tmp/tmp.LXnQu0hkFn/repositories",destination="/etc/apk/repositories",readonly \
 -w "/work/packages" \
 cgr.dev/chainguard/wolfi-base:latest
d2df519c59df:/work/packages#
```

Your newly built packages should now be available for installation from this environment via `apk add`. You should use the full path to the `.apk` file, for instance:

```shell
apk add ./x86_64/composer-2.6.5-r0.apk
```

Make sure the package can be installed without errors, including dependencies.

### Checking for CVEs

Checking the package for CVEs is a good practice to avoid submitting unpatched packages into Wolfi. If CVEs are found, you may want to apply a security patch before submitting your package, if that is available.

From your **Wolfi development environment**, run the following command, providing the full path to your `.apk` file:

```shell
[sdk] ❯ wolfictl scan ./packages/x86_64/composer-2.6.5-r0.apk
🔎 Scanning "./packages/x86_64/composer-2.6.5-r0.apk"
✅ No vulnerabilities found
[sdk] ❯
```

For more information about patching CVEs in Wolfi, check [the official docs on this subject](https://github.com/wolfi-dev/os/blob/main/HOW_TO_PATCH_CVES.md).

## Submitting the package to Wolfi OS

Once you are satisfied with your set of packages and subpackages, you may consider submitting your package to [Wolfi OS](https://github.com/wolfi-dev/os).

From this point, the process is essentially the following:

- Create a fork of the [wolfi-dev/os](https://github.com/wolfi-dev/os) repository
- Create a branch with the name of your package, for instance: add-php-package
- Remove the `repositories` and `keyring` sections of the YAML file
- Add the `release-monitor` info to the YAML file
- Run [`yam`](https://github.com/wolfi-dev/os/blob/main/docs/UPDATES.md) to fix any YAML formatting issues
- Create a signed commit
- Open a pull request following the instructions from the PR template.

The [Wolfi Contributing Guide](https://github.com/wolfi-dev/os/blob/main/CONTRIBUTING.md) on GitHub has more details about this process.

## Resources to learn more

If you haven't yet, check the [Wolfi PHP package source file](https://github.com/wolfi-dev/os/blob/main/php-8.2.yaml) for a more comprehensive view of the melange YAML structure and how that looks in a more complex build.

If you'd like to learn more about Wolfi, check the [documentation](https://edu.chainguard.dev/open-source/wolfi/overview/) and [FAQ](https://edu.chainguard.dev/open-source/wolfi/faq/) for more details about the ecosystem surrounding it.

---

### Package version selection
_Path: open-source/wolfi/apk-version-selection.md_

This document explains how to specify version constraints for packages installed with the apk tool, as well as apko and melange. Understanding version selection will enable you to choose the version you're looking for, determine what updates and vulnerability fixes you receive, and can allow you to reproduce an image's digest through exact version matching.

## Version selection in apko and melange

All the examples in this document focus on usage with the `apk` tool, but the same semantics apply to `apk add` as well as references in an apko or melange `packages` field:

```yaml
environment:
  packages:
    - go>1.21    # install anything newer than 1.21, excluding 1.21
    - foo=~4.5.6 # install any version with a name starting with "4.5.6" (e.g., 4.5.6-r7)
    - python3    # install the latest stable version of python3.
```

## Basic usage

```sh
apk add go
```

This will install the latest stable version of Go. This is nearly always what you want, since it gives you stable software, with as many updates and vulnerability fixes as possible.

Refer to the section below for information on the behavior of pre-release versions.

## Fuzzy matching

You can also use fuzzy version matching.

For example, if you don't care about the epoch, you can request any version of Go with a version string starting in `1.21.1`:

```sh
apk add go=~1.21.1
```

Or you can add any 1.21:

```sh
apk add go=~1.21
```

If multiple versions match that prefix (e.g., `1.21.1-r0`, `1.21.1-r1`, etc.), then the highest numbered next version segment will be chosen.

Fuzzy matching means you can request Go 1.21 without getting 1.20 or 1.22, like you would with `&lt;` or `>`. Wolfi provides a separate `go-1.21` package that `provides:go=1.21.x` so in Go's case you can request `go-1.21` and get the same behavior as `go~1.21`. But this might not be the same case for all packages.

The operators `~`, `~=` and `=~` are equivalent, and all do the same thing.

You can also use fuzzy matching to request a major version prefix:

```sh
apk add go=~1
```

Go will not have a version 2, but other packages might.

For example, `erlang=~26` will match any release of Erlang in the 26 major version, and not match Erlang 25 and below or 27 and above.

`erlang~2` will _not_ match Erlang 26 or 27. It only fuzzy matches whole segments of a semantic versioning version string.

## Version constraints

To request a minimum or maximum acceptable version of a package to install, you can use `>`, `<`, `>=` and `<=`:

```sh
apk add go>1.20  # install anything newer than 1.20, excluding 1.20.0, but including 1.20.1
apk add go<1.20  # install anything older than 1.20, excluding 1.20.0, but including 1.19.14
apk add go>=1.20 # install anything newer than 1.20, including 1.20.0
apk add go<=1.20 # install anything older than 1.20, including 1.20.0
```

This comparison logic is aware of semantic versioning semantics, so `1.9.10` is less than `1.10`, and `1.9.9` is less than `1.9.10`, even though they may be alphabetically sorted later.

Version constraints can be useful when you want to ensure a minimum or maximum major or minor version, but still want to receive minor or patch updates. Fuzzy matching can produce the same behavior – `go~1.20` is equivalent to `go>=1.20` for example.

## Installing future versions

Using `apk add go` installs the latest _stable_ release of Go. For most packages, there is no distinction between the "latest" and "latest stable" release. Some projects, like Go, Node, Python, etc., produce pre-release versions before, or have more nuanced release maturity and support processes. Please refer to the respective larger project for more information.

Go versions often have Release Candidates. For example, when Go 1.21 is the latest release, the Go team may prepare for Go 1.22 by releasing a Go `1.22_rc1` to let folks try it out before it's fully released. To install this version, you can specify the pre-release package name, which for go will be `go-1.22`:

```sh
apk add go-1.22
```

Note that this string uses a dash (`-`), which means it's specifying the full name of the package, which Wolfi's convention is `go-1.22`. Since it doesn't include any other version constraint or fuzzy matching, it's requesting "the latest version of a package named `go-1.22`", which may install `go-1.22` with version `1.22_rc3`.

When Go 1.22 is fully released, it will become the latest release of Go and `provides:[go=$version]`, so `apk add go` will install Go 1.22.0.

## Exact version matching

You can also specify an exact version and epoch to install:

```sh
apk add go=1.21.1-r0
```

This will install exactly this version and epoch, as long as that is available.

Because package updates or vulnerability fixes won't be picked up, this is not generally useful for day-to-day usage. However, this is useful for reproducing an environment exactly, and it's the form we use in the resolved apko configuration attestation we attach to images. This makes it clear exactly what versions of which packages were installed in an image, so you can reproduce it with `apko` to get exactly the same image digest.

---

### Get started with chainctl
_Path: get-started/getting-started-with-chainctl.md_

Chainguard's `chainctl` provides command-line access to manage container images, identity resources, and security configurations across your organization. This guide covers essential commands to begin using `chainctl` effectively in your security and DevOps workflows. For comprehensive command documentation, refer to the [chainctl reference](/platform/chainctl/).

## Authenticate and check auth status

To use `chainctl`, the first thing you must do is [authenticate with the Chainguard platform](/chainguard/chainguard-registry/authenticating/). Do so with:

```shell
chainctl auth login
```

This will present a list of identity providers for you to select from. Use the one that is tied to your Chainguard Account. Once you select the one you wish to use, such as Google, `chainctl` will open a browser window for you to log in with your credentials. Upon successful login, you will have the option to save this identity provider as your default for future logins. Then a token will be exchanged and you will be able to use `chainctl`.

{{< blurb/chainctl-auth >}}

To check your authentication status at any time, enter:

```shell
chainctl auth status
```

This will list your identity and other attributes tied to your account, including your account's assigned roles and capabilities.

To create a pull token, use:

```shell
chainctl auth pull-token
```

One important flag you can pass to this command is the `--repository` flag, which allows you to specify the repository type to create the pull token for. For example, specifying `--repository=apk` binds the pull-token identity to the `apk.pull` role, allowing the identity to download packages from the private APK repository of the parent organization.

To configure a Docker credential helper, which will use a token to pull images when using Docker, use:

```shell
chainctl auth configure-docker
```

> **Note**: {{< blurb/noproxy >}}

## Update chainctl to the latest release

To see which `chainctl` version you have installed, use:

```shell
chainctl version
```

To update your `chainctl` installation, use:

```shell
chainctl update
```

Because this replaces the installed binary, you need write access to the directory where `chainctl` lives. On Linux and macOS, updating a system-wide install such as `/usr/local/bin` requires administrative privileges (for example, with `sudo`). The command also verifies the downloaded binary's signature in-process before installing it; refer to [Updating chainctl](/platform/chainctl-usage/how-to-install-chainctl/#updating-chainctl) for details.

## Configure chainctl

`chainctl` comes with a default configuration, but there are aspects of it that can be adjusted. Examples include setting the registry location that will be used when one is not mentioned in an issued command. To edit the current configuration, use:

```shell
chainctl config edit
```

If you make a mistake and can't recall the original settings, reset the configuration to default settings with:

```shell
chainctl config reset
```

Learn more at [How to manage chainctl configuration](/platform/chainctl-usage/manage-chainctl-config/).

## List available images

To see which Chainguard Containers are available to your account, use:

```shell
chainctl images list
```

Be warned, that list may take a while to generate and is likely to scroll past quickly in your command line terminal.

## Compare two image versions

Let's say you want to compare two versions of an image for the same package. You need to know the URL for your repo, the image name, and the two versions you want to compare. For versions, you can use release numbers like `8.12.0` or you can use `latest` or `latest-dev`.

Use this, where we show the repo used by our Chainguard Developer Education team and where both instances of `<image_name>` are the same:

```shell
chainctl images diff cgr.dev/chainguard.edu/$IMAGENAME:latest cgr.dev/chainguard.edu/$IMAGENAME:latest-dev
```

If a requested image or release being requested is not available in the repo you are using, this will return a `Forbidden` error, just like if you tried to pull an image you did not have access to or from a repository your account is not authorized to use.

Learn more at [How to compare Chainguard Containers with chainctl](/platform/chainctl-usage/comparing-images/).

## List available package versions

If you want to get details about the various package versions available that can be used in images, use:

```shell
chainctl packages versions list $PACKAGENAME
```

This will list all the versions that Chainguard has built and the end-of-life date for each version that has one assigned. It will also list older package versions that are no longer available.

## Output formats

Commands may have a default format for output, but that doesn't mean you have to stick with it. There is an option available to tell `chainctl` the output format to use, like this:

```shell
chainctl $COMMAND -o $FORMAT
```

The `-o` is followed by one of the following strings: `csv`, `id`, `json`, `none`, `table`, `terse`, `tree`, or `wide`.

Not all output formats make sense for all commands, so test thoroughly before you use any specific format in automation.

---

### Change or reset your MFA device
_Path: get-started/mfa-devices.md_

You might need to move your multi-factor authentication (MFA, also called 2FA) to a new device because you replaced your phone, changed authenticator apps, or lost the device that generates your codes. Where you make that change depends on how you sign in to the Chainguard Console, because Chainguard manages MFA for only one of the sign-in paths.

## Find out which sign-in path you use

The Console login screen has buttons for Google, GitHub, and GitLab, along with a single field that accepts either your email address or your organization name. What you click or enter there determines your path:

- **You click Google, GitHub, or GitLab.** That provider signs you in.

- **You enter your organization name.** The Console sends you to the identity provider your organization registered.

- **You enter an email address whose domain your organization registered with a custom identity provider.** The Console sends you to that provider.

- **You enter any other email address.** The Console sends you to Chainguard's email and password sign-in, which always asks for a one-time code from an authenticator app.

Your path determines who holds your MFA enrollment:

| How you sign in | Who manages your MFA | Where to change it |
| --- | --- | --- |
| Google, GitHub, or GitLab | That provider | Your account settings with that provider |
| Your organization's identity provider, such as Okta, Microsoft Entra ID, Ping Identity, or Keycloak | Your own organization | Your internal IT or identity provider administrator |
| Your email address and a password | Chainguard | A support ticket opened by an Owner in your organization |

## Change MFA managed by an identity provider

When you sign in through Google, GitHub, GitLab, or your organization's own identity provider, that provider holds your MFA enrollment. Chainguard can neither see it nor change it, so Chainguard support can't reset it for you. Change it where you manage the rest of that account:

- **Google.** See [Turn on 2-Step Verification](https://support.google.com/accounts/answer/185839) in Google Account Help.

- **GitHub.** See [Configuring two-factor authentication](https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication).

- **GitLab.** See [Two-factor authentication](https://docs.gitlab.com/user/profile/account/two_factor_authentication/).

- **A corporate identity provider.** Contact your internal IT helpdesk or the administrator who manages the provider.

After you change MFA with your provider, sign in to the Console as usual. Nothing needs to change on the Chainguard side.

## Change MFA for email and password sign-in

Chainguard manages this path through Auth0, which hosts the sign-in screen at `auth.chainguard.dev` and holds your MFA enrollment. MFA is required here, so this path always asks for a code. You can't change or reset your own device: the Console has no MFA settings page, and Chainguard's sign-in configuration includes no self-service reset.

If you still have your old device, check whether your authenticator app can move the entry for you. Some apps can transfer an existing entry to a new device, though whether yours can, and how, depends on the app. If it can't, or if you no longer have the old device, ask Chainguard to reset your enrollment.

### Ask for a reset

Chainguard doesn't act on an MFA reset requested from the account's own email address. Anyone who controlled your mailbox could already request a password reset, so treating an emailed request as proof of identity would defeat the purpose of the second factor.

Instead, ask an Owner in your Chainguard organization to open a support ticket on your behalf. [Resetting your MFA device for the Chainguard Console](https://support.chainguard.dev/hc/en-us/articles/52523310297115-Resetting-your-MFA-device-for-the-Chainguard-Console) in the Chainguard knowledge base describes the process.

Once support clears your enrollment, sign in to the Console again. The sign-in flow prompts you to enroll and displays a new QR code, which you scan with your authenticator app to finish. You won't receive an automatic notification when the reset happens, so watch your support ticket for the update.

## One email address, two identities

If your organization registered a custom identity provider after you had already created an email and password account, you might hold two separate Chainguard identities that share one email address. Chainguard identifies you by the provider that issued your login together with your ID at that provider, not by your email address, so the platform treats the two as distinct accounts. Each carries its own MFA, in a different place.

When the Console asks for a code from an authenticator app and you expected to sign in through your organization's provider, you're on the email and password path. Enter your organization name in the login field instead of your email address to reach your provider.

## Get more help

If you can't sign in at all and therefore can't reach the support portal, see [Get support](/get-started/get-support/) for the right channel.

---

### Get started
_Path: get-started/_index.md_

New to Chainguard? Start with [What is Chainguard?](/get-started/what-is-chainguard/) for a high-level overview of the company and its products. Otherwise, pick the path that matches what you're trying to do:

## Build with containers

Pull and run hardened, low-CVE container images from `cgr.dev`. Work through a [language- or service-specific example](/get-started/containers-examples/).

## Build with libraries

Swap your existing dependencies for Chainguard Libraries — rebuilt from verified source, drop-in compatible. Currently available for Java, Python, and JavaScript. Start with the [libraries on-ramp](/get-started/libraries-examples/).

## Evaluate trust

Deciding whether Chainguard is right for your organization? Review how Chainguard Containers are built, what guarantees they carry, and how they compare on CVEs.

## Onboard your teams

Already adopted Chainguard and need to bring your developers on board? Learn what your teams can pull, how access depends on your subscription, and how to retrieve SBOMs and provenance in the guide to [onboarding your teams](/get-started/onboard-your-teams/).

## Migrate an organization

Already convinced and ready to move existing workloads over? Step through the [migration guides](/get-started/migration/).

## Get help

Stuck on something the documentation doesn't cover? [Get support](/get-started/get-support/) explains what to check first, which channel handles your kind of request, and how to open a support ticket when you need one. If you're locked out because you replaced or lost the device running your authenticator app, start with [Change or reset your MFA device](/get-started/mfa-devices/).

---

### Onboard your teams
_Path: get-started/onboard-your-teams.md_

Your organization has adopted Chainguard, and now you need to bring your teams on board. This guide explains what your teams can pull from Chainguard Containers and Chainguard Libraries, why that depends on your subscription, and how to retrieve the SBOMs and provenance that ship with every image and package.

It's written for two readers:

- **Platform and security administrators** who manage Chainguard for the organization and need to explain it to the teams they support. Early on, you may be the only people with [Chainguard Console](/platform/console/) access, so your teams rely on you to communicate how this works.
- **Software engineers** who were pointed here and want to know how to find and pull the resources they're cleared to use.

To decide where to start, identify which Chainguard products your organization uses; many use both. Read [Chainguard Containers](#chainguard-containers) if your teams pull container images, or [Chainguard Libraries](#chainguard-libraries) if they pull language dependencies for Java, Python, or JavaScript. Your administrators know which subscriptions apply.

## Chainguard Containers

### What you can browse compared to what you can pull

There are two different surfaces, and it helps to keep them separate.

The **Chainguard Containers Directory** at [images.chainguard.dev](https://images.chainguard.dev) is public. Anyone can browse the entire catalog there, inspect tags and metadata, and view the SBOM and provenance for each image. Browsing the Directory does not mean your organization can pull every image it lists.

Your **organization's registry** is what your teams pull from, and it holds only the images your organization has access to. Authenticated production images live under your organization's namespace:

```shell
cgr.dev/$ORGANIZATION/$IMAGE:$TAG
```

For example, an organization registered as `example.com` pulls its Python image from `cgr.dev/example.com/python`. Public Starter images remain available to everyone under `cgr.dev/chainguard/`. See the [registry overview](/chainguard/containers/registry/overview/) for the access tiers and [authentication](/chainguard/containers/registry/authenticating/) to set up your credentials.

Your organization may also front the registry with a pull-through cache, such as Artifactory. In that case, the concepts here still hold, but you pull from your cache's address instead of `cgr.dev` directly. Ask your administrators for the path.

### What your organization can pull

Whether an image is available to pull depends on your subscription. If a pull fails for an image you can see in the Directory, it most likely hasn't been added to your organization yet. To work through the possible causes, including a missing version rather than a missing image, see [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).

**Catalog customers.** A Catalog subscription covers the full Chainguard catalog. Even so, only a subset of images is loaded into your organization's registry at any given time, and administrators add more as teams need them. To use an image that isn't there yet, find it in the [Chainguard Containers Directory](https://images.chainguard.dev) and ask an administrator to add it. If you have the `owner` role, you can add it yourself from the Console; refer to [Catalog pricing](/chainguard/containers/reference/pricing/) for the steps and the roles required.

**Per-image customers.** A per-image subscription covers a specific, licensed set of images rather than the whole catalog. You can browse everything in the Directory, but only your licensed images are permitted for builds, deployments, and production workloads. To add an image that isn't in your set, ask your administrators to start a request; once they approve it, they add the image to your organization's registry.

### Access SBOMs and provenance

Every Chainguard container image ships with a signed SBOM and provenance attestations. You can retrieve them three ways; the [full guide](/chainguard/containers/security-and-compliance/retrieve-image-sboms/) covers each in detail.

- **From the Chainguard Containers Directory.** Open an image at [images.chainguard.dev](https://images.chainguard.dev), then download the SBOM from the **SBOM** tab in SPDX or CycloneDX format. This needs no tooling and works for any image in the catalog.
- **With `cosign`.** Download the SBOM attestation for an image directly from the registry:

  ```shell
  cosign download attestation \
    --platform linux/amd64 \
    --predicate-type https://spdx.dev/Document \
    cgr.dev/$ORGANIZATION/$IMAGE | jq -r '.payload' | base64 -d | jq -r '.predicate'
  ```

- **With `syft`.** Generate an SBOM locally from an image you've pulled. Use this for images you've customized, where you want an SBOM of the final artifact.

To pin what you pull so builds stay reproducible, reference images by digest. Refer to [Inspecting Chainguard Containers](/chainguard/containers/troubleshooting/inspecting-containers/).

## Chainguard Libraries

Chainguard Libraries is a secure catalog of language dependencies for Java, Python, and JavaScript. Each package goes through multiple layers of defense, including malicious behavior scanning, building from source, and configurable policies. A package pulled from Chainguard is a drop-in replacement for the one you'd normally pull from Maven Central, PyPI, or npm. See the [overview](/chainguard/libraries/introduction/overview/) for how they're built and what guarantees they carry.

### What your organization can access

Libraries don't have a public browse site like the Chainguard Containers Directory. Instead, you browse the packages your organization is entitled to by signing in to the [Chainguard Console](/chainguard/libraries/introduction/browse/). Access is granted per language: your organization is entitled to Java, Python, or JavaScript individually, so which ecosystems you can pull depends on your subscription. There's no catalog-versus-per-image distinction as there is for containers.

### Pull libraries into your project

You consume Chainguard Libraries by pointing your package manager at your organization's Chainguard repository and authenticating with a pull token. Each ecosystem has its own endpoint under `libraries.cgr.dev`:

```shell
https://libraries.cgr.dev/java/
https://libraries.cgr.dev/python/
https://libraries.cgr.dev/javascript/
```

The [quickstart](/chainguard/libraries/introduction/quickstart/) walks through creating a pull token and configuring your build tools, and [access and authentication](/chainguard/libraries/introduction/access/) covers the details.

### Verify provenance and SBOMs

Every package that Chainguard builds from source ships with a signed SBOM and SLSA provenance, attached alongside each package. Use a command similar to the following to verify which of your dependencies were built by Chainguard:

```shell
chainctl libraries verify /path/to/artifact
```

See [verifying Chainguard Libraries](/chainguard/libraries/policies-and-security/verification/) for what the command checks and for retrieving the SBOM and attestation files directly.

## Other products your company may have adopted

Chainguard's platform reaches beyond containers and libraries. Your organization may also use one or more of these:

- **[Chainguard Agent Skills](/chainguard/agent-skills/overview/)** — hardened AI agent skills that Chainguard reviews, scopes, and publishes with a full audit trail, so your teams can install them without inheriting unknown risk.
- **[Chainguard Actions](/chainguard/actions/overview/)** — hardened, drop-in replacements for popular GitHub Actions that protect your CI/CD pipelines from supply chain attacks.
- **[Chainguard Guardener](/chainguard/guardener/)** — a tool for managing and hardening your source code through a suite of capabilities you opt into independently.

## Next steps

- New to the platform? Start with [What is Chainguard?](/get-started/what-is-chainguard/).
- Ready to pull your first container image? Work through a [language- or service-specific example](/get-started/containers-examples/).
- Adopting Chainguard Libraries? Follow the [libraries on-ramp](/get-started/libraries-examples/).
- Managing resources from the command line? See [Get started with chainctl](/get-started/getting-started-with-chainctl/).

---

### What is Chainguard?
_Path: get-started/what-is-chainguard.md_

Nearly every modern application is built on open source software. That software is powerful, but it arrives with problems: vulnerabilities (including publicly disclosed [CVEs](https://edu.chainguard.dev/software-security/glossary/#cve)), unpatched dependencies, unclear provenance, and the constant work of keeping it all up to date. Tracking and fixing these issues across a large codebase consumes engineering time that could go toward building products.

Chainguard's mission is to be the secure source for open source. Rather than leaving you to patch and harden open source software yourself, Chainguard rebuilds it from source in a hardened build environment, keeps it continuously updated, and distributes it with the metadata you need to verify what you're running. The result is software that carries low-to-no known CVEs and requires far less remediation work from your team.

## What Chainguard offers

Chainguard rebuilds open source software into products you can adopt directly, depending on how you consume dependencies:

- **[Chainguard Containers](/chainguard/containers/overview/)** are minimal, hardened container images. Following a distroless philosophy, each image includes only your application and its essential runtime dependencies, minimizing the overall attack surface. This minimalism is a large part of why they carry [low-to-no CVEs](/chainguard/containers/concepts/zerocve/).
- **[Chainguard Libraries](/chainguard/libraries/introduction/overview/)** bring the same approach to language dependencies. They're drop-in replacements for open source packages in the Java, Python, and JavaScript ecosystems, rebuilt from verified sources and continuously monitored.

You pull Chainguard Containers and Libraries from a single, policy-aware endpoint, the [Chainguard Repository](/chainguard/chainguard-repository/overview/).

Containers and Libraries are where most teams start, but Chainguard secures more than these. Its other products include:

- **[Chainguard OS](/chainguard/chainguard-os/overview/)**, the hardened Linux foundation the other products build on.
- **[Chainguard VMs](/chainguard/vms/overview/)**, minimal virtual machine images for cloud and hypervisor workloads.
- **[Chainguard Actions](/chainguard/actions/overview/)**, hardened replacements for popular GitHub Actions.
- **[Chainguard Guardener](/chainguard/guardener/)**, tooling to harden your own source code.
- **[Chainguard Agent Skills](/chainguard/agent-skills/overview/)**, security-reviewed skills for AI agents.

## The Chainguard Factory

Behind these products is the [Chainguard Factory](/platform/factory/overview/), the automated build system at the heart of what Chainguard does. The Factory continuously monitors thousands of open source projects. When a new upstream release appears, it fetches the source, verifies it, rebuilds it, retests it, and publishes signed packages built from source along with SBOMs and provenance metadata.

Because the Factory does this work for you, adopting a Chainguard artifact immediately reduces your software supply chain risk. Because Chainguard maintains the artifact continuously, those security improvements continue over time with minimal changes to your existing workflows.

## Why Chainguard

Compared with using artifacts from public repositories, Chainguard gives you:

- **Low-to-no CVEs**, so your team spends less time triaging and patching vulnerabilities.
- **A minimal attack surface**, because artifacts ship with only what they need to run.
- **Verifiable provenance** through signatures, SBOMs, and builds from source, so you can prove what's in your software supply chain.
- **Continuous updates**, so patches land automatically instead of waiting for manual upgrades.

## Where to go next

- Ready to try an image? Work through a [container example](/get-started/containers-examples/) for your language or service.
- Replacing dependencies instead? Start with the [libraries on-ramp](/get-started/libraries-examples/).
- Moving existing workloads over? Step through the [migration guides](/get-started/migration/).
- Rolling Chainguard out to your teams? See how to [onboard your teams](/get-started/onboard-your-teams/).

---

### Get support
_Path: get-started/get-support.md_

When the documentation doesn't answer your question, Chainguard offers several ways to get help. This guide covers what to check first, which channel handles your kind of request, and how to open a support ticket when you need one.

## Before you open a ticket

Many questions already have a published answer you can find in seconds:

- **This documentation site.** Search from the box at the top of any page.

- **Ask AI.** Click **Ask AI** in the upper-right corner of any page on this site and ask your question in plain language. The assistant draws on Chainguard's documentation and support content and cites its sources. Review the answer and its sources before you act on it.

- **The [Chainguard knowledge base](https://support.chainguard.dev/hc/en-us).** Chainguard support engineers publish articles there for problems that come up repeatedly.

## Where to send your request

The support portal handles most requests, but it isn't the only route, and for some situations it isn't the right one. Find your situation in the following list:

- **You have a problem with a Chainguard product or with your organization's configuration.** Open a ticket in the [support portal](https://support.chainguard.dev/).

- **You need to move your multi-factor authentication to a new device, or you've lost the device running your authenticator app.** Where you make that change depends on how you sign in, and for most sign-in paths it isn't Chainguard that manages your MFA. See [Change or reset your MFA device](/get-started/mfa-devices/).

- **You can't sign in at all, so you can't reach the portal.** Email [support@chainguard.dev](mailto:support@chainguard.dev).

- **Your organization uses Catalog Starter.** Use the [knowledge base](https://support.chainguard.dev/hc/en-us), the [community Slack](https://join.slack.com/t/chainguardcommunity/shared_invite/zt-3nttdr807-V9BJHayWvsB0KbHsfZO5Rw), and the free [Chainguard courses](https://courses.chainguard.dev/). Catalog Starter doesn't include ticket access.

- **Your request concerns your subscription or what your organization is licensed for — for example, whether a particular image is included in your entitlements.** Contact your account team, meaning the customer success manager or solutions architect assigned to your organization.

- **You can't pull a container image or a specific version of one.** Work through [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/) first. It tells you which cases you can resolve yourself and which need a ticket.

## Open a ticket

### Confirm that you can reach the portal

The support portal has two prerequisites.

First, your organization needs a paid plan. Catalog Starter doesn't include support tickets or root cause analysis. For what the free plan does cover, see [Chainguard Catalog Starter](/chainguard/containers/reference/catalog-starter/).

Second, your identity has to be linked to an organization. The portal identifies you through your Chainguard Console account, and an unlinked identity produces an error. To check, sign in to the [Chainguard Console](https://console.chainguard.dev) and look for your organization in the left sidebar. If it isn't there, ask an administrator in your organization to invite you, then open the invitation email and complete the setup flow. Signing in without completing that flow leaves your identity unlinked.

{{< note >}}
Administrators can invite users from the Console under **Settings > Users > Invite users**, or from the command line. See [How to manage IAM organizations in Chainguard](/platform/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard/).
{{< /note >}}

### Submit the request

1. Sign in to the [Chainguard Console](https://console.chainguard.dev).

1. In the left sidebar, click **Support**. You can also go to [support.chainguard.dev](https://support.chainguard.dev/) directly.

1. Fill in the request form. Before you submit, the portal offers relevant documentation and a generated answer. If that resolves your question, you're finished. Otherwise, submit the request as usual.

### If the portal returns an error

Work through the following steps:

1. Open the Console and the support portal in a private browsing window.

1. Clear your browser cache and cookies.

1. Confirm that you're signing in with the same identity you were invited with.

If the error persists, email [support@chainguard.dev](mailto:support@chainguard.dev) with a screenshot of the error, the email address of the account you're trying to use, and the invitation link if you still have it.

## What to include in your request

A support engineer can start on a problem instead of asking you for more information when your request includes:

- Your organization name.

- The image or package name and tag, and the digest if you have it.

- The command you ran and its complete output, including any error message.

- The `chainctl` version, if the problem involves the command-line tool. Run `chainctl version` to get it.

- What you expected to happen instead.

- Anything else you think might help: logs, screenshots, or a short screen recording.

---

### Containers examples
_Path: get-started/containers-examples/_index.md_

Start with the [quickstart](/chainguard/containers/quickstart/), which pulls a public Chainguard Container, builds an application on top of it, and verifies the image's signature and SBOM.

From there, pick a stack and build your first image. Each guide walks through pulling a Chainguard Container, running it, and adapting it to your own application.

These are a starting point. Chainguard publishes getting-started guides for many more languages and services — refer to the full set under [Chainguard Containers](/chainguard/containers/getting-started/).

## Featured guides

- **[nginx](/chainguard/containers/getting-started/web-and-data-services/nginx/)** — serve a web application from a hardened, distroless nginx container.
- **[PostgreSQL](/chainguard/containers/getting-started/web-and-data-services/postgres/)** — run a PostgreSQL database with a minimal attack surface.
- **[Python](/chainguard/containers/getting-started/languages-and-runtimes/python/)** — package a Python application using the development and production image variants.
- **[Go](/chainguard/containers/getting-started/languages-and-runtimes/go/)** — compile a Go binary with a multi-stage build and ship it on a minimal runtime.

---

### Libraries examples
_Path: get-started/libraries-examples/_index.md_

Point your package manager at Chainguard, reinstall, and ship — no breaking changes. Chainguard Libraries are rebuilt from verified source as drop-in replacements for the packages you already use.

These on-ramp guides link to the published Chainguard Libraries documentation. Libraries are currently available for **Java**, **Python**, and **JavaScript** — a reader on another ecosystem can still build with [Chainguard Containers](/get-started/containers-examples/).

## On-ramp guides

- **[Quickstart: swap in a library](/chainguard/libraries/introduction/quickstart/)** — point your package manager at Chainguard, reinstall, and ship.
- **[Migrate a Java project](/chainguard/libraries/java/migration/)** — switch an existing Maven or Gradle project over to Chainguard Libraries.
- **[Migrate a JavaScript project](/chainguard/libraries/javascript/migration/)** — switch an existing npm project over to Chainguard Libraries.
- **[Migrate a Python project](/chainguard/libraries/python/migration/)** — switch an existing pip, uv, or Poetry project over to Chainguard Libraries.

## Example projects

For hands-on testing, each ecosystem has a demo repository with example projects you can clone and run:

- **[Chainguard Libraries for Java](https://github.com/chainguard-demo/chainguard-libraries-java)** — Maven and Gradle projects, including a Spring Boot application and CVE remediation demos.
- **[Chainguard Libraries for JavaScript](https://github.com/chainguard-demo/chainguard-libraries-javascript)** — npm, pnpm, Yarn, and Bun examples, each with a `demo.sh` script.
- **[Chainguard Libraries for Python](https://github.com/chainguard-demo/chainguard-libraries-python)** — pip, uv, and Poetry examples, each with a `demo.sh` script.

---

### Self-serve Helm charts
_Path: get-started/self-serve/helm-charts.md_

Catalog customers can provision Chainguard Helm charts, along with the container images each chart depends on, directly from the Chainguard Console. This replaces the previous manual request process, which required coordination with Chainguard sales, customer success, and support and could take 1 to 4 days.

{{< note >}}
This capability is available to Catalog customers whose plan includes the APPLICATION tier. It does not apply to the free [Catalog Starter](/chainguard/containers/reference/catalog-starter/) plan. Customers on per-image pricing can request charts through a support workflow, described in [Per-image pricing customers](#per-image-pricing-customers).
{{< /note >}}

## Add a chart in the Chainguard Console

To add Helm charts to your organization from the Console, complete the following steps:

1. In the Chainguard Console, go to the **Helm charts** section in the sidebar.
1. Review the available charts. Charts already enabled for your organization are marked.
1. Select one or more charts to add. The Console checks whether your organization already has the container images each chart requires, then lists any missing images by name.
1. Optional: If your organization is entitled to FIPS images, select the FIPS option to add FIPS variants where they are available.
1. Confirm your selection to add the charts and their required images to your organization.

Provisioning runs in the background. The Console shows in-progress and completion states while it adds the charts and images, which can take some time to finish.

## Add a chart with `chainctl`

You can perform the same action from the command line with `chainctl`. For a Catalog customer, the following command resolves the chart's image dependencies and creates any missing chart and image repositories in your organization, matching the Console flow:

```shell
chainctl images helm add-chart $CHART
```

Replace `$CHART` with the chart you want to add. The command will output a small chart showing the name of every image in the Helm chart and the image status, such as whether it already exists in your org or is being added.

{{< note >}}
This command is available starting in a specific `chainctl` release. If it isn't available in your installation, update `chainctl` to the latest version.
{{< /note >}}

You can use the command to add `iamguarded` charts, too:

```shell
chainctl images helm add-chart iamguarded-charts/$CHART
```

If you want to test the process before actually adding the chart, use:

```shell
chainctl images helm add-chart $CHART --dry-run
```

To learn more, use `chainctl images helm add-chart --help` or refer to the [`chainctl` Reference documentation](/platform/chainctl/).

## Per-image pricing customers

If your organization uses per-image pricing, or a chart requires images outside your active tiers, the Console doesn't provision the chart instantly. Instead, it generates a single support request that lists the chart and any missing images, prefilled with your organization's details. Chainguard support then provisions the chart and images, typically within 1 to 2 days.

## Use your charts

After provisioning completes, authenticate and deploy your charts by following [How to Use Chainguard Helm Charts](/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/).

---

### Self-serve overview
_Path: get-started/self-serve/overview.md_

**Self-serve** refers to the ways you can provision Chainguard products,
such as container images and Helm charts, on your own, without direct
involvement from Chainguard employees.

This section covers the self-serve options available today:

- **[Catalog Starter](/chainguard/containers/reference/catalog-starter/)** is a free plan that lets you try up to five Chainguard container images. Any Helm charts that depend on those images are included.
- **[Self-serve Helm charts](/get-started/self-serve/helm-charts/)** lets Catalog customers provision Chainguard Helm charts, along with the container images they depend on, directly from the Chainguard Console.

---

### Migration
_Path: get-started/migration/_index.md_

Already using Chainguard and ready to move existing workloads over? Start with the product you're migrating.

## Migrate to Chainguard Containers

Replace the base images in your Dockerfiles with Chainguard Containers. Because Chainguard Containers are minimal — most have no shell or package manager — migration usually means adjusting how your image installs dependencies, which user it runs as, and what its entrypoint expects.

- **[Container migration overview](/chainguard/containers/migration/migrations-overview/)** — key differences, rollout strategy, and troubleshooting.
- **[Porting a sample application](/chainguard/containers/migration/porting-apps-to-chainguard/)** — a full walkthrough converting a three-service application.
- **[Migrating Dockerfiles](/chainguard/containers/migration/migrating-to-chainguard-images/)** — instruction-by-instruction guidance.
- **[Migration checklist](/chainguard/containers/migration/migration-checklist/)** — best practices to work through before and during a rollout.
- **[Compatibility guides](/chainguard/containers/migration/compatibility/)** — what changes when moving from Alpine, Debian, Red Hat, or Ubuntu.
- **[Language and platform guides](/chainguard/containers/migration/migration-guides/)** — Python, Node, PHP, .NET, Go, and Java.

## Migrate to Chainguard Libraries

Point your package manager at Chainguard Libraries and reinstall. Libraries are rebuilt from verified source as drop-in replacements, so migration is a configuration change rather than a code change.

- **[Java](/chainguard/libraries/java/migration/)** — switch an existing Maven or Gradle project over.
- **[JavaScript](/chainguard/libraries/javascript/migration/)** — switch an existing npm project over.
- **[Python](/chainguard/libraries/python/migration/)** — switch an existing pip, uv, or Poetry project over.

Libraries are currently available for Java, Python, and JavaScript. For background on how access and configuration work, refer to the [Chainguard Libraries overview](/chainguard/libraries/introduction/overview/).

## Migrate an API integration

If you call the Chainguard API directly, v2 is Generally Available and endpoints have moved from `/v1/` to `/v2/`.

- **[API v1 to v2 migration](/platform/api/api-v2-migration/)** — what changed and how to move a direct integration over.

`chainctl`, the Chainguard Console, and the Terraform provider handle versioning themselves, so this only applies to `curl`, gRPC, or custom SDK integrations.

## Automate the migration

Three tools reduce the manual work, and they suit different situations:

- **[Guardener Dockerfile migration](/chainguard/guardener/dockerfile-migration/)** — an AI agent that converts, builds, and validates your Dockerfiles until they work. Use it when a Dockerfile is complex enough that a mechanical translation won't hold up.
- **[Dockerfile Converter (dfc)](/chainguard/containers/migration/migration-tools/dockerfile-conversion/)** — an open source tool that rewrites `apt`, `yum`, and `apk` instructions deterministically. Use it when you want a fast, predictable first pass you can review yourself.
- **[Image Matcher](/chainguard/containers/migration/migration-tools/image-matcher/)** — an API that reads an existing image's SBOM and ranks the closest Chainguard equivalents. Use it when you know what you run today but not what to replace it with.

Guardener also migrates GitHub Actions to hardened, SHA-pinned equivalents and enforces signed commits. Refer to the [Guardener overview](/chainguard/guardener/) for its full set of capabilities.

---

### Using the Chainguard Console
_Path: platform/console/images-directory/index.md_

This guide serves as a walkthrough of the Chainguard Console, which is accessible to anyone, but you'll first need to [create an account and log in](https://console.chainguard.dev/auth/login).

If you're not ready to create a Chainguard account, you can follow along with the public [Chainguard Directory](/chainguard/containers/registry/chainguard-directory/) which offers similar information, but is only informative as it is not connected to your organization or account. If you use the *Sign In* link in the directory, it brings you to the console.

## Accessing the Chainguard Console

Log in to access the [Chainguard Console](https://console.chainguard.dev/auth/login).

If you would like to open the console with your Organization already selected, you can use (and bookmark) a link like this, replacing `ORGANIZATION` with your organization's name:

```URL
https://console.chainguard.dev/auth/login?org=ORGANIZATION
```

## Browse Chainguard Libraries in the console

Learn more browsing Chainguard Libraries in the console on the [Libraries browsing page](/chainguard/libraries/introduction/browse/).

## Browse container images and details in the Console

After signing in to the [Chainguard Console](https://console.chainguard.dev), your browser will take you to the Overview page:

<center><img src="/platform/console/images-directory/imgs-dir-A.png" alt="Screenshot showing the Chainguard Console's Overview page." style="width:1100px;"></center>
<br />

If your organization and account have [Chainguard Notifications](/platform/console/use-chainguard-notifications/) enabled, you will see the **Activity Center** on the page where notifications from Chainguard will occasionally be shown.

Click **Images** in the left-hand navigation. By default, takes you to the **Organization** images tab. If you're part of an organization, you may have access to private Chainguard Containers (or *Production Containers*) that can be found here.

Navigate to the **Chainguard catalog** tab. There, you'll be presented with a list of all of Chainguard's available images.

The **Chainguard catalog** tab has a table with four columns:

* **Name**: the name of each given container image
* **Latest tag**: the latest available version of the image
* **Description**: a brief description of each container image
* **Updated**: how long it's been since the container image was last updated

Note that if your organization has signed up for catalog pricing, there will be another column containing buttons labeled **Add to org**, allowing you to provision Chainguard Containers independently without having to reach out to Chainguard. Check out our doc on [Chainguard container catalog pricing](/chainguard/containers/reference/pricing/) for more information.

If an image you need doesn't appear in your organization's catalog, or appears without the version you need, refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).

The **Organization** tab doesn't have a **Description** column, but has two additional columns. The first of these, labeled **Status** specifies what resources an organization has purchased and has access to. This column can show one of two possible values: **Active**, meaning that your organization is able to download and use the container image, or **Expired**, meaning that your organization had access to the container image in the past but not anymore.

The other additional column is labeled **Pull URL**, and contains a URL you can use to pull the given image, as in a `docker pull` command.

You can click on any of these column names to sort the list of container images in ascending or descending order based on the values in these columns.

Above the table is a search box you can use to find specific container images by their name or latest version number. To the right of this box is a drop-down menu labeled **Category**. You can use this to filter the images listed based on which of [Chainguard's container image categories](/chainguard/containers/concepts/container-categories/) they belong to.

## Container image information

Next, let's inspect an individual container image. Click on any container image you'd like:

<center><img src="/platform/console/images-directory/imgs-dir-E.png" alt="Screenshot of the Container Details page for the go image, showing the 'Tags' tab." style="width:1100px;"></center>
<br />

This example shows the details page for `go` in the Console.

Each container image details page has several tabs that provide information about various facets of the given image.

### Tags

The default page for each image is the **Tags** tab which contains information about the version tags available for each image. This contains a table with columns:

* **Tag**: this column lists each tag available for the container image
* **Pull URL**: the URL you can use to download a version, shown when your organization can pull that version. When it can't, this column shows a status label in place of the URL: **Add to organization for access**, **Add image for access**, **Request image for access**, **Available in organization**, **Unavailable to organization**, or **Contact us for access**. These labels describe the repository rather than the version on that row, so **Available in organization** can appear beside a version you can't pull. For what each label means and what to do about it, refer to [Troubleshoot container and version availability](/chainguard/containers/troubleshooting/container-version-troubleshooting/).
* **Compressed size**: the size of the image, in megabytes
* **Last changed**: when each version of the image was last updated

Above the table is a search box which you can use to filter the different versions available for the image. There is also a **Variant** drop-down menu you can use to filter for all images, only development variants, or only non-development variants.

### Overview

The **Overview** tab contains the container image's README. Typically, READMEs include instructions on how to download the container image, any relevant compatibility notes, and instructions on how to get started with using the image.

### Comparison

The **Comparisons** tab includes useful data that shows how a given Chainguard Container compares against a non-Chainguard alternative in terms of CVE count. It also includes helpful visualizations of these comparisons. For more information, check out our guide on [CVE visualizations](/chainguard/containers/security-and-compliance/vulnerability-management/cve-visualizations/).

### Provenance

All Chainguard Containers contain verifiable signatures and high-quality [software bills of materials](/open-source/sbom/what-is-an-sbom/) (SBOMs). These features allow you to confirm the origin of each image and provide you with a detailed list of everything included in the container image.

The **Provenance** tab outlines how you can verify container signatures and download and verify container image attestations, all with examples using [`cosign`](/open-source/sigstore/cosign/an-introduction-to-cosign/).

### Specifications

The **Specifications** tab is where you can find a number of important details about a given container image, such as whether it ships with the `apk` package manager or a shell. It also includes information like the image's default user ID, environment variables, and its entrypoint.

It also shows the container image's **Raw configuration**, which includes many of these details as well as its OCI labels (similar to [annotations](/chainguard/containers/overview/#annotations)).

### SBOM

The **SBOM** tab contains a list of packages in the image. Chainguard Containers are built so that everything contained in the image is a package, meaning that this package list gives a complete view of what's in the container image. You won't find anything hidden in the image that isn't listed in its SBOM tab.

The table listing an image's packages has six columns.

* **Type**: the type of package, such as `golang` or `apk`
* **Namespace**: any packages found in a Chainguard container image are built by Chainguard; this column shows the source repository on which the package is based
* **Name**: the name of each package included in the image's SBOM
* **Version**: the version of the listed package
* **Subpath**: if available, a subpath that points to a specific file or directory within the package
* **License**: the license under which each package is published

Above the table is a search box you can use to find and filter the packages listed. To the left of this search box are two drop-down menus you can use to select which version of the image you want to find the SBOM for as well as what architecture (either x86_64 or arm64).

Finally, to the right of the search box is a button labeled **Download**. If the image is a Free Container or a container image your organization has access to, you can click this button to download the SBOM (in either the SPDX or CycloneDX formats) to your machine.

Note that Chainguard began generating SBOMs for its images on November 15, 2023. For this reason, any versions of a given container image that were released before that date will not have any SBOM data to show.

### Vulnerabilities

The **Vulnerabilities** tab contains a list of every CVE one can find within the image. As with the SBOMs tab, the Vulnerabilities tab has a search box you can use to find and filter specific vulnerabilities within the image. There is also a drop-down menu to the left allowing you to select different versions of the container image.

Below these is a table listing the vulnerabilities. However, most Chainguard Containers won't show any vulnerabilities for the `latest` version. This isn't an error, as we aim to remove vulnerabilities from images as soon as they arise.

To illustrate how this table appears when vulnerabilities are actually present, you can select different versions in the drop-down until you find one with a vulnerability.

The Vulnerabilities table has five columns.

* **CVE ID**: the official identification number of each vulnerability present in the table
* **Severity**: the severity of each given vulnerability. This can either read **Critical**, **High**, **Medium**, **Low**, or **Unknown**
* **Package**: the package where the vulnerability was found
* **Version**: the version of the package containing the vulnerability
* **Last detected**: the date and time when the vulnerability last appeared in a scan of the container image

To the left of each row in the table is down-pointing chevron (**˅**). Clicking on this expands the row to show more information about the given vulnerability.

Specifically, this highlights the **Package** name and **Version** number of the package associated with the vulnerability. It also shows the **Fixed version** of the package, a brief **Description** of the vulnerability, and one or more **References** you can review to learn more about the vulnerability.

Please be aware that, as with SBOM data, Chainguard began generating vulnerability information for its images on November 15, 2023. For this reason, any versions of a given image that were released before that date won't have any vulnerability data to show.

### Advisories

The **Advisories** tab lists any CVEs that have affected the image in the past and what action Chainguard took to remediate the CVE. This tab shows a timeline of each security advisory released for a given container image, starting with the most recent. Each entry specifies the date and time the advisory was released, the CVE in question, the affected package, and the [current status](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/#summary-of-advisory-statuses).

To learn more about Chainguard security advisories, we encourage you to read our article on [How Chainguard issues Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/) as well as our guide on [How to use Chainguard Security Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-to-use/). You can also find every security advisory published for Chainguard Containers by exploring our self-service [Security Advisories page](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-directory).

### Builds

Chainguard Containers viewed in the Console have an additional **Builds** tab. However, this tab is only accessible if the container image in question has been customized with Chainguard's [Custom Assembly](/chainguard/containers/custom-assembly/overview/) tool.

Our guide on [Using the Chainguard Console to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-console/) provides an in-depth overview of the Builds tab, as well as working with Custom Assembly in the Chainguard Console.

### Find Helm charts in the Chainguard Console

For organizations looking to deploy their Chainguard container images with Helm, Chainguard provides upstream-produced Helm charts as well as a set of Chainguard-created charts labeled as iamguarded, designed specifically to support organizations migrating off of Bitnami.

You can find these charts and information about them in the Chainguard Console. From the sidebar menu, click **Helm Charts**.

Charts with the **shield** icon are iamguarded charts, created specifically to help people who are switching from Bitnami.

Click any chart name to learn the chart details.

### Find packages in the Chainguard Console

You can find a list of packages available to your organization in the Chainguard Console. Click **Packages** in the sidebar menu to open the Packages page to view and search across the list of APK packages that are available to you via the Chainguard-provided private APK repository for your organization.

Click a package name to reveal more details about the package. Use the **Architecture** dropdown to select which option to display.

## Learn more

The Chainguard Console is a useful tool for understanding what Chainguard container images are available and learn details about each. To better understand how to work with individual container images, you can see if we have a [getting started guide](/chainguard/containers/getting-started/) available. We also provide a guide on [how to view Security Advisories](/chainguard/containers/security-advisories/) through our [self-service public Security Advisories page](https://images.chainguard.dev/security?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-chainguard-images-working-with-images-images-directory).

---

### How to use Chainguard Notifications
_Path: platform/console/use-chainguard-notifications/index.md_

You can use the [Chainguard Console](/platform/console/images-directory/) to configure how **Chainguard** is permitted to send notifications about things like breaking changes to users in your organization. The feature includes options to allow notifications to be sent in-app to the **Activity Center** on the user’s Overview page in the Chainguard Console, via Slack, and for customers who are opted in, via email.

These notifications are different from [Chainguard Events](/chainguard/administration/cloudevents/) as Chainguard Notifications are sent by Chainguard’s customer success representatives.

## Prerequisites and limitations

{{< beta feature="Chainguard Notifications" >}}

Notifications are currently limited to messages related to a small set of topics like breaking changes, incidents, and product lifecycle changes like end-of-life (EOL) and new releases.

The in-app notifications are set up automatically and currently have no configuration options.

Slack requires you to establish the connection between our Chainguard Notifications Slack app and your company Slack workspace by completing the Slack OAuth flow that initiates when you connect Slack the first time.

Some customers have access to email notifications. When enabled, you have control over which email notifications are sent. You are also able to set one or more additional email addresses to receive notifications for your organizations; these are called forwarding addresses.

## Set up Slack for Chainguard Notifications

Make sure you are logged into both the console and to your Slack workspace on the same machine before you begin. To perform this task, you must use a user account for the Chainguard Console that is configured with the *owner* role for the organization and a Slack account that can add apps to your Slack workspace and which has access to the Slack channels you plan to use.

> For example, when you are trying to add the Chainguard Notifications app to Slack channels, the Slack account you are using will only be shown a list of public and private Slack channels the app has access to and your Slack user account is a member of. If you have a specific channel in mind for these notifications, make sure the Slack user establishing the connection has access to and is a member of that channel.

To set this up, follow these steps:

1. In the Chainguard Console, open **Settings \> Activity Center**.

1. Next to the **Integrations** section heading, click **Edit**.

1. Under the **Slack** subheading, click **Connect Slack**.
  A pop-up window from Slack will appear asking you to allow the **Chainguard Notifications** app to access Slack.

1. In the **Workspace** dropdown, select the Slack workspace in which you want to have your users receive Chainguard Notifications.

1. Click **Allow**.

Follow the directions in one or more of the following sections to enable notifications in public and private channels.

### Preliminary step to set up notifications in a private channel

If you want to provide Chainguard Notifications in a private Slack channel, then at this point you must add the app to the private channel. In Slack:

1. Enter the private channel with your Slack user.

1. Click on the channel members icon to open the list.

1. Click to open the **Integrations** tab.

1. Click the **Add an App** button to display a list of available apps in your workspace.

1. Find **Chainguard Notifications** in the list and click the **Add** button.

Include the private channel in your actions in the next section.

### Set up notifications in a public or private channel

1. Click into the **Slack Channels** box under the **Slack** subheading on the **Notifications** page in the console. You will be shown the list of channels available for the Chainguard Notifications app to use. Select the channel(s) where you want these notifications to be posted.

> NOTE: Private channels will not appear here unless you first complete the preliminary step in the previous section.

## Manage email notifications

Email notifications are not yet available to all customers.

Use this procedure to change which notification topics are sent, change who receives them, or unsubscribe an address from them entirely.

To perform this task, you must use a user account for the Chainguard Console that is configured with the *owner* role for the organization. Then, follow these steps:

1. In the Chainguard Console, open **Settings \> Activity Center**.

1. Next to the **Email** section heading, click **Edit**.
  You can then change settings for what notification topics will be sent and to whom, either an individual or perhaps to an email alias for a group. To unsubscribe an address, remove it here.

1. When you are done, click **Save changes**.

If you don't have the *owner* role, ask an owner in your organization to make the change for you. If you can't reach an owner, see [Get support](/get-started/get-support/).

## Notification categories

Notifications fall into one of multiple categories based on content. Here's a list of the currently available categories:

- **Breaking changes** - Changes that could disrupt regular use
- **Incidents** - Reports and updates
- **Product lifecycle** - Has two sub-categories:
    - **End of life**
    - **New releases**

## Troubleshooting FAQ - setting up Slack

### Channel seems to be missing — check if it is private

**Q:** I connected Slack successfully, but the channel I want to use doesn't appear in the "Slack Channels" dropdown. Other channels show up fine — why is this one missing?

The most common cause is that the channel is private. The Chainguard Notifications Slack app can only see public channels by default. To make a private channel selectable:

1. In Slack, open the private channel.
1. Click the channel members icon, then open the **Integrations** tab.
1. Click **Add an App**, find **Chainguard Notifications**, and click **Add**.
1. Return to the Chainguard Console and refresh the **Settings > Activity Center** page. The private channel should now appear in the dropdown.

### Channel still seems to be missing — check which email address you are using

**Q:** My channel is public, I'm a member of it, and I even added the Chainguard Notifications app to it — but it still doesn't show up. What's wrong?

This usually means the email address you used to sign in to the Chainguard Console doesn't match the email address associated with your account in your company's Slack workspace.

The Slack app uses your Console email to look up your Slack user ID — if it can't find a matching user in your workspace, it can't determine which channels you have access to, and the channel list comes back empty (or partial).

A common version of this scenario is signing in to the Console with your Github profile linked to your personal Gmail (e.g. you@gmail.com) while your corporate Slack workspace knows you as you@company.com.

To fix it:

1. In the Console, disconnect the Slack integration in **Settings > Activity Center > Integrations > Edit**.
1. Sign out of the Chainguard Console.
1. Sign back in using the email address that matches your corporate Slack workspace identity.
1. Re-connect Slack and complete the OAuth flow again.

### I still cannot find the channel — refresh the Console cache

**Q:** I disconnected and reconnected Slack with the correct email, but the channel I want still isn't appearing. Now what?

After reconnecting, the channel list can get stuck on a stale cached version from the previous session.

A hard refresh of the Console tab almost always resolves it. On Mac use `Cmd + Shift + R` or on Windows and Linux use `Ctrl + Shift + R` to refresh.

Then reopen **Settings > Activity Center** and check the channel dropdown again. If the channel still doesn't appear after a hard refresh, contact your Chainguard Customer Success representative — they can verify on the backend that your Slack user ID was successfully linked to the Notifications service.

---

### Chainguard OpenAPI specification
_Path: platform/api/spec.md_

{{< openapi spec-url="/api.json" >}}

---

### Chainguard API v2 tutorial
_Path: platform/api/api-v2-tutorial.md_

The v2 API is now Generally Available (GA) and introduces cursor-based pagination, server-side ordering, consistent resource patterns, and structured error responses across all endpoints.

This guide walks through the v2 API using real `curl` commands. If you're migrating an existing v1 or beta (`v2beta1`) integration, see [Migrating from API v1 to API v2](/platform/api/api-v2-migration/) instead.

> **Note:** The example output in this guide was captured from a development environment. Your organization's resource names, UIDs, timestamps, and counts will differ. The response structure and field names are the same across all environments.

## What's the same

- **Authentication** — same OIDC token model as v1
- **Authorization** — same identity-based access control
- **Scoping** — same `uidp.descendants_of` / `uidp.children_of` hierarchy filters

## What's new in v2

- **Cursor-based pagination** with `page_size`, `page_token`, `total_count`
- **Server-side ordering** with `order_by` (ascending/descending on any sortable field)
- **Random-access pagination** with `skip` for UI page jumping
- **Structured errors** with typed detail payloads (AIP-193)
- **Consistent resource patterns** — every resource has `uid`, `createTime`, `updateTime`
- **Hydrated references** — role binding responses include full identity, group, and role objects
- **FieldMask updates** — partial updates via `updateMask` instead of sending the full resource

## Available endpoints

| Domain | Resources | Operations |
| -------- | ----------- | ------------ |
| **IAM** | Groups, Identities, Roles, RoleBindings, IdentityProviders, AccountAssociations, GroupInvites, ExternalGroupRoleMappings, Terms | List, Get, Create, Update, Delete (Terms: accept + list acceptances) |
| **Registry** | Repos (incl. readme), Tags, Images | Repos: List, Get, Create, Update, Delete; Tags: List, Get, Create, Delete; Images: architectures & size (read-only) |
| **Vulnerabilities** | Advisories | List, Get |
| **Libraries** | Artifacts | List artifacts, list versions, artifact count (read-only) |
| **Advisory** | Security advisory documents, vulnerability metadata, resolved-vulnerability reports | List (read-only) |
| **Events** | Subscriptions | List, Get, Create, Delete |
| **Ping** | Ping (connectivity check) | Ping |

All endpoints live under a versioned path per domain: `/iam/v2/`, `/registry/v2/`, `/vulnerabilities/v2/`, `/libraries/v2/`, `/advisory/v2/`, `/events/v2/`, and `/ping/v2/`.

The worked examples in this guide focus on IAM, Registry, and Vulnerabilities. The other domains follow the same request and response conventions.

For an IAM resource used end to end in an administrative task, refer to [Automate IdP group mappings with the API](/platform/administration/custom-idps/grant-roles-from-groups/#automate-mappings-with-the-api), which maps identity provider groups to Chainguard roles in bulk with the `ExternalGroupRoleMappings` endpoints.

## Prerequisites

Get an API token and set your organization ID:

```shell
export TOKEN=$(chainctl auth token)
export API=https://console-api.enforce.dev
# ORG_ID is the UID of your root organization group
export ORG_ID=YOUR_ORG_ID
```

The following examples use `$TOKEN`, `$API`, and `$ORG_ID` for brevity.

## Operational notes

Keep the following in mind as you work through this guide.

- **Page tokens expire after 3 days** ([AIP-158](https://google.aip.dev/158)). If a token expires, the query restarts from the beginning — no error is returned.
- **gRPC** — all endpoints are also available via gRPC at the same host. Proto definitions are at `chainguard.dev/sdk/proto/chainguard/platform/`, and the Go SDK clients live under `chainguard.dev/sdk/proto/chainguard/platform/clients/v2`.

---

## 1. Your first v2 request

List the first 3 repos in your organization:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=3&order_by=name" | jq .
```

```json
{
  "repos": [
    {
      "uid": "d9e2f1a0.../06626efd8c6b3fb7",
      "name": "nginx",
      "createTime": "2026-01-28T12:54:21.189Z",
      "updateTime": "2026-01-28T12:54:21.189Z"
    },
    {
      "uid": "d9e2f1a0.../0ed18f0f929f4c60",
      "name": "python",
      "createTime": "2026-01-23T14:54:42.774Z",
      "updateTime": "2026-01-23T14:54:42.774Z"
    },
    {
      "uid": "d9e2f1a0.../12b4208b23740c37",
      "name": "static",
      "createTime": "2026-01-23T14:54:39.021Z",
      "updateTime": "2026-01-23T14:54:39.021Z"
    }
  ],
  "nextPageToken": "CqQBV3lK...",
  "totalCount": "12",
  "skipped": 0
}
```

Every v2 response follows the same shape:

- **`uid`** — unique resource identifier (replaces `id` in v1)
- **`createTime` / `updateTime`** — timestamps on every resource
- **`nextPageToken`** — cursor for the next page (empty when no more results)
- **`totalCount`** — total matching results across all pages

### Get a single resource

New in v2: fetch a resource directly by UID. In v1, this required a List call with an ID filter.

```shell
# REPO_UID is a uid value from the List repos response above
export REPO_UID=YOUR_REPO_UID

curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos/$REPO_UID" | jq '{uid, name, createTime}'
```

```json
{
  "uid": "d9e2f1a0.../06626efd8c6b3fb7",
  "name": "nginx",
  "createTime": "2026-01-28T12:54:21.189Z"
}
```

Use direct UID lookups when you already know the resource identifier — they are faster than a List call with an ID filter.

### Filter by name

Find a specific repo without knowing its UID:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&name=nginx" \
  | jq '[.repos[] | {uid, name, createTime}]'
```

```json
[
  {
    "uid": "d9e2f1a0.../06626efd8c6b3fb7",
    "name": "nginx",
    "createTime": "2026-01-28T12:54:21.189Z"
  }
]
```

Name filtering returns exact matches. Combine with `uidp.descendants_of` to scope the search to your organization.

---

## 2. Set up access for a new team

A common workflow: create a CI identity at your organization and bind a role to it.

> **Note:** Create identities under your root organization group (`$ORG_ID`) so they can reach the resources that live there, including your registry. An identity created under a subgroup is scoped to that subgroup and won't see your registry — so it can't pull images.

### Create an identity

```shell
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/identities/$ORG_ID" \
  -d '{
    "name": "ci-bot",
    "description": "CI/CD pipeline identity",
    "claimMatch": {
      "issuer": "https://token.actions.githubusercontent.com",
      "subject": "repo:my-org@123456/my-repo@654321:ref:refs/heads/main"
    }
  }' | jq .
```

```json
{
  "uid": "d9e2f1a0.../f462d354ca32ca9f",
  "name": "ci-bot",
  "description": "CI/CD pipeline identity",
  "lastSeenTime": "2026-03-27T13:55:00.783Z",
  "createTime": "2026-03-27T13:55:00.785Z",
  "updateTime": "2026-03-27T13:55:00.785Z",
  "claimMatch": {
    "issuer": "https://token.actions.githubusercontent.com",
    "subject": "repo:my-org@123456/my-repo@654321:ref:refs/heads/main"
  }
}
```

{{< note >}}
The `subject` shown here uses GitHub's immutable format, which embeds the numeric owner ID (`123456`) and repository ID (`654321`). Match the exact subject your repository's token carries. For how to find these IDs and when the format applies, see [Create an Assumable Identity for a GitHub Actions Workflow](/platform/administration/assumable-ids/identity-examples/github-identity/#finding-your-repositorys-numeric-identifiers).
{{< /note >}}

Note the identity `uid` in the response — you will use it in the next step when binding a role.

### Bind a role

First, find the viewer role:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/iam/v2/roles" | jq '.roles[] | select(.name == "viewer") | {uid, name, description}'
```

```json
{
  "uid": "63921b2c44617e3f2603851537be0123af4a57d7",
  "name": "viewer",
  "description": "Viewer Role (built-in)"
}
```

Then bind it:

```shell
# ROLE_UID is the uid of the viewer role, retrieved above
ROLE_UID="63921b2c44617e3f2603851537be0123af4a57d7"
# IDENTITY_UID is the uid value returned in the Create an identity response above
export IDENTITY_UID=YOUR_IDENTITY_UID

curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/roleBindings/$ORG_ID" \
  -d "{\"identityUid\": \"$IDENTITY_UID\", \"roleUid\": \"$ROLE_UID\"}" | jq .
```

```json
{
  "uid": "d9e2f1a0.../9b822036a7075d75",
  "identity": {
    "uid": "d9e2f1a0.../f462d354ca32ca9f",
    "name": "ci-bot",
    "description": "CI/CD pipeline identity",
    "subject": "repo:my-org@123456/my-repo@654321:ref:refs/heads/main",
    "issuer": "https://token.actions.githubusercontent.com"
  },
  "group": {
    "uid": "d9e2f1a0...",
    "name": "my-org",
    "description": "Root organization group"
  },
  "role": {
    "uid": "63921b2c44617e3f2603851537be0123af4a57d7",
    "name": "viewer",
    "description": "Viewer Role (built-in)"
  },
  "createTime": "2026-03-27T13:55:01.475Z"
}
```

The response includes fully hydrated identity, group, and role objects — no need for follow-up lookups.

---

## 3. Pagination

Every List endpoint supports cursor-based pagination with consistent parameters.

### Basic pagination

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5" \
  | jq '{totalCount, repos: [.repos[].name], nextPageToken: .nextPageToken[:20]}'
```

```json
{
  "totalCount": "12",
  "repos": ["apko", "busybox", "go", "jdk", "nginx"],
  "nextPageToken": "CqQBV3lKbE16Z3dPVE0y"
}
```

Follow the cursor for the next page:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5&page_token=CqQBV3lK..." \
  | jq '{repos: [.repos[].name]}'
```

```json
{
  "repos": ["node", "php", "postgres", "python", "redis"]
}
```

When `nextPageToken` is absent from the response, you have reached the last page.

### Server-side ordering

Sort by name:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5&order_by=name" \
  | jq '[.repos[].name]'
```

```json
["apko", "busybox", "go", "jdk", "nginx"]
```

Reverse the order:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5&order_by=name%20desc" \
  | jq '[.repos[].name]'
```

```json
["static", "ruby", "redis", "python", "postgres"]
```

Sort by creation time (newest first):

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5&order_by=created_at%20desc" \
  | jq '[.repos[] | {name, createTime}]'
```

```json
[
  {"name": "redis", "createTime": "2026-02-14T09:11:05.488Z"},
  {"name": "postgres", "createTime": "2026-02-10T17:02:05.135Z"},
  {"name": "node", "createTime": "2026-02-03T11:48:04.814Z"},
  {"name": "nginx", "createTime": "2026-01-28T12:54:21.189Z"},
  {"name": "python", "createTime": "2026-01-23T14:54:42.774Z"}
]
```

Pagination and ordering combine: pages maintain sort order across cursors.

### Random-access with `skip`

Jump directly to page 3 (skip the first 10 results):

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=5&order_by=name&skip=10" \
  | jq '{skipped: .skipped, repos: [.repos[].name]}'
```

```json
{
  "skipped": 10,
  "repos": ["ruby", "static"]
}
```

The `skipped` field in the response confirms how many results were skipped, useful for building UI page controls.

### Pagination parameters

| Parameter | Description |
| ----------- | ------------- |
| `page_size` | Number of results per page (default 50, max 200) |
| `page_token` | Opaque cursor from previous response's `nextPageToken` |
| `order_by` | Sort field and direction, for example `name` or `created_at desc` |
| `skip` | Number of results to skip (for random-access / UI page jumping) |

---

## 4. Tags and end-of-life

Tags live under a repo. List them with the same patterns you used for repos, scoped to a single repo with `uidp.children_of`.

### List tags in a repo

Each tag carries its `digest` and a `deprecated` flag:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/tags?uidp.children_of=$REPO_UID&page_size=3" \
  | jq '[.tags[] | {name, digest, deprecated, updateTime}]'
```

```json
[
  {"name": "latest", "digest": "sha256:6b3f...", "deprecated": false, "updateTime": "2026-07-14T09:12:44.501Z"},
  {"name": "1.27", "digest": "sha256:8c1a...", "deprecated": false, "updateTime": "2026-07-14T09:12:44.502Z"},
  {"name": "1.26", "digest": "sha256:a90d...", "deprecated": true, "updateTime": "2026-05-02T18:30:10.114Z"}
]
```

### Check for deprecated tags

In v1, a dedicated `ListEolTags` call surfaced end-of-life tags. v2 has no separate end-of-life endpoint or server-side filter. Instead, each tag carries a `deprecated` boolean, which you filter on client-side:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/tags?uidp.children_of=$REPO_UID&page_size=200" \
  | jq '[.tags[] | select(.deprecated) | .name]'
```

> **Note:** Client-side filtering on `deprecated` is the intended approach in v2. A v2 equivalent of `ListEolTags` is on the backlog with no committed date; until it ships, the v1 `ListEolTags` endpoint remains available.

---

## 5. Querying vulnerabilities

The Vulnerabilities domain exposes advisory data. In v2 it covers advisories with List and Get.

### List advisories

Advisories are scoped and paginated like every other List endpoint, with extra filters such as `artifactNames` and `advisoryIds`:

```shell
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/vulnerabilities/v2/advisories?uidp.descendants_of=$ORG_ID&page_size=3" \
  | jq '[.advisories[] | {uid, advisoryId, artifactName, updateTime}]'
```

```json
[
  {"uid": "d9e2f1a0.../3b1c", "advisoryId": "CGA-abcd-1234-wxyz", "artifactName": "nginx", "updateTime": "2026-07-18T21:04:11.220Z"},
  {"uid": "d9e2f1a0.../7f2a", "advisoryId": "CGA-efgh-5678-stuv", "artifactName": "python", "updateTime": "2026-07-18T21:04:11.221Z"},
  {"uid": "d9e2f1a0.../a1b2", "advisoryId": "CGA-ijkl-9012-mnop", "artifactName": "openssl", "updateTime": "2026-07-18T21:04:11.222Z"}
]
```

Fetch a single advisory by UID at `/vulnerabilities/v2/advisories/{uid}`.

### Vulnerability reports

The v1 `GetVulnReport` and `ListVulnCountReports` calls have no v2 equivalent today, and advisories are not a replacement — they serve a different, advisory-feed purpose. The `ListResolvedVulnsReports` endpoint under `/advisory/v2/` is also advisory-feed oriented, not a vulnerability-report replacement. If your integration reads vulnerability reports, continue using the v1 endpoints, which remain fully supported. v2 coverage arrives with the Vulnerabilities domain's migration.

---

## 6. Structured errors

API v2 returns structured error responses with machine-parseable codes and details.

### Validation error

```shell
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/identities/$ORG_ID" \
  -d '{}' | jq .
```

```json
{
  "code": 3,
  "message": "Invalid argument: name: name must match \"^[a-z0-9 ._-]{1,}$\"",
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "reason": "INVALID_ARGUMENT",
      "domain": "iam.chainguard.dev"
    },
    {
      "@type": "type.googleapis.com/google.rpc.BadRequest",
      "fieldViolations": [
        {
          "field": "name",
          "description": "name must match \"^[a-z0-9 ._-]{1,}$\""
        }
      ]
    }
  ]
}
```

The `fieldViolations` array identifies exactly which fields failed validation and why.

### Precondition failure

Attempting to delete a group that still contains child resources returns a precondition failure:

```json
{
  "code": 9,
  "message": "Precondition failed: cannot delete group with child repos",
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "reason": "FAILED_PRECONDITION",
      "domain": "iam.chainguard.dev"
    },
    {
      "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
      "violations": [
        {
          "type": "RESOURCE_NOT_EMPTY",
          "description": "cannot delete group with child repos"
        }
      ]
    }
  ]
}
```

Error responses follow [Google AIP-193](https://google.aip.dev/193) with typed detail payloads you can switch on programmatically.

---

## 7. Partial updates with FieldMask

Update specific fields without sending the full resource. Only the fields listed in `updateMask` are changed:

```shell
curl -s -X PATCH -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/registry/v2/repos/$REPO_UID" \
  -d '{
    "description": "Updated description — only this field changes"
  }' | jq '{uid, name, description}'
```

```json
{
  "uid": "d9e2f1a0.../06626efd8c6b3fb7",
  "name": "nginx",
  "description": "Updated description — only this field changes"
}
```

The `name` field was not in the request body, so it's unchanged. In v1, updates required sending the entire resource — any omitted field would be reset to its zero value.

To be explicit about which fields to update, pass `updateMask`:

```shell
curl -s -X PATCH -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/registry/v2/repos/$REPO_UID?updateMask=description" \
  -d '{
    "description": "Only this field is updated",
    "name": "this-is-ignored"
  }' | jq '{uid, name, description}'
```

```json
{
  "uid": "d9e2f1a0.../06626efd8c6b3fb7",
  "name": "nginx",
  "description": "Only this field is updated"
}
```

The `name` in the body is ignored because `updateMask` only includes `description`. This PATCH-with-field-mask pattern applies to every updatable resource.

---

## Migration from v1

v2 is additive — v1 endpoints remain available during a transition period, so you can migrate at your own pace. For the full field-by-field mapping and migration timeline, see [Migrating from API v1 to API v2](/platform/api/api-v2-migration/).

---

## Cleanup

Delete resources you created during this walkthrough:

```shell
# Delete in reverse order: role binding, then identity
# BINDING_UID is the uid value returned in the Bind a role response above
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" "$API/iam/v2/roleBindings/$BINDING_UID"
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" "$API/iam/v2/identities/$IDENTITY_UID"
```

Each DELETE returns an empty response body on success.

---

### Chainguard API v1 specification
_Path: platform/api/spec-api-v1.md_

{{< openapi spec-url="/api-v1.json" >}}

---

### Migrating from API v1 to API v2
_Path: platform/api/api-v2-migration.md_

Chainguard's API v2 is now Generally Available (GA) across every product domain: Customer Platform (IAM), Containers, Ecosystems, and Integrations. At GA, the "beta" designation is dropped: endpoints move from `/v2beta1/` to `/v2/`. This guide covers what changed from v1, and the steps to migrate an existing direct integration.

If you only use `chainctl`, the Chainguard Console, or the Terraform provider, you don't need this guide — those clients handle versioning for you, and nothing changes on your end. This guide is for anyone calling the API directly: `curl`, gRPC, or a custom SDK integration.

v1 continues to work during a transition period, so nothing breaks today. Migrate at your own pace; see [Timeline](#timeline) for what happens next.

## Prerequisites

You'll need:

- A valid Chainguard identity with access to the resources you're calling.
- [`chainctl` installed](/platform/chainctl-usage/how-to-install-chainctl/), to mint a token for testing (`chainctl auth token`).

Set up your environment for the following examples:

```shell
export TOKEN=$(chainctl auth token)
export API=https://console-api.enforce.dev
# ORG_ID is the UID of your root organization group
export ORG_ID=YOUR_ORG_ID
```

## What's not changing

- **Authentication**: same OIDC token model as v1.
- **Authorization**: same identity-based access control.
- **Scoping**: same `uidp.descendants_of` / `uidp.children_of` hierarchy filters.
- **Host**: same API host (`console-api.enforce.dev` in production).
- **CREATE shape**: the parent resource stays in the URL path (`/groups/{parent}`), and the request body carries the resource fields directly. This is unchanged from v1.

If your integration already authenticates against v1 successfully, no credential or auth-flow changes are needed to call v2.

## Quick reference

| Operation | v1 pattern | v2 pattern |
| --- | --- | --- |
| Path versioning | Versioned (`/iam/v1/`, `/registry/v1/`, `/vulnerabilities/v1/`, `/libraries/v1/`, `/advisory/v1/`) | Same domains with the `/v2/` segment |
| Field naming | Inconsistent (`id`, `created_at`, `group_id`) | Consistent camelCase (`uid`, `createTime`/`updateTime`) |
| CREATE | Parent resource identified in the URL path | No change — parent stays in the URL path |
| GET (single resource) | No dedicated endpoint; filter a List call | Dedicated Get endpoint, fetch by `uid` |
| LIST | Offset/page-number params, full result set, no total count | `page_size`, `page_token`, `skip`, `order_by`, `total_count` |
| UPDATE | PUT, full-resource replacement | PATCH, partial update via a field mask |
| DELETE | Same path pattern, ambiguous failure on blocked deletes | Same path pattern, returns a `PreconditionFailure` detail when blocked |
| Errors | Ambiguous — a missing resource can return an empty HTTP 200 result | Structured: `ErrorInfo`, `BadRequest`, `ResourceInfo`, `PreconditionFailure`, with proper status codes |

### Path prefixes by domain

| Domain | v1 path prefix | v2 path prefix (GA) |
| --- | --- | --- |
| IAM (Customer Platform: groups, roles, identities, role bindings) | `/iam/v1/` | `/iam/v2/` |
| Registry (Containers) | `/registry/v1/` | `/registry/v2/` |
| Vulnerabilities | `/vulnerabilities/v1/` | `/vulnerabilities/v2/` |
| Libraries (Ecosystems) | `/libraries/v1/` | `/libraries/v2/` |
| Advisory (Integrations) | `/advisory/v1/` | `/advisory/v2/` |

If you built against the beta endpoints, updating the version segment from `v2beta1` to `v2` is the only path change — the request and response shapes don't change as part of that rename.

## Migration steps

### Step 1: Update your endpoint paths

Change the version segment from `v1` to `v2` for each domain you call, using the [path prefix table](#path-prefixes-by-domain). If you were already on `/v2beta1/`, rename it to `/v2/`.

### Step 2: Update field references

v2 standardizes field naming across every service:

- Resource identifiers are always `uid`, never `id`.
- Timestamps are `createTime` / `updateTime`, not `created_at` / `updated_at`.
- All fields use camelCase.

Update any code that reads specific field names out of API responses — these differ from v1 even for the same resource.

### Step 3: Switch updates to PATCH with a field mask

v1 uses PUT semantics: changing one field means sending the entire resource back, which forces a fetch-before-write pattern and creates race conditions on concurrent updates. v2 uses PATCH with a field mask, so you specify only the fields you're changing.

```shell
curl -X PATCH -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos/$REPO_UID?updateMask=description" \
  -d '{"description": "updated description"}'
```

Replace fetch-modify-write update logic with a PATCH call that sets only the fields you're changing. A wildcard `*` is available if you genuinely want full replacement.

Repository updates (`UpdateRepo`) are a common case to migrate here. For a worked repo PATCH example, see [Partial updates with FieldMask](/platform/api/api-v2-tutorial/#7-partial-updates-with-fieldmask) in the tutorial.

### Step 4: Switch pagination to cursor-based

v1 pagination relies on page numbers or offsets, and loads the full result set into memory. v2 List endpoints add:

- `page_size`: how many items to return per page.
- `page_token`: the opaque cursor from the previous response's `next_page_token`, used to fetch the next page. Omit it for the first page.
- `skip`: number of items to skip, for jumping directly to a specific page without walking the cursor sequentially.
- `order_by`: server-side ordering, instead of sorting client-side after fetching.
- `total_count`: total matching items, so you don't have to infer it from page math.

```shell
curl -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=3&order_by=name" | jq .
```

Replace any page-number or offset logic with a loop that follows `page_token` until the response stops returning one. Use `skip` instead if you need to jump to an arbitrary page. Adopt `order_by` and drop any client-side sort you were doing to compensate.

### Step 5: Use dedicated Get endpoints

v1 typically requires filtering a List call to fetch a single resource. v2 adds a dedicated Get endpoint per resource, fetched by `uid` directly.

```shell
curl -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos/$REPO_UID"
```

Replace any "list and filter to one item" pattern with the dedicated Get endpoint for that resource.

### Step 6: Update your error handling

In v1, an empty or ambiguous result can mean several different things — no matches, no permission, or a missing parent resource — with no way for a client to tell them apart. For example, requesting a resource that doesn't exist in v1 returns an empty result with HTTP 200.

v2 returns proper status codes (for example, `NOT_FOUND` / HTTP 404) with structured error details, following the same error model used across Google Cloud APIs:

- **ErrorInfo**: a machine-readable reason code and error domain.
- **BadRequest**: per-field validation errors.
- **ResourceInfo**: which specific resource type and name wasn't found.
- **PreconditionFailure**: why a request was blocked (for example, a delete blocked by a dependent resource).

If your integration currently treats an empty v1 result as ambiguous, or works around that ambiguity with extra calls, update it to branch on the v2 status code and structured error details instead. Re-test your error-handling paths, not just the happy path.

### Step 7: Update gRPC and SDK clients

All v2 endpoints are also available directly via gRPC, at the same host. Proto definitions are at `chainguard.dev/sdk/proto/chainguard/platform/`. At GA the `v2beta1` designation is dropped across REST paths, gRPC proto packages, and the Go SDK. If you call the API via generated gRPC clients, regenerate them against the `v2` packages; the Go SDK clients aggregation moves to `chainguard.dev/sdk/proto/chainguard/platform/clients/v2`.

## Full example: listing and deleting repos

**Before (v1):**

```shell
curl -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v1/repos?uidp.descendants_of=$ORG_ID"
```

**After (v2):**

```shell
curl -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos?uidp.descendants_of=$ORG_ID&page_size=3&order_by=name" | jq .
```

Delete follows the same path-prefix change, with no other behavior change:

```shell
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "$API/registry/v2/repos/$REPO_UID"
```

A `DELETE` returns an empty response body on success, same as v1. A delete blocked by a dependent resource now returns a `PreconditionFailure` error detail explaining why, instead of an ambiguous failure.

## Timeline

v1 remains fully supported alongside v2. This release sets no sunset date and adds no deprecation or sunset response headers. When a deprecation timeline is set, Chainguard will announce it separately, with generous advance notice.

You don't need to wait for a deadline to start: both versions are available today, and you can migrate incrementally.

## Troubleshooting

**Will my existing integration stop working today?**
No. v1 keeps working during the parallel availability period. Nothing changes for existing integrations until the sunset date, which will be communicated well in advance.

**Do I need new credentials for v2?**
No. Authentication and authorization are unchanged — the same tokens and identities that work with v1 work with v2.

**Why did an API call that used to return an empty list now return an error?**
This is expected, and it's an improvement. In v1, a missing resource and an empty result look the same, so there was no way to tell "nothing matched" apart from "that resource doesn't exist" or "you don't have permission." v2 returns a specific, structured error in those cases instead.

**Where do I send a customer who asks about migrating?**
This guide. If you're on the account or support team and hit something this guide doesn't cover, reach out to Engineering rather than guessing at specifics.

## Next steps

- [Chainguard API v2 Tutorial](/platform/api/api-v2-tutorial/): worked examples of the v2 endpoints you'll be migrating to.
- [Chainguard API v2 Specification](/platform/api/spec-api-v2/): full OpenAPI reference.
- If you run into issues migrating, reach out to your Chainguard account team or refer to [Get support](/get-started/get-support/).

---

### Chainguard API v2 specification
_Path: platform/api/spec-api-v2.md_

{{< openapi spec-url="/api-v2.json" >}}

---

### Authenticating with the Chainguard SDK
_Path: platform/api/authentication.md_

There are several ways for users to interact with the Chainguard platform, with [`chainctl`](/platform/chainctl/) (Chainguard's command-line tool) and the [Chainguard Console](https://console.chainguard.dev/overview) (Chainguard's web interface) being the two most commonly-used methods. However, both of these require a human user to authenticate, and aren't useful for working with Chainguard resources programmatically.

The [Chainguard SDK](https://github.com/chainguard-dev/sdk) serves to ease programmatic integration with the Chainguard platform. This guide highlights two examples from the SDK repository that show how to authenticate to the [Chainguard registry](/chainguard/chainguard-registry/overview/) using the `chainguard.dev/sdk/auth` and `chainguard.dev/sdk/auth/ggcr` packages. The first has you authenticate as a local user, while the second has you authenticate as an [assumed identity](/platform/administration/assumable-ids/assumable-ids/).

This page gives examples in Golang as well as using `curl`. For more information about the Golang examples, refer to the [`examples` folder](https://github.com/chainguard-dev/sdk/tree/main/examples/registry) in the SDK repository.

## Prerequisites

To follow along with this guide you must have [Go installed](https://go.dev/doc/install) to run the  examples provided by the SDK repository, which are written in Golang. Additional examples in `curl` are found just after the discussion of each Golang example.

Additionally, it may help to run these examples from a temporary directory, like `/tmp` so the code is automatically removed from your system the next time it boots:

```shell
cd /tmp
```

## Example 1 — Authenticate using local credentials

The first example from the SDK repository we will go over is the [`chainctl` example](https://github.com/chainguard-dev/sdk/tree/main/examples/registry/chainctl). This example shows how to use a token source backed by `chainctl` — Chainguard's command-line tool — to access the Chainguard registry using local credentials.

### Example 1 in Golang

The `chainctl` example consists of the following Go code in a `main.go` file (with comments removed):

```go
package main

import (
 "context"
 "encoding/json"
 "log"
 "os"

 "chainguard.dev/sdk/auth"
 "chainguard.dev/sdk/auth/ggcr"
 "github.com/google/go-containerregistry/pkg/name"
 "github.com/google/go-containerregistry/pkg/v1/remote"
)

func main() {
 ctx := context.Background()
 ts := auth.NewChainctlTokenSource(ctx, auth.WithAudience("cgr.dev"))

 desc, err := remote.Get(name.MustParseReference("cgr.dev/chainguard/static"), remote.WithAuthFromKeychain(ggcr.TokenSourceKeychain(ts)))
 if err != nil {
     log.Fatalf("error getting reference: %v", err)
 }
 enc := json.NewEncoder(os.Stdout)
 enc.SetIndent("", "  ")
 _ = enc.Encode(desc)
}
```

This code works by executing the `chainctl` binary to retrieve a token and making a call directly to the registry. Specifically, it does the following things:

* It imports some packages, including the Chainguard SDK's [auth](https://github.com/chainguard-dev/sdk/tree/main/auth) and [auth/ggcr](https://github.com/chainguard-dev/sdk/tree/main/auth/ggcr) packages. These are what allow the program to interact with the Chainguard registry.
* The example uses the `auth` package to execute the `chainctl` CLI binary to retrieve a token based on the local user's credentials.
* Using this token, the example makes a call to the Chainguard registry to retrieve some information about the supplied image. The example uses the `cgr.dev/chainguard/static` Free image.

To run this example, save the `main.go` file to your local machine. Then run the following commands:

```shell
go mod init github.com/chainguard-dev/sdk && go mod tidy
```

The `go mod init` command will initialize a new `go.mod` file in the current directory. Including the `github.com/chainguard-dev/sdk` URL tells Go to use that as the module path. The `go mod tidy` command ensures that the new `go.mod` file matches the source code in the module.

Following that, execute the program with `go run`:

```shell
go run main.go
```

This will return output like the following:

```
{
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "size": 925,
  "digest": "sha256:633aabd19a2d1b9d4ccc1f4b704eb5e9d34ce6ad231a4f5b7f7a3af1307fdba8",
  "Manifest": "eyJzY2hlbWFWZXJzaW9uIjoyLCJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLmluZGV4LnYxK2pzb24iLCJtYW5pZmVzdHMiOlt7Im1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UubWFuaWZlc3QudjEranNvbiIsInNpemUiOjgzOCwiZGlnZXN0Ijoic2hhMjU2OmJiMmRlMjU3MjFlMTE3Zjg4MDYwYjgyZGQ2YWQ1M2Y4ODdlZTgwOWU1MzE1Y2Y0MWEwMGNkOGExM2ZhMjMwNzciLCJwbGF0Zm9ybSI6eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsIm9zIjoibGludXgifX0seyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLCJzaXplIjo4MzgsImRpZ2VzdCI6InNoYTI1NjoxMmVjMWU3NDg0NmVhNDM1OTNkNmExMzMwZGEyOGVkNGQzNmRmNThhMTg2NGQwOTE1MjRlM2IwYTk5MDY4Y2QzIiwicGxhdGZvcm0iOnsiYXJjaGl0ZWN0dXJlIjoiYXJtNjQiLCJvcyI6ImxpbnV4In19XSwiYW5ub3RhdGlvbnMiOnsiZGV2LmNoYWluZ3VhcmQucGFja2FnZS5tYWluIjoiIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnMiOiJDaGFpbmd1YXJkIFRlYW0gaHR0cHM6Ly93d3cuY2hhaW5ndWFyZC5kZXYvIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLmNyZWF0ZWQiOiIyMDI1LTA1LTI4VDEzOjM1OjQ4WiIsIm9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2UiOiJodHRwczovL2dpdGh1Yi5jb20vY2hhaW5ndWFyZC1pbWFnZXMvaW1hZ2VzL3RyZWUvbWFpbi9pbWFnZXMvc3RhdGljIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybCI6Imh0dHBzOi8vaW1hZ2VzLmNoYWluZ3VhcmQuZGV2L2RpcmVjdG9yeS9pbWFnZS9zdGF0aWMvb3ZlcnZpZXciLCJvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yIjoiQ2hhaW5ndWFyZCJ9fQ=="
}
```

The example returns the image's digest and the OCI manifest data. This proves that you've gotten a response back from the registry and that authentication worked as expected.

This example doesn't really reflect a real-world use case, as users will generally access `cgr.dev/chainguard` container repositories without authenticating. However, by presenting a token it will trigger the authentication checks, making this example useful for illustrating how this can be done with the Chainguard SDK.

You can experiment with updating this example to retrieve information about a different Chainguard container image by changing the `cgr.dev/chainguard/static` value in the `main()` function. You could replace this with any Chainguard repository you have access to, and the example will return information about that image.

### Example 1 using curl

To authenticate using `curl` and the API, first authenticate directly with `chainctl`:

```shell
chainctl auth login
```

This will return output like the following:

```response
Opening browser to https://issuer.enforce.dev/oauth?audience=https%3A%2F%2Fconsole-api.enforce.dev&client_id=auth0&connection=google-oauth2&create_refresh_token=true&exit=redirect&redirect=http%3A%2F%2Flocalhost%3A44723%2Fcallback%3Ftoken%3Dtrue%26error%3Dtrue&skip_registration=true
Opening in existing browser session.
<api-token>
```

Then, retrieve an API token and use it to call the API:

```shell
curl -H "Authorization: Bearer $(chainctl auth token)" https://console-api.enforce.dev/iam/v1/groups | jq '.'
```

In our example, [we requested a list of groups the account belongs to](https://edu.chainguard.dev/chainguard/api/spec/#tag/groups/GET/iam/v1/groups). Then we piped the API response, which is in JSON, into `jq` to make it more easily readable by humans for our documentation sample. This will return output like the following, which has been edited for length:

```response
{
  "items": [
    {
      "id": "<removed>",
      "name": "chainguard.edu",
      "description": "Developer Enablement images catalog",
      "resourceLimits": {
        "clusters": 0,
        "idps": 0,
        "repositories": 0
      },
      "verified": true
    },
    {
      "id": "<removed>",
      "name": "chainguard",
      "description": "    This group holds the public Chainguard Images hosted under\n    cgr.dev/chainguard\n",
      "resourceLimits": {},
      "verified": true
    }
  ]
}
```

## Example 2 — Authenticate with an assumed identity

The [`exchange` example](https://github.com/chainguard-dev/sdk/tree/main/examples/registry/exchange) demonstrates how to exchange a token for an assumed identity to access the registry.

### Example 2 in Golang

This example consists of the following Go code in a `main.go` file (with comments removed):

```go
package main

import (
 "context"
 "encoding/json"
 "log"
 "os"

 "chainguard.dev/sdk/auth"
 "chainguard.dev/sdk/auth/ggcr"
 "github.com/google/go-containerregistry/pkg/name"
 "github.com/google/go-containerregistry/pkg/v1/remote"
)

const (
 sub = "720909c9f5279097d847ad02a2f24ba8f59de36a/a033a6fabe0bfa0d"
)

func main() {
 ctx := context.Background()
 ts := auth.NewChainctlTokenSource(ctx)

 desc, err := remote.Get(name.MustParseReference("cgr.dev/chainguard/static"), remote.WithAuthFromKeychain(ggcr.Keychain(sub, ts)))
 if err != nil {
     log.Fatalf("error getting reference: %v", err)
 }
 enc := json.NewEncoder(os.Stdout)
 enc.SetIndent("", "  ")
 _ = enc.Encode(desc)
}
```

This example is similar to the previous one, but has the following differences:

* It creates a constant named `sub`. In this example, the `sub` constant's value is set to the UIDP of a Chainguard identity named `all-users` which can be assumed by any Chainguard user.
* It takes the token retrieved with the `chainctl` binary and exchanges it for the assumable identity to make a call to the Chainguard registry in order to retrieve some information about the supplied image. The example uses the `cgr.dev/chainguard/static` Free image.

To run this example, first, delete the previous example's `main.go` file if you haven't already. Then save the `exchange` example's `main.go` file to your local machine. Then run the following `go mod init` and `go mod tidy` commands:

```shell
go mod init github.com/chainguard-dev/sdk && go mod tidy
```

Following that, execute the program:

```shell
go run main.go
```

This will return output like the following:

```
{
  "mediaType": "application/vnd.oci.image.index.v1+json",
  "size": 925,
  "digest": "sha256:633aabd19a2d1b9d4ccc1f4b704eb5e9d34ce6ad231a4f5b7f7a3af1307fdba8",
  "Manifest": "eyJzY2hlbWFWZXJzaW9uIjoyLCJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLmluZGV4LnYxK2pzb24iLCJtYW5pZmVzdHMiOlt7Im1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UubWFuaWZlc3QudjEranNvbiIsInNpemUiOjgzOCwiZGlnZXN0Ijoic2hhMjU2OmJiMmRlMjU3MjFlMTE3Zjg4MDYwYjgyZGQ2YWQ1M2Y4ODdlZTgwOWU1MzE1Y2Y0MWEwMGNkOGExM2ZhMjMwNzciLCJwbGF0Zm9ybSI6eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsIm9zIjoibGludXgifX0seyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLCJzaXplIjo4MzgsImRpZ2VzdCI6InNoYTI1NjoxMmVjMWU3NDg0NmVhNDM1OTNkNmExMzMwZGEyOGVkNGQzNmRmNThhMTg2NGQwOTE1MjRlM2IwYTk5MDY4Y2QzIiwicGxhdGZvcm0iOnsiYXJjaGl0ZWN0dXJlIjoiYXJtNjQiLCJvcyI6ImxpbnV4In19XSwiYW5ub3RhdGlvbnMiOnsiZGV2LmNoYWluZ3VhcmQucGFja2FnZS5tYWluIjoiIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnMiOiJDaGFpbmd1YXJkIFRlYW0gaHR0cHM6Ly93d3cuY2hhaW5ndWFyZC5kZXYvIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLmNyZWF0ZWQiOiIyMDI1LTA1LTI4VDEzOjM1OjQ4WiIsIm9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5zb3VyY2UiOiJodHRwczovL2dpdGh1Yi5jb20vY2hhaW5ndWFyZC1pbWFnZXMvaW1hZ2VzL3RyZWUvbWFpbi9pbWFnZXMvc3RhdGljIiwib3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybCI6Imh0dHBzOi8vaW1hZ2VzLmNoYWluZ3VhcmQuZGV2L2RpcmVjdG9yeS9pbWFnZS9zdGF0aWMvb3ZlcnZpZXciLCJvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yIjoiQ2hhaW5ndWFyZCJ9fQ=="
}
```

As with the `chainctl` example, the `exchange` example returns the image's digest and the OCI manifest data. This proves that you've gotten a response back from the registry and that authentication worked as expected.

Again, this example doesn't really reflect a real-world use case. Users will generally access Free container repositories without authenticating, but this example is still useful for understanding how this can be done with the Chainguard SDK.

You can experiment with updating this example to authenticate by assuming an identity you created and retrieve the digest of a container image from your organization's private repository within the Chainguard registry.

To do so, you will need an appropriately-configured assumable identity. You can create an assumable identity with the [`chainctl iam identities create` command](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/).

### Example 2 using curl

First, login with chainctl using an OIDC token. Where the token comes from will differ by platform. Refer to our [Identity provider samples](/platform/administration/custom-idps/idp-providers/) for some examples.

```shell
chainctl auth login --identity "<identity-id>" --identity-token /var/run/chainguard/oidc/oidc-token
```

Then, retrieve an API token and use it to call the API:

```shell
curl -H "Authorization: Bearer $(chainctl auth token)" https://console-api.enforce.dev/iam/v1/groups | jq '.'
```

In our example, [we requested a list of groups the account belongs to](https://edu.chainguard.dev/chainguard/api/spec/#tag/groups/GET/iam/v1/groups). Then we piped the API response, which is in JSON, into `jq` to make it more easily readable by humans for our documentation sample. This will return output like the following, which has been edited for length:

```response
{
  "items": [
    {
      "id": "<removed>",
      "name": "chainguard.edu",
      "description": "Developer Enablement images catalog",
      "resourceLimits": {
        "clusters": 0,
        "idps": 0,
        "repositories": 0
      },
      "verified": true
    },
    {
      "id": "<removed>",
      "name": "chainguard",
      "description": "    This group holds the public Chainguard Images hosted under\n    cgr.dev/chainguard\n",
      "resourceLimits": {},
      "verified": true
    }
  ]
}
```

Using environment variables is helpful when working with assumable identities through the API and API tokens. Here's a high-level example of what you might do. Refer to your identity provider's documentation and [Assumable identities](/platform/administration/assumable-ids/assumable-ids/) to learn more.

Here are some sample environment variables:

```shell
# This is the UIDP of the assumable identity (refer to documentation)
IDENTITY="<identity-id>"

# Retrieve the OIDC token for your workload. How this is done will differ by platform.
IDENTITY_TOKEN=$(cat /var/run/chainguard/oidc/oidc-token)

# Exchange the OIDC token for a Chainguard API token. The token will be valid for an hour.
API_TOKEN=$(curl -sSf \
  -H "Authorization: Bearer $IDENTITY_TOKEN" \
   "https://issuer.enforce.dev/sts/exchange?aud=https://console-api.enforce.dev&identity=$IDENTITY" \
   | jq -r .token
)

# Use the API token
curl -H "Authorization: Bearer ${API_TOKEN}" https://console-api.enforce.dev/registry/v1/repos
```

Refer to the [Assumable identities documentation](/platform/administration/assumable-ids/assumable-ids/#using-the-chainguard-api) for another example of authentication using an assumed identity.

## Learn more

The Chainguard SDK is a powerful tool for interacting with the Chainguard platform. As mentioned previously, the examples covered in this guide don't represent a practical real-world application, but they are useful for understanding how the Chainguard SDK works and can be used to authenticate to the Chainguard platform.

To learn more, you may be interested in the following resources:

* [Overview of assumable identities in Chainguard](/platform/administration/assumable-ids/assumable-ids/)
* [Authenticate to Chainguard's registry](/chainguard/chainguard-registry/authenticating/)
* [Chainguard OpenAPI specification](/platform/api/spec/)

---

### Assumable identities
_Path: platform/administration/assumable-ids/_index.md_

Documentation and resources on Chainguard's Assumable Identities.

---

### Overview of assumable identities in Chainguard
_Path: platform/administration/assumable-ids/assumable-ids.md_

Both [`chainctl`](/platform/chainctl/) and the [Chainguard Console](https://console.chainguard.dev/) are useful tools for interacting with Chainguard. However, there may be times that you want to hand off certain administrative tasks to an automation system, like Buildkite or GitHub Actions.

In such cases, you can create a Chainguard identity for these systems to assume, allowing them to perform certain tasks within a specific scope. You can restrict access to an identity so that only workflows that present tokens matching a specific issuer and subject can assume it. Likewise, assumable identities can be tied to certain roles — like `viewer`, `owner`, or `editor` — letting you place strict limits on what a given identity is allowed to do.

This guide provides a general overview of assumable identities in Chainguard, outlining how they work and how to create them.

## About assumable identities

Chainguard's *assumable identities* are identities that can be assumed by workflows in order to complete tasks without manual authorization. In many ways, these are similar to AWS roles or Google Service accounts, as Chainguard identities allow you to delegate access to your Chainguard resources to external applications or services.

Chainguard originally only supported what are referred to as *literal identities*. These are identities that consist of a unique mapping of verified issuer and subject to refer to an individual user. Literal identities can work well for self-service enrollment in some cases. However, they start to run into problems in several scenarios, such as with systems that use variable `subject` claims (like Buildkite, which injects commit SHAs) or automation systems (like continuous integration systems), which can be difficult to register to literal identities on their first use.

Assumable identities essentially reverse the lookup process of literal identities. Instead of Chainguard analyzing at a token's issuer and subject to determine their literal identity, the client presents an assumable identity's UIDP (unique identifier path). Chainguard then checks this UIDP against the client's token. If the token's issuer and subject match those required by the identity, then the client may assume the identity.

This enables you to create identities that can only be assumed by specific automated workflows, providing greater security for your build and deployment processes. We have a number of examples of how to create assumable identities for specific providers.

* [GitHub](/platform/administration/assumable-ids/identity-examples/github-identity/)
* [GitLab](/platform/administration/assumable-ids/identity-examples/gitlab-identity/)
* [AWS](/platform/administration/assumable-ids/identity-examples/aws-identity-oidc/)
* [AWS (legacy)](/platform/administration/assumable-ids/identity-examples/aws-identity/)
* [Jenkins with Terraform](/platform/administration/assumable-ids/identity-examples/jenkins-terraform/) or [Jenkins with chainctl](/platform/administration/assumable-ids/identity-examples/jenkins-chainctl/)
* [Buildkite](/platform/administration/assumable-ids/identity-examples/buildkite-identity/)
* [Bitbucket](/platform/administration/assumable-ids/identity-examples/bitbucket-identity/)

A notable difference between registered users and identities in Chainguard's IAM model is that identities are tied to a specific [IAM organization](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/). When you create an identity, you must specify a Chainguard organization under which the identity will be created.

However, an identity won't automatically have access to the other resources associated with that organization. In order for an identity to be able to interact with a organization's resources — including the containers, repositories, and users associated with the organization — it must be granted the permissions it needs to do so. To do this, you must also tie the identity to a role. Chainguard comes with a few built-in roles, including `viewer`, `editor`, and `owner`. You can also create custom role-bindings with `chainctl`. Check out the [`chainctl iam role-bindings` documentation](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/) for more details.

Now that you have a better understanding of what assumable identities are, let's go over how you can set up an assumable identity. There are currently two main ways you can create an identity: with Terraform and with `chainctl`. Let's first go over how to set up an identity with Terraform.

## Terraform

To set up an assumable identity with Terraform, you will need to add a few specific blocks to your Terraform configuration. The following example `resource` block is the most important of these, as it is what creates the assumable identity.

```hcl
resource "chainguard_identity" "<id-ref>" {
  parent_id   = <chainguard organization ID>
  name     = "<identity name>"
  description = <<EOF
    This is an example description for an identity.
  EOF

  claim_match {
    issuer  = "https://some.issuer.uri.com"
    subject = "example-subject"
  }
}
```

Here, `parent_id` defines the Chainguard organization that the identity will be tied to. This could be a literal value — like a Chainguard organization identification number — or a [local value](https://developer.hashicorp.com/terraform/language/values/locals) that references an existing organization. You can enter whatever you'd like for the `name`, though it helps to provide a descriptive name for your identities. The `description` field is optional, but it can be helpful to include to clarify the identity's purpose.

The `claim_match` block within this section is what specifies the users and workloads allowed to assume the identity. You must specify an issuer and subject in the claim match block, but you can optionally specify an `audience` here as well.

This example provides literal values for both the `issuer` and `subject` fields. This means that any workload or individual attempting to use this identity must have a signature whose issuer and subject match those within the `claim_match` block exactly. You can instead use the `issuer_pattern`, `subject_pattern`, or `audience_pattern` fields to pass regular expression patterns which clients must match in order to assume the identity.

```hcl
  claim_match {
 issuer_pattern = ".*"
 subject_pattern = ".*"
 audience_pattern = ".*"
  }
```

This gives you some more flexibility with defining who has access to the identity. Note that this example `claim_match` block would match any signature, meaning it would be so permissive as to be insecure.

Another block to include in your Terraform configuration is an `output` block that outputs the UIDP of the identity you're trying to assume. This is a unique value that you can use to let Chainguard know that you want to assume the role.

```hcl
output "<id-ref>-identity" {
  value = chainguard_identity.<id-ref>.id
}
```

The last two blocks you should include in a Terraform configuration are what apply a role-binding to the new identity. First, you need to include a `data` section to look up the role. In this example it looks up Chainguard's built-in `viewer` role.

```hcl
data "chainguard_roles" "viewer" {
  name = "viewer"
}
```

Then you need to include another `resource` block to create the role-binding using the determined role. The identity will have the permissions of that role over the organization specified within this block.

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.<id-ref>.id
  group    = chainguard_group.user-group.id
  role     = data.chainguard_roles.viewer.items[0].id
}
```

This means that the identity this Terraform configuration will create will only be able to view the resources tied to the same organization the identity is tied to.

Applying this configuration will create the assumable identity. You can follow any of our [identity examples](/platform/administration/assumable-ids/identity-examples/) to create an assumable identity that can be used by a continuous integration workflow to interact with Chainguard. The Terraform files used in the linked tutorials are based closely on the template outlined here.

## Managing identities with `chainctl`

You can also set up an assumed identity using the `chainctl` command-line tool. Specifically, you can run the `chainctl iam identities create` subcommand, which uses the following syntax:

```sh
chainctl iam identities create <identity-name> \
    --identity-issuer=<issuer of the identity> \
    --issuer-keys=<keys for the issuer> \
    --subject=<subject of the identity> \
    --group=<organization name> \
    --role=<role>
```

As with Terraform, you must provide `chainctl` with certain information about the identity you want to create, including the issuer and subject of the identity, the role-bindings associated with the identity (if any), and the organization under which the identity should be created.

Be aware that you can use regular expressions to create an identity that matches claims using a pattern. The following example passes pattern expressions to the `--identity-issuer-pattern` and `--subject-pattern` flags:

```shell
chainctl iam identities create <identity-name> \
    --identity-issuer-pattern="https://*.mycompany\.com" \
    --subject-pattern="^\d{4}$"
```

You can use the following `chainctl` flags to match claims to patterns:

* `--audience-pattern`: A pattern to match the audience of the identity.
* `--claim-pattern`: A comma-separated list of `claim:pattern` pairs of custom claims to match the identity.
* `--identity-issuer-pattern`: A pattern to match the issuer of the identity.
* `--subject-pattern`: A pattern to match the subject of the identity.

You can change an existing identity with the `update` command. The following example would update the identity's issuer.

```sh
chainctl iam identities update <identity-name> --identity-issuer=https://new-issuer.mycompany.com
```

To delete an identity, use the `delete` subcommand.

```sh
chainctl iam identities delete <identity-name>
```

For more detailed information on managing identities with `chainctl`, we encourage you to check out the [`chainctl` reference documentation](/platform/chainctl/chainctl-docs/chainctl_iam_identities/).

## Assuming an identity

Whether you create an identity with `chainctl` or with Terraform, Chainguard will generate a UIDP (unique identifier path) tied to the identity. You can retrieve a list of all the identities you've created — along with their UIDPs — with the following command.

```sh
chainctl iam identities ls -o table
```

```output
                             ID                             |      NAME      |    TYPE     | DESCRIPTION |         ROLES         |                   ISSUER                    | EXPIRES
------------------------------------------------------------+----------------+-------------+-------------+-----------------------+---------------------------------------------+----------
  c95870ebffa72a258df087ea727ee92daf177e29/f067a9080d45a098 | sampleidentity | claim_match |             | example-group: viewer | https://token.actions.githubusercontent.com | n/a
```

If a workflow is authorized to assume the identity — meaning that its token matches the `issuer` and `subject` specified for the identity — then it only needs to present this identification number and the token in order to assume it.

There are a few different ways to do this.

### Using `chainctl`

On some platforms, such as
[GitHub](/platform/administration/assumable-ids/identity-examples/github-identity/)
or Google Cloud Platform, `chainctl` is able to detect your credentials
transparently. This means you only need to provide the identity's UIDP to log in, as in this example:

```sh
chainctl auth login --identity <identity-id>
```

Otherwise, you will need to provide the OIDC token explicitly. This can
either be the raw token value or a path to the token on disk:

```sh
chainctl auth login --identity <identity-id> --identity-token <identity-token>
```

Once you're logged in, you will be able to perform the operations that the
identity has permissions for. For instance, listing repositories.

```sh
chainctl image repo list
```

Alternatively, you can use `chainctl auth token` to retrieve a bearer token that you can
use directly with the Chainguard API:

```sh
curl -sSf \
    -H "Authorization: Bearer $(chainctl auth token)" \
    https://console-api.enforce.dev/registry/v1/repos \
    | jq -r .items[].name
```

### Using the Chainguard API

If you want to interact with the API directly without using `chainctl`,
you can exchange your platform's OIDC token for a Chainguard API token
like in the following example. Be sure to substitute `<identity-id>` and `<identity-token>` with the
identity's UIDP and the OIDC token, respectively:

```sh
curl -sSf \
    -H "Authorization: Bearer <identity-token>" \
    "https://issuer.enforce.dev/sts/exchange?aud=https://console-api.enforce.dev&identity=<identity-id>" \
    | jq -r .token
```

This will return a token for the Chainguard API that you can use for subsequent
requests to the API. For instance, listing repositories:

```sh
curl -sSf \
    -H "Authorization: Bearer <api-token>" \
    https://console-api.enforce.dev/registry/v1/repos \
    | jq -r .items[].name
```

The API token issued by `/sts/exchange` will be valid for up to an hour. You
will need to fetch a new token after it has expired.

## Learn more

As mentioned previously, we've published a few tutorials that outline how you can [set up an identity for a CI/CD workflow to assume](/platform/administration/assumable-ids/identity-examples/). We strongly encourage you to follow these guides to better understand how assumable identities work in Chainguard.

---

### Create an assumable identity for a Bitbucket pipeline
_Path: platform/administration/assumable-ids/identity-examples/bitbucket-identity.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/) are identities that can be assumed by external applications or workflows in order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines how to create an identity using Terraform, and then how to update a Bitbucket pipeline so that it can assume the identity and interact with Chainguard resources.

## Prerequisites

To complete this guide, you will need the following.

* `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
* A Bitbucket pipeline you can use to test out the identity you'll create. We recommend following Bitbucket's [Getting Started guide](https://support.atlassian.com/bitbucket-cloud/docs/get-started-with-bitbucket-pipelines/) to set this up. If you need to enable pipelines for your repository, visit Bitbucket's [Configure your first pipeline](https://support.atlassian.com/bitbucket-cloud/docs/configure-your-first-pipeline/) page to get started.

## Creating Terraform files

We will be using Terraform to create an identity for a Bitbucket pipeline to assume. This step outlines how to create three Terraform configuration files that, together, will produce such an identity.

To help explain each configuration file's purpose, we will go over what they do and how to create each file one by one. First, though, create a directory to hold the Terraform configuration and navigate into it.

```sh
mkdir ~/bitbucket-id && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

### `main.tf`

The first file, which we will call `main.tf`, will serve as the scaffolding for our Terraform infrastructure.

The file will consist of the following content.

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
```

This is a fairly barebones Terraform configuration file, but we will define the rest of the resources in the other two files. In `main.tf`, we declare and initialize the Chainguard Terraform provider.

Next, you can create the `sample.tf` file.

### `sample.tf`

`sample.tf` will create a couple of structures that will help us test out the identity with a Bitbucket a workflow.

This Terraform configuration consists of two main parts. The first part of the file will contain the following lines.

```hcl
data "chainguard_group" "group" {
  name = "my-customer.biz"
}
```

This section looks up a Chainguard IAM organization named `my-customer.biz`. This will contain the identity — which will be created by the `bitbucket.tf` file — to access when we test it out later on.

Now you can move on to creating the rest of our Terraform configuration files, `bitbucket.tf`.

### `bitbucket.tf`

The `bitbucket.tf` file is what will actually create the identity for your Bitbucket workflow to assume. The file will consist of four sections, which we'll go over one by one.

The first section creates the identity itself.

```hcl
resource "chainguard_identity" "bitbucket" {
  parent_id   = data.chainguard_group.group.id
  name        = "bitbucket"
  description = <<EOF
    This is an identity that authorizes Bitbucket workflows
    for this repository to assume to interact with chainctl.
  EOF

    claim_match {
    audience        = "ari:cloud:bitbucket::workspace/%workspace-uuid%"
    issuer          = "https://api.bitbucket.org/2.0/workspaces/%workspace-name%/pipelines-config/identity/oidc"
    subject_pattern = "{%repository-uuid%}:.+"
  }
}
```

First, this section creates a Chainguard Identity tied to the `chainguard_group` looked up in the `sample.tf` file. The identity is named `bitbucket` and has a brief description.

The most important part of this section is the `claim_match`. When the Bitbucket pipeline tries to assume this identity later on, it must present a token matching the `audience`, `issuer` and `subject` specified here in order to do so. The `audience` is the intended recipient of the issued token, while the `issuer` is the entity that creates the token.

Finally, the `subject_pattern` is the entity (here, the Bitbucket pipeline build) that the token represents. Note that the curly braces around the `%repository-uuid%` variable are part of the generated OIDC token from Bitbucket, so be sure to include both opening `{` and closing `}` characters around your repository UUID.

In this case, the `issuer` field points to `https://api.bitbucket.org/2.0/workspaces/%workspace-name%/pipelines-config/identity/oidc`, the issuer of JWT tokens for Bitbucket pipelines.

Instead of pointing to a literal value with a `subject` field, though, this file points to a regular expression using the `subject_pattern` field. When you run a Bitbucket pipeline, it generates a unique identifier for each pipeline `- step` and appends that to the `subject_pattern` field. Since the identifier is not known ahead of time, passing the regular expression `.+` allows you to specify a subject regex that will work for every build from this pipeline.

Refer to your Bitbucket repository OIDC settings page for reference values. To find the page, browse to your **Repository settings** page, and then find the **OpenID Connect** section in the left menu. For the purposes of this guide, you will need to replace `%workspace-name%`, `%workspace-uuid%`, and `%repository-uuid%` with the values from your Bitbucket OIDC settings page.

The next section will output the new identity's `id` value. This is a unique value that represents the identity itself.

```hcl
output "bitbucket-identity" {
  value = chainguard_identity.bitbucket.id
}
```

The section after that looks up the `viewer` role.

```hcl
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final section grants this role to the identity.

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.bitbucket.id
  group    = data.chainguard_group.group.id
  role     = data.chainguard_role.viewer.items[0].id
}
```

Run the following command to create this file with each of these sections. Be sure to change the `subject_pattern` value to align with your own Bitbucket pipeline OIDC variables. For example, if your repository UUID were `C668DE74-6D94-4924-90B1-8B9AB7EE9089`, you would set the `subject_pattern` value to `"{C668DE74-6D94-4924-90B1-8B9AB7EE9089}:.+"`, ensuring that the curly braces are included.

Following that, your Terraform configuration will be ready. Now you can run a few `terraform` commands to create the resources defined in your `.tf` files.

## Creating your resources

First, run `terraform init` to initialize Terraform's working directory.

```sh
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section.

```sh
terraform plan
```

If the plan worked successfully and you're satisfied that it will produce the resources you expect, you can apply it.

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```
. . .

Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + bitbucket-identity = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After pressing `ENTER`, the command will complete and will output an `bitbucket-identity` value. Note that you may receive a `PermissionDenied` error part way through the apply step. If so, run `chainctl auth login` once more, and then `terraform apply` again to resume creating the identity and resources.

```
. . .

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Outputs:

bitbucket-identity = "%bitbucket-identity%"
```

This is the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers), which you configured the `bitbucket.tf` file to emit in the previous section. Note this value down, as you'll need it when you test this identity using a Bitbucket workflow. If you need to retrieve this UIDP later on, though, you can always run the following `chainctl` command to obtain a list of the UIDPs of all your existing identities.

```sh
chainctl iam identities ls
```

You're now ready to edit a Bitbucket pipeline in order to test out this identity.

## Testing the identity with a Bitbucket pipeline

To test the identity you created with Terraform in the previous section, ensure you have Pipelines enabled for your repository and then create a `bitbucket-pipelines.yml` file in the root of your repository. Note that if you already have a pipeline with steps defined then you only need to add the `oidc: true` field to your pipeline to enable OIDC for the step in question.

Copy the following pipeline definition into your `bitbucket-pipelines.yml` file and commit it to the repository.

```bitbucket-pipelines.yml
image: atlassian/default-image:3

pipelines:
  default:
    - step:
        oidc: true
        max-time: 5
        script:
          - curl -o chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m)"
          - chmod +x chainctl

          # Assume the bitbucket pipeline identity
          - ./chainctl auth login --identity-token $BITBUCKET_STEP_OIDC_TOKEN --identity %bitbucket-identity%
          - ./chainctl auth configure-docker --identity-token $BITBUCKET_STEP_OIDC_TOKEN --identity %bitbucket-identity%
```

The important line is the `oidc: true` option, which enables OIDC for the individual step in the pipeline. This configuration is why the `subject_pattern` with a regular expression is used in the Terraform configuration, since each step gets its own UUID identifier, which is added to the `sub` field in the generated OIDC token. Since the step UUID is known known before the build, the subject match needs to use a regular expression.

Now you can add the commands for testing the identity like `chainctl images repos list` in the following example:

```bitbucket-pipelines.yml
...
          # Assume the bitbucket pipeline identity
          - ./chainctl auth login --identity-token $BITBUCKET_STEP_OIDC_TOKEN --identity %bitbucket-identity%
          - ./chainctl images repos list
          - docker pull cgr.dev/<organization>/<repo>:<tag>
```

Once you commit the `bitbucket-pipelines.yml` file the pipeline will run.

Assuming everything works as expected, your pipeline will be able to assume the identity and run the `chainctl images repos list` command, listing repos available to the organization.

```
. . .
chainctl         100%[===================>]  54.34M  6.78MB/s in 13s

2023-05-17 13:19:45 (4.28 MB/s) - ‘chainctl’ saved [56983552/56983552]

Successfully exchanged token.
Valid! Id: 3f4ad8a9d5e63be71d631a359ba0a91dcade94ab/d3ed9c70b538a796
```

If you'd like to experiment further with this identity and what the pipeline can do with it, there are a few parts of this setup that you can tweak. For instance, if you'd like to give this identity different permissions you can change the role data source to the role you would like to grant.

```
data "chainguard_roles" "editor" {
  name = "editor"
}
```

You can also edit the pipeline itself to change its behavior. For example, instead of listing the repos the identity has access to, you could have the workflow inspect the organizations.

```bitbucket-pipelines.yml
          - ./chainctl images repos list
```

Of course, the Bitbucket pipeline will only be able to perform certain actions on certain resources, depending on what kind of access you grant it.

## Removing sample resources

To remove the resources Terraform created, you can run the `terraform destroy` command.

```sh
terraform destroy
```

This will destroy the role-binding, and the identity created in this guide. It will not delete the organization.

You can then remove the working directory to clean up your system.

```sh
rm -r ~/bitbucket-id/
```

Following that, all of the example resources created in this guide will be removed from your system.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on this Terraform configuration for a production environment. Likewise, for more information on using Bitbucket pipelines, we encourage you to check out the [official project documentation](https://support.atlassian.com/bitbucket-cloud/docs/get-started-with-bitbucket-pipelines/), particularly their [documentation on OIDC](https://support.atlassian.com/bitbucket-cloud/docs/integrate-pipelines-with-resource-servers-using-oidc/).

---

### Create an assumable identity to authenticate from Azure
_Path: platform/administration/assumable-ids/identity-examples/azure-identity.md_

> **Note:** If you're authenticating from a workload running in Azure
> Kubernetes Service (AKS), refer to the
> [Kubernetes identity guide](/chainguard/administration/assumable-ids/identity-examples/kubernetes-identity/)
> instead.

Chainguard's [_assumable identities_](/chainguard/administration/assumable-ids/assumable-ids/)
are identities that can be assumed by external applications or workflows in
order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines how to create an identity that can be assumed
by an Azure workload — such as a VM, Container App, or Function — using an
[Azure managed identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview)
and then used to interact with the Chainguard API.

## Prerequisites

To complete this guide, you will need the following.

- `chainctl` — the Chainguard command line interface tool — installed on your
  local machine. Follow our guide on
  [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/)
  to set this up.
- The [Azure CLI (`az`)](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli),
  authenticated with `az login`.
- An Azure subscription, and permission to register applications in your Entra
  ID tenant. App registration is enabled for all users in most tenants. If
  it's disabled in yours, ask an administrator to pre-register the
  application and share its client ID with you.
- To follow the Terraform example, [`terraform`](https://developer.hashicorp.com/terraform/install)
  installed locally.

## Find your tenant ID

Each Entra ID tenant has its own OIDC issuer URL, which has the following
format:

```
https://login.microsoftonline.com/<tenant-id>/v2.0
```

Retrieve the tenant ID of your current Azure session with:

```shell
az account show --query tenantId --output tsv
```

## Create the Entra ID application

Register an Entra ID application to serve as the audience for tokens issued
to managed identities in your tenant. We'll grant it no API permissions and
expose no scopes — its only purpose is to provide a unique, tenant-specific
`aud` claim that Chainguard's STS can match on.

```shell
az ad app create \
  --display-name chainguard-audience \
  --sign-in-audience AzureADMyOrg
```

Note down the `appId` from the output — this is the client ID we'll use as the
token audience. Substitute it for `<client-id>` in the following commands.

Configure the application to issue v2.0 access tokens and to register
`api://<client-id>` as an identifier URI, so that Entra ID will resolve it as
a valid scope when requesting tokens.

```shell
az ad app update \
  --id <client-id> \
  --requested-access-token-version 2 \
  --identifier-uris "api://<client-id>"
```

Then create a service principal for the application. Entra ID requires this
in order to recognise the application as a valid token resource when a
managed identity requests a token for it.

```shell
az ad sp create --id <client-id>
```

## Create the managed identity

If you don't already have a
[user-assigned managed identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities)
to bind the Chainguard identity to, create one now. Substitute
`<resource-group>` and `<location>` (e.g. `eastus`) for your own values.

```shell
az identity create \
  --name chainguard-identity \
  --resource-group <resource-group> \
  --location <location>
```

Note down the `principalId` from the output — we'll use this as the subject of
the Chainguard identity in the next step. Note the `clientId` too, as the
workload will need it later to request a token.

## Create the assumable identity

This guide outlines two methods for creating the Chainguard identity: one
using `chainctl` over a command-line interface, and another using Terraform.

### CLI

Run this `chainctl` command to create the identity and bind it to the
`registry.pull` role. Substitute `<tenant-id>` with the tenant ID you
retrieved earlier, `<principal-id>` with the managed identity's principal ID,
and `<client-id>` with the application's client ID.

```shell
chainctl iam id create azure-identity \
  --identity-issuer="https://login.microsoftonline.com/<tenant-id>/v2.0" \
  --subject="<principal-id>" \
  --audience="<client-id>" \
  --role=registry.pull
```

This will return the [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers)
of the identity, which we'll use when assuming it in the next section.

If you need to retrieve the UIDP later, list the identity with this command:

```shell
chainctl iam identities list --name=azure-identity
```

### Terraform

You can also create the application registration, managed identity, and
Chainguard identity together with the
[Chainguard Terraform provider](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest)
and the
[AzureRM](https://registry.terraform.io/providers/hashicorp/azurerm/latest)
and
[AzureAD](https://registry.terraform.io/providers/hashicorp/azuread/latest)
providers.

Substitute `<org-name>` with your Chainguard organization name,
`<resource-group>` with your Azure resource group, and `<location>` with the
Azure region you want to deploy into.

```hcl
terraform {
  required_providers {
    azurerm    = { source = "hashicorp/azurerm" }
    azuread    = { source = "hashicorp/azuread" }
    chainguard = { source = "chainguard-dev/chainguard" }
  }
}

provider "azurerm" {
  features {}
}

data "azurerm_client_config" "current" {}
data "azuread_client_config" "current" {}

# A permission-free Entra ID application registration. Its sole purpose is
# to provide a unique audience for tokens exchanged with Chainguard's STS.
resource "azuread_application" "chainguard_audience" {
  display_name = "chainguard-audience"
  owners       = [data.azuread_client_config.current.object_id]

  api {
    requested_access_token_version = 2
  }

  lifecycle {
    ignore_changes = [identifier_uris]
  }
}

# A service principal — required for Entra ID to recognise the application
# as a valid token audience when a managed identity requests a token.
resource "azuread_service_principal" "chainguard_audience" {
  client_id = azuread_application.chainguard_audience.client_id
  owners    = [data.azuread_client_config.current.object_id]
}

# Register api://<client-id> as the identifier URI so Entra ID resolves
# it as a valid resource for token requests.
resource "azuread_application_identifier_uri" "chainguard_audience" {
  application_id = azuread_application.chainguard_audience.id
  identifier_uri = "api://${azuread_application.chainguard_audience.client_id}"
}

# A user-assigned managed identity that will assume the Chainguard identity.
# Attach this to any Azure workload that supports managed identities
# (VMs, Container Apps, Functions, etc).
resource "azurerm_user_assigned_identity" "chainguard" {
  name                = "chainguard-identity"
  resource_group_name = "<resource-group>"
  location            = "<location>"
}

data "chainguard_group" "org" {
  name = "<org-name>"
}

resource "chainguard_identity" "azure" {
  parent_id   = data.chainguard_group.org.id
  name        = "azure-identity"
  description = "Assumed by Azure workloads via the chainguard-identity managed identity."

  claim_match {
    issuer   = "https://login.microsoftonline.com/${data.azurerm_client_config.current.tenant_id}/v2.0"
    subject  = azurerm_user_assigned_identity.chainguard.principal_id
    audience = azuread_application.chainguard_audience.client_id
  }
}

data "chainguard_role" "registry_pull" {
  name = "registry.pull"
}

resource "chainguard_rolebinding" "registry_pull" {
  identity = chainguard_identity.azure.id
  role     = data.chainguard_role.registry_pull.items[0].id
  group    = data.chainguard_group.org.id
}

output "chainguard_identity_id" {
  value = chainguard_identity.azure.id
}

output "token_audience" {
  value = "api://${azuread_application.chainguard_audience.client_id}"
}

output "managed_identity_client_id" {
  value = azurerm_user_assigned_identity.chainguard.client_id
}
```

The `chainguard_identity_id` output provides the identity's UIDP. The
`token_audience` and `managed_identity_client_id` outputs provide the values
your workload will need to request a managed identity token and exchange it
with Chainguard.

For a full end-to-end example of using this pattern from an Azure Container
App, see the
[`image-copy-acr` example](https://github.com/chainguard-demo/platform-examples/tree/main/image-copy-acr)
in Chainguard's public `platform-examples` repository.

## Assume the identity

Attach the managed identity to the Azure workload you want to authenticate
from. For example, to attach it to an existing VM:

```shell
az vm identity assign \
  --name <vm-name> \
  --resource-group <resource-group> \
  --identities <managed-identity-resource-id>
```

From inside the workload, request a token from the
[Azure Instance Metadata Service (IMDS)](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)
for the audience you configured on the application. Substitute `<client-id>`
with the application's client ID, and `<managed-identity-client-id>` with the
`clientId` of the managed identity.

```shell
AZURE_TOKEN=$(curl -sSf \
  -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=api://<client-id>&client_id=<managed-identity-client-id>" \
  | jq -r .access_token)
```

The following sections outline two methods for using the Azure token to
interact with Chainguard: one using `chainctl`, and another by exchanging
the token directly with the Chainguard STS over the API.

### CLI

Use the Azure token to log in with `chainctl`. Substitute `<identity-id>`
with the UIDP of the Chainguard identity created earlier.

```shell
chainctl auth login \
  --identity <identity-id> \
  --identity-token "${AZURE_TOKEN}"
```

Now you can issue `chainctl` commands under this assumed identity. For
instance, you could list the container image repositories available to your
organization:

```shell
chainctl image repo list
```

To pull images from the Chainguard registry with Docker, configure a
credential helper with `chainctl`. Provide the same identity and token:

```shell
chainctl auth configure-docker \
  --identity <identity-id> \
  --identity-token "${AZURE_TOKEN}"
```

You can now pull images with `docker`. Substitute `<org-name>` with your
Chainguard organization name and `<image>` with an image available to your
organization.

```shell
docker pull cgr.dev/<org-name>/<image>:latest
```

### API

If `chainctl` isn't installed in the workload, you can exchange the Azure
token for a Chainguard API token directly. Substitute `<identity-id>` with
the UIDP of the Chainguard identity created earlier.

```shell
API_TOKEN=$(curl -sSf \
  -H "Authorization: Bearer ${AZURE_TOKEN}" \
  "https://issuer.enforce.dev/sts/exchange?aud=https://console-api.enforce.dev&identity=<identity-id>" \
  | jq -r .token)
```

Use the API token to interact with the Chainguard API. For instance, to list
the container image repositories available to your organization:

```shell
curl -sSf -H "Authorization: Bearer ${API_TOKEN}" \
  https://console-api.enforce.dev/registry/v1/repos | jq -r .items[].name
```

If you're authenticating from Go, the
[Chainguard SDK](https://pkg.go.dev/chainguard.dev/sdk) and the
[Azure SDK for Go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go) can
do the token exchange for you. The
[`image-copy-acr` example](https://github.com/chainguard-demo/platform-examples/tree/main/image-copy-acr)
demonstrates this pattern.

## Clean up

Delete the Chainguard identity.

```shell
chainctl iam id delete <identity-id>
```

Delete the managed identity.

```shell
az identity delete \
  --name chainguard-identity \
  --resource-group <resource-group>
```

Delete the Entra ID application registration. This will also remove the
associated service principal.

```shell
az ad app delete --id <client-id>
```

## Learn more

For more information about how assumable identities work in Chainguard, check
out our [conceptual overview of assumable identities](/chainguard/administration/assumable-ids/assumable-ids/).

---

### Identity examples
_Path: platform/administration/assumable-ids/identity-examples/_index.md_

Procedural tutorials outlining how to create and assume a Chainguard identity for various Continuous Integration systems.

---

### Create an assumable identity for a GitLab CI/CD pipeline
_Path: platform/administration/assumable-ids/identity-examples/gitlab-identity.md_

Chainguard's [*assumable identities*](/chainguard/administration/assumable-ids/assumable-ids/) are identities that can be assumed by external applications or workflows in order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines two methods for how to create a Chainguard identity: `chainctl` and Terraform. It then walks through how to create a GitLab CI/CD pipeline that will assume the identity to interact with Chainguard resources.

## Prerequisites

To complete this guide, you will need the following.

Both methods outlined in this guide require you to have the following:

* Access to a GitLab project and CI/CD pipeline you can use to test out the identity you'll create. GitLab provides a [quickstart tutorial on creating your first pipeline](https://docs.gitlab.com/ee/ci/quick_start/) which can be useful for getting a testing pipeline up and running.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.

Additionally, the Terraform method requires you to have `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.

## Create an assumable identity with `chainctl`

You can create a new Chainguard identity that a GitLab CI/CD pipeline can assume by running the following command.

Be sure to replace `<group_name>` and `<project_name>` with your actual GitLab group and project names. If you have access to more than one Chainguard organization, add `--parent=<organization>` to choose where the identity is created.

For example, if your GitLab project URL is `https://gitlab.com/mycompany/myproject`, then:

* `<group_name>` should be `mycompany`
* `<project_name>` should be `myproject`

```shell
chainctl iam identities create cg-gitlab-id \
  --identity-issuer="https://gitlab.com" \
  --subject="project_path:<group_name>/<project_name>:ref_type:branch:ref:main" \
  --audience="https://gitlab.com" \
  --role=viewer
```

Take note of the identity's full UIDP (unique identity path) as you'll need it to test this identity out in a [GitLab CI/CD configuration](/chainguard/administration/assumable-ids/identity-examples/gitlab-identity/#testing-the-identity-with-a-gitlab-cicd-pipeline).

This command creates an identity named `cg-gitlab-id` with the following claim matching rules:

* Issuer: `https://gitlab.com` (GitLab's OIDC token issuer)
* Subject: Restricts access to a specific GitLab project running on the main branch
* Audience: `https://gitlab.com` (the intended recipient of the token)

These options' values are string literals; you can use `--identity-issuer-pattern`, `--subject-pattern`, and `--audience-pattern` to use regular expressions instead.

This command also binds the `viewer` role to the new identity. The `viewer` role provides read-only access to Chainguard resources, which is appropriate for most CI/CD use cases that need to pull images or inspect resources. You can also chain together multiple roles, as in `--role=registry.push,registry.pull`.

To see all available roles and their permissions, run `chainctl iam roles list`. You can also learn more by reviewing our [Overview of roles and role-bindings in Chainguard](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/).

If you ever need to retrieve information about it in the future, you can run the following command:

```shell
chainctl iam identities ls
```

This will return `cg-gitlab-id` listed among all your Chainguard identities.

### Self-managed GitLab instances

The previous example works for GitLab SaaS (`gitlab.com`) and for self-managed instances whose OIDC issuer is reachable from the public internet. To validate a pipeline's token, Chainguard's Security Token Service (STS) fetches the signing keys from the issuer's JWKS endpoint (`https://<your-gitlab-instance>/oauth/discovery/keys`). If your instance isn't reachable from the public internet, this fetch fails and the pipeline can't assume the identity.

For a private instance, pin the signing keys when you create the identity by passing them to `--issuer-keys`. Export the JWKS from a host that can reach your instance and provide it inline:

```shell
chainctl iam identities create cg-gitlab-id \
  --identity-issuer="https://<your-gitlab-instance>" \
  --issuer-keys="$(curl -s https://<your-gitlab-instance>/oauth/discovery/keys)" \
  --subject="project_path:<group_name>/<project_name>:ref_type:branch:ref:main" \
  --audience="https://<your-gitlab-instance>" \
  --role=viewer
```

Set `--identity-issuer` and `--audience` to your instance's URL instead of `https://gitlab.com`.

Because the keys are pinned rather than fetched on demand, the identity doesn't pick up key rotations automatically. GitLab rotates its signing keys, so `chainctl` creates a static identity that expires after a set period, 30 days by default. Recreate the identity with the current JWKS before it expires or whenever the keys rotate.

> **Note**: You don't need to register your self-managed GitLab as a [custom identity provider](/platform/administration/custom-idps/custom-idps/) to assume an identity from a pipeline. Custom identity providers federate human sign-in to Chainguard, whereas a pipeline assumes an identity through the OIDC token exchange described above. Registering a private instance as an identity provider won't work in any case, because Chainguard can't reach its issuer to validate it — the same reachability limit that requires you to pin the keys with `--issuer-keys`.

## Create an assumable identity with Terraform

This section outlines how to use Terraform to create an identity for a GitLab pipeline to assume. This involves creating two Terraform configuration files that, together, will produce such an identity.

To help explain each configuration file's purpose, we will go over what they do and how to create each file one by one. First, though, create a directory to hold the Terraform configuration and navigate into it.

```shell
mkdir ~/gitlab-tf && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

### `main.tf`

The first file, which we will call `main.tf`, will serve as the scaffolding for our Terraform infrastructure.

The file will consist of the following content.

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
```

This is a fairly barebones Terraform configuration file, but we will define the rest of the resources in the other two files. In `main.tf`, we declare and initialize the Chainguard Terraform provider.

### `gitlab.tf`

The `gitlab.tf` file is what will actually create the identity for your GitLab CI pipeline workflow to assume. The file will consist of five sections, which we'll go over one by one.

The first section section looks up a Chainguard IAM organization named `myorg.biz`:

```hcl
data "chainguard_group" "group" {
  name     = "myorg.biz"
}
```

Be sure to change `myorg.biz` to the name of your own Chainguard organization.

The next section creates the identity itself.

```hcl
resource "chainguard_identity" "gitlab" {
  parent_id   = data.chainguard_group.group.id
  name     = "gitlab-ci"
  description = <<EOF
 This is an identity that authorizes Gitlab CI in this
 repository to assume to interact with chainctl.
  EOF

  claim_match {
    issuer   = "https://gitlab.com"
    subject  = "project_path:<group_name>/<project_name>:ref_type:branch:ref:main"
    audience = "https://gitlab.com"
  }
}
```

First this section creates a Chainguard Identity tied to the `chainguard_group` looked up in the `sample.tf` file. The identity is named `gitlab-ci` and has a brief description.

The most important part of this section is the `claim_match`. When the GitLab pipeline tries to assume this identity later on, it must present a token matching the `issuer`, `subject`, and `audience` specified here in order to do so. The `issuer` is the entity that creates the token, the `subject` is the entity that the token represents (here, the GitLab pipeline), and the `audience` is the intended recipient of the token.

In this case, the `issuer` field points to `https://gitlab.com`, the issuer of JWT tokens for GitLab pipelines. Likewise, the `audience` field also points to `https://gitlab.com`. This will work for demonstration purposes, but if you're taking advantage of GitLab's support for custom audiences then be sure to change this to the appropriate audience. These values are string literals; you can use `identity-issuer-pattern`, `subject-pattern`, and `audience-pattern` to use regular expressions instead.

The GitLab documentation provides [several examples of `subject` claims](https://docs.gitlab.com/ee/ci/cloud_services/#configure-a-conditional-role-with-oidc-claims) which you can refer to if you want to construct a `subject` claim specific to your needs. For the purposes of this guide, though, you will need to replace `<group_name>` and `<project_name>` with the name of your GitLab group and project names, respectively.

The next section will output the new identity's `id` value. This is a unique value that represents the identity itself.

```hcl
output "gitlab-identity" {
  value = chainguard_identity.gitlab.id
}
```

The section after that looks up the `viewer` role.

```hcl
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final section grants this role to the identity.

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.gitlab.id
  group = data.chainguard_group.group.id
  role  = data.chainguard_role.viewer.items[0].id
}
```

Following that, your Terraform configuration will be ready. Now you can run a few `terraform` commands to create the resources defined in your `.tf` files.

### Creating your resources

First, run `terraform init` to initialize Terraform's working directory.

```shell
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section.

```shell
terraform plan
```

Then apply the configuration.

```shell
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```
...

Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + gitlab-identity = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After typing `yes` and pressing `ENTER`, the command will complete and will output a `gitlab-ci` value.

```
...

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Outputs:

gitlab-identity = "<your actions identity>"
```

This is the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers), which you configured the `gitlab.tf` file to emit in the previous section. Note this value down, as you'll need it to set up the GitLab CI pipeline you'll use to test the identity. If you need to retrieve this UIDP later on, though, you can always run the following `chainctl` command to obtain a list of the UIDPs of all your existing identities.

```shell
chainctl iam identities ls
```

Note that you may receive a `PermissionDenied` error part way through the apply step. If so, run `chainctl auth login` once more, and then `terraform apply` again to resume creating the identity and resources.

You're now ready to create a GitLab CI pipeline which you'll use to test out this identity.

## Testing the identity with a GitLab CI/CD pipeline

From the GitLab Dashboard, select **Projects** in the left-hand sidebar menu. From there, click on the project you specified in the `subject` claim to be taken to the project overview.

In the list of the repository's contents, there will be a file named `.gitlab-ci.yml`. This is a special file that's required when using GitLab CI/CD, as it contains the CI/CD configuration.

Click on the `.gitlab-ci.yml` file, then click the **Edit** button and select an option for editing the file. For the purpose of this guide, delete whatever content is in this file to start and replace it with the following.

```
image: cgr.dev/chainguard/wolfi-base

stages:
  - assume-and-explore

assume-and-explore:
  id_tokens:
    ID_TOKEN_1:
      aud: https://gitlab.com

  stage: assume-and-explore

  script:
  - |
    # Install wget
    apk add wget

    # Install chainctl.
    wget -O chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_linux_$(uname -m)"
    chmod +x chainctl
    mv chainctl /usr/bin

    # Assume the identity.
    chainctl auth login \
      --identity-token $ID_TOKEN_1 \
      --identity <your gitlab identity>
    chainctl auth configure-docker \
      --identity-token $ID_TOKEN_1 \
      --identity <your gitlab identity>

    # Explore available images.
    chainctl images repos list
```

Let's go over what this configuration does.

First, GitLab requires that pipelines have a shell. To this end, this configuration uses the [`cgr.dev/chainguard/wolfi-base` image](https://images.chainguard.dev/directory/image/wolfi-base/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-administration-iam-organizations-identity-examples-gitlab-identity) since it includes the `sh` shell.

Next, this configuration creates a JSON Web Token (JWT) with an [`id_tokens`](https://docs.gitlab.com/ee/ci/yaml/index.html#id_tokens) block that will allow the job to be able to fetch an OIDC token and authenticate with Chainguard. GitLab requires that any JWTs created in this manner must include an `aud` keyword. In this case, it should align with the `audience` associated with the Chainguard identity you created: `https://gitlab.com`.

Following that, the job runs a few commands to download and install `chainctl`. It then uses `chainctl`, the JWT, and the Chainguard identity's `id` value to assume the Chainguard identity and log in.

> **Note**: Be sure to replace `<your gitlab identity>` with the identity UIDP you noted down in the previous section.

After logging in, the pipeline is able to run any `chainctl` command under the assumed identity. To test out this ability, this configuration runs the `chainctl images repos list` command to list all available image repos associated with the organization.

After updating the configuration, commit the changes and the pipeline will run automatically. A status box in the dashboard will let you know whether the pipeline runs successfully.

Click **Build** and then **Pipelines** to view the pipeline, and then click the **assume-and-explore** job button to open the job's output from the last run. There you should see a list of container repositories accessible to your organization:

```Output
. . .
Successfully exchanged token.
Valid! Id: $ORGANIZATION/$IDENTITY
Updated auth config for cgr.dev
[cgr.dev/example.edu]
├ [buildkit]
├ [mongodb]
├ [nginx]
├ [node]
├ [postgresql]
└ [python]
```

This indicates that the GitLab CI/CD pipeline did indeed assume the identity and run the `chainctl images repos list` command.

## Next steps

If you'd like to experiment further with this identity and what the workflow can do with it, there are a few parts of this setup that you can tweak. For instance, if you'd like to give this identity different permissions you can change the role data source to the role you would like to grant.

```
data "chainguard_roles" "editor" {
  name = "editor"
}
```

To retrieve a list of all the available roles — including any custom roles — you can run the following command.

```shell
chainctl iam roles list
```

You can also edit the pipeline itself to change its behavior. For example, instead of inspecting the image repos the identity has access to, you could have the workflow inspect the organization like in the following example.

```shell
chainctl iam orgs ls
```

The GitLab pipeline will only be able to perform certain actions on certain resources, depending on what kind of access you grant it.

## Removing sample resources

To delete the identity created directly with `chainctl`, run the following:

```shell
chainctl iam identities delete cg-gitlab-id
```

This will also remove the identity's role-binding.

To remove the resources Terraform created, you can run the `terraform destroy` command.

```shell
terraform destroy
```

This will destroy identity and the role-binding created in this guide. It will not delete the organization.

You can then remove the working directory to clean up your system.

```shell
rm -r ~/gitlab-tf/
```

Following that, all of the example resources created in this guide's Terraform instructions will be removed from your system.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on this Terraform configuration for a production environment. Likewise, for more information on using GitLab CI/CD pipelines, we encourage you to check out the [official documentation on the subject](https://docs.gitlab.com/ee/ci/pipelines/).

---

### Create an assumable identity to authenticate from AWS (legacy)
_Path: platform/administration/assumable-ids/identity-examples/aws-identity.md_

> **Note:** This page describes a custom implementation of assumable identities for AWS that was
> developed before AWS natively supported issuing OIDC tokens with [IAM outbound
> identity federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound.html).
> If possible, you should follow the instructions on
> [this page](/chainguard/administration/assumable-ids/identity-examples/aws-identity-oidc/)
> instead.

Chainguard's [*assumable identities*](/chainguard/administration/assumable-ids/assumable-ids/) are identities that can be assumed by external applications or workflows in order to access Chainguard resources or perform certain actions.

This tutorial outlines how to create a Chainguard identity that can be assumed by an AWS user or IAM role and used to authorize requests from AWS services and workloads hosted on platforms like EC2, ECS, Lambda, and EKS.

## Prerequisites

To complete this guide, you will need the following tools.

* The AWS CLI. Review the official documentation for information on [how to install or update to the latest version of the tool](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
* To create the assumable identity, you will need one of the following tools:
    * [`chainctl`](/get-started/getting-started-with-chainctl/) — the Chainguard command line interface tool. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
    * [`terraform`](https://developer.hashicorp.com/terraform) — an Infrastructure as Code tool developed by Hashicorp. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.

## Create the assumable identity

This guide outlines two methods for creating an identity that can be assumed by an AWS user or IAM role: one using `chainctl` over a command-line interface, and another using Terraform.

### CLI

This example creates an identity for an IAM role and binds it to the `registry.pull` role. Replace `<identity-name>` with the name you'd like to give the identity, `<account-id>` with your AWS account ID, and `<role-name>` with the name of your IAM role.

```shell
chainctl iam id create aws role <identity-name> --aws-account-id=<account-id> --aws-role-name=<role-name> --role=registry.pull
```

For an IAM user, use this command. Replace `<identity-name>` with the name you'd like to give the identity, `<account-id>` with your AWS account ID and `<user-name>` with the name of your IAM user.

```shell
chainctl iam id create aws user <identity-name> --aws-account-id=<account-id> --aws-user-name=<user-name> --role=registry.pull
```

If your IAM resources are in the `aws-cn` or `aws-us-gov` [partitions](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/partitions.html), you must specify that with the `--aws-partition` flag. For instance, for a role:

```shell
chainctl iam id create aws role <identity-name> --aws-partition=aws-us-gov --aws-account-id=<account-id> --aws-role-name=<role-name> --role=registry.pull
```

These commands will return the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers). Note this value down, as you'll need it to assume the identity later.

If you need to retrieve the UIDP later on, you can always run the following `chainctl` command to list the identity.

```sh
chainctl iam identities list --name=<identity-name>
```

If you're unsure which IAM identity your AWS resource is using, you can run `aws sts get-caller-identity` to get the details of the current AWS session. You must run this from the AWS environment you are trying to assume the identity from. For example, if you run this command from an EC2 instance with an assumed role, you might see output like this:

```sh
aws sts get-caller-identity
```

```output
{
 "UserId": "AROAEXAMPLEC2UL7LUB:i-05a6373examplehd2",
 "Account": "452example43",
 "Arn": "arn:aws:sts::452example43:assumed-role/AmazonSSMRoleForInstancesQuickSetup/i-05a6373examplehd2"
}
```

In this example, the role name is `AmazonSSMRoleForInstancesQuickSetup`.

### Terraform

You can also create an assumable identity with the [Chainguard Terraform provider](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest).

The following example demonstrates creating an identity that can be assumed by an IAM role. It binds the `registry.pull` role to the identity.

Substitute your Chainguard organization name for `<org-name>`.

```hcl
data "aws_caller_identity" "current" {}

resource "aws_iam_role" "example" {
  # Configuration omitted for brevity
}

data "chainguard_group" "org" {
  name = "<org-name>"
}

resource "chainguard_identity" "my_identity_name" {
  parent_id   = data.chainguard_group.org.id
  name        = "my-identity-name"

  aws_identity {
    aws_account         = data.aws_caller_identity.current.account_id
    aws_user_id_pattern = "^${aws_iam_role.example.unique_id}:(.+)$"
    aws_arn_pattern     = "^arn:aws:sts::${data.aws_caller_identity.current.account_id}:assumed-role/${aws_iam_role.example.name}/(.+)$"
  }
}

data "chainguard_roles" "registry_pull" {
  name = "registry.pull"
}

resource "chainguard_rolebinding" "my_identity_name_registry_pull" {
  identity = chainguard_identity.my_identity_name.id
  role     = data.chainguard_roles.registry_pull.items[0].id
  group    = data.chainguard_group.org.id
}

output "my_identity_name_id" {
  value = chainguard_identity.my_identity_name.id
}
```

The `my_identity_name_id` output provides the identity’s [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers). You’ll need this value to assume the identity later.

For a full example, refer to the [`aws-auth` example](https://github.com/chainguard-dev/platform-examples/tree/main/aws-auth) in Chainguard's public `platform-examples` repository.

## Assume the identity

Unlike other supported platforms, AWS does not issue OIDC tokens for its IAM entities. To facilitate assumable identities from AWS workloads, Chainguard accepts a custom token format that is constructed by Base64 encoding a signed AWS API request to [`GetCallerIdentity`](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html).

Chainguard can then use that request and verify that it returns a caller identity that is permitted to assume the Chainguard identity. To better understand the verification logic, refer to the [`aws.VerifyToken`](https://pkg.go.dev/chainguard.dev/sdk@v0.1.44/auth/aws#VerifyToken) function from the [Chainguard SDK For Go](https://pkg.go.dev/chainguard.dev/sdk).

The following sections outline different methods of generating the token, assuming the identity, and using it to interact with the Chainguard API from your AWS resources.

### CLI

You should be able to follow these instructions from any environment, including AWS services like EC2 and EKS, as long as the AWS CLI [can fetch credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) and both `curl` and `chainctl` are installed.

First, use the AWS CLI to retrieve credentials and export them as the `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_SESSION_TOKEN` environment variables:

```shell
eval "$(aws configure export-credentials --format env)"
```

Next, use `curl` to sign a HTTP request with the credentials and base64 encode it. Store the result in the variable `${TOK}`. Substitute `<identity-id>` with the UIDP of your Chainguard identity which you created previously:

```shell
TOK=$(curl -X POST "https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15" \
  --aws-sigv4 "aws:amz:us-east-1:sts" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  -H "x-amz-security-token: ${AWS_SESSION_TOKEN}" \
  -H "Chainguard-Identity: <identity-id>" \
  -H "Chainguard-Audience: https://issuer.enforce.dev" \
  -H "Accept: application/json" \
  -v 2>&1 > /dev/null \
  | grep '^> ' \
  | sed 's/> //' \
  | base64 -w0)
```

Finally, use the token to login with `chainctl`. Provide the UIDP of the identity as `<identity-id>`:

```shell
chainctl auth login \
  --identity <identity-id> \
  --identity-token "${TOK}"
```

Now you will be able to issue `chainctl` commands under this assumed identity. For instance, you could list the container image repositories available to your organization:

```shell
chainctl image repo list
```

### Go SDK

The [Chainguard SDK For Go](https://pkg.go.dev/chainguard.dev/sdk) provides an [`aws.GenerateToken`](https://pkg.go.dev/chainguard.dev/sdk@v0.1.44/auth/aws#GenerateToken) function that makes it straightforward to generate a token from AWS credentials that can be exchanged for a Chainguard API token.

For an example of how to leverage this function, refer to the [`aws-auth` example](https://github.com/chainguard-dev/platform-examples/tree/main/aws-auth) in Chainguard's public `platform-examples` repository.

## Learn more

By following this guide, you will have created a Chainguard identity that you can use to authenticate to Chainguard from AWS. For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/assumable-ids/assumable-ids/). Additionally, we encourage you to read through the rest of our documentation on [Administering Chainguard resources](/chainguard/administration/).

---

### Create an assumable identity for a CLI session authenticated with Keycloak
_Path: platform/administration/assumable-ids/identity-examples/keycloak-identity.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/) are identities that can be assumed by external applications or workflows in order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines how to create an identity using Terraform, and then assume the identity with the CLI to interact with Chainguard resources.

## Prerequisites

To complete this guide, you will need the following.

* `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
* A Keycloak deployment. [Keycloak](https://www.keycloak.org/) is an Open Source identity provider which Chainguard provides as an [image](https://images.chainguard.dev/directory/image/keycloak/versions?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement&utm_content=edu-content-chainguard-administration-iam-organizations-identity-examples-keycloak-identity)

## Creating Terraform files

We will be using Terraform to create an identity for a Keycloak user to assume. This step outlines how to create three Terraform configuration files that, together, will produce such an identity.

To help explain each configuration file's purpose, we will go over what they do and how to create each file one by one. First, though, create a directory to hold the Terraform configuration and navigate into it.

```sh
mkdir ~/keycloak-id && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

### `main.tf`

The first file, which we will call `main.tf`, will serve as the scaffolding for our Terraform infrastructure.

The file will consist of the following content.

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
```

This is a fairly barebones Terraform configuration file, but we will define the rest of the resources in the other two files. In `main.tf`, we declare and initialize the Chainguard Terraform provider.

Next, you can create the `sample.tf` file.

### `sample.tf`

`sample.tf` will create a couple of structures that will help us test out the identity in a workflow.

This Terraform configuration consists of two main parts. The first part of the file will contain the following lines.

```hcl
data "chainguard_group" "group" {
  name     = "my-customer.biz"
}
```

This section looks up a Chainguard IAM organization named `my-customer.biz`. This organization will contain the identity — which will be created by the `keycloak.tf` file — to access when we test it out later on.

If you aren't sure of the name of your organization, you can retrieve a list of available organizations with the following command.

```sh
chainctl iam organizations list -o table
```

Now you can move on to creating the last of our Terraform configuration files, `keycloak.tf`.

### `keycloak.tf`

The `keycloak.tf` file is what will actually create the identity for your CLI to assume. The file will consist of four sections, which we'll go over one by one.

The first section creates the identity itself.

```hcl
resource "chainguard_identity" "keycloak" {
  parent_id   = data.chainguard_group.group.id
  name     = "keycloak"
  description = <<EOF
 This is an identity that authorizes Keycloak in this
 repository to assume to interact with chainctl.
  EOF

  claim_match {
    issuer   = "https://<keycloak issuer>"
    subject  = "<keycloak user ID>"
    audience = "<keycloak audience>"
  }
}
```

First this section creates a Chainguard Identity tied to the `chainguard_group` looked up in the `sample.tf` file. The identity is named `keycloak` and has a brief description.

The most important part of this section is the `claim_match`. When the the user tries to assume this identity later on, it must present a token matching the `issuer`, `subject`, and `audience` specified here in order to do so. The `issuer` is the entity that creates the token, the `subject` is the entity that the token represents (here, the Keycloak user), and the `audience` is the intended recipient of the token.

In this case, the `issuer` field points to the realm you are using on your Keycloak server, the issuer of JWT tokens. The `audience` field will likely be `account` depending on your Keycloak setup.

To discover the issuer, audience, and subject you will need to authenticate with the Keycloak server from the CLI and decode the JWT token returned. There are many ways to authenticate, but here is one example with password authentication:

```sh
curl --data "grant_type=password&client_id=<client name>&client_secret=<client secret>&username=<user>&password=<password>" https://<DNS NAME>/realms/<realm>/protocol/openid-connect/token | jq -r .access_token | cut -d\. -f2 | sed 's/$/==/' | base64 -d | jq | jq .iss,.aud,.sub
```

The next section of the `keycloak.tf` file will output the new identity's `id` value. This is a unique value that represents the identity itself.

```hcl
output "keycloak-identity" {
  value = chainguard_identity.keycloak.id
}
```

The section after that looks up the `viewer` role.

```hcl
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final section grants this role to the identity.

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.keycloak.id
  group = data.chainguard_group.group.id
  role  = data.chainguard_role.viewer.items[0].id
}
```

Following that, your Terraform configuration will be ready. Now you can run a few `terraform` commands to create the resources defined in your `.tf` files.

## Creating your resources

First, run `terraform init` to initialize Terraform's working directory.

```sh
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section.

```sh
terraform plan
```

Then apply the configuration.

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```
...

Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + keycloak-identity = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After typing `yes` and pressing `ENTER`, the command will complete and will output a `keycloak-ci` value.

```
...

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Outputs:

keycloak-identity = "<your actions identity>"
```

This is the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers), which you configured the `keycloak.tf` file to emit in the previous section. Note this value down, as you'll need it to authenticate with `chainctl`. If you need to retrieve this UIDP later on, though, you can always run the following `chainctl` command to obtain a list of the UIDPs of all your existing identities.

```sh
chainctl iam identities ls
```

Note that you may receive a `PermissionDenied` error part way through the apply step. If so, run `chainctl auth login` once more, and then `terraform apply` again to resume creating the identity and resources.

## Testing the identity

From a CLI with the `chainctl` binary installed and access to the Keycloak server:

First, create a pair of environment variables for when you log into Chainguard using the identity. This command generates a JSON Web Token (JWT) by logging in to Keycloak with a username and password and then assigning the token to a variable named `ID_TOKEN`.

```sh
export ID_TOKEN=$(curl \
  --data "grant_type=password&client_id=<client>&client_secret=<client secret>&username=<user>&password=<password>" \
  https://<keycloak URL>/realms/<realm>/protocol/openid-connect/token | jq -r .access_token)
```

Next set a variable named `ID` to your identity's UIDP value with the following command. Be sure to replace `<identity UIDP>` with the identity's UIDP value, which you noted down in the previous section.

```sh
export ID=<identity UIDP>
```

After creating these variables, run the following commands to log in to Chainguard under the assumed identity.

```shell
chainctl auth login \
  --identity-token $ID_TOKEN \
  --identity $ID

chainctl auth configure-docker \
  --identity-token $ID_TOKEN \
  --identity $ID
```

After logging in, the pipeline will be able to run any `chainctl` command under the assumed identity. To test out this ability, this configuration runs the `chainctl images repos list` command to list all available image repositories associated associated with the organization.

```sh
chainctl images repos list

```

After updating the Keycloak configuration, commit the changes and the pipeline will run automatically. A status box in the dashboard will let you know whether the pipeline runs successfully.

If the token times out, `chainctl` will try to reauthenticate and fail. If you repeat the same login command with the old token you will see messages like this:

```sh
chainctl auth login --identity-token $ID_TOKEN --identity $ID
Error: [101] unable to exchange tokens: rpc error: code = PermissionDenied desc = verifying token: oidc: token is expired (Token Expiry: 2024-03-18 11:44:35 +0000 UTC)
```

To authenticate with `chainctl` you will need to generate a new token with Keycloak.

If you'd like to experiment further with this identity and what the workflow can do with it, there are a few parts of this setup that you can tweak. For instance, if you'd like to give this identity different permissions you can change the role data source to the role you would like to grant.

```hcl
data "chainguard_roles" "editor" {
  name = "editor"
}
```

To retrieve a list of all the available roles, you can run the following command.

```sh
chainctl iam roles list
```

This command's output will also include any custom roles you are able to grant.

## Removing sample resources

To remove the resources Terraform created, you can run the `terraform destroy` command.

```sh
terraform destroy
```

This will destroy identity and the role-binding created in this guide. It will not delete the organization.

You can then remove the working directory to clean up your system.

```sh
rm -r ~/keycloak-id/
```

Following that, all of the example resources created in this guide will be removed from your system.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on this Terraform configuration for a production environment. For more information about OIDC you can find a lot of documentation on the [OpenID Foundation website](https://openid.net/). For Keycloak specific information, we encourage you to check out the [official Keycloak documentation](https://www.keycloak.org/documentation)

---

### Create an assumable identity to authenticate from AWS
_Path: platform/administration/assumable-ids/identity-examples/aws-identity-oidc.md_

Chainguard's [*assumable identities*](/chainguard/administration/assumable-ids/assumable-ids/) are identities that can be assumed by external applications or workflows in order to access Chainguard resources or perform certain actions.

This tutorial outlines how to create a Chainguard identity that can be assumed by an AWS IAM user or IAM role using [AWS IAM outbound identity federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound.html).

## Prerequisites

To complete this guide, outbound identity federation must be enabled for your AWS account. Follow [the official AWS documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_getting_started.html#enable-outbound-federation) to set this up.

You will also need the following tools.

* The AWS CLI. Review the official documentation for information on [how to install or update to the latest version of the tool](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).
* To create the assumable identity, you will need one of the following tools:
    * [`chainctl`](/get-started/getting-started-with-chainctl/) — the Chainguard command line interface tool. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
    * [`terraform`](https://developer.hashicorp.com/terraform) — an Infrastructure as Code tool developed by Hashicorp. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.

## Retrieve token issuer URL

Each AWS account has a different issuer URL for outbound identity federation. You can retrieve it from the AWS Console UI by navigating to `IAM > Account settings > STS` as described in [the official getting started guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_outbound_getting_started.html).

The token issuer URL will align with the following format:

```
https://<uuid>.tokens.sts.global.api.aws
```

## Create the identity

This guide outlines two methods for creating an identity that can be assumed by an AWS user or IAM role: one using `chainctl` over a command-line interface, and another using Terraform.

### CLI

Firstly, attach a policy to your AWS role or user that allows it to call `sts:GetWebIdentityToken` for the `https://issuer.enforce.dev` audience. The following example is a minimal policy that allows this:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:GetWebIdentityToken",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "sts:IdentityTokenAudience": "https://issuer.enforce.dev"
                },
                "NumericLessThanEquals": {
                    "sts:DurationSeconds": 300
                }
            }
        }
    ]
}
```

Then, run this command which uses `chainctl` to create a Chainguard identity and assign it the `registry.pull` role. Substitute `<identity-name>`, `<issuer-url>` and `<aws-arn>` with the name you want to give the identity, the issuer URL you just retrieved and the ARN of the AWS user or role you want to assume the identity with, respectively.

```shell
chainctl iam id create <identity-name> --identity-issuer=<issuer-url> --subject=<aws-arn> --role=registry.pull
```

This command should return the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers). Note this value down, as you'll need it to assume the identity later.

If you need to retrieve the UIDP later on, you can always run the following `chainctl` command to list the identity.

```sh
chainctl iam identities list --name=<identity-name>
```

If you're unsure which ARN or issuer URL to provide to `chainctl iam id create`, you can issue a token with `aws sts get-web-identity-token` and inspect the claims with `jwt`. To complete this command, you must install `jwt` as described on [this page](https://github.com/mike-engel/jwt-cli#installation).

```shell
aws sts get-web-identity-token \
  --audience=https://issuer.enforce.dev \
  --signing-algorithm=ES384 \
  --query WebIdentityToken \
  --output text \
  | jwt decode -j - \
```

The output will look like this:

```json
{
  "header": {
    "typ": "JWT",
    "alg": "ES384",
    "kid": "EC384_0"
  },
  "payload": {
    "aud": "https://issuer.enforce.dev",
    "exp": 1766915543,
    "https://sts.amazonaws.com/": {
      "aws_account": "123456789012",
      "org_id": "o-anih79mrvn",
      "original_session_exp": "2025-12-28T10:45:29Z",
      "ou_path": [
        "o-anih79mrvn/r-amv9/ou-amv9-ndi0nlgq/"
      ],
      "principal_id": "arn:aws:iam::123456789012:role/example",
      "source_region": "us-west-2"
    },
    "iat": 1766915243,
    "iss": "https://00000000-0000-0000-0000-000000000000.tokens.sts.global.api.aws",
    "jti": "00000000-0000-0000-0000-000000000000",
    "sub": "arn:aws:iam::123456789012:role/example"
  }
}
```

The `sub` and `iss` claims are the values you should provide to `--subject` and `--identity-issuer`, respectively.

### Terraform

You can also create an assumable identity with the [Chainguard Terraform provider](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest). The following example demonstrates creating an identity that can be assumed by an IAM role. It binds the `registry.pull` role to the identity.

Substitute your Chainguard organization name for `<org-name>` and the issuer URL for `<issuer-url>`.

```hcl
terraform {
  required_providers {
    aws        = { source = "hashicorp/aws" }
    chainguard = { source = "chainguard-dev/chainguard" }
  }
}

data "aws_caller_identity" "current" {}

resource "aws_iam_role" "example" {
  name = "example-role"

  # Configuration omitted for brevity
}

resource "aws_iam_role_policy" "example_policy" {
  name = "web-identity-token-policy"
  role = aws_iam_role.example.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = "sts:GetWebIdentityToken"
        Resource = "*"
        Condition = {
          "ForAnyValue:StringEquals" = {
            "sts:IdentityTokenAudience" = "https://issuer.enforce.dev"
          }
          "NumericLessThanEquals" : {
            "sts:DurationSeconds" : 300
          }
        }
      }
    ]
  })
}

data "chainguard_group" "org" {
  name = "<org-name>"
}

resource "chainguard_identity" "my_identity_name" {
  parent_id = data.chainguard_group.org.id
  name      = "my-identity-name"
  claim_match {
    issuer  = "<issuer-url>"
    subject = aws_iam_role.example.arn
  }
}

data "chainguard_role" "registry_pull" {
  name = "registry.pull"
}

resource "chainguard_rolebinding" "my_identity_name_registry_pull" {
  identity = chainguard_identity.my_identity_name.id
  role     = data.chainguard_role.registry_pull.items[0].id
  group    = data.chainguard_group.org.id
}

output "my_identity_name_id" {
  value = chainguard_identity.my_identity_name.id
}
```

The `my_identity_name_id` output provides the identity’s [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers). You’ll need this value to assume the identity later.

## Assume the identity

After creating an identity with either method outlined previously, generate a token with `aws sts get-web-identity-token`:

```shell
TOK=$(aws sts get-web-identity-token --audience=https://issuer.enforce.dev --signing-algorithm=ES384 --query WebIdentityToken --output text)
```

Then use the token to log in with `chainctl`. Provide the UIDP of the identity as `<identity-id>`:

```shell
chainctl auth login \
  --identity <identity-id> \
  --identity-token "${TOK}"
```

Now you will be able to issue `chainctl` commands under this assumed identity. For instance, you could list the container image repositories available to your organization:

```shell
chainctl image repo list
```

## Learn more

By following this guide, you will have created a Chainguard identity that you can use to authenticate to Chainguard from AWS. For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/assumable-ids/assumable-ids/). Additionally, we encourage you to read through the rest of our documentation on [Administering Chainguard resources](/chainguard/administration/).

---

### Create an assumable identity for a Buildkite pipeline
_Path: platform/administration/assumable-ids/identity-examples/buildkite-identity.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/) are identities that can be assumed by external applications or workflows in order to perform certain tasks that would otherwise have to be done by a human.

This tutorial outlines how to create an identity using Terraform, and then how to update a Buildkite pipeline so that it can assume the identity and interact with Chainguard resources.

## Prerequisites

To complete this guide, you must have the following in place:

* `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide uses to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
* A Buildkite agent and pipeline you can use to test out the identity you'll create. We recommend following Buildkite's [Getting Started guide](https://buildkite.com/docs/tutorials/getting-started) to set these up.

## Creating Terraform files

This guide outlines using Terraform to create an identity for a Buildkite pipeline to assume. This step outlines how to create three Terraform configuration files that, together, produce such an identity.

To help explain each configuration file's purpose, we will go over what they do and how to create each file one by one. First, create a directory to hold the Terraform configuration and navigate into it.

```sh
mkdir ~/buildkite-id && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

### `main.tf`

The first file, named `main.tf`, serves as the scaffolding for our Terraform infrastructure.

The file consists of the following content:

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
```

This is a fairly barebones Terraform configuration file, but we will define the rest of the resources in the other two files. In `main.tf`, we declare and initialize the Chainguard Terraform provider.

Next, you can create the `sample.tf` file.

### `sample.tf`

`sample.tf` creates a couple of structures that help us test out the identity in a workflow.

This Terraform configuration consists of the following lines:

```hcl
data "chainguard_group" "group" {
  name = "example.com"
}
```

This section looks up a Chainguard IAM organization named `example.com`. You must change this to the name of your Chainguard organization where you want to create the Buildkite identity.

Now you can move on to creating the last of our Terraform configuration files, `buildkite.tf`.

### `buildkite.tf`

The `buildkite.tf` file is what actually creates the identity for your Buildkite workflow to assume. The file consists of four sections, which we'll go over one by one.

The first section creates the identity itself:

```hcl
resource "chainguard_identity" "buildkite" {
  parent_id   = data.chainguard_group.group.id
  name        = "buildkite"
  description = <<EOF
    This is an identity that authorizes Buildkite workflows
    for this pipeline to assume to interact with chainctl.
  EOF

  claim_match {
    issuer          = "https://agent.buildkite.com"
    subject_pattern = "organization:<buildkite-organization>:pipeline:<pipeline>:ref:refs/heads/main:commit:[0-9a-f]+:step:.*"
  }
}
```

First, this section creates a Chainguard Identity tied to the `chainguard_group` specified in the `sample.tf` file. The identity is named `buildkite` and has a brief description.

The most important part of this section is the `claim_match`. When the Buildkite workflow tries to assume this identity later on, it must present a token matching the `issuer` and `subject` specified here in order to do so successfully. The `issuer` is the entity that creates the token, while the `subject` is the entity (here, the Buildkite pipeline build) that the token represents.

In this case, the `issuer` field points to `https://agent.buildkite.com`, the issuer of JWT tokens for Buildkite pipelines.

Instead of pointing to a literal value with a `subject` field, though, this file points to a regular expression using the `subject_pattern` field. When you run a Buildkite pipeline, it generates a unique commit for each build. Passing the regular expression `[0-9a-f]+` allows you to generate an identity that works for every build from this pipeline.

You may refer to [the official Buildkite documentation](https://buildkite.com/docs/agent/v3/cli-oidc#claims) for more details on how Buildkite `issuer` and `subject` claims can be formatted to suit your specific needs. For the purposes of this guide, though, you must replace `<buildkite-organization>` and `<pipeline>` with the name of your Buildkite organization and the name of your Buildkite pipeline.

The next section outputs the new identity's `id` value. This is a unique value that represents the identity itself:

```hcl
output "buildkite-identity" {
  value = chainguard_identity.buildkite.id
}
```

The section after that looks up the `viewer` role:

```hcl
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final section grants this role to the identity:

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.buildkite.id
  group    = data.chainguard_group.group.id
  role     = data.chainguard_role.viewer.items[0].id
}
```

After creating the `buildkite.tf` file with each of these sections, your Terraform configuration will be ready. Now you can run a few `terraform` commands to create the resources defined in your `.tf` files.

## Creating your resources

First, run `terraform init` to initialize Terraform's working directory:

```sh
terraform init
```

Then run `terraform plan`. This produces a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section:

```sh
terraform plan
```

If the plan worked successfully and you're satisfied that it will produce the resources you expect, you can apply it. First, though, you'll need to log in to `chainctl` to ensure that Terraform can create the Chainguard resources:

```sh
chainctl auth login
```

Then apply the configuration:

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command prompts you to confirm that you want it to do so. Enter `yes` to apply the configuration:

```output
...
Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + buildkite-identity = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After pressing `ENTER`, the command will complete and output a `buildkite-identity` value:

```
...

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

buildkite-identity = "<your-buildkite-identity>"
```

This is the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers), which you configured the `buildkite.tf` file to emit in the previous section. Note this value down, as you'll need it when you test this identity using a Buildkite workflow. If you need to retrieve this UIDP later on, though, you can always run the following `chainctl` command to obtain a list of the UIDPs of all your existing identities:

```sh
chainctl iam identities ls
```

You're now ready to edit a Buildkite pipeline in order to test out this identity.

## Testing the identity with a Buildkite pipeline

To test the identity you created with Terraform in the previous section, navigate to your Buildkite pipeline. From the Buildkite Dashboard, click **Pipelines** in the top navigation bar and then click on the pipeline you specified in the `buildkite.tf` file.

From there, click the **Edit Steps** button to add the following commands to a step in your pipeline. Be sure to replace `<your-buildkite-identity>` with the identity UIDP you noted down in the previous section.

If you followed the [**Getting Started** guide linked in the prerequisites](https://buildkite.com/docs/tutorials/getting-started), your pipeline will have a structure like this.

```Pipeline
steps:
  - label: "Pipeline upload"
    command: buildkite-agent pipeline upload
```

You could add the commands for testing the identity like this:

```Pipeline
- command: |
    curl -o chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m)"
    chmod +x chainctl
    mv chainctl /usr/bin
    buildkite-agent oidc request-token --audience issuer.enforce.dev > .token.txt
    chainctl auth login --identity-token $(cat .token.txt) --identity <your-buildkite-identity>
    chainctl auth configure-docker --identity-token $(cat .token.txt) --identity <your-buildkite-identity>
    rm .token.txt
    chainctl images repos list
    docker pull cgr.dev/<organization>/<repo>:<tag>
```

These commands instruct your Buildkite pipeline to download `chainctl` and make it executable.

The pipeline then runs a `buildkite-agent oidc request-token` command, which requests and prints an OIDC token that claims the Job ID and the specified audience. It pipes this token into a file named `.token.txt`, and then signs in to Chainguard using this token along with the Buildkite identity you generated previously.

If this workflow can successfully assume the identity, it then executes the `chainctl images repos list` command and retrieves the list of repos available to the organization.

Click the **Save and Build** button. Ensure that your Buildkite agent is running, and then wait a few moments for the pipeline to finish building.

### Testing the identity with a Buildkite plugin

You can also create a [Buildkite plugin](https://buildkite.com/docs/pipelines/integrations/plugins/writing) that uses the assumable identity to access your Chainguard resources.

Note that to use a plugin like the following example with the pipeline you created previously, the plugin code must reside in the same repository where the pipeline is running.

To get started, create some directories within your repository:

```sh
mkdir -p .buildkite/plugins/cgrauth/hooks
```

Create a `plugin.yml` file within the `cgrauth` directory. This is a special file that describes what information the plugin requires and what configuration options it accepts:

```sh
cat > .buildkite/plugins/cgrauth/plugin.yml <<EOF
name: Auth
description: Authenticate to pull images
author: https://github.com/<github-id>
requirements: [bash]
configuration:
  properties:
    identity: { type: string }
  required: [identity]
  additionalProperties: false
EOF
```

Be sure to replace `<github-id>` with your GitHub username.

Plugins can implement a number of [plugin hooks](https://buildkite.com/docs/agent/v3/hooks). Run the following command to create a pre-command hook within the `hooks/` subdirectory:

```sh
cat > .buildkite/plugins/cgrauth/hooks/pre-command <<EOF
#!/usr/bin/env bash
set -euo pipefail

identity="${BUILDKITE_PLUGIN_CGRAUTH_IDENTITY:?missing identity}"
curl -o chainctl https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr "[:upper:]" "[:lower:]")_$(uname -m)
chmod +x chainctl
mv chainctl /usr/bin
token=$(buildkite-agent oidc request-token --audience issuer.enforce.dev)
chainctl auth login --identity-token $token --identity <your-buildkite-identity>
chainctl auth configure-docker --identity-token $token --identity <your-buildkite-identity>
EOF
```

Be sure to replace `<your-buildkite-identity>` with the UIDP of the assumable identity you created earlier.

After merging these new files into your code repository, update your pipeline to use the plugin. The following example is useful for testing that the pipeline can read the identity from the plugin and use it to retrieve a list of your organization's image repositories:

```Pipeline
steps:
  - label: "Buildkite test"
    plugins:
      - "./.buildkite/plugins/cgrauth":
          identity: "<your-buildkite-identity>"
    command:
      - 'chainctl images repos list'
```

Assuming everything works as expected, your pipeline will be able to assume the identity and run the `chainctl images repos list` command, returning a list of images available to your Chainguard organization:

```Pipeline
. . .
$ .buildkite/plugins/cgrauth/hooks/pre-command
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 98.6M  100 98.6M    0     0   177M      0 --:--:-- --:--:-- --:--:--  177M
Successfully exchanged token.
Valid! Id: 45a0c61ea6fd9EXAMPLE5fb9ac06a69eed764595/9753EXAMPLE6d0c8
Updated auth config for cgr.dev
Running commands
$ chainctl images repos list
[cgr.dev/example.com]
├ [adoptium-jdk-fips]
├ [aws-efs-csi-driver]

. . .
```

If you'd like to experiment further with this identity and what the pipeline can do with it, there are a few parts of this setup that you can tweak. For instance, if you'd like to give this identity different permissions you can change the role data source to the role you would like to grant:

```hcl
data "chainguard_roles" "editor" {
  name = "editor"
}
```

You can also edit the pipeline itself to change its behavior. For example, instead of listing repos, you could have the workflow inspect the organization with the `chainctl iam organizations ls` command.

Of course, the Buildkite pipeline is only able to perform certain actions on certain resources depending on what kind of access you grant it.

## Removing sample resources

To remove the resources Terraform created, run the `terraform destroy` command:

```sh
terraform destroy
```

This destroys the role-binding and the identity created in this guide. It will not delete the organization.

You can then remove the working directory to clean up your system.

```sh
rm -r ~/buildkite-id/
```

This removes the Terraform configuration files you used to create the example Buildkite resources.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on this Terraform configuration for a production environment. Likewise, for more information on using Buildkite, we encourage you to check out the [official project documentation](https://buildkite.com/docs), particularly their [documentation on Buildkite OIDC](https://buildkite.com/docs/agent/v3/cli-oidc).

---

### Create an assumable identity for a Kubernetes pod
_Path: platform/administration/assumable-ids/identity-examples/kubernetes-identity/index.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/)
are identities that can be assumed by external applications or workflows in
order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines how to create an identity that can be assumed
by a Kubernetes pod and then used to interact with the Chainguard API.

## Prerequisites

To complete this guide, you will need the following.

* `chainctl` — the Chainguard command line interface tool — installed on your
  local machine. Follow our guide on
  [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/)
  to set this up.
* `kubectl` - the command line interface tool for Kubernetes.
* Access to a Kubernetes cluster.

## Find the issuer URL of the Kubernetes cluster

A Kubernetes cluster operates as an OIDC issuer. How you find the URL for that
issuer depends on where the cluster is running.

### GKE  (Google Kubernetes Engine)

The issuer URL for a GKE cluster will follow this format.

```
https://container.googleapis.com/v1/projects/<project>/locations/<location>/clusters/<cluster-name>
```

### EKS (Amazon Elastic Kubernetes Service)

```shell
aws eks describe-cluster \
  --name <cluster-name> \
  --query "cluster.identity.oidc.issuer" \
  --output text
```

### AKS (Azure Kubernetes Service)

```shell
az aks show \
  --name <cluster-name> \
  --resource-group <resource-group> \
  --query "oidcIssuerProfile.issuerUrl" \
  --output tsv
```

### Generic

You can issue a token with `kubectl` and find the issuer URL in the `iss`
claim with [`jwt`](https://github.com/mike-engel/jwt-cli).

```shell
kubectl create token default | jwt decode -
```

## Create an assumable identity

Run this `chainctl` command to create an identity for the `default` service
account in the `default` namespace and assign it the `registry.pull` role.

Provide the issuer URL you identified in the previous step.

```shell
chainctl iam id create example-identity \
    --identity-issuer="<issuer-url>" \
    --subject-pattern="system:serviceaccount:default:default" \
    --role=registry.pull
```

This will return the ID of the identity which we will use in the next section.

If your cluster's issuer URL is not available over the internet then you can
create an identity by exporting the JWKS (JSON Web Key Set) from the cluster
with `kubectl` and provide it with the `--issuer-keys` flag.

```shell
chainctl iam identities create example-identity \
  --issuer-keys="$(kubectl get --raw /openid/v1/jwks)" \
  --identity-issuer=<issuer-url> \
  --subject=system:serviceaccount:default:default \
  --role=registry.pull
```

Many Kubernetes clusters will rotate the keys in the JWKS, so this command
creates a static identity that expires after a period of time. The default
duration is 30 days. In this scenario you should regularly recreate the
identity with the latest JWKS.

## Assume the identity in a pod

Create `pod.yaml` with this content. Replace `<identity-id>` in the
list of environment variables with the ID of the identity you created in the
previous step.

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: assumable-id-demo
  namespace: default
spec:
  serviceAccountName: default
  restartPolicy: Never
  containers:
    - name: curl
      image: cgr.dev/chainguard/curl:latest-dev
      command:
        - sh
        - -c
        - |
          # Exchange the service account token for a Chainguard
          # API token
          IDENTITY_TOKEN=$(cat /var/run/chainguard/oidc/oidc-token)
          API_TOKEN=$(curl \
            -sSf \
            -H "Authorization: Bearer $IDENTITY_TOKEN" \
            "https://issuer.enforce.dev/sts/exchange?aud=https://console-api.enforce.dev&identity=$IDENTITY" \
            | jq -r .token
          )

          # List repos in the Chainguard registry
          curl -sSf -H "Authorization: Bearer $API_TOKEN" https://console-api.enforce.dev/registry/v1/repos | jq -r .items[].name
      env:
        - name: IDENTITY
          value: "<identity-id>"
      volumeMounts:
        - name: oidc-token
          mountPath: /var/run/chainguard/oidc
          readOnly: true
  volumes:
    - name: oidc-token
      projected:
        sources:
          - serviceAccountToken:
              path: oidc-token
              expirationSeconds: 600
              audience: issuer.enforce.dev
```

Then create the pod.

```shell
kubectl create -n default -f pod.yaml
```

Wait for the pod to complete and then view the logs. It should return a list of
the repositories in your organization.

```shell
kubectl -n default logs assumable-id-demo
```

## Clean up

Delete the pod.

```shell
kubectl -n default delete pod assumable-id-demo
```

Delete the identity.

```shell
chainctl iam id delete <identity-id>
```

## Learn more

For more information about how assumable identities work in Chainguard, check
out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/).

---

### Use chainctl to create an assumable identity for a Jenkins pipeline
_Path: platform/administration/assumable-ids/identity-examples/jenkins-chainctl/index.md_

[Jenkins](https://www.jenkins.io/) is an open source automation server that supports building, deploying, and automating projects.

This guide explains how to use `chainctl` to create an assumable identity and configure Jenkins to use that identity to authenticate to Chainguard. To accomplish this, create an OIDC token credential in Jenkins and a matching Chainguard identity that uses the Jenkins OIDC URL, then put the process into an example Jenkins build pipeline.

To do this using Terraform, follow the instructions in [Use Terraform to create an assumable identity for a Jenkins pipeline](/chainguard/administration/assumable-ids/identity-examples/jenkins-terraform/).

## Prerequisites

- A running [Jenkins](https://www.jenkins.io/doc/pipeline/tour/getting-started/) instance.
    - This Jenkins instance should have the [**Open ID Connect Provider** plugin](https://plugins.jenkins.io/oidc-provider/) installed, allowing you to create an OIDC token with Jenkins.
- [`chainctl`](https://edu.chainguard.dev/chainguard/chainctl-usage/how-to-install-chainctl/) installed locally.
- Administrative privileges within your Chainguard organization to create IAM identities (`identity.create`); this capability is available to users with [the owner role](https://edu.chainguard.dev/chainguard/administration/iam-organizations/roles-role-bindings/capabilities-reference/#chainguard-role-capabilities).

## Configure Jenkins credentials

Jenkins needs a way to supply `chainctl` with an API token so it can exchange it for short-lived credentials when a pipeline runs.

In this example, Jenkins mints an OIDC ID token during each build and `chainctl` uses that token to allow the build pipeline to assume your Chainguard identity — no long-lived secrets are required.

> **Note**: Chainguard does not issue general-purpose, long-lived API tokens. This ensures your automation relies only on short-lived, scoped credentials.

### Create an OIDC token credential

To get started, create an OIDC token with Jenkins:

1. Log in to the Jenkins UI
2. Navigate to the **Manage Jenkins** page by clicking the settings gear (**⚙**) in the upper-right corner
3. Navigate to the **Credentials** page by clicking **Credentials**
4. In the Domain column, click **(global)**
5. On the **Global credentials (unrestricted)** page, click **Add Credentials**
6. Use the **Kind** dropdown to select **OpenID Connect id token**
7. Enter an **ID**, our example uses `jenkins-oidc`.
8. Click **Create**

## Create a matching Chainguard identity

Create a Chainguard identity that uses your Jenkins OIDC URL. This is typically `https://YOUR_JENKINS/oidc`:

```shell
chainctl iam identities create jenkins-ci \
  --identity-issuer https://YOUR_JENKINS/oidc \
  --subject jenkins \
  --description "Identity for Jenkins builds" \
  --output json
```

Bind the identity to a role. We chose `registry.pull` for this example, but you should adjust according to your needs. Refer to [Overview of roles and role-bindings in Chainguard](https://edu.chainguard.dev/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) to learn more:

```shell
chainctl iam role-bindings create \
  --identity=jenkins-ci \
  --role=registry.pull
```

You can now use this identity in your build pipeline to authenticate to Chainguard.

## Use the identity and create a token in your Jenkins pipeline

Here is an example Jenkinsfile that uses what we just created. In this pipeline:

- `jenkins-oidc` is the credential ID you created in Jenkins for an OpenID Connect (OIDC) token.
- The `withCredentials` step injects the value of that credential into the environment variable `IDTOKEN` for the duration of the block.
- Inside the `sh` section of the `withCredentials` step, `$IDTOKEN` refers to that environment variable containing the actual OIDC token issued by Jenkins at build time while `chainctl auth login --identity-token "$IDTOKEN"` uses that token to authenticate to Chainguard and assume the Jenkins identity.

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

```groovy
pipeline {
  agent any

  environment {
    CHAINCTL_IDENTITY = "iam-1234567890" // replace with your identity ID
  }

  stages {
    stage('Install chainctl') {
      steps {
        sh '''
          mkdir -p .bin
          curl -fsSL -o .bin/chainctl \
            "https://dl.enforce.dev/chainctl/latest/chainctl_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/aarch64/arm64/; s/x86_64/amd64/')"
          chmod +x .bin/chainctl
        '''
      }
    }

    stage('Auth with Chainguard') {
      steps {
        withCredentials([string(credentialsId: 'jenkins-oidc', variable: 'IDTOKEN')]) {
          sh '''
            echo "Logging in to Chainguard using OIDC..."
            chainctl auth login \
              --identity "$CHAINCTL_IDENTITY"
            chainctl auth configure-docker
          '''
        }
      }
    }

    stage('Pull image') {
      steps {
        sh 'docker pull cgr.dev/ORGANIZATION/python:latest' //replace with your org
      }
    }
  }
}
```

> **Note**: `$IDTOKEN` is not something you create manually; it comes from the Jenkins credentials plugin at runtime. Ensure that you created the Jenkins credentials with ID `jenkins-oidc` and that the credential type is OpenID Connect ID token.

After you run this pipeline, check to see that the requested Chainguard image was pulled to confirm everything is set up properly.

## Learn more

In this guide you used `chainctl` to create an assumable identity and configure Jenkins to use that identity to authenticate to Chainguard. Refer to the following to learn more about how Chainguard has designed assumable IDs, `chainctl`, and authentication.

- [Assumable IDs](/chainguard/administration/assumable-ids/)
- [How to install chainctl](/chainguard/chainctl-usage/how-to-install-chainctl/)
- [Authenticating with Chainguard registry](/chainguard/containers/registry/authenticating/)

---

### Create an assumable identity for a GitHub Actions workflow
_Path: platform/administration/assumable-ids/identity-examples/github-identity/index.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/)
are identities that can be assumed by external applications or workflows in
order to perform certain tasks that would otherwise have to be done by a human.
For instance, an assumable identity can be used to allow a GitHub Actions
workflow to pull images from `cgr.dev` without a static pull token.

This tutorial outlines how to create an identity, and then create a GitHub Actions workflow that will assume the identity to interact with Chainguard resources.

## Prerequisites

To complete this guide, you will need the following.

* One of:
    * `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
    * `terraform` installed on your local machine. Terraform is an Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* A GitHub repository you can use for testing out GitHub identity federation. To complete this guide, you must have permissions to create GitHub Actions on this testing repo.

## Creating an identity

{{< note >}}
GitHub issues OIDC tokens whose `sub` claim embeds immutable numeric IDs for the repository owner and the repository. For example, the subject `repo:my-org@123456/repo-name@654321:ref:refs/heads/main` replaces the older name-only form `repo:my-org/repo-name:ref:refs/heads/main`. This format is the default for repositories created after July 15, 2026, and is available as an opt-in for older repositories through GitHub's OIDC settings.

An identity that matches the older name-only subject will not match a token that carries the immutable subject, so the workflow fails to authenticate. The examples that follow use the immutable format. If your repository still sends the name-only subject, leave out the `@<owner-id>` and `@<repo-id>` portions.
{{< /note >}}

### Finding your repository's numeric identifiers

The immutable subject claim uses the numeric ID of the repository owner and the numeric ID of the repository.

To retrieve the subject claim in the GitHub UI, modify and browse to this URL:

```http
https://github.com/<org-name>/<repo-name>/settings/actions/oidc-configuration
```

To retrieve the subject claim with the [GitHub CLI](https://cli.github.com/):

```sh
gh api repos/OWNER/REPO --jq '{owner_id: .owner.id, repo_id: .id}'
```

You can also preview the exact subject your repository sends from its OIDC settings in the GitHub web interface. To confirm the subject a running workflow presents, inspect the `sub` claim of the OIDC token in the workflow logs. For background on the format, refer to GitHub's changelog announcing [immutable subject claims for GitHub Actions OIDC tokens](https://github.blog/changelog/2026-04-23-immutable-subject-claims-for-github-actions-oidc-tokens/).

### Chainctl

This command creates an identity that can be assumed by workflows in the
`my-org/repo-name` repository. Substitute the owner and repository IDs you
retrieved earlier. The identity is bound to the `registry.pull` role.

```sh
chainctl iam identities create github my-identity-name \
    --github-repo=my-org@<owner-id>/repo-name@<repo-id> \
    --role registry.pull
```

You can also include the `--github-ref` flag to restrict it to workflows that
run from a specific branch. For instance, the `main` branch.

```sh
chainctl iam identities create github my-identity-name \
    --github-repo=my-org@<owner-id>/repo-name@<repo-id> \
    --github-ref=refs/heads/main \
    --role registry.pull
```

Regex is also available. For example, you can create an identity that can be assumed by multiple repositories and multiple branches. Because every repository in an organization shares the same owner ID, a single pattern can match all of them.

```sh
chainctl iam identities create github my-identity-name \
    --github-repo='my-org@<owner-id>/.*' \
    --github-ref='refs/heads/main|master' \
    --role registry.pull
```

This will return the identity's
[UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers).
Note this value down, as you'll need it to set up the GitHub Actions workflow.

If you need to retrieve the UIDP later on, you can always run the following
`chainctl` command to list the identity.

```sh
chainctl iam identities list --name=my-identity-name
```

### Terraform

Alternatively, you could create the identity with the [Chainguard Terraform
provider](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest).

Substitute your Chainguard organization name, GitHub organization, and GitHub
repository for `<org-name>`, `<github-org>`, and `<github-repo>`, respectively.
Substitute the numeric owner and repository IDs for `<owner-id>` and
`<repo-id>`, following the steps in
[Finding your repository's numeric identifiers](#finding-your-repositorys-numeric-identifiers).

```hcl
data "chainguard_group" "org" {
  name = "<org-name>"
}

resource "chainguard_identity" "my_identity_name" {
  parent_id   = data.chainguard_group.org.id
  name        = "my-identity-name"

  claim_match {
    issuer  = "https://token.actions.githubusercontent.com"
    subject = "repo:<github-org>@<owner-id>/<github-repo>@<repo-id>:ref:refs/heads/main"
  }
}

data "chainguard_role" "registry_pull" {
  name = "registry.pull"
}

resource "chainguard_rolebinding" "my_identity_name_registry_pull" {
  identity = chainguard_identity.my_identity_name.id
  group = data.chainguard_group.org.id
  role  = data.chainguard_role.registry_pull.items[0].id
}

output "my_identity_name_id" {
  value = chainguard_identity.my_identity_name.id
}
```

In this example the `chainguard_identity.my_identity_name` resource defines an
identity in your organization that can be assumed by a GitHub workflow that
matches the claims in the `claim_match` block.

The `chainguard_rolebinding.my_identity_name_registry_pull` resource binds the
`registry.pull` role to the identity.

The `my_identity_name_id` output provides the identity's [UIDP (unique identity
path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers).
You'll need this value to set up the GitHub Actions workflow.

## Creating and testing a GitHub Actions workflow

This example workflow definition assumes an identity with the [`setup-chainctl`](https://github.com/chainguard-dev/setup-chainctl)
GitHub Action, lists repositories with `chainctl` and pulls an
image from `cgr.dev`.

Commit this workflow to the `main` branch of your repository as
`.github/workflows/assume-and-explore.yaml`, substituting `<identity-id>` with
the UIDP of the assumable identity you created in the previous step and
`<org-name>` with the name of your Chainguard organization.

```yaml
name: Assume and Explore

on:
  workflow_dispatch: {}

jobs:
  assume-and-explore:
    name: actions assume example

    permissions:
      id-token: write

    runs-on: ubuntu-latest
    steps:

    - uses: chainguard-dev/setup-chainctl@main
      with:
        identity: <identity-id>

    - run: |
        chainctl image repo list --parent=<org-name>

    - run: |
        docker pull cgr.dev/<org-name>/example-image:latest
```

Once its committed, you can trigger the workflow by navigating to
`Actions > Assume And Explore` from the home page of your repository and
selecting `Run workflow`.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on the provided Terraform configuration for a production environment. Likewise, for more information on using GitHub Actions, we encourage you to check out the [official documentation on the subject](https://docs.github.com/en/actions).

---

### Use Terraform to create an assumable identity for a Jenkins pipeline
_Path: platform/administration/assumable-ids/identity-examples/jenkins-terraform/index.md_

Chainguard's [*assumable identities*](/chainguard/administration/iam-organizations/assumable-ids/) are identities that can be assumed by external applications or workflows in order to perform certain tasks that would otherwise have to be done by a human.

This procedural tutorial outlines how to create an identity using Terraform, and then how to update a Jenkins pipeline so that it can assume the identity and interact with Chainguard resources. If you would like to follow this guide using `chainctl`, Chainguard's command line tool, you can review [Use chainctl to create an assumable identity for a Jenkins pipeline](/chainguard/administration/assumable-ids/identity-examples/jenkins-chainctl/).

## Prerequisites

To complete this guide, you will need the following.

* `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
* A [Jenkins](https://www.jenkins.io/) server with the [OpenID Connect Provider plugin](https://plugins.jenkins.io/oidc-provider/) installed and configured, as well as a pipeline you can use to test out the identity you'll create.

## Creating Terraform files

We will be using Terraform to create an identity for a Jenkins pipeline to assume. This step outlines how to create three Terraform configuration files that, together, will produce such an identity.

To help explain each configuration file's purpose, we will go over what they do and how to create each file one by one. First, though, create a directory to hold the Terraform configuration and navigate into it.

```sh
mkdir ~/jenkins-id && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

### `main.tf`

The first file, which we will call `main.tf`, will serve as the scaffolding for our Terraform infrastructure.

The file will consist of the following content.

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
```

This is a fairly bare-bones Terraform configuration file, but we will define the rest of the resources in the other two files. In `main.tf`, we declare and initialize the Chainguard Terraform provider.

To create the `main.tf` file, run the following command.

```sh
cat > main.tf <<EOF
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
  }
}
EOF
```

Next, you can create the `sample.tf` file.

### `sample.tf`

`sample.tf` will create a couple of structures that will help us test out the identity in a workflow.

This Terraform configuration consists of two main parts. The first part of the file will contain the following lines.

```hcl
data "chainguard_group" "group" {
  name        = "my-customer.biz"
}
```

This section looks up a Chainguard IAM organization named `my-customer.biz`. This will contain the identity — which will be created by the `jenkins.tf` file — to access when we test it out later on.

Now you can move on to creating the last of our Terraform configuration files, `jenkins.tf`.

### `jenkins.tf`

The `jenkins.tf` file is what will actually create the identity for your Jenkins workflow to assume. The file will consist of four sections, which we'll go over one by one.

The first section creates the identity itself.

```hcl
resource "chainguard_identity" "jenkins" {
  parent_id   = data.chainguard_group.group.id
  name        = "jenkins"
  description = <<EOF
    This is an identity that authorizes Jenkins workflows
    for this repository to assume to interact with chainctl.
  EOF

  claim_match {
    audience = "%your-audience%"
    issuer   = "https://%your-domain%/oidc"
    subject  = "%your-subject%"
  }
}
```

First, this section creates a Chainguard Identity tied to the Chainguard organization looked up in the `sample.tf` file. The identity is named `jenkins` and has a brief description.

The most important part of this section is the `claim_match`. When the Jenkins workflow tries to assume this identity later on, it must present a token matching the `audience`, `issuer` and `subject` specified here in order to do so. The `audience` is the intended recipient of the issued token, while the `issuer` is the entity that creates the token. Finally, the `subject` is the entity (here, the Jenkins pipeline build) that the token represents.

The `audience` and `issuer` fields use settings from your configured Jenkins OIDC credential. To find them:

1. In the left-hand sidebar menu of your dashboard, click **Manage Jenkins**, then click **Credentials**.
2. Click your **System** credentials, then click **Global credentials (unrestricted)**. Jenkins lists all your configured OIDC tokens in a table.
3. Click the wrench icon for the token you want to use to test this identity. Jenkins shows the `audience` and `issuer` values to use in your `jenkins.tf` file.

For the subject, refer to your Jenkins repository OIDC settings page. To find it:

1. Navigate back to the **Manage Jenkins** landing page in your dashboard and click **Security**.
2. Scroll to the `OpenID Connect` section, click the **Claim templates** button, and locate the `sub` field.
3. Use the value in the **Value format** field under the first `sub` template as your `subject`. For example, this value might be `jenkins-oidc-test`.

For the purposes of this guide, you will need to replace `%your-audience%`, `%your-domain%`, and `%your-subject%` with the values from your Jenkins OIDC credential page, and the `OpenID Connect` administrative settings page.

The next section will output the new identity's `id` value. This is a unique value that represents the identity itself.

```hcl
output "jenkins-identity" {
  value = chainguard_identity.jenkins.id
}
```

The section after that looks up the `viewer` role.

```hcl
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final section grants this role to the identity.

```hcl
resource "chainguard_rolebinding" "view-stuff" {
  identity = chainguard_identity.jenkins.id
  group    = data.chainguard_group.group.id
  role     = data.chainguard_role.viewer.items[0].id
}
```

Following that, your Terraform configuration will be ready. Now you can run a few `terraform` commands to create the resources defined in your `.tf` files.

## Creating your resources

First, run `terraform init` to initialize Terraform's working directory.

```sh
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section.

```sh
terraform plan
```

If the plan worked successfully and you're satisfied that it will produce the resources you expect, you can apply it.

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```
. . .
Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + jenkins-identity = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After pressing `ENTER`, the command will complete and will output an `jenkins-identity` value.

```
. . .
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Outputs:

jenkins-identity = "<your jenkins identity>"
```

This is the identity's [UIDP (unique identity path)](/chainguard/administration/cloudevents/events-reference/#uidp-identifiers), which you configured the `jenkins.tf` file to emit in the previous section. Note this value down, as you'll need it when you test this identity using a Jenkins workflow. If you need to retrieve this UIDP later on, though, you can always run the following `chainctl` command to obtain a list of the UIDPs of all your existing identities.

```sh
chainctl iam identities ls
```

Note that you may receive a `PermissionDenied` error part way through the apply step. If so, run `chainctl auth login` once more, and then `terraform apply` again to resume creating the identity and resources.

You're now ready to create or edit a Jenkins pipeline to test out this identity.

## Testing the identity with a Jenkins pipeline

To test the identity you created with Terraform in the previous section, create or edit a pipeline job. To create a pipeline job, click the **New Item** link in the menu at the top left of your Jenkins dashboard. Give the job a title, and select **Pipeline** from the list of job types.

Once you are on the pipeline configuration page:

1. Select the **This project is parameterized** checkbox.
2. Give your parameter a name like `oidc-token`.
3. Under the **Credential type** list, select **OpenID Connect id token**.
4. Mark the parameter as required, and select your configured OIDC credential token as the `Default Value` for the parameter.

Next copy the following pipeline definition into the `Script` body for your job:

```
pipeline {
    agent any
    stages {
        stage('oidc-test') {
            steps {
                withCredentials([string(variable: 'token', credentialsId: 'oidc-token')]) {
                    sh '''
                        wget -O chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_linux_\$(uname -m)"
                        chmod +x chainctl
                        ./chainctl auth login --identity-token $token --identity <your jenkins identity>
                        ./chainctl auth configure-docker --identity-token $token --identity <your jenkins identity>
                    '''
                }
            }
        }
    }
}
```

The important line is `withCredentials` option, which maps the generated OIDC token from the `oidc-token` credential parameter to `token` variable in the pipeline step.

Now you can add the commands for testing the identity using `chainctl images repos list` in the following example:

```
sh '''
    wget -O chainctl "https://dl.enforce.dev/chainctl/latest/chainctl_linux_\$(uname -m)"
    chmod +x chainctl
    ./chainctl auth login --identity-token $token --identity <your jenkins identity>
    ./chainctl auth configure-docker --identity-token $token --identity <your jenkins identity>
    ./chainctl images repos list
    docker pull cgr.dev/<organization>/<repo>:<tag>
'''
```

Save the job, and then build it using the `Build with Parameters` option.

Assuming everything works as expected, your pipeline will be able to assume the identity and run the `chainctl images repos list` command, listing repositories available to the organization.

```
. . .
chainctl         100%[===================>]  54.34M  6.78MB/s in 13s

2023-05-17 13:19:45 (4.28 MB/s) - ‘chainctl’ saved [56983552/56983552]

Successfully exchanged token.
Valid! Id: 3f4ad8a9d5e63be71d631a359ba0a91dcade94ab/d3ed9c70b538a796
<list of repos>
```

If you'd like to experiment further with this identity and what the pipeline can do with it, there are a few parts of this setup that you can tweak. For instance, if you'd like to give this identity different permissions you can change the role data source to the role you would like to grant.

```hcl
data "chainguard_role" "editor" {
  name = "editor"
}
```

You can also edit the pipeline itself to change its behavior. For example, instead of inspecting the policies the identity has access to, you could have the workflow inspect the organizations.

```
 . . .
 - './chainctl iam organizations ls'
```

Of course, the Jenkins pipeline will only be able to perform certain actions on certain resources, depending on what kind of access you grant it.

## Removing sample resources

To remove the resources Terraform created, you can run the `terraform destroy` command.

```sh
terraform destroy
```

This will destroy the role-binding, and the identity created in this guide. It will not delete the organization.

You can then remove the working directory to clean up your system.

```sh
rm -r ~/jenkins-id/
```

Following that, all of the example resources created in this guide will be removed from your system.

## Learn more

For more information about how assumable identities work in Chainguard, check out our [conceptual overview of assumable identities](/chainguard/administration/iam-organizations/assumable-ids/). Additionally, the Terraform documentation includes a section on [recommended best practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) which you can refer to if you'd like to build on this Terraform configuration for a production environment. Likewise, for more information on using OIDC with Jenkins pipelines, we encourage you to check out the [OpenID Connect Provider documentation](https://plugins.jenkins.io/oidc-provider/).

---

### Custom identity providers
_Path: platform/administration/custom-idps/_index.md_

Example tutorials on integrating various Identity Providers (IdPs) with Chainguard.

---

### Using custom identity providers to authenticate to Chainguard
_Path: platform/administration/custom-idps/custom-idps/index.md_

The Chainguard platform supports Single Sign-on (SSO) authentication for users. By default, users can log in with GitHub, GitLab, and Google, but SSO support allows users to bring their own identity provider for authentication. This is helpful when your organization mandates using a corporate identity provider — like Okta or Azure Active Directory — to authenticate to SaaS products.

## Usage

Once an administrator has [configured an identity provider](#setup-and-administration) and set up their organization, users can authenticate at the command line and in the web console using the identity provider’s organization.

### Authenticate with `chainctl`

[`chainctl`, the Chainguard command line interface (CLI)](/platform/chainctl/), supports SSO authentication by supplying the identity provider organization name as a flag or by setting it as a default in configuration. To use a flag to authenticate using SSO, pass the `--identity-provider` flag to `chainctl auth login`.

```sh
export IDP_ID=<idp_id>
chainctl auth login --identity-provider=$IDP_ID
```

You can retrieve all your identity provider's unique IDs by running `chainctl iam identity-providers list`.

Note that you can also use the [`--headless` option](/platform/chainctl-usage/authentication-options/#headless-device-code-login) to log in with a custom IdP in an environment that doesn't have a browser installed, such as a container or a remote server. By including this option, `chainctl` will output a special URL. You can then navigate to the URL in another device's browser to log in with your custom IdP.

To log in with a custom IdP using the `--headless` option, you would run a command like the following:

```sh
chainctl auth login --headless --identity-provider=$IDP_ID
```

Then you can use the URL in this command's output to complete the login flow from another device's browser.

> **Note**: As of this writing (September 2024), using the headless login flow with a custom IdP is still an experimental feature. Please reach out to us through your customer success manager or the support portal to report any feedback. Also, until this feature becomes enabled by default, you must enable it yourself with the following command:

```sh
chainctl config set auth.device-flow chainguard
```

### Setting a default identity provider

As an alternative to remembering identity provider IDs, you can set the default identity provider by editing the `chainctl` configuration file. You can do so with the following command.

```sh
chainctl config edit
```

This will open your system's default text editor where you can edit the local `chainctl` config. Add the following lines to this file.

```yaml
default:
  identity-provider: <idp_id>
```

Then save and close the file. If your system's default editor is `nano`, for example, you can do so by pressing `CTRL + X`, `Y`, and then `ENTER`.

You can also set this with a single command using the `chainctl config set` subcommand, as in this example.

```sh
chainctl config set default.identity-provider <idp_id>
```

Once set, the configured identity provider will be used automatically any time you run `chainctl auth login`.

### Authenticate with `chainctl` using a verified organization

If your organization is [verified](/platform/administration/iam-organizations/verified-orgs/), you can use your organization name instead of the ID of your identity provider to authenticate.

```sh
chainctl auth login --org-name example.com
```

You can add your organization's name to your `chainctl` config to make this a default setting.

```yaml
defaults:
  org-name: example.com
```

To learn more about working with your `chainctl` config, you can read our doc on [How to manage `chainctl` configuration](/platform/chainctl-usage/manage-chainctl-config/).

### Authenticate with the Chainguard Console

To authenticate with the Chainguard Console, [open the login screen](https://console.chainguard.dev). Then, select one of the following options:

- To use your organization's SSO, enter your Organization or email address and click **Continue**.
- To use a third-party identity provider, click the corresponding option from the list.
- To use your email and a password, enter your email and click **Continue**.

<center><img src="/platform/administration/custom-idps/custom-idps/cg-all-signin-24.png" alt="Screenshot showing an example Chainguard login box, with all described options shown." style="width:600px;"></center>

In each of these cases, you will be redirected to an external identity provider to authenticate and then returned to the Chainguard Console. If you are using your email and a password, authentication is handled by and credentials are stored with [Auth0](https://auth0.com/).

Multi-factor authentication follows the same split. Your own identity provider manages it for users who sign in through your SSO integration, while Chainguard manages it for users who sign in with an email address and a password. See [Change or reset your MFA device](/get-started/mfa-devices/) for what each group should do to move MFA to a new device.

## Setup and administration

Chainguard SSO supports OpenID Connect (OIDC) compatible identity providers. In addition, identity providers must support the following:

- The `authorization code` grant type (sometimes called the `authorization code` *flow*).
- The standard `openid`, `email`, and `profile` scopes. Note that the Chainguard platform [will partially function](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) with only the `openid` scope, but full functionality requires the `email` and `profile` scopes as well.

Customer-managed identity providers must also have a public, unauthenticated OIDC discovery endpoint.

Typically, identity providers enable you to set up SSO by creating a specific resource on the provider's platform. For example, Ping Identity requires you to [add an application](https://docs.pingidentity.com/pingone/applications/p1_applications_add_applications.html), while Okta has you create [an app integration](https://help.okta.com/en-us/content/topics/apps/apps_apps.htm).

To set up SSO for your identity provider, you must configure one of these resources to use OIDC so that the Chainguard platform can interact with the provider. Following that, you have to configure the Chainguard platform to use that application.

### Confidential and public applications

OAuth classifies client applications as either confidential or public, and most identity providers use this terminology when you register an application. The classification determines whether your application authenticates with a client secret.

- **Confidential applications** can store credentials securely, so they authenticate with a client secret. A web application backed by a server is the typical example, and identity providers usually label these as "Web" applications.
- **Public applications** can't store credentials securely, because their code runs where the user can reach it. Native, mobile, desktop, and single-page applications fall here, and identity providers usually label these as "Native" or "SPA" applications.

A public application has no secret to prove its identity, so it uses PKCE (Proof Key for Code Exchange) instead. PKCE binds the authorization code to the client that requested it, so an intercepted code is useless to anyone else.

Chainguard supports both models:

- **Confidential**: a client ID and client secret. The integration guides describe this setup, and you can also [add PKCE on top of the client secret](/platform/administration/custom-idps/enabling-pkce/).
- **Public**: a client ID and PKCE, with no client secret. OAuth 2.1 requires this model for public clients going forward.

Identity providers usually tie this classification to the application *type* you select at registration rather than to a separate setting, and some don't let you change the type afterward. If you want a public application, choose the matching type when you first register it. For the underlying definitions, refer to [section 2.1 of RFC 6749](https://datatracker.ietf.org/doc/html/rfc6749#section-2.1); your identity provider's documentation names the application types it offers.

### Integration guides for supported identity providers

We have [published guides for multiple platforms](/platform/administration/custom-idps/), including Okta and Ping Identity. If you aren’t using one of these identity providers, you can complete the following Generic Integration Guide to configure your provider to work with Chainguard. However, be aware that Chainguard does not actively support identity providers other than the ones listed previously. If you are using an alternate identity provider, we encourage you to contact us to learn more.

### Generic integration guide

For a generic OIDC-compatible identity provider, start by creating an OIDC application. If possible, set as much metadata as possible for the application so that your users can identify this application as the Chainguard platform. The following assets and details can be helpful to include in the metadata:

- The Console homepage is [console.chainguard.dev/](https://console.chainguard.dev)
- Our terms of service can be found at [chainguard.dev/terms-of-service](https://www.chainguard.dev/terms-of-service)
- Our terms of use can be found at [chainguard.dev/terms-of-use](https://www.chainguard.dev/terms-of-use)
- Our privacy policy is located at [chainguard.dev/privacy-notice](https://www.chainguard.dev/privacy-notice)
- You can also add a Chainguard logo icon here to help your users visually identify this integration. The icon from the [Chainguard Console](https://console.chainguard.dev/logo512.png) will be suitable for most platforms

Next, configure your OIDC application as follows:

- Set redirect URI to `https://issuer.enforce.dev/oauth/callback`
- Restrict grant types to **authorization code** only. It is critical that your application does not support "client credentials", "device code", "implicit" or other grant types (sometimes called “flows”)
- Restrict response types to only authorization codes (sometimes called just “code”)
- Enable “openid”, “email” and “profile” scopes for application
- Set PKCE to **optional**. Chainguard supports PKCE for the OAuth token exchange, so you can also set it to **required** if you [enable PKCE on the Chainguard side](/platform/administration/custom-idps/enabling-pkce/). Don't disable PKCE if you plan to enable it for Chainguard.

Finally, configure a set of client credentials and make note of the following details to configure Chainguard:

- The issuer URL
- Client ID
- Client Secret

Next, use `chainctl` to log in to Chainguard with an OIDC provider (such as Google, GitHub, or GitLab) to bootstrap your account.

```sh
chainctl auth login
```

The bootstrap account can use any supported IdP -- for example you may choose to temporarily use a personal Google account. You can leave this account active as a [backup account](/platform/administration/custom-idps/custom-idps/#backup-accounts) or, if you prefer, you can delete the account by removing the role-binding after configuring the custom IdP.

Create a new identity provider using the details you noted from your OIDC application. Replace `<application_client_id>`, `<client_secret>`, and `<issuer_url>` with the values from your own application.

```sh
export NAME=my-sso-identity-provider
export CLIENT_ID=<application_client_id>
export CLIENT_SECRET=<client_secret>
export ISSUER=<issuer_url>
chainctl iam identity-provider create \
  --configuration-type=OIDC \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-issuer=${ISSUER} \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer \
  --name=${NAME}
```

`chainctl` installs the provider in your organization automatically when you belong to only one. If you have access to more than one, add `--parent=<organization_id>` to choose where it is installed.

The `oidc-issuer`, `oidc-client-id`, and `oidc-issuer-secret` values are required when setting up an OIDC configuration with `chainctl`. You must also include a unique name for each custom IdP account.

If you omit the `--default-role` option, `chainctl` prompts you to select a value interactively. This option defines the default role granted to users registering with this identity provider. The previous example specifies the `viewer` role, but depending on your needs you might choose `editor` or `owner`. For more information, refer to the [IAM and Security section](#iam-and-security).

You can retrieve a list of all your Chainguard organizations — along with their UIDPs — with the following command.

```shell
chainctl iam organizations ls -o table
```

```output
                         ID                       |    NAME    | DESCRIPTION
--------------------------------------------------------+------------+---------------------
  59156e77fb23e1e5ebcb1bd9c5edae471dd85c43           | sample_org |
  . . .                                              | . . .      |
```

Your organization selection won’t affect how your users authenticate but will have implications on who has permission to modify the SSO configuration.

## Managing existing identity providers

Identity providers can be managed via `chainctl` using the `chainctl iam identity-provider` subcommand.

To create new providers, you can use the `create` subcommand.

```sh
chainct iam identity-provider create
```

To list out every configured identity provider, run the `list` subcommand.

```sh
chainctl iam identity-provider list
```

This will return a list of details for each of your identity providers, including their names and unique IDs.

To modify an existing identity provider, use the `update` subcommand.

```sh
chainctl iam identity-provider update
```

This can be useful for rotating client credentials.

Lastly, to delete an identity provider, run the `delete` subcommand.

```sh
chainctl iam identity-provider delete
```

For more details, check out the [`chainctl` documentation for these commands](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/).

## IAM and security

Once an identity provider has been created on the Chainguard platform, any user that can authenticate with that identity provider will be able to use it to access the Chainguard platform. It’s important to note that users can do so even if they have no IAM capabilities with the IAM organization at which the identity provider is defined. Identity providers give access to the Chainguard platform, but not the specific IAM organization where the identity provider is defined.

The IAM capabilities `identity_providers.create`, `identity_providers.update`, `identity_providers.list` and `identity_providers.delete` control which users can read and manipulate identity providers. The built-in roles `viewer`, `editor` and `owner` have the following capabilities related to identity providers.

| **Role** | **Capabilities** |
|----------|----------|
| `viewer`   | `identity_providers.list`   |
| `editor`   | `identity_providers.list`   |
| `owner`   | `identity_providers.create`, `identity_providers.list`, `identity_providers.update`, `identity_providers.delete`   |

## Backup accounts

In the case of an outage or misconfiguration of your identity provider, it can be helpful to have an authentication mechanism to the Chainguard platform outside of your SSO identity provider for recovery purposes. To this end, you can use one of our OIDC login providers (currently Google, GitHub, or GitLab) to create a backup account.

As an OIDC login account needs to be set up to bootstrap the SSO identity provider initially, it’s possible to keep this account as a backup account in case you need it for recovery. However, the nature of these OIDC provider accounts is such that it is difficult to share them as a backup resource since they’re often tied to a single user.

Instead of relying on an account with an OIDC login provider, you can alternatively set up an assumable identity to use as a backup account. Refer to our [conceptual guide on assumable identities](/platform/administration/assumable-ids/assumable-ids/) to learn more.

---

### Enable PKCE for OAuth token exchange
_Path: platform/administration/custom-idps/enabling-pkce/index.md_

You can add PKCE (Proof Key for Code Exchange, commonly referred to as "pixy") to the OAuth token exchange between Chainguard and your custom identity provider (IdP). PKCE is a security extension to OAuth that adds an extra layer of protection against authorization code interception during login, and it is required by the OAuth 2.1 standard.

Chainguard supports two configurations, depending on your needs:

- **Client ID + client secret + PKCE** — In this configuration, PKCE is layered on top of your existing confidential client setup. This is additive: you keep your client ID and client secret.
- **Client ID + PKCE only, no client secret** — This is the newer "public client" model where PKCE replaces the client secret entirely, and is the approach OAuth 2.1 requires going forward.

Enabling PKCE is optional. If you leave PKCE disabled or optional on your IdP, your login behavior remains unchanged and you don't need to take any action.

## Prerequisites

To follow this guide, you need:

- A custom identity provider (such as [Okta](/platform/administration/custom-idps/idp-providers/okta/), [Microsoft Entra ID](/platform/administration/custom-idps/idp-providers/ms-entra-id/), or [Ping Identity](/platform/administration/custom-idps/idp-providers/ping-id/)) already configured for login to Chainguard. If you haven't set one up yet, refer to our guide [Using custom identity providers to authenticate to Chainguard](/platform/administration/custom-idps/custom-idps/).
- An IAM role that can manage identity providers in your Chainguard organization, such as the `owner` role.
- [`chainctl` installed](/chainguard/chainctl-usage/how-to-install-chainctl/) on your local machine. You must also authenticate with `chainctl auth login`.

The rest of this guide refers to your identity provider by its UIDP, stored in the `IDENTITY_PROVIDER` environment variable. Retrieve and set it with the following command:

```sh
export IDENTITY_PROVIDER=$(chainctl iam identity-providers list -o json | jq -r '.items[0].id')
```

This command selects the first identity provider the list returns. If your account can access more than one identity provider, replace `.items[0]` with a filter that matches the one you want, or set the variable to the UIDP manually.

## Option 1: Client ID + client secret + PKCE

This option adds PKCE on top of an existing confidential client setup. You keep using your client ID and client secret, and PKCE is layered on as an additional protection.

To enable it, complete the following steps:

1. In your identity provider, locate the application registration used for your Chainguard integration.
2. Enable PKCE for that application. This is typically a toggle or checkbox labeled "Require PKCE" or similar.
3. Update your identity provider configuration on the Chainguard platform to turn on PKCE:

    ```sh
    chainctl iam identity-providers update $IDENTITY_PROVIDER --oidc-pkce-enabled
    ```

    You can also set this at creation time by including the `--oidc-pkce-enabled` flag with [`chainctl iam identity-providers create`](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_create/).

> **Note**: Complete steps 1 and 2 before you run the command in step 3. When you enable PKCE on the Chainguard side, we check your IdP's configuration and reject it if your IdP explicitly advertises that it doesn't support PKCE. Not all IdPs advertise this either way, so a successful command doesn't guarantee that your IdP is configured correctly.

## Option 2: Client ID + PKCE only, no client secret

Unlike Option 1, this usually isn't a setting you can toggle on or off. Most IdPs tie "public client" (no secret) behavior to the *type* of application you've registered, not just a PKCE setting. To go secret-free, the application must be a type your IdP treats as a public client.

Whether you can change an existing application's type depends on your identity provider. Some providers, including Okta, don't allow it: a "Web" app in Okta is confidential and always expects a secret, even with PKCE enabled. If your provider won't let you convert an existing application, you can instead register a new application as a public client type from the start, then create a matching identity provider configuration in Chainguard that includes the `--oidc-pkce-enabled` flag and omits the `--oidc-client-secret` flag.

To switch an existing application, complete the following steps:

1. In your identity provider, locate the application registration used for your Chainguard integration and change its type to a public client type, such as **Native** or **SPA** in Okta, or the equivalent for your IdP.
2. Confirm that PKCE is required for that application.
3. Update your identity provider configuration on the Chainguard platform to remove the client secret and turn on PKCE:

    ```sh
    chainctl iam identity-providers update $IDENTITY_PROVIDER --oidc-client-secret="" --oidc-pkce-enabled
    ```

    You must explicitly set the `--oidc-client-secret` field to `""` to clear it. The configured IdP must always have either a client secret or PKCE enabled.

> **Note**: Complete steps 1 and 2 before you run the command in step 3. When you enable PKCE on the Chainguard side, we check your IdP's configuration and reject it if your IdP explicitly advertises that it doesn't support PKCE. Not all IdPs advertise this either way, so a successful command doesn't guarantee that your IdP is configured correctly.

## Verify that PKCE is enabled

After completing either option, confirm that Chainguard has PKCE enabled for your identity provider:

```sh
chainctl iam identity-providers list -o json | jq '.items[] | {name, pkce: .oidc.pkce_enabled}'
```

If PKCE is enabled, your provider reports `"pkce": true`. You can also run `chainctl iam identity-providers list -o table` and look for `PKCE Enabled` in the `CONFIGURATION` column.

This checks the Chainguard side of the configuration only. Chainguard never returns client secrets in command output, so these commands can't confirm that a secret has been removed.

Next, test a login from end to end:

```sh
chainctl auth login --identity-provider=$IDENTITY_PROVIDER
```

You can also log in with your organization name:

```sh
chainctl auth login --org-name=example.com
```

A successful login completes the browser redirect and returns an authenticated session. If you have any questions or issues, contact your Customer Success Team or Support, and we'll help confirm your configuration is working correctly.

---

### How to integrate Microsoft Entra ID SSO with Chainguard
_Path: platform/administration/custom-idps/idp-providers/ms-entra-id/index.md_

The Chainguard platform supports single sign-on (SSO) authentication for users. By default, users can log in with GitHub, GitLab, and Google, but SSO support lets users bring their own identity provider for authentication.

This guide outlines how to register a Microsoft Entra ID (formerly Azure Active Directory) application and integrate it with Chainguard. After completing this guide, you'll be able to log in to Chainguard using Entra ID and you'll no longer be limited to the default SSO options.

{{< note >}}
If you plan to use SCIM provisioning, check out our guide on [how to provision users into Chainguard from Microsoft Entra ID with SCIM](/platform/administration/custom-idps/scim-provisioning/ms-entra-id-scim/) instead. That guide covers SSO as well, and it creates the identity provider with the correlation rule SCIM linking depends on. The correlation rule is immutable, so adding it later means deleting and recreating your identity provider.
{{< /note >}}

## Prerequisites

To complete this guide, you need the following:

* `chainctl` installed on your system. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed.
* Owner permissions on the Chainguard organization where you want to install the identity provider.
* An Entra ID account with [Global Administrator](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference#global-administrator) or [Application Administrator](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference#application-administrator) permissions. Without one of these roles, you can't register applications or assign users to them.
* A workforce Entra ID tenant. External ID (CIAM) tenants use a different application model, and this guide doesn't cover them.

## Create a Microsoft Entra ID application

1. Log in to the [Microsoft Entra admin center](https://entra.microsoft.com) and navigate to **Entra ID** > **App registrations**.
2. Click **New registration** and configure the application:
   * **Name**: Set the name to "Chainguard" (or similar) so users recognize this application is for authentication to Chainguard.
   * **Supported account types**: Select **Single tenant only** so that only your organization can use this application to authenticate to Chainguard.
   * **Redirect URI**: Set the platform to **Web** and the URI to `https://issuer.enforce.dev/oauth/callback`.
3. Click **Register**.
4. On the application's **Overview** tab, note the **Application (client) ID** and the **Directory (tenant) ID**.
5. Open **Manage** > **Certificates & secrets** and click **New client secret**.
6. Add a description, set an expiration, and click **Add**. Note the secret's **Value**.

> **Warning**: Entra ID shows the secret's **Value** only once, and SSO through this application stops working when the secret expires. Record the expiration date so you can rotate the secret before then.

You'll need all three of the values you noted — the client ID, the tenant ID, and the client secret — in the next section.

### Restrict who can log in

By default, any user in your tenant can authenticate through this application. To limit access to specific users and groups:

1. Open **Entra ID** > **Enterprise applications** and select the application you just registered.
2. On its **Properties** page, set **Assignment required?** to **Yes**.
3. Under **Users and groups**, assign the users or groups you want to have access.

Users can't log in to Chainguard unless they have access to the application, so grant access before directing them to log in.

## Configure Chainguard to use Microsoft Entra ID

Now that your Microsoft Entra ID application is ready, you can create the custom identity provider.

First, log in to Chainguard with `chainctl`, using an OIDC provider like Google, GitHub, or GitLab to bootstrap your account.

```sh
chainctl auth login
```

Note that you can use this bootstrap account as a [backup account](/chainguard/administration/custom-idps/custom-idps/#backup-accounts) — that is, an account you can use to log in if you ever lose access to your primary account. However, if you prefer to remove this role-binding after configuring the custom IdP, you can do so.

If you belong to more than one Chainguard organization, you also need the ID of the one where you want to install the identity provider. Your choice doesn't affect how your users authenticate, but it does determine who has permission to modify the SSO configuration.

To retrieve a list of the Chainguard organizations you belong to, along with their IDs, run the following command.

```sh
chainctl iam organizations ls -o table
```

```output
                    ID                    |    NAME    | STATUS |           DESCRIPTION
------------------------------------------|------------|--------|----------------------------------
 591**********************************c43 | sample_org | ready  | A sample Chainguard organization
 . . .                                    | . . .      | . . .  | . . .
```

Note the `ID` value for your chosen organization.

With this information in hand, create a new identity provider with the following commands. Replace `<application_client_id>`, `<client_secret>`, and `<directory_tenant_id>` with the values from your Entra ID application.

```sh
export NAME=entra-id
export CLIENT_ID=<application_client_id>
export CLIENT_SECRET=<client_secret>
export TENANT_ID=<directory_tenant_id>
export ISSUER="https://login.microsoftonline.com/${TENANT_ID}/v2.0"
chainctl iam identity-providers create \
  --configuration-type=OIDC \
  --name=${NAME} \
  --oidc-issuer=${ISSUER} \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer
```

`chainctl` installs the provider in your organization automatically when you belong to only one. If you have access to more than one, add `--parent=<organization_id>` to choose where it is installed.

{{< note >}}
Customers using Azure Government Cloud should set `ISSUER="https://login.microsoftonline.us/${TENANT_ID}/v2.0"` instead.
{{< /note >}}

Pass `--oidc-additional-scopes` once per scope; comma-separating the scopes doesn't work.

The `--default-role` option defines the default role granted to users registering with this identity provider. This example specifies the `viewer` role, but depending on your needs you might choose `editor` or `owner`. If you don't include this option, `chainctl` prompts you to specify the role interactively. For more information, refer to the [IAM and security section](/chainguard/administration/custom-idps/custom-idps/#iam-and-security) of our Introduction to Custom Identity Providers in Chainguard tutorial.

You can refer to our [Generic integration guide](/chainguard/administration/custom-idps/custom-idps/#generic-integration-guide) in our Introduction to Custom Identity Providers doc for more information about the `chainctl iam identity-providers create` command and its required options.

## Log in to Chainguard with the Entra ID identity provider

To log in to the Chainguard Console with the new identity provider you just created, navigate to [console.chainguard.dev/auth/login](https://console.chainguard.dev/auth/login), enter your Chainguard organization's name into the **Email or organization** box, and click **Continue**. This opens a new window with the Microsoft Entra ID login flow, where you can complete the login process.

You can also use the custom identity provider to log in through `chainctl`. To do this, run the `chainctl auth login` command and add the `--identity-provider` option followed by the identity provider's ID value:

```sh
chainctl auth login --identity-provider <idp_id>
```

The ID value appears in the `ID` column of the table returned by the `chainctl iam identity-providers create` command you ran previously. You can also retrieve this table at any time by running `chainctl iam identity-providers ls -o table` when logged in.

To have Entra ID create and deactivate Chainguard user accounts automatically as you assign and unassign them, check out our guide on [how to provision users into Chainguard from Microsoft Entra ID with SCIM](/platform/administration/custom-idps/scim-provisioning/ms-entra-id-scim/).

---

### How to integrate Keycloak with Chainguard
_Path: platform/administration/custom-idps/idp-providers/keycloak/index.md_

By default, the Chainguard platform supports Single sign-on (SSO) authentication for users with GitHub, GitLab, and Google.

This guide outlines how to create a [Keycloak](https://www.keycloak.org/) Client on your existing Keycloak instance and integrate it with Chainguard. After completing this guide, you'll be able to log in to Chainguard using Keycloak and will no longer be limited to the default SSO options.

## Prerequisites

To complete this guide, you will need the following:

* `chainctl` installed on your system. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed.
* An existing Keycloak instance with admin access to the realm you will be using to authenticate.

## Create a Keycloak client

To integrate Keycloak with the Chainguard platform, log in to your Keycloak admin interface. In the left-hand navigation menu, select **Create client**.

<center><img src="keycloak-0.png" alt="Screenshot of Keycloak's Admin menu, with the 'Create Client' option highlighted in a red box."></center>
<br />

Configure the new client through the wizard:

1. Set the **Client Type** to OIDC Connect and set your **Client ID**. Add a friendly **Name** and **Description** if desired. Note your **Client ID** value — you'll need it to configure the Chainguard platform to use this Keycloak Client. Click **Next**.
2. Toggle **Client Authentication** on and click **Next**.
3. Set the Chainguard platform redirect URI in the **Valid redirect URIs** field, then click **Save** to finalize the client.

Navigate to the **Credentials** tab of your newly created client.

<center><img src="keycloak-4.png" alt="Screenshot of the newly created Keycloak Client, with the Credentials tab highlighted in a red box."></center>
<br />

Copy the **Client Secret** value. You'll need this to configure the Chainguard platform to use this Keycloak Client.

## Configure Chainguard to use your Keycloak client

Now that your Keycloak Client is ready, you can create the custom identity provider.

First, log in to Chainguard with `chainctl`, using an OIDC provider like Google, GitHub, or GitLab to bootstrap your account.

```sh
chainctl auth login
```

Note that this bootstrap account can be used as a [backup account](/chainguard/administration/custom-idps/custom-idps/#backup-accounts) (that is, a backup account you can use to log in if you ever lose access to your primary account). However, if you prefer to remove this role-binding after configuring the custom IdP, you may also do so.

To configure Chainguard, make a note of the following details from your Keycloak Client:

* **Client ID**: This can be found on the **Settings** tab of the Keycloak Client.
* **Client Secret**: This can be found on the **Credentials** tab of the Keycloak Client.
* **Issuer**: Your **Issuer** URL is defined by the following pattern `https://<keycloak_server_address>/realms/<realm_name>`

If you belong to more than one Chainguard organization, you will also need the UIDP of the one under which you want to install the identity provider. Your selection won’t affect how your users authenticate but will have implications on who has permission to modify the SSO configuration.

You can retrieve a list of all the Chainguard organizations you belong to — along with their UIDPs — with the following command.

```shell
chainctl iam organizations ls -o table
```

```output
                    ID                    |    NAME    | STATUS |           DESCRIPTION
------------------------------------------|------------|--------|----------------------------------
 591**********************************c43 | sample_org | ready  | A sample Chainguard organization
 . . .                                    | . . .      | . . .  | . . .
```

Note down the `ID` value for your chosen organization.

With this information in hand, create a new identity provider with the following commands. Replace `<client_id>` and `<client_secret>` with the values from your Keycloak client, and `<keycloak_server_address>` and `<realm_name>` with your Keycloak server address and realm.

```sh
export NAME=keycloak-idp
export CLIENT_ID=<client_id>
export CLIENT_SECRET=<client_secret>
export ISSUER="https://<keycloak_server_address>/realms/<realm_name>"
chainctl iam identity-provider create \
  --configuration-type=OIDC \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-issuer=${ISSUER} \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer \
  --name=${NAME}
```

`chainctl` installs the provider in your organization automatically when you belong to only one. If you have access to more than one, add `--parent=<organization_id>` to choose where it is installed.

Note the `--default-role` option. This defines the default role granted to users registering with this identity provider. This example specifies the `viewer` role, but depending on your needs you might choose `editor` or `owner`. If you don't include this option, you'll be prompted to specify the role interactively. For more information, refer to the [IAM and security section](/chainguard/administration/custom-idps/custom-idps/#iam-and-security) of our Introduction to Custom Identity Providers in Chainguard tutorial.

You can refer to our [Generic integration guide](/chainguard/administration/custom-idps/custom-idps/#generic-integration-guide) in our Introduction to Custom Identity Providers article for more information about the `chainctl iam identity-provider create` command and its required options.

To log in to the Chainguard Console with the new identity provider you just created, navigate to [console.chainguard.dev](https://console.chainguard.dev) and click **Use Your Identity Provider**. Next, click **Use Your Organization Name** and enter the name of the organization associated with the new identity provider. Finally, click the **Login with Provider** button. This will open up a new window with the Keycloak login flow, allowing you to complete the login process through there.

You can also use the custom identity provider to log in through `chainctl`. To do this, run the `chainctl auth login` command and add the `--identity-provider` option followed by the identity provider's ID value:

```sh
chainctl auth login --identity-provider <idp_id>
```

The ID value appears in the `ID` column of the table returned by the `chainctl iam identity-provider create` command you ran previously. You can also retrieve this table at any time by running `chainctl iam identity-provider ls -o table` when logged in.

---

### How to integrate Okta SSO with Chainguard
_Path: platform/administration/custom-idps/idp-providers/okta/index.md_

The Chainguard platform supports single sign-on (SSO) authentication for users. By default, users can log in with GitHub, GitLab, and Google, but SSO support lets users bring their own identity provider for authentication.

This guide outlines how to create an Okta application and integrate it with Chainguard. After completing this guide, you'll be able to log in to Chainguard using Okta and you'll no longer be limited to the default SSO options.

## Prerequisites

To complete this guide, you need the following.

* `chainctl` installed on your system. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed.
* An Okta account over which you have administrative access.

## Create an Okta app integration

To integrate your Okta identity provider with the Chainguard platform, [log in to Okta](https://www.okta.com/login/) and navigate to the **Applications** landing page in the Admin console. There, click **Create App Integration**.

Select **OIDC - OpenID Connect** as the sign-in method and **Web Application** as the application type.

> **Note**: A Web Application is a confidential client and always expects a client secret. You can [add PKCE to the token exchange](/platform/administration/custom-idps/enabling-pkce/) on top of that secret. To use a secret-free public client instead, select **Native** or **SPA** here, since Okta doesn't let you change an application's type after you create it.

Next, in the **General Settings** window, configure the application as follows:

* **App integration name**: Enter a descriptive name (like "Chainguard") here.
* **Grant type**: Ensure that the grant type is set to **Authorization Code** only.

> **Warning**: Don't select other grant types, because doing so may compromise your security.

* **Sign-in redirect URIs**: Set the redirect URI to the following.

    ```URI
    https://issuer.enforce.dev/oauth/callback
    ```

* **Sign-out redirect URIs**: This field has a URI set to `http://localhost:8080` by default. Click the **X** icon to remove the sign-out redirect entirely, leaving the field blank.
* **Assignments**: You must select one of the options in this section:
    * **Allow everyone in your organization to access**: This option grants access to any [users](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-people.htm) you've added to your Okta organization.
    * **Limit access to selected groups**: If you select this option, you can select one or more Okta groups to have access to the identity provider.
    * **Skip group assignment for now**: You can select this option and configure group assignment later. However, note that users **will not** be able to log in unless they have been granted access to the application.

> **Note**: For more information on Okta users and groups, refer to [the official documentation](https://help.okta.com/en-us/content/topics/users-groups-profiles/usgp-main.htm).

Click **Save**. Then, navigate to the **Sign On** tab.

There, find the **OpenID Connect ID Token** section and click **Edit**. Set the **Issuer** option to **Okta URL**, then click **Save**.

With that, you've configured the Okta application. Next, you need to configure the Chainguard platform to use it by creating a custom identity provider.

## Configure Chainguard to use Okta SSO

Now that your Okta application is ready, you can create the custom identity provider.

First, log in to Chainguard with `chainctl`, using an OIDC provider like Google, GitHub, or GitLab to bootstrap your account.

```shell
chainctl auth login
```

Note that you can use this bootstrap account as a [backup account](/chainguard/administration/custom-idps/custom-idps/#backup-accounts) — that is, an account you can use to log in if you ever lose access to your primary account. However, if you prefer to remove this role-binding after configuring the custom IdP, you can do so.

To configure the platform, make a note of the following settings from your Okta Application:

* **Client ID**: You can find this on the **General** tab under **Client Credentials**
* **Client Secret**: Find this on the **General** tab under **Client Credentials**
* **Issuer URL**: You can find this under the **Sign On** tab in the **OpenID Connect ID Token** section

With this information in hand, create a new identity provider with the following commands. Replace `<client_id>`, `<client_secret>`, and `<issuer_url>` with the values you just noted.

```shell
export NAME=okta
export CLIENT_ID=<client_id>
export CLIENT_SECRET=<client_secret>
export ISSUER=<issuer_url>
chainctl iam identity-provider create \
  --configuration-type=OIDC \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-issuer=${ISSUER} \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer \
  --name=${NAME}
```

Note the `--default-role` option. This defines the default role granted to users registering with this identity provider. This example specifies the `viewer` role, but depending on your needs you might choose `editor` or `owner`. If you don't include this option, you'll be prompted to specify the role interactively. For more information, refer to the [IAM and security section](/chainguard/administration/custom-idps/custom-idps/#iam-and-security) of our Introduction to Custom Identity Providers in Chainguard tutorial.

You can refer to our [Generic integration guide](/chainguard/administration/custom-idps/custom-idps/#generic-integration-guide) in our Introduction to Custom Identity Providers article for more information about the `chainctl iam identity-provider create` command and its required options.

## Log in to Chainguard with the Okta identity provider

To log in to the Chainguard Console with the new identity provider you just created, navigate to [console.chainguard.dev/auth/login](https://console.chainguard.dev/auth/login), enter your Chainguard organization's name into the **Email or organization** box, and click **Continue**. This opens a new window with the Okta login flow, where you can complete the login process.

You can also use the custom identity provider to log in through `chainctl`. To do this, run the `chainctl auth login` command and add the `--identity-provider` option followed by the identity provider's ID value:

```shell
chainctl auth login --identity-provider <idp_id>
```

The ID value appears in the `ID` column of the table returned by the `chainctl iam identity-provider create` command you ran previously. You can also retrieve this table at any time by running `chainctl iam identity-provider ls -o table` when logged in.

To have Okta create and deactivate Chainguard user accounts automatically as you assign and unassign them, check out our guide on [how to provision users into Chainguard from Okta with SCIM](/platform/administration/custom-idps/scim-provisioning/okta-scim/).

---

### How to integrate Ping Identity SSO with Chainguard
_Path: platform/administration/custom-idps/idp-providers/ping-id/index.md_

The Chainguard platform supports Single sign-on (SSO) authentication for users. By default, users can log in with GitHub, GitLab and Google, but SSO support allows users to bring their own identity provider for authentication.

This guide outlines how to create a Ping Identity application and integrate it with Chainguard. After completing this guide, you'll be able to log in to Chainguard using Ping and will no longer be limited to the default SSO options.

## Prerequisites

To complete this guide, you will need the following.

* `chainctl` installed on your system. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed.
* A Ping Identity account over which you have administrative access.

## Create a Ping Identity application

To integrate the Ping identity provider with the Chainguard platform, [sign on to Ping Identity](https://www.pingidentity.com/en.html) and navigate to the Dashboard. Click on the **Applications** tab in the left-hand sidebar menu, and then click on **Applications** in the resulting dropdown menu. From the Applications landing page, click the plus sign (**➕**) to set up a new application.

<center><img src="ping-1.png" alt="Screenshot of the Ping Identity Dashboard, showing the applications landing page. The Applications tab in the left hand sidebar and the 'add application' plus sign icon are highlighted in yellow." style="width:950px;"></center>
<br />

Configure the application as follows:

* **Application Name**: Set a descriptive name (such as "Chainguard") and optional description to ensure users recognize this application is for authentication to the Chainguard platform.
* **Icon**: You can optionally add a Chainguard logo icon here to help your users visually identify this integration. If you'd like, you can use the icon from the [Chainguard Console](https://console.chainguard.dev/logo512.png).
* **Application Type**: Select **OIDC Web App**.

After setting these details, click the **Save** button.

Next, configure scopes for the application. In the **Overview** tab, click the **Resource Access** scope button.

<center><img src="ping-3.png" alt="Screenshot of the Overview tab, with the Resource Access scope button highlighted in a yellow box." style="width:950px;"></center>
<br />

Add **email** and **profile** scopes, then save.

Next, configure the OIDC application. Navigate to the **Configuration** tab and click the pencil-shaped "edit" icon.

To configure the application, add the following settings.

* **Response Type**: Select the **Code** checkbox.
* **Grant Type**: Select the **Authorization Code** checkbox, and set PKCE Enforcement to "Optional." You can instead set this to "Required" if you [enable PKCE for the token exchange](/platform/administration/custom-idps/enabling-pkce/) on the Chainguard side.

> Warning: Setting a grant type other than **Authorization Code** may compromise your security posture.

* **Redirect URIs**: Set the Redirect URI to [`https://issuer.enforce.dev/oauth/callback`](https://issuer.enforce.dev/oauth/callback).

Click the **Save** button to save your configuration.

Finally, enable the Chainguard application by toggling the button in the top right corner.

This completes configuration of the Ping application. You're now ready to configure the Chainguard platform to use it.

## Configure Chainguard to use Ping SSO

Now that your Okta application is ready, you can create the custom identity provider.

First, log in to Chainguard with `chainctl`, using an OIDC provider like Google, GitHub, or GitLab to bootstrap your account.

```sh
chainctl auth login
```

Note that this bootstrap account can be used as a [backup account](/chainguard/administration/custom-idps/custom-idps/#backup-accounts) (that is, a backup account you can use to log in if you ever lose access to your primary account). However, if you prefer to remove this role-binding after configuring the custom IdP, you may also do so.

To configure Chainguard make a note of the following settings from your Ping application. These can be found in the Ping console under the **Configuration** tab of the **Application** page.

* Client ID
* Client Secret
* Issuer URL

If you belong to more than one Chainguard organization, you will also need the UIDP of the one under which you want to install the identity provider. Your selection won’t affect how your users authenticate but will have implications on who has permission to modify the SSO configuration.

You can retrieve a list of all the Chainguard organizations you belong to — along with their UIDPs — with the following command.

```shell
chainctl iam organizations ls -o table
```

```output
                    ID                    |    NAME    | STATUS |           DESCRIPTION
------------------------------------------|------------|--------|----------------------------------
 591**********************************c43 | sample_org | ready  | A sample Chainguard organization
 . . .                                    | . . .      | . . .  | . . .
```

Note down the `ID` value for your chosen organization.

With this information in hand, create a new identity provider with the following commands. Replace `<client_id>`, `<client_secret>`, and `<issuer_url>` with the values from your Ping Identity application.

```sh
export NAME=ping-id
export CLIENT_ID=<client_id>
export CLIENT_SECRET=<client_secret>
export ISSUER=<issuer_url>
chainctl iam identity-provider create \
  --configuration-type=OIDC \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-issuer=${ISSUER} \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer \
  --name=${NAME}
```

`chainctl` installs the provider in your organization automatically when you belong to only one. If you have access to more than one, add `--parent=<organization_id>` to choose where it is installed.

Note the `--default-role` option. This defines the default role granted to users registering with this identity provider. This example specifies the `viewer` role, but depending on your needs you might choose `editor` or `owner`. If you don't include this option, you'll be prompted to specify the role interactively. For more information, refer to the [IAM and security section](/chainguard/administration/custom-idps/custom-idps/#iam-and-security) of our Introduction to Custom Identity Providers in Chainguard tutorial.

You can refer to our [Generic integration guide](/chainguard/administration/custom-idps/custom-idps/#generic-integration-guide) in our Introduction to Custom Identity Providers guide for more information about the `chainctl iam identity-provider create` command and its required options.

To log in to the Chainguard Console with the new identity provider you just created, navigate to [console.chainguard.dev](https://console.chainguard.dev) and click **Use Your Identity Provider**. Next, click **Use Your Organization Name** and enter the name of the organization associated with the new identity provider. Finally, click the **Login with Provider** button. This will open up a new window with the Ping Identity login flow, allowing you to complete the login process through there.

You can also use the custom identity provider to log in through `chainctl`. To do this, run the `chainctl auth login` command and add the `--identity-provider` option followed by the identity provider's ID value:

```sh
chainctl auth login --identity-provider <idp_id>
```

The ID value appears in the `ID` column of the table returned by the `chainctl iam identity-provider create` command you ran previously. You can also retrieve this table at any time by running `chainctl iam identity-provider ls -o table` when logged in.

---

### Provision Chainguard users with SCIM
_Path: platform/administration/custom-idps/scim-provisioning/scim-overview.md_

System for Cross-domain Identity Management (SCIM) is an open standard for automating the exchange of user identity information between systems. Chainguard uses SCIM to create and deactivate user accounts based on your identity provider (IdP). Connect your IdP's SCIM provisioning once; from then on, assigning a user to the application provisions them, and deactivating or unassigning them removes their Chainguard access. Accounts follow your IdP, so you manage access in one place.

Chainguard's SCIM provisioning manages accounts, not roles. To grant roles from IdP group membership, use [group mappings](/platform/administration/custom-idps/grant-roles-from-groups/); the two are independent, and you can use either or both. Chainguard's SCIM endpoint accepts user provisioning only: group provisioning over SCIM is not yet available, so leave your IdP's SCIM group push turned off.

This page explains how provisioning behaves and how to manage the connection over its lifetime. To connect a specific identity provider, follow its guide:

* [Okta SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/okta-scim/)
* [Microsoft Entra ID SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/ms-entra-id-scim/)

## How SCIM provisioning works

Provisioning behaves the same way for every provider:

* **Provisioning creates records, logins create accounts.** When your IdP provisions a user, Chainguard stores a provisioning record. Chainguard creates the user's account the first time they log in, exactly as it would without SCIM, and connects it to their provisioning record automatically. Users who have logged in before are connected at their next login, with no re-registration; their existing access is unaffected.
* **Matching is by `externalId`, never by email.** A provisioned user connects to a login by matching the SCIM `externalId` your IdP sends against the subject of the login token. Each provider guide covers how to make the two align. Chainguard never uses email addresses for matching.
* **Deactivation takes effect at the user's next login or token refresh.** When your IdP deactivates or unassigns a provisioned user, their current access token runs out on its own schedule (up to an hour), and Chainguard refuses every attempt to log in or refresh after the deactivation. Reactivating the user in your IdP restores their ability to log in; it does not restore any role bindings that were removed while they were deactivated.
* **Provisioning does not assign roles.** A provisioned user who logs in gets the identity provider's default role, plus any group-mapped roles and role bindings they hold, same as any other user.
* **Enabling SCIM does not restrict other logins.** Users who aren't provisioned log in exactly as before; provisioning adds lifecycle control only for the users your IdP sends.

## Prerequisites

The provider guides share the following prerequisites:

* A custom identity provider already configured for login to Chainguard. If you haven't set one up yet, refer to our guide on [using custom identity providers](/platform/administration/custom-idps/custom-idps/).
* An IAM role that can manage identity providers in your organization, such as the owner role.
* Two owners with directly assigned role bindings in your organization. Enabling SCIM requires this, so that access to your organization never depends entirely on the IdP that SCIM controls. Roles held through group mappings don't count toward the two: Chainguard grants them per session at login, which an IdP outage would interrupt. Organizations that manage access through groups often have only their creator as a directly assigned owner, so check this first.
* `chainctl` installed on your local machine. Follow our guide on [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed. You must also authenticate with `chainctl auth login`.

The commands on this page refer to your identity provider by its UIDP, stored in the `IDENTITY_PROVIDER` environment variable. Retrieve and set it with the following command:

```sh
export IDENTITY_PROVIDER=$(chainctl iam identity-providers list -o json | jq -r '.items[0].id')
```

Organizations generally have one identity provider, so the list usually holds a single entry and the `.items[0].id` filter selects it. If the list holds more than one — because you belong to several organizations, or your organization has several providers — run `chainctl iam identity-providers list` on its own and set `IDENTITY_PROVIDER` to the UIDP of the provider you are configuring.

## The SCIM token

Your IdP authenticates to Chainguard's SCIM endpoint with a bearer token. Generate it with the following command:

```sh
chainctl iam identity-providers scim token generate $IDENTITY_PROVIDER
```

This command prints the token to standard output and the SCIM endpoint URL and expiry to standard error. Chainguard shows the token exactly once and stores only a digest of it, so paste it into your IdP right away. If you lose it, create a replacement with the `regenerate` command shown in [Manage provisioning](#manage-provisioning).

Tokens expire after one year by default. Set a different lifetime with `--expires-in` (up to two years), or issue a non-expiring token with `--never-expires`.

## Enable and disable provisioning

Generating a token does not start provisioning. Enable it with the following command:

```sh
chainctl iam identity-providers scim enable $IDENTITY_PROVIDER
```

Chainguard now accepts provisioning requests from your IdP. If the command fails with a message about owner-tier identities, your organization doesn't yet have two directly assigned owners; refer to [Prerequisites](#prerequisites).

Disabling stops Chainguard from accepting provisioning requests. It doesn't invalidate the token, and already provisioned users are unaffected:

```sh
chainctl iam identity-providers scim disable $IDENTITY_PROVIDER
```

## Manage provisioning

* **Rotate the token.** Replace the token while your IdP keeps working through the change. The previous token keeps authenticating for the overlap window (one hour by default, up to 24 hours) while you paste the new one into your IdP:

    ```sh
    chainctl iam identity-providers scim token regenerate $IDENTITY_PROVIDER --overlap 1h
    ```

* **Revoke the token.** If you suspect the token is exposed, revoke it. This immediately invalidates the current token and any overlap token:

    ```sh
    chainctl iam identity-providers scim token revoke $IDENTITY_PROVIDER
    ```

    Provisioning requests fail until you regenerate a replacement; revoking contains a compromise without turning provisioning off. If you want an immediate replacement instead of a stop, regenerate with `--overlap 0`.

* **Delete a user in your IdP.** If your IdP sends a SCIM delete (distinct from deactivation), Chainguard removes the provisioning record entirely and deactivates the user's account.

Token lifecycle and the on/off switch are independent: rotating or revoking a token never disables provisioning, and disabling never invalidates a token.

## Limits

* Chainguard rate limits provisioning write requests (create, update, deactivate) per organization and per source address. Past the limit, requests receive HTTP `429` with a `Retry-After` header; IdPs retry on their own schedule.
* Chainguard caps request bodies on writes at 256 KiB, which is larger than any standard SCIM user payload.

## Related resources

* [How to provision users into Chainguard from Okta with SCIM](/platform/administration/custom-idps/scim-provisioning/okta-scim/)
* [How to provision users into Chainguard from Microsoft Entra ID with SCIM](/platform/administration/custom-idps/scim-provisioning/ms-entra-id-scim/)
* [Grant Chainguard roles from identity provider groups](/platform/administration/custom-idps/grant-roles-from-groups/)
* [Using custom identity providers to authenticate to Chainguard](/platform/administration/custom-idps/custom-idps/)
* [Overview of the Chainguard IAM model](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/)

---

### How to provision users into Chainguard from Microsoft Entra ID with SCIM
_Path: platform/administration/custom-idps/scim-provisioning/ms-entra-id-scim/index.md_

The Chainguard platform supports SCIM 2.0 provisioning from Microsoft Entra ID. With SCIM enabled, Entra ID creates, updates, and deactivates Chainguard users as you assign and unassign them in your directory, and Chainguard links each provisioned user to their single sign-on (SSO) identity the first time they log in.

This guide outlines how to register an Entra ID application for SSO, create a Chainguard identity provider for it, and configure an Entra ID enterprise application for SCIM provisioning. Set up SSO first, since provisioning links users to their SSO logins. For provisioning behavior, token lifecycle, and limits, refer to [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/).

## Prerequisites

To complete this guide, you need the following:

* `chainctl` installed on your system. Follow our guide on [How to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you don't already have this installed.
* Owner permissions on the Chainguard organization where you want to install the identity provider.
* The [prerequisites for SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/scim-overview/#prerequisites), including two owners with directly assigned role bindings in your organization.
* An Entra ID account with Global Administrator or Application Administrator permissions. Without these, you cannot register applications or assign users to them.
* An Entra ID P1 or P2 license. The **Automatic** provisioning mode this guide uses requires one.
* A workforce Entra ID tenant. External ID (CIAM) tenants use a different application model, and this guide doesn't cover them.

## Register the Entra ID application for SSO

Log in to the [Microsoft Entra admin center](https://entra.microsoft.com), navigate to **Entra ID** > **App registrations**, and click **New registration**. Configure the application as follows.

* **Name**: Set the name to "Chainguard" (or similar) so users recognize this application is for authentication to Chainguard.
* **Supported account types**: Select **Single tenant** so that only your organization can use this application to authenticate to Chainguard.
* **Redirect URI**: Set the platform to **Web** and the URI to `https://issuer.enforce.dev/oauth/callback`.

Click **Register**. From the application's **Overview** tab, note the **Application (client) ID** and the **Directory (tenant) ID**.

Then open **Certificates & secrets**, click **New client secret**, set a description and expiration, and note the secret **Value**. Entra ID shows the Value only once, and SSO stops working when the secret expires. You'll need all three values in the next step.

## Create the Chainguard identity provider

Log in to Chainguard with `chainctl`, using an OIDC provider like Google, GitHub, or GitLab to bootstrap your account.

```sh
chainctl auth login
```

This bootstrap account can serve as a [backup account](/platform/administration/custom-idps/custom-idps/#backup-accounts) if you ever lose access to your primary login.

If you belong to more than one organization, retrieve the ID of the one where you want to install the identity provider.

```sh
chainctl iam organizations ls -o table
```

Then create the identity provider. Replace `<application_client_id>`, `<client_secret>`, and `<directory_tenant_id>` with the three values from the previous step.

```sh
export NAME=entra-id
export CLIENT_ID=<application_client_id>
export CLIENT_SECRET=<client_secret>
export TENANT_ID=<directory_tenant_id>
export ISSUER="https://login.microsoftonline.com/${TENANT_ID}/v2.0"
chainctl iam identity-providers create \
  --configuration-type=OIDC \
  --name=${NAME} \
  --oidc-issuer=${ISSUER} \
  --oidc-client-id=${CLIENT_ID} \
  --oidc-client-secret=${CLIENT_SECRET} \
  --oidc-correlation-rule=oid_equals_external_id \
  --oidc-additional-scopes=email \
  --oidc-additional-scopes=profile \
  --default-role=viewer \
  -o json
```

`chainctl` installs the provider in your organization automatically when you belong to only one. If you have access to more than one, add `--parent=<organization_id>` to choose where it is installed.

This `create` command includes two options specific to SCIM linking with Entra ID:

* `--oidc-correlation-rule=oid_equals_external_id` links each login to its provisioned user by the Entra ID `oid` claim. It is immutable — to change it, delete and recreate the identity provider. Confirm it appears in the command's JSON output, and keep that output as your record of the setting.
* `--oidc-additional-scopes=profile` is required: Entra ID includes the `oid` claim only when you request `profile`. Pass `--oidc-additional-scopes` once per scope.

Set an environment variable to the identity provider's `id` from the previous command's output:

```sh
export IDP=<idp_id>
```

Then generate a provisioning token:

```sh
chainctl iam identity-providers scim token generate ${IDP}
```

The `token generate` command prints the **SCIM base URL** for the identity provider and a **bearer token** beginning with `cgscim_`. Note both now — Chainguard shows the token only once. To replace or revoke it later, use the `scim token regenerate` and `scim token revoke` commands described in [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/#manage-provisioning).

Following that, enable SCIM for the IdP:

```sh
chainctl iam identity-providers scim enable ${IDP}
```

The order of these commands is important: you must generate the token first, as `scim enable` fails with `etag: etag is required` if the identity provider has no token issued yet.

## Configure the Entra ID enterprise application for SCIM

Provisioning runs from a separate non-gallery enterprise application. In the Entra admin center, navigate to **Entra ID** > **Overview**. Click **+ Add** and select **Enterprise applications**. Click **Create your own application**, name it (for example, "Chainguard SCIM"), select **Integrate any other application you don't find in the gallery (Non-gallery)**, and click **Create**.

### Connect to the SCIM endpoint

Open the enterprise application's **Overview** page, navigate to the **Provisioning** tab, and click **+ New configuration**. From there, configure the connection:

* **Select authentication method**: **Bearer authentication**.
* **Tenant URL**: The SCIM base URL from the previous step with `?aadOptscim062020` appended, which opts Entra ID into SCIM 2.0-compliant behavior.
    * To illustrate, the URL should have the following structure:

        ```url
        https://scim.enforce.dev/scim/v2/<organization_id>/<idp_id>?aadOptscim062020
        ```

* **Secret token**: The bare `cgscim_...` token. Do not add a `Bearer` prefix — Entra ID adds the scheme itself.

Click **Test connection** to confirm the URL and token — the test must succeed — then **Save**.

### Map externalId to objectId

Navigate to the **Attribute mapping** tab and select **Users**. Edit the mapping whose **Target attribute** is **`externalId`**, and change its **Source attribute** from the default (`mailNickname`) to **`objectId`** (`objectId` is in the source-attribute dropdown). Leave the mapping type as **Direct**, then click **Apply**.

{{< note >}}
Make this change before provisioning any user, including with **Provision on demand**, and do not change it afterward. `objectId` is the value the identity provider matches against at login; changing it after users exist leaves those users permanently unlinked. Map `externalId` only to `objectId` — a user-editable or non-unique attribute could link a login to the wrong identity.
{{< /note >}}

On the same page, delete every mapping whose **Target attribute** contains a value filter, such as `addresses[type eq "work"].streetAddress` or `phoneNumbers[type eq "work"].value`.

Chainguard's SCIM endpoint doesn't support value-filter paths. One is enough to make it reject the entire request with `400 invalidPath`, so nothing in that update reaches Chainguard — deactivations included. Chainguard also doesn't store these attributes, so Entra ID finds the same gap on every cycle and retries the failing update until you delete the mappings.

Keep the plain-path mappings. `userName` maps from `userPrincipalName`, which is the attribute Chainguard matches on. `active` maps through the default expression `Switch([IsSoftDeleted], , "False", "True", "True", "False")`, which inverts `IsSoftDeleted` so that a user Entra ID soft-deletes or unassigns arrives at Chainguard as inactive — this is what drives deactivation. If the application shows a **Provision Microsoft Entra ID Groups** mapping, disable it; Chainguard's SCIM endpoint accepts user provisioning only.

### Assign users and turn on provisioning

Under the application's **Users and groups**, assign the users or groups to provision.

On the **Provisioning** page, set **Provisioning Mode** to **Automatic**, and under **Settings** set **Scope** to **Sync only assigned users and groups**. Then set **Provisioning Status** to **On** and click **Save** to begin.

Entra ID runs its provisioning cycle about every 40 minutes. While testing, use **Provision on demand** to push a user immediately.

## Verify the integration

Provision a user, then query the SCIM API to confirm the user's `externalId` is their `objectId` — a lowercase GUID, not a mail nickname. Replace `<scim_token>` and `<scim_base_url>` with the bearer token and SCIM base URL from the `token generate` command.

```sh
curl -s -H "Authorization: Bearer <scim_token>" "<scim_base_url>/Users?count=5"
```

Then have that user log in at [console.chainguard.dev](https://console.chainguard.dev): click **Use Your Identity Provider**, then **Use Your Organization Name**, enter your organization name, and click **Login with Provider**. The first login must go through this browser flow for linking to complete. Afterward the user appears in your organization with the identity provider's default role.

## Map Entra ID groups to Chainguard roles

Chainguard's SCIM endpoint provisions users only. To grant Chainguard roles based on a user's Entra ID group membership, follow [Grant Chainguard roles from identity provider groups](/platform/administration/custom-idps/grant-roles-from-groups/).

Entra ID emits group Object IDs (GUIDs) rather than display names in the groups claim. As a result, a group-to-role mapping displays the group as a GUID, such as `aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee`, in both `chainctl` and the console's group-mapping tab. To find which group an Object ID refers to, look it up in the Entra admin center under **Groups**. To display readable names instead, configure the groups claim to emit cloud-group display names.

## Deactivation and deletion

Unassigning a user from the application, disabling their account, or deleting them causes Entra ID to deactivate or delete the corresponding Chainguard identity on its next provisioning cycle. Chainguard rejects the login of a user deactivated before they ever logged in. For immediate offboarding, use **Provision on demand** on the affected user rather than waiting for the cycle.

## Troubleshooting

### A user logged in but wasn't linked

A correlation mismatch does not error — the login proceeds as a normal, unlinked user. Confirm that you created the identity provider with `--oidc-correlation-rule=oid_equals_external_id` and `profile` in its scopes (check the saved `create` output), that the user's `externalId` is their `objectId` GUID, and that the user has logged in through the browser flow described earlier.

### Login fails, or the identity provider isn't offered

This is an SSO problem, not SCIM. Recheck the redirect URI, issuer, and client ID from the SSO application.

### Test connection fails

Confirm the Tenant URL is the SCIM base URL with `?aadOptscim062020` appended and the Secret token is the bare `cgscim_...` value. The URL and token must come from the same `token generate` run.

**Provisioning is quarantined.** Entra ID pauses provisioning after repeated errors. Fix the error shown in the provisioning logs and restart provisioning.

## Related resources

* [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/)
* [Grant Chainguard roles from identity provider groups](/platform/administration/custom-idps/grant-roles-from-groups/)
* [Overview of the Chainguard IAM model](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/)

---

### How to provision users into Chainguard from Okta with SCIM
_Path: platform/administration/custom-idps/scim-provisioning/okta-scim/index.md_

The Chainguard platform supports SCIM 2.0 provisioning from Okta. With SCIM enabled, Okta creates, updates, and deactivates Chainguard users as you assign and unassign them, and Chainguard links each provisioned user to their single sign-on (SSO) login automatically.

This guide covers the Okta-specific setup. For provisioning behavior, token lifecycle, and limits, refer to [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/).

## Prerequisites

To complete this guide, you need the following:

* Okta already configured for login to Chainguard through an OIDC app integration. If you haven't set that up yet, refer to our guide on [How to integrate Okta SSO with Chainguard](/platform/administration/custom-idps/idp-providers/okta/).
* The [prerequisites for SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/scim-overview/#prerequisites): an IAM role that can manage identity providers, two owners with directly assigned role bindings, and an authenticated `chainctl`.

The rest of this guide refers to your identity provider by its UIDP, stored in the `IDENTITY_PROVIDER` environment variable:

```sh
export IDENTITY_PROVIDER=$(chainctl iam identity-providers list -o json | jq -r '.items[0].id')
```

Organizations generally have one identity provider, so the list usually holds a single entry and the `.items[0].id` filter selects it. If the list holds more than one — because you belong to several organizations, or your organization has several providers — run `chainctl iam identity-providers list` on its own and set `IDENTITY_PROVIDER` to the UIDP of the provider you are configuring.

## Step 1: Enable provisioning and generate the SCIM token

First, generate the bearer token Okta authenticates with:

```sh
chainctl iam identity-providers scim token generate $IDENTITY_PROVIDER
```

The `token generate` command prints the token to standard output and the SCIM endpoint URL to standard error. Chainguard shows the token exactly once, so keep both values for Step 2. Our guide [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/#the-scim-token) outlines lifetime options and rotation.

Next, enable SCIM for your identity provider:

```sh
chainctl iam identity-providers scim enable $IDENTITY_PROVIDER
```

Generate the token first: `scim enable` fails with `etag: etag is required` if the identity provider has no token issued yet. If it instead fails with a message about owner-tier identities, your organization doesn't yet have two directly assigned owners; refer to the [prerequisites for SCIM provisioning](/platform/administration/custom-idps/scim-provisioning/scim-overview/#prerequisites).

## Step 2: Create the Okta provisioning app

Okta hosts SCIM provisioning on an app integration, but you cannot add SCIM to the OIDC app integration you use for login. This means you must create a second app integration that exists only to carry provisioning.

In the Okta Admin Console, navigate to **Applications and Resources** > **Applications**, click **Create App Integration**, and choose **SAML 2.0**. Complete the wizard with placeholder values; Chainguard does not consume the SAML assertion, and sign-in stays on your existing OIDC app. On the new app's **General** tab, set **Provisioning** to **SCIM**.

Then open the app's **Provisioning** tab, select **Integration**, and click **Edit** to configure the SCIM connection:

* **SCIM connector base URL**: the endpoint printed in Step 1.
* **Unique identifier field for users**: `userName`.
* **Supported provisioning actions**: check **Push New Users** and **Push Profile Updates**. Leave **Push Groups** unchecked; Chainguard's SCIM endpoint accepts user provisioning only.
* **Authentication Mode**: select **HTTP Header**, then paste the bare `cgscim_...` token into the **Bearer** field. Do not add a `Bearer` prefix — Okta supplies the scheme itself, and a prefixed value fails authentication.

Use **Test API Credentials** to confirm the URL and token, then save.

### Error authenticating: No results for users returned

Okta's connection test reads the SCIM endpoint and expects to find a user it recognizes there. A newly enabled Chainguard endpoint has no users yet, so on a first-time setup the test fails with this message. Despite the wording, authentication succeeded; the missing user is what blocks the save.

A workaround is to create the first user directly, then run the test again. Replace `<scim_token>` and `<scim_endpoint_url>` with the bearer token and endpoint URL for your identity provider, and `<okta_username>` and `<okta_user_id>` with the details of a real user you intend to provision.

```sh
curl -X POST \
  -H "Authorization: Bearer <scim_token>" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "<okta_username>",
    "externalId": "<okta_user_id>",
    "active": true
  }' \
  "<scim_endpoint_url>/Users"
```

Set `externalId` to the user's Okta ID — the `00u...` value in the page URL when you open that user under **Directory** > **People**. Okta's test rejects an arbitrary value even though the endpoint returns the user, so this is not a field you can fill with a placeholder. `externalId` is also what Chainguard matches against at login, and a wrong value leaves the user unlinked with no error, so seed a real user you intend to provision.

## Step 3: Enable provisioning actions

With the integration saved, select **To App** in the **Provisioning** tab, click **Edit**, and enable **Create Users**, **Update User Attributes**, and **Deactivate Users**. These options appear only after you save the connection, and only for the actions you checked under **Supported provisioning actions** in Step 2.

## Step 4: Assign users and verify

In Okta, assign a user to the provisioning app integration you created in Step 2. Okta provisions them immediately. Have that user log in to Chainguard through Okta and confirm they have access. A provisioned user connects to their login by matching the SCIM `externalId` against the login token's subject; with Okta, both default to the Okta user ID, so they align without configuration.

To confirm the rest of the lifecycle, deactivate that user in Okta or remove their assignment, and confirm that Chainguard refuses their next login. Then reactivate them and confirm that they can log in again.

## Troubleshooting

### A user logged in but wasn't linked

A provisioning mismatch does not produce an error; the login proceeds as a normal, unlinked user. Confirm that you assigned the user to the provisioning app and that Okta provisioned them (check the app's assignment and Okta's provisioning logs), and that the app sends the default Okta user ID as `externalId`.

### Test API Credentials fails

If the message is "No results for users returned," refer to [Error authenticating: No results for users returned](#error-authenticating-no-results-for-users-returned) in Step 2. Otherwise, confirm the base URL is the endpoint printed by `token generate` and that the **Bearer** field holds the correct `cgscim_...` token. The URL and token must come from the same `token generate` run.

### Provisioning requests receive HTTP `429`

Chainguard rate limits provisioning writes; Okta retries on its own schedule, so bulk assignments complete without intervention. For more information, refer to the [Limits section](/platform/administration/custom-idps/scim-provisioning/scim-overview/#limits).

## Related resources

* [Provision Chainguard users with SCIM](/platform/administration/custom-idps/scim-provisioning/scim-overview/)
* [Grant Chainguard roles from identity provider groups](/platform/administration/custom-idps/grant-roles-from-groups/)
* [How to integrate Okta SSO with Chainguard](/platform/administration/custom-idps/idp-providers/okta/)
* [Overview of the Chainguard IAM model](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/)

---

### Grant Chainguard roles from identity provider groups
_Path: platform/administration/custom-idps/grant-roles-from-groups/index.md_

Chainguard can grant roles based on a user's groups in your identity provider (IdP). You map an IdP group to a Chainguard role once, and from then on any user who logs in with that group in their token receives the role for that session. Access follows group membership, so you manage who gets what in your IdP instead of assigning roles to each user in Chainguard.

This guide covers Okta and Microsoft Entra ID. The Chainguard-side steps (2 through 4) are the same for both providers; only how you emit group membership in Step 1 differs.

## Prerequisites

To complete this guide, you need the following:

- A custom identity provider (such as [Okta](/platform/administration/custom-idps/idp-providers/okta/) or [Microsoft Entra ID](/platform/administration/custom-idps/idp-providers/ms-entra-id/)) already configured for login to Chainguard. If you haven't set one up yet, refer to our guide [Using custom identity providers to authenticate to Chainguard](/platform/administration/custom-idps/custom-idps/).
- An IAM role that can manage identity providers and role-bindings in your organization, such as the `owner` role.
- [`chainctl` installed](/chainguard/chainctl-usage/how-to-install-chainctl/) on your local machine. You must also authenticate with `chainctl auth login`.

The rest of this guide refers to your organization and identity provider by their UIDPs, stored in the `ORGANIZATION` and `IDENTITY_PROVIDER` environment variables. Retrieve and set them with the following commands.

Store your organization's UIDP in the `ORGANIZATION` variable:

```sh
export ORGANIZATION=$(chainctl iam organizations list -o json | jq -r '.items[0].id')
```

Store your identity provider's UIDP in the `IDENTITY_PROVIDER` variable:

```sh
export IDENTITY_PROVIDER=$(chainctl iam identity-providers list -o json | jq -r '.items[0].id')
```

These commands select the first result each list returns. If your account can access more than one organization or identity provider, replace `.items[0]` with a filter that matches the one you want, or set each variable to the UIDP directly.

## How IdP group mappings work

Before you configure any mappings, it helps to understand how group-derived roles behave:

- **Mappings are additive.** A mapping grants a role on top of whatever access a user already has. It never removes existing access.
- **Group-derived roles are session-scoped, not standing grants.** They apply to the logged-in session and are re-evaluated at each login. They do not appear in `chainctl iam role-bindings list` or the Console's role-bindings view. Instead, each login that resolves group-derived roles emits a Chainguard CloudEvent recording the roles granted, along with the identity provider and groups they came from. To observe effective group-derived access, [subscribe to Chainguard's CloudEvents stream](/platform/administration/cloudevents/events-example/).

    As a result, no single command or view answers "who holds a group-derived role right now?" The CloudEvents stream is a log of each login as it happens, not a current-state table. During an access review or an incident, reconstruct effective access by combining that event history with current group membership in your IdP and the mappings from `chainctl iam external-group-role-mappings list`.
- **Changes take effect within an hour.** A session that includes group-derived roles is short-lived by design. Its access token lasts at most one hour, and no refresh token is issued, so when the token expires the user logs in again and that login re-reads their current group membership. As a result:
    - Removing a user from a group takes effect at their next login, within one hour.
    - Deleting or changing a mapping takes effect within one hour, because Chainguard reads mappings fresh on every login.
    - A user whose access is only group-derived re-authenticates at least hourly.

## Step 1: Emit group membership from your IdP

Configure your identity provider to include the user's group memberships in the OIDC token it issues to Chainguard. The exact Console steps differ by provider and change over time, so follow your provider's own documentation. This guide relies only on the result:

- The token carries a claim listing the user's groups, named whatever you set in Step 2. That value format is what you supply as `--external-group-id` in Step 3. This guide uses `groups`.
- The token carries only the groups you map, not every group a user belongs to. The IdP drops oversized group sets from the token, as described in [Limits](#limits).

| Provider | Configuring the groups claim | Values you map on |
| :---- | :---- | :---- |
| Okta | [Customize tokens with a groups claim](https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/) | Group names (for example, `app-admins`) |
| Microsoft Entra ID (Group Claim) | [Configure group claims](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-fed-group-claims) | Group Object IDs (GUIDs), by default |
| Microsoft Entra ID (App Roles) | [Configure app roles](https://learn.microsoft.com/en-us/entra/identity-platform/howto-add-app-roles-in-apps) | App Role Value, by default |

To use group display names in Entra ID instead of GUIDs, configure the claim to emit cloud-group display names. This requires restricting the claim to groups assigned to the application, which is also the recommended way to stay under the group limit.

## Step 2: Point Chainguard at the groups claim

Update the identity provider you use to log in so Chainguard requests the groups claim and knows which claim carries group membership:

```sh
chainctl iam identity-providers update $IDENTITY_PROVIDER \
  --oidc-additional-scopes=groups \
  --oidc-groups-claim=groups
```

> `--oidc-additional-scopes=groups` should not be set when using Entra ID.

- `--oidc-additional-scopes=groups` tells Chainguard to request the groups claim.
- `--oidc-groups-claim=groups` tells Chainguard which claim carries group membership, using the name from Step 1. An empty value turns group mapping off for this provider.

## Step 3: Map a group to a role

Create a mapping from an IdP group to a Chainguard role:

```sh
chainctl iam external-group-role-mappings create \
  --external-group-id "GROUP" \
  --role editor \
  --scope $ORGANIZATION \
  --idp $IDENTITY_PROVIDER
```

- `--external-group-id` is the value the IdP emits: the group name for Okta (for example, `app-admins`), or the group Object ID (GUID) for Entra ID.
- `--role` is the role to grant, by name or UIDP, such as `viewer` or `editor`.
- `--scope` is the UIDP of the organization where the role applies.
- `--idp` is the identity provider that owns the mapping.

To review the mappings you've configured, run the `list` subcommand:

```sh
chainctl iam external-group-role-mappings list --parent $ORGANIZATION
```

Each command creates one mapping. To map many groups at once, see [Automate mappings with the API](#automate-mappings-with-the-api).

## Step 4: Verify the mapping

1. Have a user who belongs to the mapped group log in to Chainguard through your IdP.
2. Confirm that the user can perform actions the granted role allows. This access doesn't appear in `chainctl iam role-bindings list`, because it's session-scoped.
3. Have a user who doesn't belong to a mapped group log in and confirm that they receive no additional access.

## Manage access

Once mappings are in place, you can adjust access by changing group membership within your identity provider, or by changing the mappings themselves:

- **Grant more than one role to a group.** Create one mapping per role for the same group. The capabilities combine.
- **Remove one user's group-derived access.** Remove that user from the group in your IdP, or unassign them from the application. Only that user is affected; everyone else in the group keeps the mapped role.
- **Remove a role from everyone in a group.** Delete the mapping. This revokes the mapped role for all users in that group and leaves their other access intact:

    ```sh
    chainctl iam external-group-role-mappings delete $MAPPING_ID
    ```

    Be sure to replace `$MAPPING_ID` with the mapping's UIDP, which you can find by running the `chainctl iam external-group-role-mappings list` command shown in Step 3.

- **Remove every mapping for an identity provider.** When offboarding a provider, delete all of its mappings in one command. `chainctl` asks you to confirm first; include the `--yes` flag to skip the prompt:

    ```sh
    chainctl iam external-group-role-mappings delete --all --idp $IDENTITY_PROVIDER
    ```

    This revokes the mapped roles for all users across that IdP's groups and leaves their other access intact. Note that this cleanup step is optional; deleting the identity provider also deletes any mappings that still exist. Running it first is still worth doing — the confirmation shows exactly how many mappings you're revoking before the provider itself is removed.

Each of these changes takes effect at the affected user's next login, within one hour.

### Revoke access urgently

When you need to revoke a user's access immediately, as with a compromised account or a departing employee, deleting the mapping alone is not enough. A session that already resolved the group-derived role keeps it until the access token expires, up to an hour, and that token can't be revoked mid-session. The fix is to stop the user from re-deriving the role at their next login:

1. In your identity provider, disable the user's account or remove them from the mapped group. This prevents their next login from granting the role.
2. Delete the mapping if you also want to revoke the role for everyone else in the group.

The existing session still expires on its own within the hour, and the IdP change blocks re-authorization after that.

## Automate mappings with the API

Each `chainctl` command in this guide handles one mapping. When your IdP has dozens or hundreds of groups to map, or when you manage Chainguard access from a pipeline, use the [Chainguard API](/platform/api/api-v2-tutorial/) instead. Its `ExternalGroupRoleMappings` endpoints create, list, and delete the same mappings `chainctl` does, and the results behave identically: additive, session-scoped, and re-evaluated at each login.

These examples reuse the `ORGANIZATION` and `IDENTITY_PROVIDER` variables from the [prerequisites](#prerequisites). Add a token and the API host:

```sh
export TOKEN=$(chainctl auth token)
export API=https://console-api.enforce.dev
```

That token is your own and expires within an hour. To run these calls from a pipeline, authenticate as an [assumable identity](/platform/administration/assumable-ids/assumable-ids/) that holds the access described in [Permissions for the calling identity](#permissions-for-the-calling-identity).

### Look up the role UIDP

`chainctl` accepts a role name, but the API takes the role's UIDP. Retrieve it by name:

```sh
export ROLE=$(curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/iam/v2/roles?name=editor" | jq -r '.roles[0].uid')
```

### Create one mapping

The identity provider owns the mapping, so its UIDP goes in the request path and the body carries the rest. The fields correspond to the flags in [Step 3](#step-3-map-a-group-to-a-role):

| `chainctl` flag | API equivalent |
| :---- | :---- |
| `--idp` | The identity provider UIDP in the request path |
| `--external-group-id` | `externalGroupId` |
| `--role` | `roleUid`, which takes the role's UIDP rather than its name |
| `--scope` | `scope` |

```sh
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/externalGroupRoleMappings/$IDENTITY_PROVIDER" \
  -d "{\"externalGroupId\": \"app-admins\", \"roleUid\": \"$ROLE\", \"scope\": \"$ORGANIZATION\"}" | jq .
```

```json
{
  "uid": "d9e2f1a0.../4b0a7c19c3e2f8d1/e54a7ea6f02e5dff",
  "identityProviderUid": "d9e2f1a0.../4b0a7c19c3e2f8d1",
  "externalGroupId": "app-admins",
  "roleUid": "0e4b93c2...",
  "scope": "d9e2f1a0...",
  "createTime": "2026-09-10T18:04:21.968Z"
}
```

Keep the `uid` from the response. It's the mapping's own UIDP, rooted under the identity provider, and deleting the mapping later requires it.

### Create many mappings

The API has no batch create, so loop over your groups. This example maps every group listed in `groups.txt` to one role and reports the result of each call:

```sh
while read -r group; do
  status=$(curl -s -o response.json -w '%{http_code}' \
    -X POST -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    "$API/iam/v2/externalGroupRoleMappings/$IDENTITY_PROVIDER" \
    -d "{\"externalGroupId\": \"$group\", \"roleUid\": \"$ROLE\", \"scope\": \"$ORGANIZATION\"}")
  case "$status" in
    200) echo "created: $group" ;;
    409) echo "exists:  $group" ;;
    *)   echo "failed:  $group (HTTP $status)"; jq -c . response.json ;;
  esac
done < groups.txt
```

A mapping that already exists returns HTTP 409 rather than a second record, so you can re-run the loop after fixing a failure without creating anything twice. To grant more than one role, run the loop once per role with its own group list.

### List mappings

Read back every mapping under an identity provider:

```sh
curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/iam/v2/externalGroupRoleMappings?identity_provider_uid=$IDENTITY_PROVIDER" \
  | jq '{totalCount, mappings: [.externalGroupRoleMappings[] | {uid, externalGroupId, roleUid}]}'
```

`totalCount` reports how many mappings match. Results are paginated, so a `nextPageToken` in the response means more pages remain, as described in [Pagination](/platform/api/api-v2-tutorial/#3-pagination).

### Delete mappings

Delete a single mapping by its UIDP:

```sh
curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \
  "$API/iam/v2/externalGroupRoleMappings/$MAPPING_UID"
```

A successful delete returns an empty JSON object, and a mapping that's already gone returns HTTP 404.

To remove several mappings in one call, pass their UIDPs to the `:batchDelete` endpoint along with the identity provider they belong to:

```sh
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/externalGroupRoleMappings:batchDelete" \
  -d "{\"parent\": \"$IDENTITY_PROVIDER\", \"names\": [\"$MAPPING_UID_1\", \"$MAPPING_UID_2\"]}" | jq .
```

The response lists the mappings it deleted. Names that no longer exist are skipped without error, so repeating a teardown is safe. Every name must belong to the identity provider named in `parent`; one that doesn't fails the whole call with `INVALID_ARGUMENT` and deletes nothing.

The API has no equivalent of the `--all` flag. To clear every mapping for a provider you're offboarding, list them first and feed their UIDPs to `:batchDelete`:

```sh
MAPPINGS=$(curl -s -H "Authorization: Bearer $TOKEN" \
  "$API/iam/v2/externalGroupRoleMappings?identity_provider_uid=$IDENTITY_PROVIDER" \
  | jq -c '[.externalGroupRoleMappings[].uid]')

curl -s -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  "$API/iam/v2/externalGroupRoleMappings:batchDelete" \
  -d "{\"parent\": \"$IDENTITY_PROVIDER\", \"names\": $MAPPINGS}" | jq .
```

This revokes the mapped roles for every group under that provider, so review the list output before you run the delete.

### Permissions for the calling identity

Creating a mapping grants a role, so the API enforces an anti-escalation rule. The identity making the call needs permission to create identity providers and role bindings, and it must already hold every capability the mapped role grants. An identity can't create a mapping that grants access it doesn't have itself. The `owner` role satisfies all three requirements.

## Limits

Identity providers cap how many groups a token can carry. Past that limit, the IdP stops sending the inline `groups` claim. This means Chainguard no longer receives the user's groups, and their mappings don't resolve. Keep the emitted set small by sending only the groups you map:

- **Okta:** Filter the groups claim in Step 1 so the token carries only the groups you map rather than every group a user belongs to.
- **Microsoft Entra ID:** Entra ID omits the `groups` claim once a user belongs to more than 200 groups (the JWT and OIDC limit; the SAML limit is 150). Past the limit, Entra ID emits an overage claim (`_claim_names` and `_claim_sources`) that points to Microsoft Graph instead of the inline list, and Chainguard doesn't follow it. Avoid the overage by emitting only groups assigned to the application, as described in Step 1, or by using fewer, coarser groups for access.

## Related resources

- [Using custom identity providers to authenticate to Chainguard](/platform/administration/custom-idps/custom-idps/)
- [How to integrate Okta SSO with Chainguard](/platform/administration/custom-idps/idp-providers/okta/)
- [How to integrate Microsoft Entra ID SSO with Chainguard](/platform/administration/custom-idps/idp-providers/ms-entra-id/)
- [Overview of the Chainguard IAM model](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/)
- [Manage identity and access with chainctl](/chainguard/chainctl-usage/chainctl-iam/)
- [Subscribe to Chainguard Events](/platform/administration/cloudevents/events-example/)
- [Chainguard API v2 tutorial](/platform/api/api-v2-tutorial/)
- [ExternalGroupRoleMappingsService in the API v2 specification](/platform/api/spec-api-v2/#tag/externalgrouprolemappingsservice)

---

### Disabling default social logins
_Path: platform/administration/custom-idps/disabling-social-logins/index.md_

By default, users can authenticate to the Chainguard platform with a built-in social login provider: GitHub, GitLab, or Google. After you [configure a custom identity provider](/chainguard/administration/custom-idps/custom-idps/#setup-and-administration) for single sign-on (SSO), you may want to require that everyone in your organization authenticate through that provider instead.

A common problem for SSO customers is that users click **Login with Google** (or another social provider) out of habit. Because a personal or non-federated Google account isn't tied to your organization, this creates an account *outside* it that an owner then has to clean up and re-provision. Preventing social logins keeps account lifecycle, group membership, and security policies (such as multi-factor authentication) enforced centrally through your identity provider.

Chainguard doesn't currently offer a native setting to disable social logins. However, if your identity provider is Google Workspace, you can achieve a similar result by blocking the Chainguard application in the Google Workspace Admin console. This guide outlines how to block the application and how to redirect users afterward.

> **Note**: If a native setting would be valuable to your organization, let your customer success manager know.

## Prerequisites

Before blocking social logins, make sure you have a working custom identity provider and a recovery path in place. Some organizations intentionally keep a social login (or an email and password account) as a [backup, break-glass account](/platform/administration/custom-idps/custom-idps/#backup-accounts) in case they are ever locked out of their identity provider. If you block Google login without another recovery mechanism, an identity provider outage or misconfiguration could lock every user out of your organization.

Chainguard manages MFA for email and password accounts, so replacing a lost authenticator device on a break-glass account of that kind takes a support ticket rather than a self-service change. Factor that turnaround into your recovery plan, and see [Change or reset your MFA device](/get-started/mfa-devices/) for the process.

We recommend confirming both of the following before proceeding:

* Your custom identity provider is configured and working. You can verify this by listing your identity providers and authenticating with one:

    ```sh
    chainctl iam identity-providers list
    ```

    ```sh
    chainctl auth login --identity-provider <IDP_ID>
    ```

* You have a [backup account](/chainguard/administration/custom-idps/custom-idps/#backup-accounts) that does not rely on Google login (for example, an [assumable identity](/chainguard/administration/iam-organizations/assumable-ids/)), so you retain a recovery path.

You also need administrator access to your organization's [Google Workspace Admin console](https://admin.google.com).

## How this works

Google Workspace administrators control which third-party applications can access Google Workspace data and log in with a Google account.

When you set the Chainguard application's access to **Blocked**, the **Login with Google** button on the Chainguard login screen fails for users in your Google Workspace organization. Those users must then authenticate through your custom identity provider (or another allowed method) instead, which prevents stray accounts from being created outside your organization.

You do all of this configuration on the Google Workspace side — Chainguard requires no configuration changes.

## Blocking the Chainguard app in Google Workspace

The following steps block the Chainguard application for your entire Google Workspace organization.

Note that navigation paths and setting names in these steps may change over time. For full details and the latest instructions, refer to Google's documentation on [controlling which third-party and internal apps access Google Workspace data](https://knowledge.workspace.google.com/admin/apps/control-which-apps-access-google-workspace-data).

1. Log in to the [Google Workspace Admin console](https://admin.google.com) with an administrator account.
2. Navigate to **Security** > **Access and data control** > **API controls**.
3. Find the **App access control** section. The list of accessed apps may be hidden behind a ribbon-style scroll pane. Scroll through the tiles until you reach the one labeled ***N* Accessed Apps**, then click **View list**. This displays the apps that have accessed your organization's Google Workspace data.
4. Click **Add filter**, type `Chainguard`, and apply the filter to narrow the list to apps with "Chainguard" in the name.
5. Hover over the **Chainguard** app row. A **Change access** button appears on the right; click it.
6. Select which users the policy applies to — either **all** organizational units or **specific** ones, and then select the policy to **Block** access.
7. Save your changes to activate the policy.

After you activate the policy, attempts to log in to the Chainguard Console using a Google account linked to your organization show a Google **Access blocked: Authorization error** pop-up with the message `Error 400: admin_policy_enforced`. Affected users must then authenticate through your custom identity provider instead.

> **Tip**: Because you can scope the block to specific organizational units, you can retain break-glass access via Google social login for a chosen organizational unit (for example, a small unit containing only your recovery accounts) while blocking it for everyone else.

## After blocking social logins

Direct your users to authenticate with your custom identity provider. If your organization is [verified](/chainguard/administration/iam-organizations/verified-orgs/), users can log in with your organization name:

```sh
chainctl auth login --org-name example.com
```

Otherwise, users authenticate by passing the identity provider's ID:

```sh
chainctl auth login --identity-provider <IDP_ID>
```

To avoid specifying this on every login, users can set a default identity provider or organization name in their `chainctl` configuration, as described in the [custom identity providers guide](/chainguard/administration/custom-idps/custom-idps/#setting-a-default-identity-provider). In the Chainguard Console, users in a verified organization can enter their organization name or email address to be routed to your identity provider.

If you need to restore Google login (for example, during a recovery scenario), follow the same steps to locate the Chainguard app, but instead of blocking it, change the access policy for the relevant organizational units to grant access. Select at least **Limited** access so that Google permits the login scopes.

Google manages the exact console layout and terminology, which may change over time. If you require additional assistance configuring app access control or organizational units, refer to [Google Workspace support](https://support.google.com/a).

---

### Subscribing to Chainguard CloudEvents
_Path: platform/administration/cloudevents/events-example.md_

Chainguard implements [CloudEvents](/chainguard/administration/cloudevents/events-reference/), a specification for a standard format for events data. This means developers can use events (generated based on interactions with Chainguard resources) to initiate processes and thus automate certain actions. For example, you could set up infrastructure to listen for push events to an organization's private registry and [mirror any new Chainguard Containers in the registry to a third-party repository](/chainguard/administration/cloudevents/image-copy-gcr/).

This article includes an example of how to use `chainctl` to create an event subscription. It also includes details on how to validate events from Chainguard and highlights some potential use cases for them. This article is primarily focused on Registry `push` and `pull` events. *Push* events occur when an image in your entitlement is added or updated. *Pull* events occur when an image is pulled from your Chainguard repository. Be aware, though, that there are also events related to IAM, such as user creation and adding identity providers.

## Subscribing to events

To subscribe to Chainguard events for your account, use the following `chainctl` command:

```shell
chainctl events subscriptions create https://<Your webhook URL>
```

The webhook URL should connect to a service that you use to process the requests. This can use whatever infrastructure works for your team, but a common choice is to use a serverless service such as [AWS Lambda](https://aws.amazon.com/lambda/) or [Google Cloud Run](https://cloud.google.com/run/docs/overview/what-is-cloud-run).

As an example, this guide uses [Webhook.site](https://github.com/webhooksite/webhook.site). This is an open-source application that will generate a URL you can use to receive, send, and transform webhooks, among other actions. Webhook.site can be self-hosted, but for the purposes of this guide you can just use the [cloud version of the application](https://webhook.site).

> **Note**: You can also try this out with alternative webhook testing sites, like [smee.io](https://smee.io/).

Once you have the webhook URL, use a `chainctl` command similar to the following to set up a subscription to events for your account:

```shell
chainctl events subscriptions create https://webhook.site/aEXAMPLE-b689-49a5-94df-f1dEXAMPLE29
```

Select the organization whose events you want to subscribe to when prompted. If successful, this returns an ID for the subscription:

```output
   ✔ Selected folder chainguard.edu.
                          ID                          |                        SINK
------------------------------------------------------------+------------------------------------------------------------
  45a0cEXAMPLE977f050c5fb9EXAMPLEeed764595/91b3cdEXAMPLE7a6 | https://webhook.site/aEXAMPLE-b689-49a5-94df-f1dEXAMPLE29
```

In order to generate an event, try pulling an image from your organization's repository within the Chainguard registry:

```shell
docker pull cgr.dev/chainguard.edu/istio-pilot:1-dev
```

Be sure to change this command to use your own organization's repository and an image you have access to.

```output
7.0.10: Pulling from chainguard.edu/istio-pilot
Digest: sha256:5a4583fb12ee4b33306a2c23ff33c9f2d04e6d1c7580703850928abf50de5dcf
Status: Image is up to date for cgr.dev/chainguard.edu/istio-pilot:1-dev
cgr.dev/chainguard.edu/istio-pilot:1-dev
```

Then, navigate back to Webhook.site. It may take a few moments, but in time an event will appear with request content like the following:

```
{
  "actor": {
    "subject": "261ea43771f4d962f17c1d206155a38b9b17ff18",
    "act": {
      "aud": "Hvqy7yoEhI8TY1zX9rPrsdcIntDz9yh2",
      "aws-acct": "",
      "aws-arn": "",
      "email": "",
      "iss": "https://auth.chainguard.dev/",
      "sub": "google-oauth2|117799788801679028930"
    }
  },
  "body": {
    "repository": "chainguard.edu/istio-pilot",
 "repo_id": "45a0cEXAMPLE977f050c5fb9EXAMPLEeed764595/e2fca7026fbaa243",
    "tag": "1-dev",
    "digest": "sha256:043446cbda630e5071e4f72736b38b5249c859d07bb14886cd93b4e36fc3402c",
    "method": "HEAD",
    "type": "manifest",
    "when": "2025-04-23T00:37:47.810899",
    "location": "",
    "remote_address": "76.169.101.202",
    "user_agent": "docker/27.3.1 go/go1.22.7 git-commit/41ca978 kernel/6.8.0-57-generic os/linux arch/amd64 UpstreamClient(Docker-Client/27.3.1 \\(linux\\))"
  }
}
```

This sample request has the following headers:

| Header | Value |
| ---------- | ---------- |
| accept-encoding | `gzip` |
| traceparent | `00-6f9aceb3276e8c60676cf04099d8818d-dd75e26d099ef057-00` |
| original-traceparent | `00-6f9aceb3276e8c60676cf04099d8818d-dd75e26d099ef057-00` |
| content-type | `application/json` |
| ce-type | `dev.chainguard.registry.pull.v1` |
| ce-time | `2025-04-23T00:37:47Z` |
| ce-subject | `<identity-uid>` |
| ce-specversion | `1.0` |
| ce-source | `cgr.dev` |
| ce-id | `188888b6-27d2-4a80-8ad5-c7450ab89c0c` |
| ce-group | `<group-uid>` |
| ce-audience | `customer` |
| ce-actor | `enforce-prod-registry-jzjewxe4@prod-enforce-fabc.iam.gserviceaccount.com` |
| authorization | `Bearer …` |
| content-length | `721` |
| user-agent | `Chainguard Enforce bd6a3e9-dirty` |
| host | `webhook.site` |

This shows that you have successfully subscribed the test service to Chainguard Events.

## Filtering events

The webhook will get all events for your organization. You will need to filter them to only the events you are interested in, which can be done using the `ce-type` header. For pull events the type is `dev.chainguard.registry.pull.v1` and push events are of type `dev.chainguard.registry.push.v1`.

A full description of all events and their types is [available on Chainguard Academy](/chainguard/administration/cloudevents/events-reference/).

## Validating events

Before processing an event from Chainguard, you should ensure that it is valid. Every Chainguard event has a JSON Web Token (JWT) formatted OIDC ID token in its Authorization header. For authorization purposes, validate the first two fields; then, verify the third:

* Use the `iss` field to ensure that the issuer is Chainguard, specifically `https://issuer.enforce.dev`.
* Use the `sub` field to check that the event matches your configured Chainguard identity. For example, assuming a UIDP ID of `0475f6baca584a8964a6bce6b74dbe78dd8805b6`, the `sub` field's value will resemble the following: `webhook:0475f6baca584a8964a6bce6b74dbe78dd8805b6`. If the subscription is in a sub-group, then the value will have the corresponding group SUID appended to the path.
* Verify the JWT digest against the content of the event.

Validating these fields before processing the JWT token using a verification library can save resources, as well as alert you about suspicious traffic or misconfigured Chainguard organization settings.

## Use cases

Events can be used to drive a wide range of processing scenarios, including the following:

* Copying images to another registry when an image is updated
* Kicking off an image rebuild process when a base image is updated
* Logging new image availability to a Slack channel
* Logging pulls and user creation to check for unexpected or unauthorized usage

Chainguard's [platform-examples](https://github.com/chainguard-dev/platform-examples) repository contains example code for implementing workflows based on events. Most examples are based on Terraform and work with the Google Cloud Platform, but should be portable to other environments.

## Learn more

This article outlined details on what Chainguard Events are, how to use them, and some common use cases. For more information on CloudEvents, you can refer to [cloudevents.io](http://cloudevents.io/). You can also find more details in [Chainguard's CloudEvents reference documentation](/chainguard/administration/cloudevents/).

---

### Chainguard Events
_Path: platform/administration/cloudevents/_index.md_

Documentation and resources explaining what Chainguard [CloudEvents](https://cloudevents.io/) are and how to use them.

---

### Chainguard Events
_Path: platform/administration/cloudevents/events-reference.md_

Chainguard generates and emits [CloudEvents](https://cloudevents.io/) based on actions that occur within a Chainguard account, such as registering a Kubernetes cluster or creating an IAM invitation. Chainguard also emits events when workloads or policies are changed in a cluster.

Check out [this GitHub repository](https://github.com/chainguard-dev/enforce-events) for some sample applications that demonstrate how to use events to create Slack notifications, open GitHub issues, and mirror images.

To subscribe to Chainguard events for your account, use the `chainctl` command like this:

```shell
chainctl events subscriptions create –parent $YOUR_ORGANIZATION_OR_FOLDER https://<Your webhook URL>

```

Once you are subscribed to Chainguard events, you will start receiving HTTP POST requests. Each request has a common set of CloudEvent header fields, denoted by the `Ce-` prefix. The event body is encoded using JSON and will have two top-level keys, `actor` and `body`.

The `actor` field is the identity of the actor in your Chainguard account that triggered the event, such as a team member or a Kubernetes cluster. The `body` field contains the specific data about the event, for example the response status for an invite creation request, or a cluster delete request.

## UIDP Identifiers

Each Chainguard event includes a `Ce-Subject` header that contains a UIDP (UID Path) identifier. Identifiers follow POSIX directory semantics and components are separated by `/` delimiters. A UIDP is comprised of:

* A globally unique identifier (UID), consisting of 20 bytes, that are URL safe hex encoded. For example, account identities like `0475f6baca584a8964a6bce6b74dbe78dd8805b6`.

* One, or multiple `/` separated, scoped unique identifiers (SUID). An SUID is 8 bytes that are unique within a scope (like a group), and are URL safe hex encoded. The following is an example SUID: `b74ce966caf448d1`. SUIDs are used to identify every entity in Chainguard, from groups, policies, Kubernetes cluster IDs, event subscriptions, to IAM invitations, roles and role-bindings.

Since Chainguard groups can contain child groups, events in a child group will propagate to the parent and thus the UIDP will contain multiple group SUIDs, along with the entity SUID itself. For example, assuming the following components:

* An account UID of `0475f6baca584a8964a6bce6b74dbe78dd8805b6`
* A group SUID of `b74ce966caf448d1`
* A child of group `b74ce966caf448d1` with its own SUID of `dda9aab2d2d90f9e`

The complete UIDP in the event's `Ce-Subject` header would be:

```
0475f6baca584a8964a6bce6b74dbe78dd8805b6/b74ce966caf448d1/dda9aab2d2d90f9e/1a4b29ca6df80013

```

## Authorization Header

Every Chainguard event has a JWT formatted [OIDC ID token](https://openid.net/specs/openid-connect-basic-1_0.html#IDToken) in its `Authorization` header. For authorization purposes, there are two important fields to validate:

1. Use the `iss` field to ensure that the issuer is Chainguard, specifically `https://issuer.enforce.dev`.
2. Use the `sub` field to check that the event matches your configured Chainguard identity. For example, assuming a UIDP ID of `0475f6baca584a8964a6bce6b74dbe78dd8805b6`, the value will resemble the following: `webhook:0475f6baca584a8964a6bce6b74dbe78dd8805b6`. If the subscription is in a sub-group, then the value will have the corresponding group SUID appended to the path.

Validating these fields before processing the JWT token using a verification library can save resources, as well as alert about suspicious traffic, or misconfigured Chainguard group settings.

## CloudEvents Sources

Chainguard CloudEvents are delivered from a stable set of egress IP
addresses. These are also published as A records on `egress.enforce.dev`,
so you can allowlist that name instead of hard-coding the individual
addresses:

* `34.132.193.40`
* `35.237.242.37`
* `35.230.121.20`
* `34.85.183.217`

These addresses apply to sinks reached over the public internet. A sink
hosted on Google Cloud, such as a Cloud Run `.run.app` URL, may instead be
reached over Google's internal network. In that case the delivery does not
originate from any of these addresses, and no source-IP allowlist will
match it. Verify those deliveries using the OIDC token in the
`Authorization` header, as described above, rather than by source IP.

## Events Reference

The following list of services and methods show example HTTP headers and bodies for public facing Chainguard events.

## Service: Registry - Pull

### Method: Pulled

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: cgr.dev
Ce-Specversion: 1.0
Ce-Subject: The identifier of the repository being pulled from
Ce-Time: 2026-09-15T20:06:41.517324018Z
Ce-Type: dev.chainguard.registry.pull.v1
Content-Length: 777
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "digest": "The digest of the image being pulled",
    "error": {
      "code": "The OCI distribution-spec error code",
      "message": "The error message",
      "status": 0
    },
    "location": "Location holds the detected approximate location of the client who pulled. For example, \"ColumbusOHUS\" or \"Minato City13JP",
    "method": "The method used to pull the image. One of: HEAD or GET",
    "remote_address": "",
    "repo_id": "The identifier of the repository being pulled from",
    "repository": "The identifier of the repository being pulled from",
    "tag": "The tag of the image being pulled",
    "type": "Type determines whether the object being pulled is a manifest or blob",
    "user_agent": "The user-agent of the client who pulled",
    "when": "2026-09-15T20:06:41.516384"
  }
}

```

## Service: Registry - Push

### Method: Pushed

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: cgr.dev
Ce-Specversion: 1.0
Ce-Subject: The identifier of the repository being pushed to
Ce-Time: 2026-09-15T20:06:41.516619528Z
Ce-Type: dev.chainguard.registry.push.v1
Content-Length: 707
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "digest": "The digest of the image being pushed",
    "error": {
      "code": "The OCI distribution-spec error code",
      "message": "The error message",
      "status": 0
    },
    "location": "Location holds the detected approximate location of the client who pushed. For example, \"ColumbusOHUS\" or \"Minato City13JP",
    "remote_address": "",
    "repo_id": "The identifier of the repository being pushed to",
    "repository": "The identifier of the repository being pushed to",
    "tag": "The tag of the image being pushed",
    "type": "Type determines whether the object being pushed is a manifest or blob",
    "user_agent": "The user-agent of the client who pushed",
    "when": "2026-09-15T20:06:41.516348"
  }
}

```

## Service: auth - Auth

### Method: Register

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/auth/v1/register
Ce-Specversion: 1.0
Ce-Subject: Chainguard UIDP
Ce-Time: 2026-09-15T20:06:41.525085731Z
Ce-Type: dev.chainguard.api.auth.registered.v1
Content-Length: 154
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "group": "the group this identity has joined by invitation",
    "identity": "Chainguard UIDP"
  }
}

```

## Service: events - Subscriptions

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/events/v1/subscriptions
Ce-Specversion: 1.0
Ce-Subject: UIDP identifier of the subscription
Ce-Time: 2026-09-15T20:06:41.53676211Z
Ce-Type: dev.chainguard.api.events.subscription.created.v1
Content-Length: 152
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP identifier of the subscription",
    "sink": "Webhook endpoint (http/https URL)"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/events/v1/subscriptions
Ce-Specversion: 1.0
Ce-Subject: UIDP identifier of the subscription to delete
Ce-Time: 2026-09-15T20:06:41.536966888Z
Ce-Type: dev.chainguard.api.events.subscription.deleted.v1
Content-Length: 119
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP identifier of the subscription to delete"
  }
}

```

## Service: iam - ExternalGroupRoleMappings

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/externalGroupRoleMappings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the mapping
Ce-Time: 2026-09-15T20:06:41.518855039Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.created.v1
Content-Length: 290
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "external_group_id": "The IdP group identifier",
    "id": "UIDP of the mapping",
    "identity_provider_uidp": "UIDP of the identity provider",
    "role_uidp": "UIDP of the Chainguard role",
    "scope": "UIDP of the group where the role applies"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/externalGroupRoleMappings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the mapping
Ce-Time: 2026-09-15T20:06:41.519106918Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.deleted.v1
Content-Length: 93
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the mapping"
  }
}

```

### Method: BatchDelete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/externalGroupRoleMappings:batchDelete
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.51932716Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.deleted.batch.v1
Content-Length: 346
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "items": [
      {
        "external_group_id": "The IdP group identifier",
        "id": "UIDP of the mapping",
        "identity_provider_uidp": "UIDP of the identity provider",
        "role_uidp": "UIDP of the Chainguard role",
        "scope": "UIDP of the group where the role applies"
      }
    ],
    "parent_id": "UIDP of the identity provider"
  }
}

```

## Service: iam - GroupAccountAssociations

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/account_associations
Ce-Specversion: 1.0
Ce-Subject: UIDP with which this account information is associated
Ce-Time: 2026-09-15T20:06:41.523502393Z
Ce-Type: dev.chainguard.api.iam.account_associations.created.v1
Content-Length: 385
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "amazon": {
      "account": "Amazon account ID (if applicable)"
    },
    "description": "description of this association",
    "google": {
      "project_id": "Google Cloud Project ID (if applicable)",
      "project_number": "Google Cloud Project Number (if applicable)"
    },
    "group": "UIDP with which this account information is associated",
    "name": "group name"
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/account_associations
Ce-Specversion: 1.0
Ce-Subject: UIDP with which this account information is associated
Ce-Time: 2026-09-15T20:06:41.523719235Z
Ce-Type: dev.chainguard.api.iam.account_associations.updated.v1
Content-Length: 336
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "amazon": {
      "account": "amazon account if applicable"
    },
    "description": "group description",
    "google": {
      "project_id": "project id if applicable",
      "project_number": "project number if applicable"
    },
    "group": "UIDP with which this account information is associated",
    "name": "group name"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/account_associations
Ce-Specversion: 1.0
Ce-Subject: UIDP of the group whose associations will be deleted
Ce-Time: 2026-09-15T20:06:41.523861554Z
Ce-Type: dev.chainguard.api.iam.account_associations.deleted.v1
Content-Length: 129
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "group": "UIDP of the group whose associations will be deleted"
  }
}

```

## Service: iam - GroupInvites

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/group_invites
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this invite resides
Ce-Time: 2026-09-15T20:06:41.521794056Z
Ce-Type: dev.chainguard.api.iam.group_invite.created.v1
Content-Length: 145
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "expiration": {
      "seconds": 100
    },
    "id": "group UIDP under which this invite resides"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/group_invites
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.522088829Z
Ce-Type: dev.chainguard.api.iam.group_invite.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

## Service: iam - Groups

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/groups
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this group resides
Ce-Time: 2026-09-15T20:06:41.540931407Z
Ce-Type: dev.chainguard.api.iam.group.created.v1
Content-Length: 169
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "group description",
    "id": "group UIDP under which this group resides",
    "name": "group name"
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/groups
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this group resides
Ce-Time: 2026-09-15T20:06:41.541121859Z
Ce-Type: dev.chainguard.api.iam.group.updated.v1
Content-Length: 169
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "group description",
    "id": "group UIDP under which this group resides",
    "name": "group name"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/groups
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.54126249Z
Ce-Type: dev.chainguard.api.iam.group.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

## Service: iam - Identities

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identities
Ce-Specversion: 1.0
Ce-Subject: UIDP of identity
Ce-Time: 2026-09-15T20:06:41.537171995Z
Ce-Type: dev.chainguard.api.iam.identity.created.v1
Content-Length: 329
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "identity": {
      "Relationship": null,
      "description": "The human readable description of identity",
      "id": "The unique identifier of this specific identity",
      "name": "The human readable name of identity"
    },
    "parent_id": "The Group UIDP path under which the new Identity resides"
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identities
Ce-Specversion: 1.0
Ce-Subject: The unique identifier of this specific identity
Ce-Time: 2026-09-15T20:06:41.537396893Z
Ce-Type: dev.chainguard.api.iam.identity.updated.v1
Content-Length: 245
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "Relationship": null,
    "description": "The human readable description of identity",
    "id": "The unique identifier of this specific identity",
    "name": "The human readable name of identity"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identities
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.537568425Z
Ce-Type: dev.chainguard.api.iam.identity.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

## Service: iam - IdentityProviders

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of identity provider
Ce-Time: 2026-09-15T20:06:41.538825128Z
Ce-Type: dev.chainguard.api.iam.identity_providers.created.v1
Content-Length: 378
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "identity_provider": {
      "Configuration": null,
      "description": "The human readable description of identity provider",
      "id": "The UIDP of the IAM group to nest this identity provider under",
      "name": "The human readable name of identity provider"
    },
    "parent_id": "The UIDP of the IAM group to nest this identity provider under"
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: The UIDP of the IAM group to nest this identity provider under
Ce-Time: 2026-09-15T20:06:41.539013804Z
Ce-Type: dev.chainguard.api.iam.identity_providers.updated.v1
Content-Length: 279
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "Configuration": null,
    "description": "The human readable description of identity provider",
    "id": "The UIDP of the IAM group to nest this identity provider under",
    "name": "The human readable name of identity provider"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the IdP
Ce-Time: 2026-09-15T20:06:41.53913178Z
Ce-Type: dev.chainguard.api.iam.identity_providers.deleted.v1
Content-Length: 89
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the IdP"
  }
}

```

### Method: GenerateScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.539241061Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.generated.v1
Content-Length: 250
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "endpoint_url": "SCIM endpoint URL for the identity provider",
    "etag": "Opaque version of the SCIM configuration",
    "expire_time": {},
    "identity_provider_uid": "UIDP of the identity provider"
  }
}

```

### Method: RegenerateScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.539343342Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.regenerated.v1
Content-Length: 319
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "endpoint_url": "SCIM endpoint URL for the identity provider",
    "etag": "Opaque version of the SCIM configuration",
    "expire_time": {},
    "identity_provider_uid": "UIDP of the identity provider",
    "previous_token_expire_time": {},
    "requested_overlap": {
      "seconds": 3600
    }
  }
}

```

### Method: RevokeScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.539457951Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.revoked.v1
Content-Length: 189
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "etag": "Opaque version of the SCIM configuration",
    "identity_provider_uid": "UIDP of the identity provider",
    "revoke_time": {}
  }
}

```

### Method: SetScimEnabled

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.539543721Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_enabled.updated.v1
Content-Length: 187
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "enabled": true,
    "etag": "Opaque version of the SCIM configuration",
    "identity_provider_uid": "UIDP of the identity provider"
  }
}

```

## Service: iam - RoleBindings

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/rolebindings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the Role to bind
Ce-Time: 2026-09-15T20:06:41.519653043Z
Ce-Type: dev.chainguard.api.iam.rolebindings.created.v1
Content-Length: 261
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "parent": "The Group UIDP path under which the new RoleBinding resides",
    "role_binding": {
      "id": "UID of this role binding",
      "identity": "UID of the Identity to bind",
      "role": "UIDP of the Role to bind"
    }
  }
}

```

### Method: CreateBatch

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/rolebindings/batch
Ce-Specversion: 1.0
Ce-Subject: UID of this role binding, under a parent group UIDP
Ce-Time: 2026-09-15T20:06:41.519897507Z
Ce-Type: dev.chainguard.api.iam.rolebindings.created.batch.v1
Content-Length: 220
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "role_bindings": [
      {
        "id": "UID of this role binding, under a parent group UIDP",
        "identity": "UID of the Identity to bind",
        "role": "UIDP of the Role to bind"
      }
    ]
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/rolebindings
Ce-Specversion: 1.0
Ce-Subject: UID of this role binding
Ce-Time: 2026-09-15T20:06:41.520157594Z
Ce-Type: dev.chainguard.api.iam.rolebindings.updated.v1
Content-Length: 173
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UID of this role binding",
    "identity": "UID of the Identity to bind",
    "role": "UIDP of the Role to bind"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/rolebindings
Ce-Specversion: 1.0
Ce-Subject: UID of the record
Ce-Time: 2026-09-15T20:06:41.520392179Z
Ce-Type: dev.chainguard.api.iam.rolebindings.deleted.v1
Content-Length: 91
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UID of the record"
  }
}

```

## Service: iam - Roles

### Method: Create

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role under the group
Ce-Time: 2026-09-15T20:06:41.527679275Z
Ce-Type: dev.chainguard.api.iam.roles.created.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "role description",
    "name": "role name",
    "uid": "UIDP of the role under the group"
  }
}

```

### Method: Update

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role under the group
Ce-Time: 2026-09-15T20:06:41.528952008Z
Ce-Type: dev.chainguard.api.iam.roles.updated.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "role description",
    "name": "role name",
    "uid": "UIDP of the role under the group"
  }
}

```

### Method: Delete

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role to delete
Ce-Time: 2026-09-15T20:06:41.529143724Z
Ce-Type: dev.chainguard.api.iam.roles.deleted.v1
Content-Length: 101
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "uid": "UIDP of the role to delete"
  }
}

```

## Service: iam - Terms

### Method: AcceptTerms

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v1/terms
Ce-Specversion: 1.0
Ce-Subject: Chainguard UIDP of the organization
Ce-Time: 2026-09-15T20:06:41.524769119Z
Ce-Type: dev.chainguard.api.iam.terms.accepted.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "document_ids": [
      "guardener-tos.v1",
      "sfdpa.v1"
    ],
    "group": "Chainguard UIDP of the organization"
  }
}

```

## Service: registry - Charts

### Method: AddChart

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/repos
Ce-Specversion: 1.0
Ce-Subject: UIDP of the destination organization
Ce-Time: 2026-09-15T20:06:41.522385866Z
Ce-Type: dev.chainguard.api.platform.registry.chart.added.v1
Content-Length: 208
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "repos": [
      {
        "created": true,
        "id": "The UIDP of the created repo",
        "name": "The path of the created repo relative to the destination organization"
      }
    ]
  }
}

```

## Service: registry - Registry

### Method: CreateRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.539800769Z
Ce-Type: dev.chainguard.api.platform.registry.repo.created.v1
Content-Length: 243
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository",
    "name": "The name is the human-readable name of the repository",
    "sync_config": {
      "expiration": {},
      "source": "Repo ID to sync from"
    }
  }
}

```

### Method: UpdateRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.539999748Z
Ce-Type: dev.chainguard.api.platform.registry.repo.updated.v1
Content-Length: 243
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository",
    "name": "The name is the human-readable name of the repository",
    "sync_config": {
      "expiration": {},
      "source": "Repo ID to sync from"
    }
  }
}

```

### Method: DeleteRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.540191799Z
Ce-Type: dev.chainguard.api.platform.registry.repo.deleted.v1
Content-Length: 116
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository"
  }
}

```

### Method: CreateTag

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/tags
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific tag
Ce-Time: 2026-09-15T20:06:41.54033319Z
Ce-Type: dev.chainguard.api.platform.registry.tag.created.v1
Content-Length: 197
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "digest": "The digest of the manifest with this tag",
    "id": "The identifier of this specific tag",
    "name": "The unique name of the tag"
  }
}

```

### Method: UpdateTag

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/tags
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific tag
Ce-Time: 2026-09-15T20:06:41.540498651Z
Ce-Type: dev.chainguard.api.platform.registry.tag.updated.v1
Content-Length: 197
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "digest": "The digest of the manifest with this tag",
    "id": "The identifier of this specific tag",
    "name": "The unique name of the tag"
  }
}

```

### Method: DeleteTag

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v1/tags
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific tag
Ce-Time: 2026-09-15T20:06:41.540647698Z
Ce-Type: dev.chainguard.api.platform.registry.tag.deleted.v1
Content-Length: 109
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific tag"
  }
}

```

## Service: v1 - Bindings

### Method: CreateBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/bindings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the binding
Ce-Time: 2026-09-15T20:06:41.530410282Z
Ce-Type: dev.chainguard.api.policies.bindings.created.v1
Content-Length: 245
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "created_at": {},
    "id": "UIDP of the binding",
    "mode": 1,
    "policy": "UIDP of the policy bound to the parent",
    "resource_types": [
      "Resource type(s) the binding applies to"
    ],
    "updated_at": {}
  }
}

```

### Method: UpdateBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/bindings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the binding
Ce-Time: 2026-09-15T20:06:41.532976259Z
Ce-Type: dev.chainguard.api.policies.bindings.updated.v1
Content-Length: 245
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "created_at": {},
    "id": "UIDP of the binding",
    "mode": 1,
    "policy": "UIDP of the policy bound to the parent",
    "resource_types": [
      "Resource type(s) the binding applies to"
    ],
    "updated_at": {}
  }
}

```

### Method: DeleteBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/bindings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the binding
Ce-Time: 2026-09-15T20:06:41.53324241Z
Ce-Type: dev.chainguard.api.policies.bindings.deleted.v1
Content-Length: 93
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the binding"
  }
}

```

## Service: v1 - Overrides

### Method: CreateOverride

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/overrides
Ce-Specversion: 1.0
Ce-Subject: UIDP of the override
Ce-Time: 2026-09-15T20:06:41.533389704Z
Ce-Type: dev.chainguard.api.policies.overrides.created.v1
Content-Length: 303
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "created_at": {},
    "created_by": "Identity of the actor that created the override",
    "digest": "Digest of the image being waived",
    "id": "UIDP of the override",
    "policy_id": "UIDP of the policy being waived",
    "reason": "Justification for the waiver"
  }
}

```

### Method: DeleteOverride

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/overrides
Ce-Specversion: 1.0
Ce-Subject: UIDP of the override
Ce-Time: 2026-09-15T20:06:41.533547102Z
Ce-Type: dev.chainguard.api.policies.overrides.deleted.v1
Content-Length: 94
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the override"
  }
}

```

## Service: v1 - Policies

### Method: CreatePolicy

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/policies
Ce-Specversion: 1.0
Ce-Subject: UIDP of the policy
Ce-Time: 2026-09-15T20:06:41.529462495Z
Ce-Type: dev.chainguard.api.policies.policies.created.v1
Content-Length: 337
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "created_at": {},
    "description": "Description of the policy",
    "expression": "Rego expression that defines the policy",
    "id": "UIDP of the policy",
    "name": "Name of the policy",
    "policy_type": 2,
    "supported_resource_type": "Versioned resource type the policy supports",
    "updated_at": {}
  }
}

```

### Method: UpdatePolicy

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/policies
Ce-Specversion: 1.0
Ce-Subject: UIDP of the policy
Ce-Time: 2026-09-15T20:06:41.529733045Z
Ce-Type: dev.chainguard.api.policies.policies.updated.v1
Content-Length: 337
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "created_at": {},
    "description": "Description of the policy",
    "expression": "Rego expression that defines the policy",
    "id": "UIDP of the policy",
    "name": "Name of the policy",
    "policy_type": 2,
    "supported_resource_type": "Versioned resource type the policy supports",
    "updated_at": {}
  }
}

```

### Method: DeletePolicy

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/policies/v1/policies
Ce-Specversion: 1.0
Ce-Subject: UIDP of the policy
Ce-Time: 2026-09-15T20:06:41.529895475Z
Ce-Type: dev.chainguard.api.policies.policies.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the policy"
  }
}

```

## Service: v2beta1 - AccountAssociationsService

### Method: CreateAccountAssociation

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/accountAssociations
Ce-Specversion: 1.0
Ce-Subject: UIDP with which this account information is associated
Ce-Time: 2026-09-15T20:06:41.533781383Z
Ce-Type: dev.chainguard.api.iam.account_associations.created.v1
Content-Length: 385
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "amazon": {
      "account": "Amazon account ID (if applicable)"
    },
    "description": "description of this association",
    "google": {
      "project_id": "Google Cloud Project ID (if applicable)",
      "project_number": "Google Cloud Project Number (if applicable)"
    },
    "group": "UIDP with which this account information is associated",
    "name": "group name"
  }
}

```

### Method: DeleteAccountAssociation

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/accountAssociations
Ce-Specversion: 1.0
Ce-Subject: UIDP of the group whose associations will be deleted
Ce-Time: 2026-09-15T20:06:41.533977242Z
Ce-Type: dev.chainguard.api.iam.account_associations.deleted.v1
Content-Length: 129
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "group": "UIDP of the group whose associations will be deleted"
  }
}

```

### Method: UpdateAccountAssociation

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/accountAssociations
Ce-Specversion: 1.0
Ce-Subject: UIDP with which this account information is associated
Ce-Time: 2026-09-15T20:06:41.534106658Z
Ce-Type: dev.chainguard.api.iam.account_associations.updated.v1
Content-Length: 336
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "amazon": {
      "account": "amazon account if applicable"
    },
    "description": "group description",
    "google": {
      "project_id": "project id if applicable",
      "project_number": "project number if applicable"
    },
    "group": "UIDP with which this account information is associated",
    "name": "group name"
  }
}

```

## Service: v2beta1 - ExternalGroupRoleMappingsService

### Method: CreateExternalGroupRoleMapping

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/externalGroupRoleMappings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the mapping
Ce-Time: 2026-09-15T20:06:41.517803475Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.created.v1
Content-Length: 290
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "external_group_id": "The IdP group identifier",
    "id": "UIDP of the mapping",
    "identity_provider_uidp": "UIDP of the identity provider",
    "role_uidp": "UIDP of the Chainguard role",
    "scope": "UIDP of the group where the role applies"
  }
}

```

### Method: DeleteExternalGroupRoleMapping

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/externalGroupRoleMappings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the mapping
Ce-Time: 2026-09-15T20:06:41.518206865Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.deleted.v1
Content-Length: 93
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the mapping"
  }
}

```

### Method: BatchDeleteExternalGroupRoleMappings

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/externalGroupRoleMappings:batchDelete
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.51853282Z
Ce-Type: dev.chainguard.api.iam.external_group_role_mappings.deleted.batch.v1
Content-Length: 346
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "items": [
      {
        "external_group_id": "The IdP group identifier",
        "id": "UIDP of the mapping",
        "identity_provider_uidp": "UIDP of the identity provider",
        "role_uidp": "UIDP of the Chainguard role",
        "scope": "UIDP of the group where the role applies"
      }
    ],
    "parent_id": "UIDP of the identity provider"
  }
}

```

## Service: v2beta1 - GroupInvitesService

### Method: CreateGroupInvite

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/groupInvites
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this invite resides
Ce-Time: 2026-09-15T20:06:41.52414248Z
Ce-Type: dev.chainguard.api.iam.group_invite.created.v1
Content-Length: 145
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "expiration": {
      "seconds": 100
    },
    "id": "group UIDP under which this invite resides"
  }
}

```

### Method: DeleteGroupInvite

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/groupInvites
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.524338451Z
Ce-Type: dev.chainguard.api.iam.group_invite.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

## Service: v2beta1 - GroupsService

### Method: DeleteGroup

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/groups
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.534282846Z
Ce-Type: dev.chainguard.api.iam.group.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

### Method: CreateGroup

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/groups
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this group resides
Ce-Time: 2026-09-15T20:06:41.534428421Z
Ce-Type: dev.chainguard.api.iam.group.created.v1
Content-Length: 169
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "group description",
    "id": "group UIDP under which this group resides",
    "name": "group name"
  }
}

```

### Method: UpdateGroup

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/groups
Ce-Specversion: 1.0
Ce-Subject: group UIDP under which this group resides
Ce-Time: 2026-09-15T20:06:41.53457494Z
Ce-Type: dev.chainguard.api.iam.group.updated.v1
Content-Length: 169
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "group description",
    "id": "group UIDP under which this group resides",
    "name": "group name"
  }
}

```

## Service: v2beta1 - IdentitiesService

### Method: CreateIdentity

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identities
Ce-Specversion: 1.0
Ce-Subject: UIDP of identity
Ce-Time: 2026-09-15T20:06:41.535283118Z
Ce-Type: dev.chainguard.api.iam.identity.created.v1
Content-Length: 329
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "identity": {
      "Relationship": null,
      "description": "The human readable description of identity",
      "id": "The unique identifier of this specific identity",
      "name": "The human readable name of identity"
    },
    "parent_id": "The Group UIDP path under which the new Identity resides"
  }
}

```

### Method: DeleteIdentity

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identities
Ce-Specversion: 1.0
Ce-Subject: UIDP of the record
Ce-Time: 2026-09-15T20:06:41.535469866Z
Ce-Type: dev.chainguard.api.iam.identity.deleted.v1
Content-Length: 92
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the record"
  }
}

```

### Method: UpdateIdentity

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identities
Ce-Specversion: 1.0
Ce-Subject: The unique identifier of this specific identity
Ce-Time: 2026-09-15T20:06:41.535594545Z
Ce-Type: dev.chainguard.api.iam.identity.updated.v1
Content-Length: 245
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "Relationship": null,
    "description": "The human readable description of identity",
    "id": "The unique identifier of this specific identity",
    "name": "The human readable name of identity"
  }
}

```

### Method: UpdateIdentityMetadata

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identities:updateIdentityMetadata
Ce-Specversion: 1.0
Ce-Subject: The caller's identity UID
Ce-Time: 2026-09-15T20:06:41.535698635Z
Ce-Type: dev.chainguard.api.iam.identity.metadata.updated.v1
Content-Length: 135
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "name": "The caller's display name",
    "uid": "The caller's identity UID"
  }
}

```

## Service: v2beta1 - IdentityProvidersService

### Method: CreateIdentityProvider

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of identity provider
Ce-Time: 2026-09-15T20:06:41.52537828Z
Ce-Type: dev.chainguard.api.iam.identity_providers.created.v1
Content-Length: 378
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "identity_provider": {
      "Configuration": null,
      "description": "The human readable description of identity provider",
      "id": "The UIDP of the IAM group to nest this identity provider under",
      "name": "The human readable name of identity provider"
    },
    "parent_id": "The UIDP of the IAM group to nest this identity provider under"
  }
}

```

### Method: UpdateIdentityProvider

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: The UIDP of the IAM group to nest this identity provider under
Ce-Time: 2026-09-15T20:06:41.525608209Z
Ce-Type: dev.chainguard.api.iam.identity_providers.updated.v1
Content-Length: 279
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "Configuration": null,
    "description": "The human readable description of identity provider",
    "id": "The UIDP of the IAM group to nest this identity provider under",
    "name": "The human readable name of identity provider"
  }
}

```

### Method: DeleteIdentityProvider

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the IdP
Ce-Time: 2026-09-15T20:06:41.525797373Z
Ce-Type: dev.chainguard.api.iam.identity_providers.deleted.v1
Content-Length: 89
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UIDP of the IdP"
  }
}

```

### Method: GenerateScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.525993872Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.generated.v1
Content-Length: 250
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "endpoint_url": "SCIM endpoint URL for the identity provider",
    "etag": "Opaque version of the SCIM configuration",
    "expire_time": {},
    "identity_provider_uid": "UIDP of the identity provider"
  }
}

```

### Method: RegenerateScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.526208322Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.regenerated.v1
Content-Length: 319
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "endpoint_url": "SCIM endpoint URL for the identity provider",
    "etag": "Opaque version of the SCIM configuration",
    "expire_time": {},
    "identity_provider_uid": "UIDP of the identity provider",
    "previous_token_expire_time": {},
    "requested_overlap": {
      "seconds": 3600
    }
  }
}

```

### Method: RevokeScimToken

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.526413013Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_token.revoked.v1
Content-Length: 189
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "etag": "Opaque version of the SCIM configuration",
    "identity_provider_uid": "UIDP of the identity provider",
    "revoke_time": {}
  }
}

```

### Method: SetScimEnabled

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/identityProviders
Ce-Specversion: 1.0
Ce-Subject: UIDP of the identity provider
Ce-Time: 2026-09-15T20:06:41.526597809Z
Ce-Type: dev.chainguard.api.iam.identity_providers.scim_enabled.updated.v1
Content-Length: 187
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "enabled": true,
    "etag": "Opaque version of the SCIM configuration",
    "identity_provider_uid": "UIDP of the identity provider"
  }
}

```

## Service: v2beta1 - OverlayBindingsService

### Method: CreateOverlayBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlayBindings
Ce-Specversion: 1.0
Ce-Subject: The identifier of this overlay binding
Ce-Time: 2026-09-15T20:06:41.522711749Z
Ce-Type: dev.chainguard.api.platform.registry.overlay_binding.created.v1
Content-Length: 449
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "overlay": {
      "config": {
        "contents": {
          "packages": [
            "The APK package names the attached overlay adds"
          ]
        }
      },
      "name": "The unique name of the attached overlay",
      "uid": "The identifier of the attached overlay"
    },
    "repo": "The identifier of the repo this binding applies to",
    "tag_selector": {
      "kind": 1,
      "tags": [
        "The exact tag names this binding applies to"
      ]
    },
    "uid": "The identifier of this overlay binding"
  }
}

```

### Method: UpdateOverlayBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlayBindings
Ce-Specversion: 1.0
Ce-Subject: The identifier of this overlay binding
Ce-Time: 2026-09-15T20:06:41.523030016Z
Ce-Type: dev.chainguard.api.platform.registry.overlay_binding.updated.v1
Content-Length: 449
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "overlay": {
      "config": {
        "contents": {
          "packages": [
            "The APK package names the attached overlay adds"
          ]
        }
      },
      "name": "The unique name of the attached overlay",
      "uid": "The identifier of the attached overlay"
    },
    "repo": "The identifier of the repo this binding applies to",
    "tag_selector": {
      "kind": 1,
      "tags": [
        "The exact tag names this binding applies to"
      ]
    },
    "uid": "The identifier of this overlay binding"
  }
}

```

### Method: DeleteOverlayBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlayBindings
Ce-Specversion: 1.0
Ce-Subject: The identifier of the deleted overlay binding
Ce-Time: 2026-09-15T20:06:41.52327212Z
Ce-Type: dev.chainguard.api.platform.registry.overlay_binding.deleted.v1
Content-Length: 120
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "uid": "The identifier of the deleted overlay binding"
  }
}

```

## Service: v2beta1 - OverlaysService

### Method: CreateOverlay

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlays
Ce-Specversion: 1.0
Ce-Subject: The identifier of this overlay
Ce-Time: 2026-09-15T20:06:41.537786403Z
Ce-Type: dev.chainguard.api.platform.registry.overlay.created.v1
Content-Length: 224
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "config": {
      "contents": {
        "packages": [
          "The APK package names this overlay adds"
        ]
      }
    },
    "name": "The unique name of the overlay",
    "uid": "The identifier of this overlay"
  }
}

```

### Method: UpdateOverlay

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlays
Ce-Specversion: 1.0
Ce-Subject: The identifier of this overlay
Ce-Time: 2026-09-15T20:06:41.537982191Z
Ce-Type: dev.chainguard.api.platform.registry.overlay.updated.v1
Content-Length: 224
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "config": {
      "contents": {
        "packages": [
          "The APK package names this overlay adds"
        ]
      }
    },
    "name": "The unique name of the overlay",
    "uid": "The identifier of this overlay"
  }
}

```

### Method: DeleteOverlay

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/overlays
Ce-Specversion: 1.0
Ce-Subject: The identifier of the deleted overlay
Ce-Time: 2026-09-15T20:06:41.538142332Z
Ce-Type: dev.chainguard.api.platform.registry.overlay.deleted.v1
Content-Length: 112
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "uid": "The identifier of the deleted overlay"
  }
}

```

## Service: v2beta1 - ReposService

### Method: CreateRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.520773218Z
Ce-Type: dev.chainguard.api.platform.registry.repo.created.v1
Content-Length: 243
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository",
    "name": "The name is the human-readable name of the repository",
    "sync_config": {
      "expiration": {},
      "source": "Repo ID to sync from"
    }
  }
}

```

### Method: UpdateRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.521069487Z
Ce-Type: dev.chainguard.api.platform.registry.repo.updated.v1
Content-Length: 243
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository",
    "name": "The name is the human-readable name of the repository",
    "sync_config": {
      "expiration": {},
      "source": "Repo ID to sync from"
    }
  }
}

```

### Method: DeleteRepo

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.521301616Z
Ce-Type: dev.chainguard.api.platform.registry.repo.deleted.v1
Content-Length: 116
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository"
  }
}

```

### Method: UpdateRepoReadme

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/repos
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific repository
Ce-Time: 2026-09-15T20:06:41.521484268Z
Ce-Type: dev.chainguard.api.platform.registry.repo.updated.v1
Content-Length: 243
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific repository",
    "name": "The name is the human-readable name of the repository",
    "sync_config": {
      "expiration": {},
      "source": "Repo ID to sync from"
    }
  }
}

```

## Service: v2beta1 - RoleBindingsService

### Method: CreateRoleBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roleBindings
Ce-Specversion: 1.0
Ce-Subject: UIDP of the Role to bind
Ce-Time: 2026-09-15T20:06:41.536027229Z
Ce-Type: dev.chainguard.api.iam.rolebindings.created.v1
Content-Length: 261
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "parent": "The Group UIDP path under which the new RoleBinding resides",
    "role_binding": {
      "id": "UID of this role binding",
      "identity": "UID of the Identity to bind",
      "role": "UIDP of the Role to bind"
    }
  }
}

```

### Method: DeleteRoleBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roleBindings
Ce-Specversion: 1.0
Ce-Subject: UID of the record
Ce-Time: 2026-09-15T20:06:41.536224929Z
Ce-Type: dev.chainguard.api.iam.rolebindings.deleted.v1
Content-Length: 91
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UID of the record"
  }
}

```

### Method: BatchCreateRoleBindings

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roleBindings:batchCreate
Ce-Specversion: 1.0
Ce-Subject: UID of this role binding, under a parent group UIDP
Ce-Time: 2026-09-15T20:06:41.536389918Z
Ce-Type: dev.chainguard.api.iam.rolebindings.created.batch.v1
Content-Length: 220
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "role_bindings": [
      {
        "id": "UID of this role binding, under a parent group UIDP",
        "identity": "UID of the Identity to bind",
        "role": "UIDP of the Role to bind"
      }
    ]
  }
}

```

### Method: UpdateRoleBinding

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roleBindings
Ce-Specversion: 1.0
Ce-Subject: UID of this role binding
Ce-Time: 2026-09-15T20:06:41.536563675Z
Ce-Type: dev.chainguard.api.iam.rolebindings.updated.v1
Content-Length: 173
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "UID of this role binding",
    "identity": "UID of the Identity to bind",
    "role": "UIDP of the Role to bind"
  }
}

```

## Service: v2beta1 - RolesService

### Method: CreateRole

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role under the group
Ce-Time: 2026-09-15T20:06:41.534741617Z
Ce-Type: dev.chainguard.api.iam.roles.created.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "role description",
    "name": "role name",
    "uid": "UIDP of the role under the group"
  }
}

```

### Method: UpdateRole

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role under the group
Ce-Time: 2026-09-15T20:06:41.534854657Z
Ce-Type: dev.chainguard.api.iam.roles.updated.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "description": "role description",
    "name": "role name",
    "uid": "UIDP of the role under the group"
  }
}

```

### Method: DeleteRole

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/roles
Ce-Specversion: 1.0
Ce-Subject: UIDP of the role to delete
Ce-Time: 2026-09-15T20:06:41.535044029Z
Ce-Type: dev.chainguard.api.iam.roles.deleted.v1
Content-Length: 101
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "uid": "UIDP of the role to delete"
  }
}

```

## Service: v2beta1 - TagsService

### Method: CreateTag

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/tags
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific tag
Ce-Time: 2026-09-15T20:06:41.538384629Z
Ce-Type: dev.chainguard.api.platform.registry.tag.created.v1
Content-Length: 197
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "digest": "The digest of the manifest with this tag",
    "id": "The identifier of this specific tag",
    "name": "The unique name of the tag"
  }
}

```

### Method: DeleteTag

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/registry/v2beta1/tags
Ce-Specversion: 1.0
Ce-Subject: The identifier of this specific tag
Ce-Time: 2026-09-15T20:06:41.53857356Z
Ce-Type: dev.chainguard.api.platform.registry.tag.deleted.v1
Content-Length: 109
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "id": "The identifier of this specific tag"
  }
}

```

## Service: v2beta1 - TermsService

### Method: AcceptTerms

#### Example HTTP Headers

```
POST / HTTP/1.1
Host: console-api.enforce.dev
Accept-Encoding: gzip
Authorization: Bearer oidctoken
Ce-Audience: customer
Ce-Group: UID of parent group
Ce-Id: cloudevent generated UUID
Ce-Source: https://console-api.enforce.dev/iam/v2beta1/terms
Ce-Specversion: 1.0
Ce-Subject: Chainguard UIDP of the organization
Ce-Time: 2026-09-15T20:06:41.526847025Z
Ce-Type: dev.chainguard.api.iam.terms.accepted.v1
Content-Length: 159
Content-Type: application/json
User-Agent: Chainguard Enforce

```

#### Example HTTP Body

```json
{
  "actor": {
    "subject": "identity that triggered the event"
  },
  "body": {
    "document_ids": [
      "guardener-tos.v1",
      "sfdpa.v1"
    ],
    "group": "Chainguard UIDP of the organization"
  }
}

```

---

### Mirror new Containers to Google Artifact Registry with Chainguard CloudEvents
_Path: platform/administration/cloudevents/image-copy-gcr/index.md_

Certain interactions with Chainguard resources will emit [CloudEvents](/chainguard/administration/cloudevents/events-reference/) that you or an application can subscribe to. This allows you to do things like receive alerts when a user downloads one or more of your organization's private container images or when a new image gets added to your organization's registry.

This tutorial is meant to serve as a companion to the [Image Copy GCP](https://github.com/chainguard-dev/platform-examples/tree/main/image-copy-gcp) example application. It will guide you through setting up infrastructure to listen for `push` events on an organization's private registry and mirror any new Chainguard Containers in the registry to a repository in a GCP Artifact Registry repository.

## Prerequisites

To follow along with this guide, it is assumed that you have the following set up and ready to use.

* A [verified Chainguard organization](/chainguard/administration/iam-organizations/verified-orgs/) with a private [Registry](/chainguard/chainguard-registry/overview/) and access to [Production containers](/chainguard/containers/overview/#production-and-free-containers).
* `chainctl`, the Chainguard command-line interface. You can install this by following our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/).
* [`terraform`](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) to configure a Google Cloud service account, IAM permissions, and deploy the Cloud Run service.
* A Google Cloud account with a project running. The example application assumes that your project has the following APIs enabled:
    * [Artifact Registry API](https://cloud.google.com/artifact-registry/docs/reference/rest)
    * [Cloud Run Admin API](https://cloud.google.com/run/docs/reference/rest)
* The [`gcloud` CLI](https://cloud.google.com/sdk/docs/install) installed on your local machine. You'll need this to authenticate to Google Cloud over the command line.

## Setting up the Terraform configuration

You can find all the code associated with this sample application in our [Platform Examples](https://github.com/chainguard-dev/platform-examples/tree/main/image-copy-gcp) repository on GitHub.

To set up the sample application, you can create a Terraform configuration file and apply it to set up the necessary resources. To begin, create a new directory to hold the configuration and navigate into it.

```sh
mkdir ~/gcp-example && cd $_
```

From within the `gcp-example` directory, you can begin creating a Terraform configuration named `main.tf`.

This configuration will consist of a single module. For the purposes of this example, we will call it `image-copy`. This module's `source` value will be the `iac` folder from the application code in the examples repository.

```hcl
module "image-copy" {
  source = "github.com/chainguard-dev/platform-examples/image-copy-gcp/iac"
```

The next five lines configure a few variables that you will need to update to reflect your own setup.

* First, the configuration defines a `name` value. This will be used to prefix resources created by this sample application where possible.
* Next, it specifies the GCP project ID where certain resources will reside, including the container image for this application (along with mirrored images), the Cloud Run service hosting the application, and the Service Account that authorizes pushes to the Google Artifact Registry.
* Following that, the configuration specifies the Chainguard IAM organization from which we expect to receive events. This is used to authenticate that the Chainguard events are intended for you, and not another user. Container images pushed to repositories under this organization will be mirrored to Artifact Registry.
    * You can find the names of every organization you have access to by running `chainctl iam organizations list -o table`.
* The next line specifies the location of the Artifact Registry repository and the Cloud Run subscriber.
* The final line defines `dst_repo` value, which is used to create a name for the repository in the Artifact Registry where container images will be mirrored.

As an example, if the `name` value you specify is `chainguard-dev` and the `dst_repo` value is `mirrored` (as shown in the following example) any pushes to `cgr.dev/<organization>/foo` will be mirrored to `<location>-docker.pkg.dev/<project_id>/chainguard-dev-mirrored`

Be sure to include a closing curly bracket after the final line.

```hcl
  name = "chainguard-dev"

  project_id = "<project-id>"

  group_name = "<organization-name>"

  location = "us-central1"

  dst_repo = "mirrored"
}
```

You can create this file with a command like the following.

```sh
cat > main.tf <<EOF
module "image-copy" {
  source = "github.com/chainguard-dev/platform-examples/image-copy-gcp/iac"

  name = "chainguard-dev"

  project_id = "<project-id>"

  group_name = "<organization-name>"

  location = "us-central1"

  dst_repo = "mirrored"
}
EOF
```

Make sure to replace the placeholders with your own settings for `project_id` and `group`. In the next section, we'll see how to apply the configuration to get the application up and running.

## Applying the configuration

The Terraform configuration you created in the previous section will do all the work of setting up an events subscription for you.

Specifically, it will build the mirroring application into a container image using `ko_build` and deploy the app to a Cloud Run service with permission to push to the Google Artifact Registry. It also sets up a Chainguard Identity with permissions to pull from the private `cgr.dev` repository, allows the Cloud Run service's service account  to assume the puller identity, and sets up a subscription to notify the Cloud Run service when pushes happen to `cgr.dev`.

Before applying the configuration, you'll need to log in to both the Chainguard platform with `chainctl` and GCP with `gcloud`.

```sh
chainctl auth login
gcloud auth login
```

If you haven't already done so, you will also need to acquire new access credentials to use as [Application Default Credentials](https://cloud.google.com/docs/authentication/application-default-credentials). You can do so with this command.

```sh
gcloud auth application-default login
```

Following that, run `terraform init` to initialize Terraform’s working directory.

```sh
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the file you set up in the last section.

```sh
terraform plan
```

If the plan worked successfully and you’re satisfied that it will produce the resources you expect, you can apply it.

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```output
. . .

Plan: 8 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

. . .

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.
```

Assuming all the resources were created as expected, you can observe the application in action.

## Testing the application

If the `terraform apply` command you ran in the previous section was successful, the Terraform configuration will have set up a Cloud Run service to host the example application.

As mentioned previously, this application listens for `registry.push` events that occur on your organization's repository; any time a new Container gets added to your organization's Registry the application will mirror it to your GCP project's Artifact Registry and into a repository named with the `name` and `dst_repo` values you set in your `main.tf` file. For example, if these values were `chainguard-dev` and `mirrored`, respectively, (as shown in the previous example) the mirror repository would be found at `<location>-docker.pkg.dev/<project_id>/chainguard-dev-mirrored`.

You can find the results of the application in your GCP Project's dashboard. Navigate to your GCP Project's **Artifact Registry**, then click on the mirror repository you set up with Terraform. There, you will find any Chainguard Containers that have been added to your organization's Registry since you deployed the application. This example shows a repository named `chainguard-dev-mirrored` with two images (`node` and `python`) mirrored into it.

![Screenshot of a repository in a GCP Artifact Registry named "chainguard-dev-mirrored." This repository shows two images stored within it. The first, `node`, was created and updated 36 minutes ago, while the second, `python`, was created and last updated 33 minutes ago.](gcp-events-1.png)

Be aware that just because the application is listening for `registry.push` events doesn't mean any will occur automatically. Chainguard Containers are generally updated at least once every twenty four hours, so container images may not immediately appear in your mirror repository.

## Removing sample resources

If you'd like to remove the resources you created with Terraform, you can run the `terraform destroy` command.

```sh
terraform destroy
```

This will destroy everything created in your Terraform configuration, including the Artifact Registry repository, the Service Account, and the Cloud Run service.

You can then remove the working directory to clean up your system.

```sh
rm -r ~/gcp-example/
```

Following that, all of the example resources created in this guide will be removed from your system.

## Learn more

Chainguard emits more CloudEvents than just the `registry:push` events highlighted in this guide. We encourage you to check out our overview of [Chainguard Events](/chainguard/administration/cloudevents/events-reference/) to learn the full breadth of event types that Chainguard generates. In addition, you may find it useful to explore the rest of our [Administration](/chainguard/administration/) resources to better understand how you can work with Chainguard's products.

---

### IAM and organizations
_Path: platform/administration/iam-organizations/_index.md_

Tutorials on IAM and Organizations

---

### Overview of the Chainguard IAM model
_Path: platform/administration/iam-organizations/overview-of-chainguard-iam-model.md_

Chainguard's identity and access management (IAM) model enables more secure, fine-grained control over container registries and security resources, using familiar concepts from cloud providers like AWS and GCP. This enterprise-grade IAM system allows organizations to implement least-privilege access, delegate permissions, and integrate with existing identity providers for seamless authentication and authorization.

## Organizations and folders

Chainguard's IAM model consists of two structures: **Organizations** and **Folders**. An organization is a customer or group of customers working with the same Chainguard resources, while a folder is a collection of resources within a Chainguard organization.

Organizations have a unique domain as their identifier and a user can belong to more than one organization. It's possible for organizations to become [verified organizations](/platform/administration/iam-organizations/verified-orgs/). Verification modifies some aspects of the Chainguard platform user experience to help large organizations guide their user base to the correct resource. This optional process is performed manually by Chainguard, so if you're interested in verifying your organization, please reach out to your customer support contact.

## Identities

In the context of Chainguard, an identity represents an individual user within an organization. Users typically join an organization after [being sent an invitation](/platform/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard/#inviting-others-to-an-organization). After receiving an invitation, the user can sign up with a Google, GitHub, or Gitlab account. In cases like this, the user's identity is the email address associated with the account they used to log in.

> Note: If their organization has configured one, a user can sign up with a [custom identity provider](/platform/administration/custom-idps/custom-idps/).

In order to create an invitation for a new user, you must choose a role for that user and then create a role-binding to tie that user to the chosen role. Our [overview of roles and role-bindings](/platform/administration/iam-organizations/roles-role-bindings/) has more information.

You can also create assumable identities. These are typically used to allow automation tools like GitHub Actions or Amazon Lambda to connect to and manage Chainguard resources. Refer to our [guide on assumable identities](/platform/administration/assumable-ids/assumable-ids/) to learn more.

## Logging in to the Chainguard platform

You can authenticate to the Chainguard platform with `chainctl` in several ways, including interactive browser login, headless device-code login, social login providers, and assumable identities for CI/CD. For the full list of login flows and guidance on when to use each, see [Authentication options](/platform/chainctl-usage/authentication-options/).

---

### Verified organizations
_Path: platform/administration/iam-organizations/verified-orgs.md_

Resources on the Chainguard platform are organized in a hierarchical structure called [IAM organizations](https://edu.chainguard.dev/chainguard/administration/iam-organizations/overview-of-chainguard-iam-model/). Single customers or organizations typically use a single root-level _Organization_ to manage their
Chainguard resources.

Organizations can optionally be verified. Verification modifies some aspects of the Chainguard platform user experience to help large organizations guide their user base to the correct resources.

## Verifying your organization

Verification is currently a manual process. To verify your organization, please contact your customer support contact. You can check if your organization is verified using [`chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/).

```sh
chainctl iam organization ls -o json | jq
```

Verified organizations will have a field `verified: true` set.

```json
[
  {
 "id": "f5a2c73d75a8d7fe666ecb623c79a2b771d78765",
 "name": "example.com",
 "resourceLimits": {
     "clusters": 3,
     "idps": 1
 },
 "verified": true
  }
]
```

## Verified organizations and custom identity providers

If you've configured a [custom identity provider](/chainguard/administration/custom-idps/custom-idps/) and your organization is verified, you can select your identity provider by providing the name of your organization when authenticating.

When authenticating with `chainctl`, the `--org-name` flag can be passed. Here, the command uses the example organization name `example.com`.

```sh
chainctl auth login --org-name example.com
```

As an alternative, you can set the organization name by editing the `chainctl` configuration file. You can do so with the following command.

```sh
chainctl config edit
```

This will open a text editor (nano, by default) where you can edit the local `chainctl` config. Add the following lines to this file.

```yaml
default:
  org-name: example.com
```

You can also set this with a single command using the `chainctl config set` subcommand, as in this example.

```sh
chainctl config set default.org-name example.com
```

Once set, the configured identity provider will be used automatically any time you run `chainctl auth login`.

When authenticating via the Chainguard Console, your organization name is detected from your email address in most cases. If your organization name does not match your email domain, it can be input manually to select your custom identity provider.

## Verified organizations and Chainguard Containers

If your organization has access to Chainguard Containers, your container images are available in a private repository within the Chainguard registry. Your Chainguard container images are available to pull from `cgr.dev/<org_id>/<image_name>`, where `<org_id>` is the unique identifier for your organization. Once your organization is verified, you can use the name of your organization instead of your organization identifier. For example, if your organization is named `example.com` and is verified, you can pull private images with a command like `docker pull cgr.dev/example.com/<image_name>`.

## Restrictions for verified organizations

Once an organization is verified, its name can be used interchangeably with the organization's unique ID. Changes to the name can break image pulls from your organization's repository within the Chainguard registry and break authentication for users that have configured custom identity providers. For that reason, modifying the name of a verified organization is not currently possible. If you need to modify the name of your verified organization, please contact support.

---

### How to manage Chainguard IAM organizations
_Path: platform/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard.md_

Chainguard provides a rich Identity and Access Management (IAM) model similar to those used by AWS and GCP. This guide outlines how to manage Chainguard's IAM structures with the [`chainctl` command line tool](/platform/chainctl/).

> **Note**: You should work with Chainguard's Customer Success team to create or delete organizations. This will help to ensure that no users lose access to resources and that your IAM structure is configured correctly.

## Logging in

To authenticate into the Chainguard platform, run the following login command.

```sh
chainctl auth login
```

A web browser window will open to prompt you to log in via your chosen OIDC flow. Select an account with which you wish to register. Once authenticated, you can set up an organization.

## Listing organizations

At any time, you can list the organizations your account has access to by using the `list` subcommand. To make it more human readable, you can output the information as a table by passing `-o table` to the end of the command.

```sh
chainctl iam organizations list
```

You’ll get output regarding each of the organizations the user you're logged in as belongs to, including a description of each organization, if available.

```output
[demo-org] This is a shared IAM organization for running demos
[tutorial-org] This is a shared IAM organization for tutorials.
```

You can retrieve your organizations' UIDPs by adding the `-o table` option to the previous `list` command.

```sh
chainctl iam organizations list -o table
```

```output
          ID          |     NAME     |   DESCRIPTION
----------------------+--------------+---------------------------------
  <Organization UIDP> | tutorial-org | This is a shared IAM
                      |              | organization for tutorials.
  <Organization UIDP> | demo-org     | This is a shared IAM
                      |              | organization for running demos
```

Some other `chainctl` functions require you to know an organization's UIDP, making this a useful option to remember.

## Inviting others to an organization

You can use `chainctl` to generate invite codes in order to invite others to a specific organization.

To do so, run the following command, making sure to replace `$ORGANIZATION` with the name of your chosen organization.

```sh
chainctl iam invite create $ORGANIZATION
```

You will be prompted for the scope that the invite code will be granted. After selecting the [role-bindings](/platform/administration/iam-organizations/roles-role-bindings/), this command will generate both an invite code and an invite link.  If you ever lose the invite code, you can retrieve a list of active invite codes with the following `chainctl` command:

```sh
chainctl iam invite list
```

This will provide output in the form of a table with the organization ID, a timestamp indicating when the invitation to the organization will expire, the invite code's key ID, and the selected role.

```output
          ID          |        EXPIRATION        |     KEYID     |           ROLE
----------------------+--------------------------+---------------+---------------------------------
  <Organization UIDP> | 2024-03-23T00:55:04.813Z | <Invite code> | [editor] Editor
```

Note that this invite code found under the `KEYID` column will be shorter than the one returned in the output of the `chainctl iam invite create` command, but they are effectively the same.

To invite team members, auditors, or others to your desired organizations, securely distribute the invite code and have them log in with chainctl as follows.

```sh
chainctl auth login --invite-code $INVITE_CODE
```

You can also securely distribute the invite link and have users open it in their web browser to log in and join the organization.

Note that you can tighten the scope of an invite code by including the `--email` and `--ttl` flags when creating the invite.

```sh
chainctl iam invite create $ORGANIZATION --email linky@example.com --ttl 24h
```

In this example, the invitation is scoped to a user with the email address `linky@example.com`. If someone with a different email address tries to use the code it will not work. The `--ttl` option in this example means that the code will expire in 24 hours.

## Learn more

In addition to inviting other users to your organization, you can set up [assumable identities](/platform/administration/assumable-ids/assumable-ids/) to allow automation systems — like Buildkite or GitHub Actions — to perform certain administrative tasks for your organization. To learn more, we encourage you to check out our [Overview of assumable identities](/platform/administration/assumable-ids/assumable-ids/) as well as our collection of [Assumable identity examples](/platform/administration/assumable-ids/identity-examples/).

You may also be interested in setting up a [Custom identity provider](/platform/administration/custom-idps/custom-idps/) for your organization. By default, users can log in with GitHub GitLab, and Google, but a Custom IdP can allow members of your organization to log in to Chainguard with a corporate identity provider like [Okta](/platform/administration/custom-idps/idp-providers/okta/), [Microsoft Entra ID](/platform/administration/custom-idps/idp-providers/ms-entra-id/), or [Ping Identity](/platform/administration/custom-idps/idp-providers/ping-id/).

---

### Roles and role-bindings
_Path: platform/administration/iam-organizations/roles-role-bindings/_index.md_

Documentation and resources on roles and role-bindings within the context of the Chainguard platform.

---

### Built-in roles and capabilities reference
_Path: platform/administration/iam-organizations/roles-role-bindings/capabilities-reference.md_

Chainguard provides customers with a set of built-in roles as part of its Identity and Access Management (IAM) system. These roles have different permissions and capabilities that allow them to serve specialized purposes, from general administrative access to access for specific resources like registries, APK packages, and programming language libraries.

This reference provides an overview of all Chainguard IAM capabilities and shows which built-in roles include each capability. Each capability represents a specific permission or action that can be performed within the Chainguard platform.

For more information on roles and role-bindings within Chainguard's IAM model, please refer to our [Overview of roles and role-bindings](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/).

## Built-in roles summary

This guide outlines the built-in Chainguard IAM roles available to most customer organizations. You can find more info about specific roles in your organization with the following `chainctl` command:

```shell
chainctl iam roles list
```

Every role has at least one of four capabilities (`create`, `list`, `update`, `delete`) in relation to at least one Chainguard resource. For example, the `owner` role can create, delete, list, and update custom roles within Chainguard, while the `viewer` role can only list them.

This guide outlines the following built-in roles provided by Chainguard:

* **Administrative Roles:**
    * `owner` - Full administrative access with all capabilities
    * `editor` - Limited administrative access with mostly read permissions and event management
    * `viewer` - Read-only access across all resources, **can** pull images, and can run Guardener sessions
    * `limited_owner` - Read access across all resources with ability to create identities and role bindings, and pull images
    * `console_viewer` - Read-only access across all resources and **cannot** pull images, without blob access or the ability to manage event subscriptions
* **Registry and Container Roles:**
    * `registry.pull` - Container image access
    * `registry.pull_token_creator` - Chainguard registry token management with additional repository capabilities
    * `apk.pull` - Access to the organization's APK packages, including the private APK repository
* **Library Roles:**
    * `libraries.java.pull` - Java library access
    * `libraries.java.pull_token_creator` - Java token management
    * `libraries.python.pull` - Python library access
    * `libraries.python.pull_token_creator` - Python library token management
    * `libraries.javascript.pull` - JavaScript library access
    * `libraries.javascript.pull_token_creator` - JavaScript library token management
* **Guardener Roles**:
    * `guardener.user` - Minimum role for running Guardener sessions, including Guardener conversion, terms lookup, and registry pull access
    * `guardener.admin` - Extends `guardener.user` with permission to accept the legal terms required before Guardener sessions can start

The administrative roles are useful for user profiles that require broad, but clearly defined capabilities. The registry, container, and library roles have limited permissions, allowing them to manage only one specific Chainguard resource. These specialized, resource-specific roles grant minimal required access.

For example, the `apk.pull` role only grants `list` access for APK packages and groups. This means identities with this role can pull the organization's APK packages and retrieve information about the organization, but won't have general access to the organization's [Chainguard registry](/chainguard/containers/registry/overview/) resources.

## Chainguard role capabilities

The following table maps Chainguard resources to the built-in roles that have permissions for them. Each row represents a specific resource type (like `apk`, `repo`, `identity`, etc.), describes its purpose, and lists which built-in roles have what capabilities (create, delete, list, update) for that resource.

<div style="overflow-x: auto;">

| Resource | Purpose | Roles with access to this resource |
|------------|---------|---------------------------|
| `account_associations` | Link cloud provider accounts to organization | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `apk` | Manage APK packages in the registry | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`apk.pull` (list)</li></ul> |
| `apk.blobs` | Download APK package binary content | <ul><li>`owner` (get)</li><li>`editor` (get)</li><li>`viewer` (get)</li><li>`limited_owner` (get)</li></ul> |
| `build_report` | Access detailed build and scan reports for images and packages | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `group_invites` | Send and manage invitations to join Chainguard organization | <ul><li>`owner` (create, delete, list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `groups` | Manage organization and hierarchical structures | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.java.pull_token_creator` (list)</li><li>`libraries.python.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `identity` | Create and manage user identities, service accounts, and pull tokens | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (create, list)</li><li>`console_viewer` (list)</li><li>`registry.pull_token_creator` (create)</li><li>`libraries.java.pull_token_creator` (create)</li><li>`libraries.python.pull_token_creator` (create)</li><li>`libraries.javascript.pull_token_creator` (create)</li></ul> |
| `identity_providers` | Configure [custom identity providers](/chainguard/administration/custom-idps/custom-idps/) (OIDC, SAML) for authentication | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `libraries.artifacts` | View Chainguard Library artifact metadata and information | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `libraries.entitlements` | Manage access permissions for Chainguard Libraries | <ul><li>`owner` (create, delete, list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`libraries.java.pull` (list)</li><li>`libraries.python.pull` (list)</li><li>`libraries.javascript.pull` (list)</li><li>`libraries.java.pull_token_creator` (list)</li><li>`libraries.python.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `libraries.java` | Access [Chainguard Libraries for Java](/chainguard/libraries/java/overview/) | <ul><li>`owner` (list)</li><li>`libraries.java.pull` (list)</li><li>`libraries.java.pull_token_creator` (list)</li></ul> |
| `libraries.javascript` | Access Chainguard Libraries for JavaScript | <ul><li>`owner` (list)</li><li>`libraries.javascript.pull` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `libraries.python` | Access [Chainguard Libraries for Python](/chainguard/libraries/python/overview/) | <ul><li>`owner` (list)</li><li>`libraries.python.pull` (list)</li><li>`libraries.python.pull_token_creator` (list)</li></ul> |
| `manifest` | Access and manage container image manifests | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (create, delete, list, update)</li></ul> |
| `manifest.metadata` | View container image manifest metadata and attestations | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `record_signatures` | View cryptographic signature verification records | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `registry.entitlements` | View registry access entitlements and permissions | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `repo` | Create and manage container repositories (including [Custom Assembly](/chainguard/containers/custom-assembly/) resources) | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (create, delete, list, update)</li></ul> |
| `repo.blobs` | Download container image binary content | <ul><li>`owner` (get)</li><li>`editor` (get)</li><li>`viewer` (get)</li><li>`limited_owner` (get)</li></ul> |
| `role_bindings` | [Assign roles to identities](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/#managing-role-bindings) (users and service accounts) | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (create, list)</li><li>`console_viewer` (list)</li><li>`registry.pull_token_creator` (create)</li><li>`libraries.java.pull_token_creator` (create)</li><li>`libraries.python.pull_token_creator` (create)</li><li>`libraries.javascript.pull_token_creator` (create)</li></ul> |
| `roles` | Create, modify, and manage [custom Chainguard IAM roles](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull_token_creator` (list)</li><li>`libraries.java.pull_token_creator` (list)</li><li>`libraries.python.pull_token_creator` (list)</li><li>`libraries.javascript.pull_token_creator` (list)</li></ul> |
| `sboms` | Access Software Bill of Materials for packages and images | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li></ul> |
| `subscriptions` | Manage [CloudEvent](/chainguard/administration/cloudevents/events-reference/) subscriptions for notifications and automation | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (create, delete, list, update)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `tag` | Manage Chainguard container image tags | <ul><li>`owner` (create, delete, list, update)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li></ul> |
| `version` | View version information across all resources and assets | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `vuln` | Create vulnerability reports and assessments | <ul><li>`owner` (create)</li></ul> |
| `vuln_report` | Manage detailed vulnerability assessments for specific resources | <ul><li>`owner` (create, list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li></ul> |
| `vuln_reports` | View high-level vulnerability report summaries | <ul><li>`owner` (list)</li><li>`editor` (list)</li><li>`viewer` (list)</li><li>`limited_owner` (list)</li><li>`console_viewer` (list)</li><li>`registry.pull` (list)</li><li>`registry.pull_token_creator` (list)</li></ul> |

</div>

## Role capabilities comparison

The following table compares the general abilities of the built-in roles described in the [previous summary](#built-in-roles-summary):

<div style="overflow-x: auto;">

| Role | Pull Images | List Tags/Repos | View SBOMs/Diffs | Create IAM Resources | Create Pull Tokens | Libraries Access |
|------|-------------|-----------------|------------------|---------------------|--------------------|-----------------|
| `owner` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| `editor` | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
| `viewer` | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
| `limited_owner` | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ |
| `console_viewer` | ✕ | ✅ | ✅ | ✕ | ✕ | ✕ |
| `registry.pull` | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
| `registry.pull_token_creator` | ✅ | ✅ | ✅ | ✅ | ✅ | ✕ |
| `apk.pull` | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ |
| `libraries.java.pull` | ✕ | ✕ | ✕ | ✕ | ✕ | ✅ |
| `libraries.java.pull_token_creator` | ✕ | ✕ | ✕ | ✅ | ✅ | ✅ |
| `libraries.python.pull` | ✕ | ✕ | ✕ | ✕ | ✕ | ✅ |
| `libraries.python.pull_token_creator` | ✕ | ✕ | ✕ | ✅ | ✅ | ✅ |
| `libraries.javascript.pull` | ✕ | ✕ | ✕ | ✕ | ✕ | ✅ |
| `libraries.javascript.pull_token_creator` | ✕ | ✕ | ✕ | ✅ | ✅ | ✅ |
| `guardener.user` | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |
| `guardener.admin` | ✅ | ✅ | ✅ | ✕ | ✕ | ✕ |

</div>

**Notes**

* **Pull Images/List Tags/Repos/View SBOMs**: These capabilities refer to container registry operations relating to the `manifest`, `repo`, `tag`, and `sboms` resources
* **APK Pull**: The `apk.pull` role is specialized for APK package management, not container operations
* **Console Viewer**: Has the same broad `list` access as `editor`, but cannot pull blobs (`apk.blobs`, `repo.blobs`) and cannot create, update, or delete event subscriptions. This makes it a safe role for inviting team members who need Console visibility without the ability to pull images or APKs.

### Pull token creator roles

The following roles are used for managing pull tokens for certain resources:

* `registry.pull_token_creator`
* `libraries.java.pull_token_creator`
* `libraries.python.pull_token_creator`
* `libraries.javascript.pull_token_creator`

For example, the `libraries.*.pull_token_creator` roles are focused on their respective library ecosystems and don't have container registry access.

These roles are able to create pull tokens because of the `identity.create` capability. However, none of these roles have the `identity.list` capability, meaning that they aren't able to view the pull tokens they've created.

The reason for this is that Chainguard doesn't distinguish pull token identities from other [assumable identities](/chainguard/administration/assumable-ids/assumable-ids/) at the IAM level. If these roles also had the `identity.list` capability, they would be able to view **all** the identities in that scope. By not including `identity.list` among their capabilities, the pull token creator roles have a more limited scope, as intended.

## Learn more

* [Overview of roles and role-bindings in Chainguard](/chainguard/administration/iam-organizations/roles-role-bindings/roles-role-bindings/) - Conceptual overview and basic management
* [Overview of Chainguard IAM model](/chainguard/administration/iam-organizations/overview-of-enforce-iam-model/) - Complete IAM architecture

---

### Overview of roles and role-bindings in Chainguard
_Path: platform/administration/iam-organizations/roles-role-bindings/roles-role-bindings.md_

In the context of Chainguard, an *identity* represents an individual user within an organization. Chainguard's IAM model allows administrators to assign identities to specialized *roles* which define the level of access that an identity has to the organization's resources. You assign a role by creating a *role-binding*, which is what ties an identity to a given role.

This guide serves as an overview of what roles and role-bindings are within the context of Chainguard. It also outlines how you can manage roles and role-bindings with `chainctl`.

## Prerequisites

This guide includes several examples of how you can manage roles and role-bindings with `chainctl`, the Chainguard command-line tool. To set up `chainctl`, follow our guide on [how to install `chainctl`](/platform/chainctl-usage/how-to-install-chainctl/) if you haven't done so already.

## Roles

There are a number of built-in roles in Chainguard's IAM model that customers can assign to identities within their organization. Most users within your organization will likely have one of the following roles with broadly-defined privileges: `owner`, `editor`, `viewer`, or `console_viewer`.

`owner` is the role with the most privileges. An owner can create, delete, view (list), and modify (update) organizations, account associations, role-bindings, organization invitations, custom roles, role-bindings, and subscriptions.

`editor` is the role with read access and limited creation and modification access. As opposed to the owner role, an editor can view images, policies, records, organizations, organization invites, roles, and account associations but cannot create or make changes to these resources. It can modify the state of event subscriptions, but cannot grant roles or permissions. Editors can also push and pull images, libraries, and APKs.

`viewer` is a role that has read-only access and **can** pull images. That is, a viewer can list images, policies, organizations (and organization invites), records, roles and role-bindings, subscriptions, and account associations.

`console_viewer` is a role that has read-only access and **cannot** pull images. It is designed for teams that need visibility into the Chainguard Console without any image pull access. A console viewer can browse the Console — viewing organizations, roles, and group information — but has no `registry.pull` or `apk.pull` permissions. This makes it a safe option for inviting developers, auditors, or stakeholders who need awareness of your organization's setup without the ability to pull images or APK packages.

`limited_owner` is a special role designed for [Catalog Starter](/chainguard/containers/reference/catalog-starter/) users, combining the capabilities of the `viewer` role with pull token creation permissions. It does not allow users to invite others to the organization or access paid features like Custom Assembly.

The remaining roles are for more specialized functions. For example, `registry.pull`, `registry.push`, and `registry.pull_token_creator` relate to administering a registry of Chainguard products.

The `owner`, `editor`, and `viewer` roles are useful for user profiles that require broad, but clearly defined capabilities. The registry, container, and library roles have limited permissions, allowing them to manage only one specific Chainguard resource. These specialized, resource-specific roles grant minimal required access.

Every role has at least one of four capabilities (`create`, `list`, `update`, `delete`) in relation to at least one Chainguard resource. For example, the `apk.pull` role only grants `list` access for APK packages and groups. This means identities with this role can pull the organization's APK packages and retrieve information about the organization, but won't have general access to the organization's [Chainguard registry](/chainguard/containers/registry/overview/) access.

Chainguard's built-in default roles serve as building blocks and can be complemented with custom roles for specific use cases. Custom roles can extend or restrict default role capabilities, and offer your organization greater flexibility, allowing you to mix default and custom roles based on your team's structure and needs.

When assigning a role, do so based on the principle of least privilege; assign only the role needed for the identity's function. For example, CI systems should have a role like `registry.pull`, not `editor`.

You can run `chainctl iam roles list` to retrieve a list of all the roles available to your organization and review each of their specific capabilities. This command will list all the built-in roles as well as any custom roles created for your organization. The next section outlines how to create and manage such custom roles.

## Managing custom roles

There are two options for managing custom roles:

- with [`chainctl`](#manage-custom-roles-with-chainctl), or
- directly [in the Chainguard Console](#manage-custom-roles-in-the-chainguard-console).

### Manage custom roles with chainctl

You can use `chainctl` to create custom roles for teams or individuals in your organization, like in the following example.

```sh
chainctl iam roles create my-role
```

After running this command, an interactive prompt will appear asking you to select what capabilities the new role should have and the organization under which the role should be created.

You can avoid the interactive prompt by including the `--capabilities` option in this command.

```sh
chainctl iam roles create new-role --capabilities=roles.list
```

This example creates a new role named `new-role` in your organization. The new role can only list roles in the organization.

`chainctl` selects your organization automatically when you belong to only one. If you have access to more than one organization or folder, it prompts you to choose; add `--parent=<organization>` to skip the prompt.

You can also grant multiple capabilities to a custom role with one command, as in this example:

```sh
chainctl iam roles create puller-role --capabilities=apk.list,groups.list,manifest.list,manifest.metadata.list,record_signatures.list,repo.list,sboms.list,tag.list,vuln.list
```

This example command creates a role named `puller-role` that has the following capabilities:

- `apk.list`
- `groups.list`
- `manifest.list`
- `manifest.metadata.list`
- `record_signatures.list`
- `repo.list`
- `sboms.list`
- `tag.list`
- `vuln.list`

This essentially combines the capabilities of the `registry.pull` and `apk.pull` roles, allowing any identities bound to this role to be able to pull both Chainguard Containers and APKs.

You can also use `chainctl` to delete custom roles.

```sh
chainctl iam roles delete new-role
```

Note that you cannot delete any of the built-in roles. Attempting to do so will result in an error.

### Manage custom roles in the Chainguard Console

In addition to using `chainctl` to manage roles, you can also create, view, and edit custom roles directly in the [Chainguard Console](https://console.chainguard.dev).

#### Create  a custom role

1. In the Chainguard Console, navigate to **Settings** > **Roles**.
1. Click **Create Role**.
1. Enter a name and optional description for the new role.
1. Select the capabilities you want the role to include.
1. Click **Create**.

After creating a role, you can attach it to a user. Learn more under [Managing role-bindings](#managing-role-bindings).

#### Edit an existing custom role

1. Navigate to **Settings** > **Roles**.
2. Find the role you want to modify and click **Edit**.
3. Add or remove capabilities as needed.
4. Click **Save Changes**.

> **Note:** Changes to a custom role take effect immediately for all identities currently bound to that role. Built-in roles cannot be edited.

Both the Console and `chainctl` operate on the same underlying roles and role-bindings; changes made in either place are immediately reflected everywhere.

## Managing role-bindings

### Manage role bindings with chainctl

You can assign a role — and all of its capabilities — to a given user by creating a role-binding and tying it to that user's identity.

You can run a command like the following example to create a role-binding.

```sh
chainctl iam role-bindings create
```

This will start an interactive prompt where you can enter the appropriate details for this new role-binding. Specifically, you'll be prompted to specify the identity to bind, the role you want the identity bound to, and the organization that the role-binding should belong to.

To avoid the interactive prompt, add these details to the command by including the `--identity` and `--role` options.

```sh
chainctl iam role-bindings create --identity=example-id --role=viewer
```

This example creates a role-binding for the identity `example-id` with the built-in `viewer` role in your organization.

Note that in order to use the `--identity` option like this, you will need to know the given identity's UIDP. You can find a list of all your identities' UIDPs by running `chainctl iam identities ls`. The identities' UIDPs will appear in the resulting `ID` column.

### Manage role bindings in the Chainguard Console

1. In the Chainguard Console, navigate to **Settings** > **Users**.
1. Click **Create role binding**.
1. Select a user and the role you want to attach to the user.
1. Click **Create**.

## Learn more

You can create a Chainguard identity for an automation system (such as Buildkite or GitHub Actions) to assume. This process involves choosing a role for the assumable identity and then creating a role-binding for it. Check out our [overview of assumable identities](/platform/administration/assumable-ids/assumable-ids/) — as well as our [collection of assumable identity examples](/platform/administration/assumable-ids/identity-examples/) — to learn more.

If you'd like to learn more about Chainguard's IAM model and structures, we encourage you to read our [Overview of the Chainguard IAM model](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/).

---

### Create role-bindings for a GitHub team using Terraform
_Path: platform/administration/iam-organizations/roles-role-bindings/rolebinding-terraform-gh/index.md_

There may be cases where an organization will want multiple users to have access to the same Chainguard organization. Chainguard allows you to grant other users access to Chainguard by [generating an invite link or code](/chainguard/administration/iam-organizations/how-to-manage-iam-organizations-in-chainguard/#inviting-others-to-an-organization).

In addition, you can now grant access to users using Terraform and identity providers like GitHub, GitLab, and Google. You can also manage access through these providers' existing group structures, like GitHub Teams or GitLab Groups. Granting access through Terraform helps to reduce the risk of unwanted users gaining access to Chainguard.

This guide outlines one method of using Terraform to grant members of a GitHub team access to the resources managed by a Chainguard organization. It also highlights a few other Terraform configurations you can use to manage role-bindings in the Chainguard platform. Although this guide is specific to GitHub, the same approach can be used for other systems.

## Prerequisites

To complete this guide, you will need the following.

* `terraform` installed on your local machine. Terraform is an open-source Infrastructure as Code tool which this guide will use to create various cloud resources. Follow [the official Terraform documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) for instructions on installing the tool.
* `chainctl` — the Chainguard command line interface tool — installed on your local machine. Follow our guide on [How to install `chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) to set this up.
* Access to a GitHub team. If you'd like, you can create a new GitHub organization and team for testing purposes. Check out [GitHub's documentation](https://docs.github.com/en/organizations/organizing-members-into-teams/creating-a-team) for details on how to do this.
* A GitHub Personal Access Token, with a minimum of **read.org** access. Follow [GitHub's documentation on the subject](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) to learn how to set one up. Additionally, you will need to [configure SSO for your personal access token](https://docs.github.com/en/enterprise-cloud@latest/authentication/authenticating-with-saml-single-sign-on/authorizing-a-personal-access-token-for-use-with-saml-single-sign-on) if required by your organization.

## Setting up your environment

There are a few things you must have in place in order to follow this guide. First, create a testing directory to hold the Terraform configuration and navigate into it.

```sh
mkdir ~/github-team && cd $_
```

This will help make it easier to clean up your system at the end of this guide.

Next, you'll need to set up a few environment variables that the Terraform configuration in this guide assumes you will have in place.

Start by creating an environment variable named `GITHUB_ORG` that points to the name of your GitHub organization. Run the following command to create this variable, but be sure to replace `<your GitHub organization>` with actual name of your organization as it appears in URLs. For example, if your organization owns a repository at the URL `htttps://github.com/orgName-example/repository-name`, then the value you would pass here would be `orgName-example`.

```sh
export GITHUB_ORG=<your GitHub organization>
```

Next, create a variable named `GITHUB_TEAM` set to the slug of the GitHub team for which you want to create a set of role-bindings. The Terraform configuration will use this detail to find and retrieve information about your GitHub team.

If you aren't sure of what your team's slug is, you can find it with `gh`, the GitHub command line interface. You can use a command like the following to retrieve a list of all your organization's teams.

```sh
gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /orgs/$GITHUB_ORG/teams
```

Scroll through this command's output to find the `slug` value for the team in question.

```json
[
. . .

  {
 "name": "Team Name",
 "id": 9999999,
 "node_id": "T_kwDOBTYtm84AbTQX",
 "slug": "team-slug",
. . .
  },
. . .
]
```

With the team's slug in hand, run the following command to create the `GITHUB_TEAM` environment variable.

```sh
export GITHUB_TEAM=<your GitHub team slug>
```

Following that, you will need to provide Terraform with your GitHub personal access token so it can access information related to your GitHub organization. Rather than hard coding your token into the Terraform configuration or having Terraform prompt you to enter it manually, you can create an environment variable named `GITHUB_TOKEN` which Terraform will automatically use. Create this variable with the following command.

```sh
export GITHUB_TOKEN=<your GitHub token>
```

Lastly, the Chainguard role-bindings that this guide's Terraform configuration will create must all be tied to an organization. Create another variable named `CHAINGUARD_ORG` with the following command, replacing `<UIDP of target Chainguard IAM organization>` with the UIDP of the Chainguard IAM organization you want to tie the role-bindings to. You can find the UIDP for your Chainguard IAM organization by running `chainctl iam organizations ls -o table`.

```sh
export CHAINGUARD_ORG="<UIDP of target Chainguard IAM organization>"
```

Following that, you will have everything you need in place to set up the Terraform configuration.

## Creating your Terraform configuration

As mentioned previously, we will be using Terraform to create role-bindings for each user in a GitHub team, giving them access to resources associated with a given Chainguard organization. This guide outlines how to create two Terraform configuration files that, together, will produce a set of such role-bindings.

To help explain both files' purposes, we will go over what they do and how to create each one individually.

### `main.tf`

First, we will create a `main.tf` file which will set up the necessary Terraform providers.

This file will consist of the following lines.

```hcl
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
    github = {
      source = "integrations/github"
    }
  }
}

provider "github" {
  owner = "$GITHUB_ORG"
}
```

The `terraform` block defines the sources for the `chainguard` and `github` providers.

The `provider` block sets up the `github` provider with one argument — `owner` — that points to the `GITHUB_ORG` variable you set previously.

Create the `main.tf` file with the following command.

```sh
cat  <<EOF > main.tf
terraform {
  required_providers {
    chainguard = {
      source = "chainguard-dev/chainguard"
    }
    github = {
      source = "integrations/github"
    }
  }
}

provider "github" {
  owner = "$GITHUB_ORG"
}
EOF
```

Next, you will create the other configuration file that will actually create the role-bindings for your GitHub team.

### `rolebindings.tf`

The `rolebindings.tf` file will contain a few separate blocks that retrieve information about the GitHub team members and create Chainguard role-bindings for each one.

The first block creates a `github_team` data source named `team`.

```hcl
data "github_team" "team" {
  slug = "$GITHUB_TEAM"
}
```

Using the arguments you provided in the `github` provider block in `main.tf`, Terraform will search for any GitHub teams matching the slug specified within this block. If Terraform can find a team with a matching slug in the specified GitHub organization, then you will be able to pull more data about this team down from GitHub.

After the first block retrieves information about the team, we need to retrieve information about each member of the team in order to create an identity for each of them. To this end, the next block creates a `github_user` data source named `team_members`.

```hcl
data "github_user" "team_members" {
  for_each = toset(data.github_team.team.members)
  username = each.key
}
```

Because, we want this source to represent **every** member of the team, this block starts with a `for_each` meta-argument which accepts a `toset` map of the GitHub team members derived from the `github_team` source created previously.

Additionally, the `github_user` data source [requires you](https://registry.terraform.io/providers/integrations/github/latest/docs/data-sources/user#username) to set the `username` argument to whichever user you want the data source to represent. In the Terraform Language, `each.key` is the map key corresponding to the objects referenced in the `for_each` argument. In this case, it means the `username` variable will be tied to a mapping of each member of the GitHub team within this Terraform configuration.

The next block retrieves Chainguard identities for each member of the GitHub team.

```
data "chainguard_identity" "team_ids" {
  for_each = toset([for x in data.github_user.team_members : x.id])

  issuer  = "https://auth.chainguard.dev/"
  subject = "github|${each.key}"
}
```

This block's `for_each` meta-argument iterates through each member of the team. For each iteration, it retrieves that user's GitHub ID and then retrieves a Chainguard identity that it derives using that GitHub ID.

If there are members of the GitHub team who have not yet registered with Chainguard, this method will still assign them the correct permissions when they log in for the first time.

The next block retrieves the predefined `viewer` role from Chainguard.

```
data "chainguard_role" "viewer" {
  name = "viewer"
}
```

The final block puts all this information together to create the role-bindings for each member of the team.

```
resource "chainguard_rolebinding" "cg-binding" {
  for_each = data.chainguard_identity.team_ids
  identity = each.value.id
  group    = "$CHAINGUARD_ORG"
  role     = data.chainguard_role.viewer.items[0].id
}
```

This `resource` block iterates through the list of Chainguard identities, assigns each one to the IAM organization specified by the `group` argument, and binds each identity to the `viewer` role. Here, the `group` argument is set to the `CHAINGUARD_ORG` variable you created at the start of this guide.

Create the `rolebindings.tf` file with the following command.

```sh
cat  <<EOF > rolebindings.tf
data "github_team" "team" {
  slug = "$GITHUB_TEAM"
}

data "github_user" "team_members" {
  for_each = toset(data.github_team.team.members)
  username = each.key
}

data "chainguard_identity" "team_ids" {
  for_each = toset([for x in data.github_user.team_members : x.id])

  issuer  = "https://auth.chainguard.dev/"
  subject = "github|\${each.key}"
}

data "chainguard_role" "viewer" {
  name = "viewer"
}

resource "chainguard_rolebinding" "cg-binding" {
  for_each = data.chainguard_identity.team_ids
  identity = each.value.id
  group    = "$CHAINGUARD_ORG"
  role     = data.chainguard_role.viewer.items[0].id
}
EOF
```

Note that the fourteenth line of this file contains a backslash (`\`).

```
  subject = "github|\${each.key}"
```

This is an escape character which will prevent the dollar sign in that line from causing a `bad substitution` error.

Now that your Terraform configuration is in place, you're ready to apply it and create role-bindings for each member of your GitHub team.

## Applying your Terraform configuration

First, run `terraform init` to initialize Terraform's working directory.

```sh
terraform init
```

Then run `terraform plan`. This will produce a speculative execution plan that outlines what steps Terraform will take to create the resources defined in the files you set up in the last section.

```sh
terraform plan
```

If the plan worked successfully and you're satisfied that it will produce the resources you expect, you can apply it.

```sh
terraform apply
```

Before going through with applying the Terraform configuration, this command will prompt you to confirm that you want it to do so. Enter `yes` to apply the configuration.

```output
. . .

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
```

After pressing `ENTER`, the command will complete.

```
. . .

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```

Following this, any members of your GitHub team for whom you've created role-bindings will be able to view the resources associated with the Chainguard organization you specified. To do so, they need to log in to the Chainguard platform, either by logging into the [Chainguard Console](https://console.chainguard.dev/) or with the following command.

```sh
chainctl auth login
```

After navigating to the Console or running the login command, they will be presented with the following login flow.

![Screenshot of the default Chainguard login flow. It includes the Linky logo above the words "Welcome. Log in to Chainguard to continue to Chainguard." Below this are three buttons, one reading "Continue with Google", one reading "Continue with GitHUb", and a third reading "Continue with GitLab".](login-flow.png)

There, they must click the **Continue with GitHub** button to continue logging in under their GitHub account. Chainguard will immediately recognize their GitHub account because it is tied to the role-binding you created in the previous step, and they will be able to view the resources associated with the Chainguard organization specified in your Terraform configuration.

## Optional configurations

The Terraform configuration used in this guide is meant to serve as a starting point, and we encourage you to tweak and expand on it to suit your organization's needs. This section contains a few alternative configurations that you may find useful.

For example, rather than applying the `viewer` role to your team's role-bindings, you can apply one of the other built-in roles, or any custom roles created within your Chainguard organization. The following `data` and `resource` block examples could be used in place of the ones used in this guide's `rolebindings.tf` file. Instead of granting the identities the `viewer` role, this grants them the `editor` role.

```hcl
data "chainguard_roles" "editor" {
  name = "editor"
}

resource "chainguard_rolebinding" "cg-binding" {
  for_each = toset(data.chainguard_identity.team_ids)
  identity = each.value.id
  group = "$CHAINGUARD_ORG"
  role     = data.chainguard_roles.editor.items[0].id
}
```

The Terraform configuration language is quite flexible. You can update your Terraform configuration to retrieve information about a single user, rather than an entire team.

```
data "github_user" "user" {
  username = "$USERNAME"
}
```

Likewise, you can retrieve a GitHub user's Chainguard identity without having to include the `for_each` meta-argument.

```
data "chainguard_identity" "gh-user-chainguard-rb" {
  issuer  = "https://auth.chainguard.dev/"
  subject = "github|${data.github_user.$USERNAME.id}"
}
```

You can refer to the [Terraform language documentation](https://developer.hashicorp.com/terraform/language) for more information on extending the configuration outlined in this guide to suit your own needs.

## Removing sample resources

To remove the resources Terraform created, you can run the `terraform destroy` command.

```sh
terraform destroy
```

This will destroy the Chainguard role-bindings created for your GitHub team. You can then remove the working directory to clean up your system.

```sh
rm -r ~/github-team/
```

Following that, all of the example resources created in this guide will be removed from your system.

## Learn more

The procedure outlined in this tutorial can be tweaked to work with other identity providers, including Google and GitLab.

---

### Introduction to the Chainguard Terraform provider
_Path: platform/administration/terraform-provider/index.md_

[Terraform](https://www.terraform.io/) is an infrastructure as code tool that allows users to declaratively configure resources in cloud providers like AWS and GCP, SaaS platforms, and many other API-driven environments. [Terraform providers](https://developer.hashicorp.com/terraform/language/providers) are written by third-party developers to allow Terraform to manage resources in their environment.

[The Chainguard Terraform provider](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest) enables users to manage resources on the Chainguard Platform, such as identities, role-bindings, custom roles, and more. This guide provides a brief introduction to the Chainguard Terraform provider, including how to configure it and use it to manage your Chainguard resources.

## Prerequisites

In order to use the Chainguard Terraform provider, you will need to [install Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) on your local machine.

Also, while it isn't necessary for using the Chainguard Terraform provider, this guide assumes you have [`chainctl` installed](/platform/chainctl-usage/how-to-install-chainctl/) in order to retrieve some information about your Chainguard resources.

## Configuring the Chainguard Terraform provider

Terraform uses [a native configuration language](https://developer.hashicorp.com/terraform/language) to define resources. Each configuration is stored in one or more `.tf` files, which in turn are stored in what is called a *root module*. When using the Terraform CLI, the root module is the working directory where you invoke `terraform` commands to create or destroy your resources.

To use the Chainguard Terraform provider, add it to the block of required providers in your configuration:

```hcl
terraform {
  required_providers {
 chainguard = { source = "chainguard-dev/chainguard" }
  }
}
```

If you don't have an active Chainguard token when you apply the configuration, the provider will automatically launch a browser to complete the Oauth 2 flow with one of the default identity providers: GitHub, GitLab, or Google. This means the Terraform provider does not require `chainctl` to be installed to manage authentication with Chainguard.

You can customize the behavior of the authentication flow in a number of ways. For example, you can specify an identity to assume, or a [verified organization](/platform/administration/iam-organizations/verified-orgs/) name in order to use a previously-configured custom identity provider:

```hcl
provider "chainguard" {
  login_options {
 organization_name = "my-org.com"
 # identity_id is the exact ID of an assumable identity.
 # Get this ID with chainctl iam identities list
 identity_id = "1f127a7c0609329f04b43d845cf80eea4247a07c/d6305475446bbef6"
  }
}
```

You can also configure the provider to use an OIDC token, either by supplying it directly or pulling it from a file, with the automatic browser flow disabled. This is useful when setting up CI workflows:

```hcl
provider "chainguard" {
  login_options {
 # Disable the automatic browser authentication flow.
 disabled    = true
 identity_token = "/path/to/oidc/token"
  }
}
```

You can find more information about authenticating with the Chainguard Terraform provider in the [provider documentation](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs) and [the included examples](https://github.com/chainguard-dev/terraform-provider-chainguard/tree/main/examples).

## Defining organization references

Terraform was designed to allow users to manage various resources declaratively. In practice, this means that you define the state you want your resources to be in and then you let Terraform and the provider handle the details of bringing that state to reality.

Resources on the Chainguard platform are organized in a hierarchical structure consisting of [**Organizations** and **folders**](/platform/administration/iam-organizations/overview-of-chainguard-iam-model/#organizations-and-folders). An organization is a customer or group of customers working with the same Chainguard resources, while a folder is a collection of resources within a Chainguard organization. Most users will only need to work at the organization level.

![Diagram outlining hierarchical structure of Chainguard resources. The diagram has two halves: one labeled "Organization" and another labeled "Chainguard". Under Organization is a box labeled "Tags" with an arrow pointing toward another box labeled "Repos." Under both halves is a box labeled "Role Bindings" which has four arrows pointing from it. Two arrows point to boxes (labeled "Identities" and "Custom Roles") under Organization and the other two point to boxes (labeled "User Identities" and "roles) under Chainguard.](tf-diagram.png)

All user-managed resources are defined in relation to the organization to which they belong. This means developers need to be able to reference their organization throughout their configuration. We'll outline two ways to define this kind of reference: using local values and data sources. For more details on referencing an organization, please refer to the [`chainguard_group` resource documentation](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs/resources/group) for more information.

> **Note:** Chainguard organizations were previously called "groups," with a "root group" representing what is now referred to as an organization and "subgroups" referring to folders. As of this writing, the Chainguard Terraform provider still refers to "groups" instead of organizations. To align with our other [IAM resources](/platform/administration/iam-organizations/), this document uses the new nomenclature wherever possible.

### Defining local values

The Terraform configuration language allows you to define *local values* which assign a name to a given expression. This allows you to reference the name of a local value multiple times throughout a Terraform configuration rather than repeating the expression each time. As an example, this section will outline how to define a local variable representing the ID of a Chainguard organization.

If you are familiar with `chainctl`, you can find your organization's ID with the following command:

```shell
chainctl iam organizations list -o table
```

Once you've copied the UIDP of your organization (the 40-digit long hex string listed in the `ID` column of the previous command's output), you can use it to create a local variable in Terraform:

```hcl
locals {
  org_id = "[organization UIDP]"
}
```

Throughout your Terraform code, you can refer to this value as `local.org_id`. If you are setting up a reusable Terraform module, you may consider using an input variable instead. Please refer to the [Terraform documentation](https://developer.hashicorp.com/terraform/language/values/variables) for more  information.

### Using data sources

*Data sources* allow Terraform to access and use information that was defined outside ofWe'll outline two ways to define this kind of reference: using local values and data sources. The available data sources for Chainguard resources are [groups](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs/data-sources/group), [identities](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs/data-sources/identity), and [roles](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs/data-sources/role).

If you know the exact name of your organization, you can use a data resource to query the API for it:

```hcl
data "chainguard_group" "org" {
  # This indicates the group is an organization.
  parent_id = "/"
  name   = "[organization name]"
}
```

To refer to the organization's ID in other parts of your Terraform configuration, you would use the reference `data.chainguard_group.org.id`. The rest of the examples in this document will use this for referring to the organization's ID.

## Managing users

The Chainguard Terraform provider is useful for configuring your organization's users and roles. When authenticating with the Chainguard platform, you have the option of using the default OIDC providers (GitHub, GitLab, Google). You can also bring your own identity provider, as long as it is OIDC compliant.

To configure a new identity provider for your organization, use the `chainguard_identity_provider` resource. You must provide a `parent_id` (your organization's ID), a `name` (the identity provider service is a good choice), a `default_role` that new users will be bound to upon their first login, and an `oidc` configuration:

```hcl
# The default role can be either a built-in role, or a custom role.
# To see the list of available built-in roles
# use chainctl iam roles list --managed
data "chainguard_role" "default_role" {
  name = "registry.pull_token_creator"
}

resource "chainguard_identity_provider" "idp" {
  parent_id   = data.chainguard_group.org.id
  name     = "[identity provider service]"
  description = "My org's identity provider"
  # Role data sources return list of matched roles.
  # Don't use data.chainguard_role.default_role.id here, as that
  # is not the ID of the returned role.
  default_role = data.chainguard_role.default_role.items.0.id

  oidc {
 issuer     = "[URL of identity provider issuer]"
 client_id  = "[identity provider client ID]"
 client_secret = "[identity provider client secret]"

 # openid scope is always requested, add additional scopes
 # your identity provider provides (e.g. email, profile)
 additional_scopes = ["email"]
  }
}
```

As this example shows, you also have the option of including a `description` of the identity provider.

If you're not bringing your own identity provider, but rather relying on one of the default OIDC providers, you can still pre-bind users to roles within your organization so they can log in and access your organization's resources right away.

As an example, say you want your users to log in with their GitHub account. To pre-bind users to a role within your organization, you will need to know their GitHub IDs and add them to a Terraform configuration like the following:

```hcl
# Create a custom role in this example for first time users.
resource "chainguard_role" "default_role" {
  parent_id   = data.chainguard_group.org.id
  name     = "org-default-role"
  description = "The role new users are bound to on first login."

  # A full list of all capabilities you can assign to a role
  # are available with chainctl iam roles capabilities list
  capabilities = [
 "groups.list",
 "repo.list",
 "tag.list",
 ...
  ]
}

# Gather a list of user identities
data "chainguard_identity" "users" {
  # Assumes there exists a github_ids set variable defined
  # with the GitHub IDs of your users
  for_each = var.github_ids

  # The issuer is always the same when using the default
  # OIDC providers.
  issuer  = "https://auth.chainguard.dev/"

  # Subjects are prepended with the name of the OIDC provider
  # when using the default provider: github, gitlab, or google-oauth2
  subject = "github|${each.key}”
}

# Bind your users to a default role
resource "chainguard_rolebinding" "default_bindings" {
  for_each = var.github_ids

  group  = data.chainguard_group.org.id
  identity  = data.chainguard_identity.users[each.key].id
  role   = chainguard_role.default_role.id
}
```

After applying this Terraform configuration, any user whose GitHub ID was included can log in and will already be bound to the default role.

## Learn more

The [Chainguard Terraform provider documentation](https://registry.terraform.io/providers/chainguard-dev/chainguard/latest/docs) includes examples of how you can use it to manage your Chainguard resources.

For more information on setting up custom identity providers, we encourage you to check out our documentation on setting up [custom IdPs](/platform/administration/custom-idps/custom-idps/), as well as our examples for [Okta](/platform/administration/custom-idps/idp-providers/okta/), [Ping Identity](/platform/administration/custom-idps/idp-providers/ping-id/), and [Microsoft Entra ID](/platform/administration/custom-idps/idp-providers/ms-entra-id/). Additionally, [our tutorial](/platform/administration/iam-organizations/roles-role-bindings/rolebinding-terraform-gh/) on using the Terraform provider to grant members of a GitHub team access to the resources managed by a Chainguard organization provides more context and information to the method outlined in this guide.

---

### Overview of Chainguard EKS add-ons
_Path: platform/fips/eks-add-ons.md_

Chainguard EKS add-ons are hardened, minimal container images for the foundational software components that power Amazon Elastic Kubernetes Service (EKS) clusters. Available through [AWS Marketplace](https://aws.amazon.com/marketplace), they serve as FIPS-validated drop-in replacements for AWS default add-ons, providing zero known CVEs and FIPS 140-3 validated cryptography without requiring custom image builds or manifest overrides.

## What are EKS add-ons?

Amazon EKS add-ons are software components that provide supporting operational capabilities to Kubernetes applications — things like networking drivers, storage integrations, and observability agents that allow the cluster to interact with underlying AWS resources, but aren't specific to any application running on it.

They handle cluster functions like internal DNS resolution, pod networking, persistent storage, and traffic routing, and are managed independently from your application workloads. AWS installs several add-ons in every EKS cluster by default.

For a full explanation of how EKS add-ons work (including how to install, configure, and update them), refer to the [Amazon EKS add-ons documentation](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html).

## Available Chainguard EKS add-ons

Chainguard provides hardened images for five widely used EKS add-ons. All are FIPS-validated.

| Add-on | Description |
| -------- | ------------- |
| **kube-proxy** | Routes network traffic between pods within the cluster |
| **CoreDNS** | Handles internal DNS — how services discover and communicate with each other |
| **Amazon VPC CNI** | Connects pods to the AWS VPC network backbone |
| **Amazon EBS CSI Driver** | Enables persistent block storage volumes backed by Amazon EBS |
| **Amazon EFS CSI Driver** | Enables shared, persistent file storage backed by Amazon EFS |

## Why use Chainguard EKS add-ons?

### Zero known CVEs

Default EKS add-on images ship with known CVEs. Because customers do not own the upstream source code, they aren't able to patch these vulnerabilities.

Chainguard rebuilds each add-on using its minimal, hardened container image approach, removing unnecessary packages and dependencies that are the most common source of CVEs. Like Chainguard Containers, Chainguard EKS add-ons are rebuilt continuously to incorporate available security patches, keeping the known CVE count at or near zero.

### FIPS 140-3 validated cryptography

For organizations operating under FedRAMP, NIST, or other compliance frameworks that require FIPS-validated cryptography, existing options create additional developer toil to maintain the image. Chainguard EKS add-ons are the only available option that provides FIPS 140-3 validated cryptography for core EKS cluster infrastructure. No other provider offers FIPS-validated replacements for these components.

To learn more about how Chainguard approaches FIPS, refer to the [Chainguard FIPS documentation](/chainguard/fips/).

### Drop-in compatibility

Chainguard EKS add-ons are designed as direct replacements for the corresponding AWS-managed components. They use the same Helm-based deployment workflow as any other EKS add-on and require no changes to your existing cluster configuration.

Chainguard EKS add-ons are available through AWS Marketplace and can be found through the AWS Console. There's no manual setup, you don't need a Chainguard account to subscribe, and billing is consolidated with your existing AWS bill.

## Who should use Chainguard EKS add-ons?

Chainguard EKS add-ons are well-suited for:

- **Regulated industries**: Healthcare, financial services, defense, and government organizations that require FIPS 140-3 validated cryptography or operate under FedRAMP, NIST 800-53, or similar compliance frameworks.
- **Security-conscious engineering teams**: Platform and DevOps teams that want a clean, auditable baseline for cluster infrastructure without maintaining custom image builds or accepting audit exceptions.
- **Organizations requiring infrastructure control**: Enterprises that need more control over their EKS deployments than EKS Auto Mode provides, and for whom FIPS compliance through Auto Mode is not a viable option.

## Using Chainguard EKS add-ons

### Prerequisites

In order to use Chainguard EKS add-ons, you will need the following:

- An active AWS account
- An existing Amazon EKS cluster, or permission to create one
- AWS IAM permissions sufficient to subscribe to AWS Marketplace offerings

### Subscribe through AWS Marketplace

Chainguard EKS add-ons are listed in AWS Marketplace and can be found within the EKS Console. To subscribe:

1. In the AWS Console, navigate to your EKS cluster and open the **Add-ons** tab.
2. Search for the Chainguard add-on you want to install.
3. Subscribe.

### Deploy with Helm

Once subscribed, deployment follows the standard EKS Helm workflow, and you can deploy the add-ons with AWS CLI or in your GitOps workflows. Unlike a standalone Helm chart, which is self-managed, EKS will automatically handle lifecycle management of your add-ons. No new tooling, no Chainguard account, and no changes to your existing Kubernetes manifests are required.

For step-by-step installation guidance, refer to the deployment instructions included with each add-on listing in AWS Marketplace.

### Known limitations

AWS Marketplace container products, including EKS add-ons, are not available in AWS GovCloud. As noted in the [AWS GovCloud User Guide](https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/govcloud-marketplace.html), "Currently, container products and Amazon Machine Learning products are not available." Consequently, you cannot deploy Chainguard EKS add-ons through AWS Marketplace in GovCloud.

Instead, deploy the add-ons using self-managed Helm charts or rendered manifests. Do not modify an add-on’s image references after deployment. These fields are effectively immutable, and modifying them prevents the add-on from receiving updates.

---

### Kernel-independent FIPS architecture
_Path: platform/fips/kernel-independent-architecture.md_

## Overview

Chainguard FIPS Containers use a userspace entropy source instead of relying on the host kernel to provide validated randomness. This kernel-independent design allows FIPS containers to run on any recent Linux kernel, eliminating the traditional requirement for kernels configured in FIPS mode.

This architectural approach addresses a longstanding limitation in deploying FIPS-compliant workloads (FIPS being the U.S. federal cryptographic standard) by removing kernel dependencies that previously restricted deployment options, prevented local development, and limited cloud platform choices.

## Chainguard's architecture

### Core components

**Jitterentropy library**: A userspace entropy generator that produces randomness from CPU execution timing variations. This library runs entirely within the container and has its own NIST SP 800-90B Entropy Source Validation (ESV).

**OpenSSL FIPS provider**: The CMVP-validated cryptographic module (Certificate [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282)) that uses the userspace entropy source instead of kernel entropy.

**Self-contained packaging**: Both the entropy source and cryptographic module are bundled in the container image, making each container self-sufficient for FIPS compliance.

### How it works

When a Chainguard FIPS container starts:

1. The container includes the Jitterentropy library with SP 800-90B validation
2. OpenSSL is configured at build time to use the userspace entropy source
3. Cryptographic operations obtain entropy from Jitterentropy running in userspace
4. No kernel entropy source is required or accessed

The FIPS cryptographic boundary is entirely within the container. The host kernel is not part of the compliance story.

### Validation architecture

The design relies on two separate NIST certifications:

**CMVP Certificate #4282**: Validates the OpenSSL FIPS provider's cryptographic algorithms. This certificate includes a caveat noting that an approved entropy source is required.

**ESV Certificate**: Validates the Jitterentropy library as meeting SP 800-90B entropy requirements, satisfying the CMVP certificate's entropy caveat.

The entropy source sits outside the cryptographic boundary but is independently validated. This architecture is sound and meets NIST requirements.

## Why this matters

### The problem with traditional FIPS containers

Before kernel-independent FIPS, containers relied on the host kernel to provide SP 800-90B validated entropy through `/dev/random`. This meant:

**Kernel must be in FIPS mode**: Organizations had to provision and maintain kernels configured for FIPS, typically older LTS versions.

**Limited deployment options**:

- Cloud platforms without FIPS-enabled kernels (GKE with COS, AWS Bottlerocket, Azure Linux) were unavailable
- Latest instance types and hardware often unsupported
- Specific Linux distributions and versions required

**Development environment gaps**: Developers couldn't run FIPS containers on workstations, creating a gap between local development and production.

**CI/CD complexity**: Testing FIPS applications required dedicated infrastructure with FIPS-enabled kernels.

### Chainguard's solution benefits

**Any Linux kernel**: Deploy on any recent kernel without FIPS mode configuration. Use latest kernels with security patches and performance improvements.

**All cloud platforms**: Run on GKE, EKS, AKS, and other managed Kubernetes services regardless of their kernel configuration.

**Local development**: Test FIPS containers on developer workstations (macOS, Windows WSL2, Linux) without special setup.

**Standard CI/CD**: Use existing pipeline infrastructure without FIPS-specific runners.

**Latest hardware**: Access newest instance types and hardware optimizations immediately.

**Simplified operations**: Container updates handle FIPS compliance. No separate kernel maintenance track.

## Supported runtimes and languages

Kernel-independent FIPS is available for:

**Go** (versions 1.21+): Uses OpenSSL via golang-fips/go or microsoft/go implementations.

**Python** (versions 3.10-3.13): Native OpenSSL integration through `_ssl` and `hashlib` modules.

**Node.js** (versions 18-23): Built-in crypto module uses OpenSSL.

**.NET** (versions 6-8): System.Security.Cryptography uses OpenSSL on Linux.

**PHP** (versions 8.2-8.3): OpenSSL extension provides cryptographic functions.

**C/C++**: Direct OpenSSL API usage with FIPS provider.

**Java** (versions 11, 17, 21): As of August 2025, supports kernel-independent FIPS using Bouncy Castle Entropy Provider with Jitterentropy.

### Java's transition

Java deserves special mention as it recently gained kernel-independent capability.

**Before August 2025**: Java-based FIPS images required the host kernel in FIPS mode because the Bouncy Castle FIPS provider (BC-FJA) lacked its own entropy source.

**August 2025 update**: Chainguard integrated Jitterentropy with a Bouncy Castle Entropy Provider, enabling Java FIPS containers to run on any kernel. Java images now ship with this configuration by default.

Read more: [Kernel-Independent FIPS for Java](https://www.chainguard.dev/unchained/announcing-kernel-independent-fips-for-java)

## What still requires kernel FIPS mode

A few use cases remain kernel-dependent:

**Certain Kubernetes CNI plugins**: Some Container Network Interface plugins require kernel cryptographic modules for network encryption.

**LUKS2 full-disk encryption**: Disk encryption operates at the block device level, requiring kernel cryptographic support.

**StrongSwan VPN**: IPsec VPN implementations typically use kernel cryptographic modules.

These involve kernel-level operations where userspace entropy cannot be substituted. For these workloads, configure the host kernel in FIPS mode.

## Verifying kernel independence

Check an image's SBOM (Software Bill of Materials) to verify kernel independence.

For images built from November 7, 2024 onward, the SBOM must contain:

```
libcrypto3>=3.4.0-r2
openssl-config-fipshardened>=3.4.0-r3
```

These package versions indicate userspace entropy source configuration.

Retrieve an image's SBOM:

```bash
cosign download sbom cgr.dev/ORGANIZATION/IMAGE:TAG
```

Then search for the required packages and versions.

## Architecture comparison

### Traditional FIPS stack

```
┌─────────────────────────┐
│   Application Code      │
├─────────────────────────┤
│  FIPS Crypto Module     │ ← CMVP Validated
├─────────────────────────┤
│   Container Runtime     │
└─────────────────────────┘
           ↓ (entropy request)
┌─────────────────────────┐
│   Host Kernel           │ ← Must be in FIPS mode
│   /dev/random           │ ← SP 800-90B source
└─────────────────────────┘
           ↓
┌─────────────────────────┐
│   Hardware RNG          │
└─────────────────────────┘
```

### Chainguard kernel-independent stack

```
┌─────────────────────────┐
│   Application Code      │
├─────────────────────────┤
│  FIPS Crypto Module     │ ← CMVP Validated
├─────────────────────────┤
│  Jitterentropy Library  │ ← SP 800-90B Validated
├─────────────────────────┤
│   Container Runtime     │
└─────────────────────────┘
           ↓ (CPU timing)
┌─────────────────────────┐
│   Any Linux Kernel      │ ← No FIPS mode required
└─────────────────────────┘
```

### Feature comparison

| Aspect | Traditional FIPS | Chainguard Kernel-Independent |
| -------- | ------------------ | ------------------------------- |
| **Kernel requirement** | Must be in FIPS mode | Any recent Linux kernel |
| **Entropy source** | Kernel (`/dev/random`) | Userspace (Jitterentropy) |
| **Developer testing** | Requires FIPS VM/hardware | Works on local workstation |
| **Cloud platforms** | Limited to FIPS-enabled kernels | All platforms supported |
| **Instance types** | Restricted to older hardware | Latest hardware available |
| **CI/CD** | Special FIPS infrastructure | Standard pipelines |
| **Validation** | CMVP cert + kernel validation | CMVP cert + ESV cert |
| **Container portability** | Limited | Full portability |
| **Maintenance** | Kernel + container updates | Container updates only |

## Performance considerations

Userspace entropy generation raises performance questions, but testing shows minimal impact.

**Jitterentropy overhead**: Minimal on modern processors. The library generates entropy from CPU timing jitter, which is fast.

**Comparison to kernel entropy**: Userspace entropy can be **faster** in some cases by avoiding context switches and system calls to kernel space.

**Entropy caching**: OpenSSL caches entropy appropriately. Frequent cryptographic operations don't repeatedly call the entropy source.

**Production validation**: Chainguard FIPS images have been tested in production workloads with no significant performance degradation.

If you encounter performance issues, profile your application to identify the actual bottleneck before assuming entropy generation is the cause.

## Technical deep dive

### Cryptographic boundaries

Understanding what's inside versus outside the FIPS boundary is essential.

**Inside the boundary**: OpenSSL FIPS provider containing:

- Approved cryptographic algorithms (AES, SHA-2, SHA-3, RSA, EdDSA, etc.)
- Key management functions
- Self-tests and integrity checks

**Outside the boundary**:

- Jitterentropy library (separately validated under SP 800-90B)
- Application code calling OpenSSL APIs
- Operating system services

The entropy source validation satisfies the cryptographic module's requirements without being inside the CMVP boundary. This separation is architecturally appropriate and compliant.

### Entropy generation

Jitterentropy works by:

1. **Measuring CPU timing variations**: Execute code loops and measure execution time with high-resolution timers
2. **Collecting jitter**: Timing variations arise from CPU pipeline effects, cache behavior, interrupts, and other micro-architectural events
3. **Extracting entropy**: Statistical analysis determines how much entropy is present in the timing measurements
4. **SP 800-90B validation**: NIST testing confirms the source produces sufficient entropy

This approach is entirely in userspace and doesn't require hardware random number generators or kernel support.

### OpenSSL configuration

Chainguard configures OpenSSL at build time to:

- Load the FIPS provider automatically
- Configure the provider to use Jitterentropy for entropy
- Operate in approved-only mode (no non-approved algorithms)
- Enforce FIPS configuration at runtime (cannot be disabled)

The `openssl-config-fipshardened` package implements these configurations. Applications using OpenSSL automatically get FIPS-validated cryptography without code changes.

## Next steps

- [Getting started with FIPS](/chainguard/fips/getting-started/) - Deploy your first FIPS container
- [Frequently asked questions](/chainguard/fips/faqs/) - Common questions about FIPS implementation
- [Blog: Kernel-Independent FIPS Images](https://www.chainguard.dev/unchained/kernel-independent-fips-images) - Original announcement with additional details
- [Blog: Kernel-Independent FIPS for Java](https://www.chainguard.dev/unchained/announcing-kernel-independent-fips-for-java) - Java-specific implementation

---

### Understanding FIPS
_Path: platform/fips/understanding-fips.md_

## What is FIPS?

Federal Information Processing Standards (FIPS) are publicly announced standards developed by the [National Institute of Standards and Technology](https://www.nist.gov/itl/publications-0/federal-information-processing-standards-fips) (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the U.S. Secretary of Commerce.

FIPS is a **U.S. federal standard** that establishes requirements for cryptographic security in federal government systems. While FIPS originates from U.S. federal requirements, many organizations globally adopt FIPS validation as a recognized security benchmark, particularly when working with U.S. government agencies or operating in regulated industries.

FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly. According to NIST guidance, "Non-validated cryptography is viewed as providing no protection… the data would be considered unprotected plaintext."

## Who needs FIPS validation?

### U.S. federal and government requirements

**U.S. Federal agencies** are required to use FIPS-validated cryptography for protecting sensitive information under FISMA.

**U.S. Department of Defense (DoD)** systems at various Impact Levels (IL4, IL5, IL6) must use FIPS-validated cryptographic modules as part of their security authorization process.

**FedRAMP-authorized cloud services** must meet Federal Risk and Authorization Management Program requirements for operating in U.S. federal environments. FedRAMP Rev 5 specifically states that "any data in transit, whether from one container to another or to a sidecar inside the same host virtual machine" requires FIPS-validated encryption controls (SC-8).

**U.S. Government contractors** working with federal data often must demonstrate FIPS compliance as part of their contractual obligations.

### Global organizations working with U.S. entities

Organizations outside the United States may need FIPS validation when:

- Providing cloud services to U.S. federal agencies or contractors
- Participating in U.S. defense supply chains
- Operating systems that handle U.S. federal data
- Seeking to demonstrate cryptographic security using a recognized standard

### Regulated industries

Beyond government mandates, FIPS validation is recommended or required for:

- **Financial services**: Banks and payment processors handling sensitive financial data
- **Healthcare**: Organizations processing protected health information (PHI) under HIPAA
- **Critical infrastructure**: Energy, telecommunications, and transportation sectors
- **Defense contractors**: Companies in the defense industrial base

### Why alternative approaches fall short

Some organizations attempt to achieve compliance through alternative means, but these approaches have limitations:

**Service meshes** (Istio, Linkerd) cannot encrypt traffic between main containers and sidecars, or container-to-container calls within the same pod. Auditors will flag these gaps as non-compliant.

**VPN tunnels** only protect host-to-host traffic. They miss intra-host and intra-pod cryptographic operations that FedRAMP and DoD auditors require.

**FIPS-enabled host OS alone** doesn't force userspace applications to use FIPS modules. Applications must be explicitly configured, and this approach restricts you to older kernel versions.

## FIPS standards overview

### FIPS 140: Cryptographic module validation

FIPS 140 defines security requirements for cryptographic modules.

**FIPS 140-2** was the standard from 2001 until recently. As of September 2026, all FIPS 140-2 certificates will become historical, making migration to FIPS 140-3 essential.

**FIPS 140-3**, published in September 2019, delivers more robust security testing, clearer validation criteria, and updated standards that reflect advancements in cryptographic technology. Organizations adopting this version gain enhanced protection against emerging threats.

The transition from 140-2 to 140-3 represents a significant upgrade in:

- Security testing rigor
- Documentation requirements
- Conformance criteria clarity
- Alignment with international standards (ISO/IEC 19790)

### FIPS 186: Digital signature standard

**FIPS 186-5**, published by NIST in 2023, approved the EdDSA (Edwards-curve Digital Signature Algorithm) for digital signatures using Ed25519 and Ed448 schemes.

Ed25519 offers improved speed and smaller key sizes compared to RSA, making it attractive for modern cryptographic implementations. This standard enables more efficient digital signatures while maintaining security guarantees.

### SP 800-90B: Entropy source validation

SP 800-90B defines requirements for entropy sources used by random bit generators. Cryptographic operations require high-quality randomness that cannot be reasonably predicted.

Entropy Source Validation (ESV) certifies that a random number generator produces sufficient entropy to meet cryptographic requirements. This validation is separate from but complementary to CMVP (Cryptographic Module Validation Program) certification.

## The CMVP validation process

### What is CMVP?

The Cryptographic Module Validation Program (CMVP) is a joint effort between NIST and the Canadian Centre for Cyber Security to validate cryptographic modules according to FIPS 140 requirements.

A validated module receives a certificate number that organizations can reference for compliance purposes. Chainguard's OpenSSL FIPS provider, for example, holds CMVP Certificate [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282).

### Validation timeline

The CMVP process is lengthy and complex:

1. **Development and internal testing**: Implement cryptographic module with FIPS requirements
2. **Lab testing**: Submit to a NIST-approved testing lab for evaluation
3. **Patching and fixes**: Address findings from lab testing
4. **Formal submission**: Submit validated module to NIST
5. **NIST review process**: Module moves through pending review, coordination, and finalization states
6. **Certificate issuance**: If approved, NIST issues a validation certificate

**Current average timeline**: 590 days from submission to certificate issuance.

This extended timeline creates challenges for software vendors, as:

- Security vulnerabilities (CVEs) may be discovered during the validation process
- New features cannot be added without restarting validation
- Projects with rapid release cycles struggle to maintain current certifications

### Module in process (MIP)

Modules awaiting validation appear on NIST's [Module in Process list](https://csrc.nist.gov/Projects/cryptographic-module-validation-program/modules-in-process/modules-in-process-list). This indicates formal submission but not yet completed validation.

## Cryptographic boundaries

A cryptographic boundary defines what is inside the validated module versus what is outside. Understanding boundaries is essential for compliance.

**Inside the boundary**: The cryptographic algorithms, key management, and security functions that are validated.

**Outside the boundary**: Operating system services, entropy sources (validated separately under SP 800-90B), and application code that uses the module.

For example, Chainguard's kernel-independent FIPS design places:

- **Inside**: OpenSSL FIPS provider with approved algorithms
- **Outside**: Jitterentropy library (separately validated under SP 800-90B)
- **Outside**: Application code calling OpenSSL APIs

The entropy source validation satisfies the cryptographic module's entropy requirements without being part of the CMVP certificate itself.

## Approved vs. non-approved algorithms

FIPS distinguishes between approved and non-approved cryptographic algorithms.

**Approved algorithms** have undergone NIST review and are permitted for protecting sensitive data. Examples include AES, SHA-2 and SHA-3 families, RSA (with constraints), and EdDSA.

**Non-approved algorithms** either haven't been evaluated or are explicitly prohibited for protecting sensitive information. Examples include MD5 (except for non-security purposes like checksums), SHA-1 for signatures, and protocols like WireGuard that require unapproved primitives.

**Approved-only mode** means the cryptographic module only permits approved algorithms. Chainguard FIPS images operate in approved-only mode and cannot be switched to allow non-approved algorithms. This design prevents accidental non-compliance.

## Security policies

Each validated cryptographic module includes a security policy document describing:

- The module's cryptographic boundary
- Approved and non-approved modes of operation
- Required configuration for FIPS compliance
- Roles and services provided
- Physical and logical security mechanisms

Security policies are publicly available on the NIST website for each validated module. Review these policies to understand module capabilities and limitations.

## Maintaining compliance

FIPS compliance is not set-and-forget:

**Ongoing updates**: As vulnerabilities are discovered, modules must be patched while maintaining validation. Chainguard addresses this by committing to zero-to-minimal CVEs under SLA.

**Certificate expiration**: Certificates must be renewed periodically. Organizations should track certificate status and plan for transitions.

**Configuration management**: Systems must maintain FIPS configuration throughout their lifecycle. A validated module running in non-FIPS mode provides no compliance benefit.

**Audit preparation**: Document which modules are in use, their certificate numbers, and configuration evidence for auditors.

## Next steps

Now that you understand FIPS fundamentals, explore:

- [Kernel-independent FIPS architecture](/chainguard/fips/kernel-independent-architecture/) - Learn how Chainguard's approach simplifies FIPS deployment
- [Chainguard FIPS containers](/chainguard/fips/fips-images/) - Overview of available FIPS images
- [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) - Chainguard's warranties and certifications
- [NIST CMVP](https://csrc.nist.gov/projects/cryptographic-module-validation-program) - Official validation program information

---

### Getting started with FIPS containers
_Path: platform/fips/getting-started.md_

## Prerequisites

Before starting, you'll need:

- **Chainguard account with FIPS access**: FIPS containers are not included in the free tier. [Contact Chainguard](https://www.chainguard.dev/contact) to request access.
- **Docker or compatible container runtime**: Install [Docker Desktop](https://www.docker.com/products/docker-desktop) or another OCI-compatible runtime.
- **Basic container knowledge**: Familiarity with pulling and running container images.

FIPS containers work on any recent Linux kernel, including:

- Linux workstations
- macOS (Docker Desktop)
- Windows (WSL2 with Docker Desktop)

## Choosing a FIPS image

Chainguard offers 400+ FIPS image variants. Choose based on your use case:

**Language runtime images** if you're building applications:

- `go-fips` - For building Go applications
- `python-fips` - For Python applications
- `node-fips` - For Node.js applications
- `jdk-fips` or `jre-fips` - For Java applications
- `dotnet-runtime-fips` - For .NET applications

**Application images** if you need a specific tool or service:

- `nginx-fips` - Web server
- `postgres-fips` - Database
- `prometheus-fips` - Monitoring
- And many more

**Base images** for minimal runtime environments:

- `glibc-openssl-fips` - Minimal glibc-based runtime
- `busybox-fips` - Minimal BusyBox environment

Browse the complete catalog at [images.chainguard.dev/?category=fips](https://images.chainguard.dev/?category=fips).

## Your first FIPS container

Let's start with a Python example to verify FIPS is working.

### Pull the image

Replace `ORGANIZATION` with your organization name in the Chainguard Registry:

```bash
docker pull cgr.dev/$ORGANIZATION/python-fips:latest
```

### Run a test script

Create a Python script that uses cryptography:

```bash
cat > test_fips.py << 'EOF'
import hashlib
import ssl

# Test that we can use cryptographic functions
data = b"Hello, FIPS!"
hash_result = hashlib.sha256(data).hexdigest()
print(f"SHA-256 hash: {hash_result}")

# Check SSL/TLS configuration
print(f"OpenSSL version: {ssl.OPENSSL_VERSION}")
print("FIPS cryptography is active")
EOF
```

Run the script in the FIPS container:

```bash
docker run --rm -v $(pwd):/work -w /work \
  cgr.dev/$ORGANIZATION/python-fips:latest \
  test_fips.py
```

You should see output like:

```
SHA-256 hash: 4a1e3b5c7d9f2a8c6b0e4f3a9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4e3d2c1b0a
OpenSSL version: OpenSSL 3.4.0 5 Aug 2025
FIPS cryptography is active
```

This confirms the container is using OpenSSL for cryptographic operations.

## Verifying FIPS configuration

### Check the SBOM

Every Chainguard image includes a Software Bill of Materials (SBOM). Verify FIPS-required packages:

```bash
cosign download attestation cgr.dev/$ORGANIZATION/python-fips:latest | jq -r .payload | base64 -d | jq '.predicate.buildDefinition.externalParameters."image-configuration".contents.packages' | grep -E "libcrypto|openssl-config"
```

Look for:

- `libcrypto3` version 3.4.0-r2 or higher
- `openssl-config-fipshardened` version 3.4.0-r3 or higher

These packages indicate kernel-independent FIPS configuration.

### Inspect OpenSSL configuration

Run a container interactively to check OpenSSL configuration:

```bash
docker run --rm -it --entrypoint /usr/bin/bash cgr.dev/$ORGANIZATION/python-fips:latest-dev
```

Inside the container, verify the FIPS module:

```bash
cat /etc/ssl/fipsmodule.cnf
```

You should see configuration for the FIPS provider. This file's presence and validity are essential for FIPS operation.

## Building applications with FIPS

### Multi-stage build pattern

The recommended pattern is to build with a FIPS SDK image and run with a minimal FIPS runtime image.

Example Dockerfile for a Go application:

```dockerfile
# Build stage
FROM cgr.dev/$ORGANIZATION/go-fips:latest AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN go build -o myapp

# Runtime stage
FROM cgr.dev/$ORGANIZATION/glibc-openssl-fips:latest

COPY --from=builder /app/myapp /usr/bin/myapp

ENTRYPOINT ["/usr/bin/myapp"]
```

This pattern:

- Builds your application with FIPS-enabled Go toolchain
- Produces a minimal runtime image with only the binary and FIPS runtime
- Maintains FIPS compliance throughout

### Build and run

```bash
docker build -t myapp-fips .
docker run --rm myapp-fips
```

The resulting container runs on any Linux kernel and maintains FIPS validation.

## Common patterns

### Python application with requirements

```dockerfile
FROM cgr.dev/$ORGANIZATION/python-fips:latest

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]
```

### Node.js application

```dockerfile
FROM cgr.dev/$ORGANIZATION/node-fips:latest AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --production

COPY . .

# Use multi-stage if you want a smaller runtime
FROM cgr.dev/$ORGANIZATION/node-fips:latest
WORKDIR /app
COPY --from=builder /app .

CMD ["node", "server.js"]
```

### Java application

```dockerfile
FROM cgr.dev/$ORGANIZATION/jdk-fips:latest AS builder

WORKDIR /app
COPY . .
RUN javac MyApp.java

FROM cgr.dev/$ORGANIZATION/jre-fips:latest
WORKDIR /app
COPY --from=builder /app/*.class .

CMD ["java", "MyApp"]
```

## Testing FIPS enforcement

To verify that FIPS mode is enforced, you can intentionally break the FIPS configuration and confirm the application fails.

**Warning**: This test should only be done in development environments.

Run a container with access to modify system files:

```bash
docker run --rm -it --user root --entrypoint /usr/bin/bash \
  cgr.dev/$ORGANIZATION/python-fips:latest-dev
```

Inside the container, break the FIPS configuration:

```bash
# Backup the config
cp /etc/ssl/fipsmodule.cnf /tmp/fipsmodule.cnf.bak

# Invalidate it
ln -sf /dev/null /etc/ssl/fipsmodule.cnf

# Try to use crypto
python3 -c "import hashlib; print(hashlib.sha256(b'test').hexdigest())"
```

You should see an error indicating FIPS is required but not available. This proves the container enforces FIPS mode and won't fall back to non-validated cryptography.

Restore the config to fix:

```bash
cp /tmp/fipsmodule.cnf.bak /etc/ssl/fipsmodule.cnf
```

## Development workflow

### Local development

FIPS containers work on any kernel, so you can develop and test locally:

1. Pull the FIPS image for your language/framework
2. Mount your source code into the container
3. Iterate on code with hot-reload if your framework supports it
4. Test cryptographic operations work correctly

Example for Python development:

```bash
docker run --rm -it \
  -v $(pwd):/app \
  -w /app \
  -p 8000:8000 \
  --entrypoint /usr/bin/bash
  cgr.dev/$ORGANIZATION/python-fips:latest-dev
```

Inside, install development dependencies and run your app.

### CI/CD integration

FIPS containers work in standard CI/CD pipelines without special infrastructure.

GitHub Actions example:

```yaml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Pull FIPS image
        run: docker pull cgr.dev/$ORGANIZATION/python-fips:latest

      - name: Run tests
        run: |
          docker run --rm -v $(pwd):/app -w /app \
            cgr.dev/$ORGANIZATION/python-fips:latest \
            python -m pytest
```

No special runners or kernel configurations required.

## Troubleshooting

### Issue: "FIPS mode requested but not available"

**Cause**: The FIPS provider configuration is missing or invalid.

**Solution**: Verify you're using a FIPS-tagged image (e.g., `python-fips`, not `python`). Check the SBOM contains required packages.

### Issue: Application crashes on startup

**Cause**: The application may be using a cryptographic library that doesn't support FIPS.

**Solution**: Ensure your application uses OpenSSL-backed cryptography.

### Issue: Performance degradation

**Cause**: Likely not FIPS-related. Profile your application first.

**Solution**: Use standard profiling tools to identify bottlenecks. FIPS cryptography typically adds minimal overhead.

### Issue: Can't pull the image

**Cause**: FIPS images require account access.

**Solution**: Verify your organization has FIPS access. Contact support if needed.

## Next steps

Now that you've deployed your first FIPS container:

- **Kernel-independent architecture**: Understand [how it works](/chainguard/fips/kernel-independent-architecture/) under the hood
- **FAQs**: Check [common questions](/chainguard/fips/faqs/) about FIPS implementation
- **Chainguard support**: [Contact us](https://www.chainguard.dev/contact) for questions or custom requirements

---

### FIPS and non-approved algorithms
_Path: platform/fips/non-approved-algorithms.md_

## Overview

FIPS cryptographic modules implement cryptographically strong protection of data at rest and in transit. NIST's position on this is very clear ([source](https://csrc.nist.gov/projects/cryptographic-module-validation-program)):

> Non-validated cryptography is viewed as providing no protection to the information or data — in effect the data would be considered unprotected plaintext. If the agency specifies that the information or data be cryptographically protected, then FIPS 140-2 or FIPS 140-3 is applicable. In essence, if cryptography is required, then it must be validated. Should the cryptographic module be revoked, use of that module is no longer permitted.

## NIST guidance on non-approved algorithm usage

As part of the FIPS collection of publications, NIST publishes [FIPS 140-3 Implementation Guidance](https://csrc.nist.gov/projects/cryptographic-module-validation-program/fips-140-3-ig-announcements) (FIPS 140 I.G.). The Cryptographic Module Validation Program (CMVP) requirements for the FIPS 140-3 include ISO standards, SP 800 series documents as well as the FIPS 140-3 I.G. The full set of documents and diagram are available from the [NIST Information Technology Laboratory Computer Security Resource Center](https://csrc.nist.gov/Projects/cryptographic-module-validation-program/fips-140-3-standards).

The FIPS 140-3 I.G. 2.4.A "Definition and Use of a non-Approved Security Function" is three pages long, and must be read in conjungtion with all other relevant NIST & ISO publications. It provides many examples, exceptions, and carve outs that at times let you use non-approved algorithms as part of higher level approved services. For example, some algorithms might not be safe to use directly, but with appropriate safeguards can be cryptographically secure. This is often the case with complex protocols such as TLS, which combines cryptographic primitives in a safe way.

Skipping to additional comments, let's focus on these statements (current edition, refer to the current [FIPS 140-3 I.G.](https://csrc.nist.gov/projects/cryptographic-module-validation-program/fips-140-3-ig-announcements) for any changes).

### FIPS 140-3 I.G. 2.4.A additional comment

The vendor must provide clear documentation and reasoning as to why the non-approved cryptographic algorithms can be used in an approved mode, that is, not being used to meet the requirements of FIPS 140-3 sections 6 and 7. It is at the discretion of the CMVP to determine if such usage of an algorithm fits within the guidance laid out in this implementation guidance (IG).

In addition, attempts to make use of this IG to include algorithms in the approved mode will not be accepted unless all of the following are met:

1) the algorithm is not used whatsoever to meet any FIPS 140-3 requirements;
1) the algorithm does not access or share CSPs in a way that counters the requirements of this IG;
1) the algorithm is either:
   1) not intended to be used as a security function (for example, interoperability or for memory wear leveling);
   1) redundant to an approved algorithm (such as double encryption);
   1) a cryptographic or mathematical operation applied for “good measure” but not for providing sound security (that is XORing a CSP with a secret value, using a proprietary algorithm, or using non-approved algorithms to obfuscate stored CSPs which are considered plaintext);
1) the algorithm’s non-approved use and purpose (from 3, above) is unambiguous to the operator and can’t be easily confused for a security function.

### Chainguard FIPS commitment

As documented in the [Chainguard FIPS commitment](https://www.chainguard.dev/legal/fips-commitment), our FIPS images enable only approved services and algorithms by default. This simplifies reasoning, audit and testing about what is or isn't a security function, since we are using only approved services. For example, Chainguard [gradle-fips](https://images.chainguard.dev/directory/image/gradle-fips/versions) has been modified to use an approved keystore to store build settings. While not a security function, this ensured that no unapproved keystore could leak into the build process and testing.

All cases of usage that might be related to a security function are also made to only use approved services. This includes but is not limited to:

* encryption / decryption
* digital signature creation and verification
* random number generation
* message authentication code
* key derivation functions
* key encapsulation methods
* key exchange

The one functionality that errs on the side of non-security function is calculating a digest alone, not part of MAC, HMAC, Merkle tree, integrity scheme, or digital signatures. Specifically, MD4, MD5, and SHA1 are universally deprecated and disallowed as part of security schemes, and yet they remain widely used for non-security functionality.

Examples of such non-security usage are:

* Webpack 4 uses MD4 to precompute perfect hashtables from trusted input at build time, refer to [this issue](https://github.com/webpack/webpack/issues/14560).
* Yarn, .ZIP, JAR, PDF require MD5 as part of the frozen fileformats they use
* Amazon S3 supports many algorithms for object integrity checking over trusted channel, including MD5 and SHA1, refer to [the official docs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity-upload.html). Many client implementations default to MD5.
* Google Cloud Storage can use CRC32C or MD5, and clients typically default to MD5 for object integrity during uploads [docs](https://docs.cloud.google.com/storage/docs/data-validation)
* AES-ECB insecure when used directly, but is used by QUIC and DTLSv1.3 protocols for non-security obfuscation of public information
* SHA-1 is still widely used for hash addressable content and lookup tables, for example `apk-tools` and git.

In all of the above use cases digest calculation does not provide any security functionality, it is meant to detect accidental corruption or improve speed. Overall, data is typically protected by SHA2-256 and is transmitted over a secure and authenticated TLS channel.

One alternative to migrating away from MD5 is to choose a specialist function explicitly designed for non-security purposes with significantly higher performance, such as [XXHASH](https://xxhash.com/). In most cases, non-security functionality should upgrade from CRC32C, MD5, SHA1 to XXHASH3.

However, if you need interoperability with existing formats and services *and* it is established that digest usage is for non-security purposes, you must use the insecure digests. Chainguard is integrating support for such use cases for MD5 and SHA1 across our FIPS images. Each language and application implementation is very different and specific, documented below.

Although SHA1 is currently approved, it is already deprecated by RFCs. NIST is deprecating SHA1 by 2030.  The implementations below are forward-looking and attempt to address access to MD5 today and SHA1 in the future.

SHA1 is available as approved in Chainguard FIPS Provider for OpenSSL versions 3.0.9, 3.1.2 and 3.4.0. It is non-approved starting in version 3.6.0.

## Access to unapproved algorithms for non-security purposes

### Chainguard Legacy Approved provider for OpenSSL

Chainguard FIPS and non-FIPS images are configured to use a legacy provider that exposes the above mentioned algorithms for non-security purposes. At runtime one can choose to disable them with an environment variable `CHAINGUARD_LEGACY_APPROVED=0`. This provider enables all OpenSSL applications to uniformally access legacy algorithms for non-security purposes. They do remain blocked from being used inside the FIPS module boundary for security purposes such as protecting data at rest or in transit.

This guidance applies to all images and software that uses OpenSSL:

* python-fips
* node-fips
* jdk-openssl-fips
* postgresql-fips
* dotnet-fips

And many others.

### Python grpc, pyca, cryptography FIPS and MD5

If you are compiling grpc or pycryptography from source; or installing it from PyPI; it may come with a vendored and statically linked copy of a cryptographic library and will not operate in FIPS mode. In such cases, all usage of it may be non-approved.

If you install grpc and pycryptography through [Custom Assembly](https://edu.chainguard.dev/chainguard/containers/custom-assembly/overview/), it will be dynamically linked with Chainguard OpenSSL and will use the above guidance.

### Go-fips / Go-openssl-fips

Access to MD5 digest is provided using native Go implementation, whilst any form of authentication, authorisation, digital signatures and TLS with MD5 is blocked.

### All other projects

If you have queries about this guidance, or any other packages, projects, languages or ecosystems, in the feedback section on this page select "No" and please fill in feedback, or please [open a support ticket](https://support.chainguard.dev/).

---

### Verify that Chainguard FIPS containers are configured to use FIPS modules
_Path: platform/fips/verify-fips.md_

Chainguard offers hundreds of FIPS container image variants covering language runtimes (Go, Java, Python, Node.js, .NET, PHP, C/C++), databases, web servers, and Kubernetes components. These images use NIST-validated cryptographic modules including the OpenSSL FIPS provider, Bouncy Castle FIPS, and BoringCrypto. Refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for a full list of the modules used in Chainguard FIPS Images, as well as their respective CMVP certificates and SBOM indicators.

This guide outlines how to verify that Chainguard's FIPS images are properly configured to use these FIPS modules.

## Why verify FIPS configuration?

FIPS (Federal Information Processing Standards) 140 is a U.S. government standard that specifies security requirements for cryptographic modules. Organizations in regulated industries—including federal agencies, defense contractors, healthcare organizations, and financial services—must verify that their containers are correctly using FIPS-validated modules to maintain compliance.

These verification steps help you:

- Confirm FIPS modules are active and operational
- Validate compliance for audit purposes
- Troubleshoot configuration issues
- Generate evidence for compliance documentation

## SBOM indicators

Container images include packages with `NIST-` prefix indicating applicable certification. These also provide URLs to the certificates in the APK database and the SPDX SBOM. The following prefixes are in use:

- `NIST-CMVP-5132` indicates a cryptoprographic module with the certificate [#5132](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/5132)
- `NIST-ESV-191` indicates an entropy source with the certificate [#E191](https://csrc.nist.gov/projects/cryptographic-module-validation-program/entropy-validations/certificate/191)
- `NIST-MIP-module-name` indicates a non-validated submitted module only available in fips-mip images showcasing [Modules in process](https://csrc.nist.gov/projects/cryptographic-module-validation-program/modules-in-process/modules-in-process-list) containing future FIPS module development

## OpenSSL

Because most software relies on OpenSSL for cryptographic operations, all of Chainguard's FIPS container images ship OpenSSL in FIPS mode.

You can verify whether OpenSSL is properly configured to use its FIPS module with [the `openssl-fips-test` tool](https://github.com/chainguard-dev/openssl-fips-test). This tool, developed by Chainguard and included in all of our FIPS container images, prints the public API version, the FIPS module version, and the executed self tests.

When run on a system using the OpenSSL Project FIPS provider, `openssl-fips-test` returns a summary of available algorithms, which is useful to compare different CMVP modules and the algorithms they offer. It also retrieves FIPS module information and returns a CMVP search URL where one can find applicable certificates.

You can use the `openssl-fips-test` tool to check whether any Chainguard Container is properly configured to use its FIPS module with a command like the following. Be sure to replace `$ORGANIZATION` with the name of your own organization and [`python-fips`](https://images.chainguard.dev/directory/image/python-fips/overview) with any FIPS image your organization has access to:

```shell
docker run -it --entrypoint openssl-fips-test cgr.dev/$ORGANIZATION/python-fips
```

```output
Checking OpenSSL lifecycle assurance.

 ✓ Self-test KAT_Integrity HMAC ... passed.
 ✓ Self-test Module_Integrity HMAC ... passed.
 ✓ Self-test KAT_Digest SHA1 ... passed.
 ✓ Self-test KAT_Digest SHA2 ... passed.
 ✓ Self-test KAT_Digest SHA3 ... passed.
 ✓ Self-test KAT_Cipher AES_GCM ... passed.
 ✓ Self-test KAT_Cipher AES_ECB_Decrypt ... passed.
 ✓ Self-test Continuous_RNG_Test RNG ... passed.
 ✓ Self-test KAT_Signature RSA ... passed.
 ✓ Self-test KAT_Signature ECDSA ... passed.
 ✓ Self-test KAT_Signature DSA ... passed.
 ✓ Self-test KAT_KDF TLS13_KDF_EXTRACT ... passed.
 ✓ Self-test KAT_KDF TLS13_KDF_EXPAND ... passed.
 ✓ Self-test KAT_KDF TLS12_PRF ... passed.
 ✓ Self-test KAT_KDF PBKDF2 ... passed.
 ✓ Self-test KAT_KDF SSHKDF ... passed.
 ✓ Self-test KAT_KDF KBKDF ... passed.
 ✓ Self-test KAT_KDF HKDF ... passed.
 ✓ Self-test KAT_KDF SSKDF ... passed.
 ✓ Self-test KAT_KDF X963KDF ... passed.
 ✓ Self-test KAT_KDF X942KDF ... passed.
 ✓ Self-test DRBG HASH ... passed.
 ✓ Self-test DRBG CTR ... passed.
 ✓ Self-test DRBG HMAC ... passed.
 ✓ Self-test KAT_KA DH ... passed.
 ✓ Self-test KAT_KA ECDH ... passed.
 ✓ Self-test KAT_AsymmetricCipher RSA_Encrypt ... passed.
 ✓ Self-test KAT_AsymmetricCipher RSA_Decrypt ... passed.
 ✓ Self-test KAT_AsymmetricCipher RSA_Decrypt ... passed.

 ✓ 29 out of 29 self-tests passed.
 ✓ Check FIPS cryptographic module is available... passed.
 ✓ Check FIPS approved only mode (EVP_default_properties_is_fips_enabled)... passed.
 ✓ Check non-approved algorithm blocked (HMAC-MD5)... passed.

Digests available for non-security use as per FIPS 140-3 I.G. 2.4.A (fips=no):
 ✓  MD5
 ✓  SHA1

Available approved algorithms for security purposes (fips=yes):
 ✗ MD5
 ✓ SHA-1
 ✓ SHA-2
 ✓ SHA-3
 ✓ DSA
 ✓ RSA
 ✓ ECDSA
 ✗ Ed25519
 ✗ DetECDSA
 ✗ ML-DSA
 ✗ SLH-DSA
 ✗ ML-KEM
 ✗ X25519MLKEM768
 ✗ SecP256r1MLKEM768

Public OpenSSL API (libssl.so & libcrypto.so):
 name:      OpenSSL 3.6.0 1 Oct 2025
 version:   3.6.0

FIPS cryptographic module provider details (fips.so):
 name:      OpenSSL FIPS Provider
 version:   3.1.2
 build:     3.1.2

Locate applicable CMVP certificate(s) at: CMVP #4985
```

This output confirms that OpenSSL in the `python-fips` image is properly configured to use its FIPS module.

## Bouncy Castle FIPS Java API

All of Chainguard's Java FIPS images support FIPS 140-3 compliance using Bouncy Castle FIPS cryptographic modules.

To verify whether Bouncy Castle FIPS is operating correctly, you can execute its `DumpInfo` command. The following example shows how you can do this with the [`jre-fips`](https://images.chainguard.dev/directory/image/jre-fips/overview) container image:

```shell
docker run -it --rm cgr.dev/$ORGANIZATION/jre-fips org.bouncycastle.util.DumpInfo
```

```output
Version Info: BouncyCastle Security Provider (FIPS edition) v2.1.1
FIPS Ready Status: READY
Native Ready Status: READY
Native Variant: vaesf
Native Build Date: 2024-11-15T15:56:42
Native Support: AES/CBC AES/CFB AES/CTR AES/ECB AES/GCM DRBG NRBG SHA2
Module SHA-256 HMAC: …
```

Note that this example worked because the `jre-fips` image's entrypoint is `/usr/bin/java`, so it executes `java org.bouncycastle.util.DumpInfo` within the container.

> **Note:** You can find a Chainguard container image's entrypoint in its [**Specifications** tab](https://images.chainguard.dev/directory/image/jre-fips/specifications) within the Containers Directory.

## BoringCrypto

Some of Chainguard's FIPS container images — including [`envoy-fips`](https://images.chainguard.dev/directory/image/envoy-fips/overview) and others that ship `envoy-fips` forks — use [BoringCrypto](https://boringssl.googlesource.com/boringssl/+/master/crypto/fipsmodule/FIPS.md), Google's fork of OpenSSL.

Chainguard FIPS images that use BoringCrypto list the version of the module in use in their `version` output:

```shell
docker run -it --rm cgr.dev/$ORGANIZATION/envoy-fips --version
```

```output
envoy  version: dc2d3098ae5641555f15c71d5bb5ce0060a8015c/1.36.2/Modified/RELEASE/BoringSSL-FIPS-2023042800
```

You can contrast this with the `version` output of the standard, non-FIPS `envoy` image:

```shell
docker run -it --rm cgr.dev/$ORGANIZATION/envoy --version
```

```output
envoy  version: dc2d3098ae5641555f15c71d5bb5ce0060a8015c/1.36.2/Modified/RELEASE/BoringSSL
```

This output shows that although it still uses BoringSSL, the non-FIPS `envoy` container image doesn't use the FIPS-enabled BoringSSL module.

Chainguard also ships the `envoy-fips` container image with `bssl-test_fips`. This tool prints useful information, including whether FIPS mode is on and which version of the module is in use:

```shell
docker run -it --rm --entrypoint /usr/bin/bssl-test_fips cgr.dev/$ORGANIZATION/envoy-fips
```

```output
Module version: 2023042800
About to AES-CBC encrypt . . .
  got . . .
About to AES-CBC decrypt . . .
  got . . .
About to AES-GCM seal . . .
  got . . .
About to AES-GCM open . . .
  got . . .
About to 3DES-CBC encrypt . . .
  got . . .
About to 3DES-CBC decrypt . . .
  got . . .
About to SHA-1 hash . . .
  got . . .
About to SHA-256 hash . . .
  got . . .
About to SHA-512 hash . . .
  got . . .
About to generate RSA key
About to RSA sign . . .
  got . . .
About to RSA verify . . .
About to generate P-256 key
About to compute key-agreement Z with P-256:
  got . . .
About to ECDSA sign . . .
About to seed CTR-DRBG with . . .
  generated . . .
About to run HKDF
  got . . .
About to run TLS v1.0 KDF
  got . . .
About to run TLS v1.2 KDF
  got . . .
About to run TLS v1.3 KDF
  got . . .
About to compute FFDH key-agreement:
  got . . .
PASS
```

## Troubleshooting

If verification checks fail, consider these common issues:

- **OpenSSL not in FIPS mode**: Ensure you're using a `-fips` tagged image variant
- **Missing FIPS configuration**: Check that the `OPENSSL_CONF` environment variable is set correctly
- **Module integrity failures**: Re-pull the container image to ensure it hasn't been modified
- **Incorrect image variant**: Verify you're using the FIPS variant of the image (e.g., `python-fips` not `python`)

For additional support, contact Chainguard support or consult the FIPS documentation.

## Related resources

- [Chainguard FIPS Images](https://images.chainguard.dev/directory?fips=true) - Browse all available FIPS-validated container images
- [NIST CMVP Certificate Search](https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules/search) - Verify cryptographic module certifications
- [OpenSSL FIPS Test Tool](https://github.com/chainguard-dev/openssl-fips-test) - Source code and documentation for the verification tool

---

### Chainguard FIPS TLS connectivity requirements
_Path: platform/fips/tls-requirements.md_

This document provides an overview of FIPS TLS connectivity requirements for using Chainguard FIPS products. These FIPS products have **higher** minimum TLS requirements, which complicates connecting them to insecure EOL non-FIPS systems, as well as FIPS systems with lapsed (historical) certification.

Chainguard strives to ensure the broadest connectivity possible for its FIPS products. However, many obsolete systems are still widely used and may not be able to connect with Chainguard FIPS products.

## FIPS TLS requirements

### TLSv1.3

[NIST Special Publication 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final) required all clients and servers to support TLSv1.3 by January 1, 2024.

While the majority of FIPS modules do have support for TLSv1.3, there are many FIPS 140-2 certified products and operating systems that do not have TLSv1.3 support. As of November 2025 there are [768 Active FIPS 140-2](https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules/search?SearchMode=Advanced&Standard=140-2&CertificateStatus=Active&ValidationYear=0) validated modules, many of which do not have TLSv1.3 capability.

As a rule of thumb, products launched prior to 2019 do not have TLSv1.3 support, and still require TLSv1.2. If at all possible, upgrade clients and servers to gain TLSv1.3 capability, as newer FIPS modules have started to drop support for validated TLSv1.2. This is primarily driven by adding Post-Quantum Cryptography (PQC) which is only supported with TLSv1.3.

### TLSv1.2 RFC 7627

A "triple handshake" man-in-the-middle attack was discovered in the original TLSv1.2 [RFC 5246](https://datatracker.ietf.org/doc/html/rfc5246) protocol specification. The TLSv1.2 [RFC 7627](https://datatracker.ietf.org/doc/html/rfc7627) (published in 2015) addresses this vulnerability with an Extended Master Secret extension.

If you connect to Chainguard's FIPS products without support for TLSv1.2 RFC 7627, your privacy and data integrity are not guaranteed.

To address this vulnerability in FIPS modules, NIST initiated a [programmatic transition](https://csrc.nist.gov/Projects/cryptographic-module-validation-program/programmatic-transitions) to require TLSv1.2 [RFC 7627](https://datatracker.ietf.org/doc/html/rfc7627) in approved mode for all new module validations from May 16, 2023.

This means that all FIPS modules submitted after that date require TLSv1.2 with RFC 7627 support in approved mode.

In practice, products that support TLS 1.2 with RFC 7627 almost always also support TLS 1.3; only a handful of cases—primarily specific Windows and Android versions—do not.

## Known compatible clients and servers

The following Operating Systems, and newer versions of thereof, are known to support TLSv1.2 RFC 7627 and/or TLSv1.3 and should be able to establish TLS connectivity with Chainguard FIPS products:

* Windows 10
* Windows Server 2016
* RHEL 8
* Fedora 28
* Ubuntu 18.04
* Amazon Linux 2023
* SLES 15
* OpenSUSE Leap 15
* Debian 10
* Android 6.0
* Apple macOS Siera 10.12
* iOS 10
* AWS RDS Postgres 16.11-R1
* AWS MQ Apache ActiveMQ

This list is not exhaustive. To find FIPS products that support TLSv1.2 RFC 7627 or TLS v1.3 one can use [CAVP search](https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/validation-search), select **Implementation**, and in the list of algorithms select "**TLS v1.2 RFC7627**" or "**TLS v1.3 KDF**".

### AWS RDS Postgres

AWS RDS Postgres 16.11-R1 and later support TLSv1.3. If you require access to Postgres 14 or 15, please consider using Chainguard [postgres-fips](https://images.chainguard.dev/directory/image/postgres-fips/overview) container image or VM instead.

### AWS MQ RabbitMQ no connectivity

At this time AWS MQ RabbitMQ [does not support](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/data-protection.html) TLSv1.2 RFC 7627 or TLSv1.3. This product is currently out of compliance with [NIST Special Publication 800-52 Rev. 2](https://csrc.nist.gov/pubs/sp/800/52/r2/final).

Please consider using AWS MQ Apache ActiveMQ, Chainguard's [rabbitmq-fips](https://images.chainguard.dev/directory/image/rabbitmq-fips/overview) container image, or a VM instead.

### Amazon Linux 2 connectivity support

There is no approved mode for connecting Chainguard products with Amazon Linux 2 in its default FIPS and non-FIPS configurations.

Amazon Linux 2 ships without support for TLSv1.2 RFC 7627 or TLS v1.3. Additionally, Amazon Linux 2 FIPS certification has lapsed.

Amazon Linux 2 non-FIPS has an optional package: `openssl11`. With this installed, it is possible to gain approved connectivity with Chainguard FIPS products.

As of this writing, Amazon Linux 2 is currently scheduled to sunset on June 30, 2026. We recommend upgrading to [Chainguard VMs](/chainguard/vms/overview/), [Amazon Linux 2023](https://aws.amazon.com/linux/amazon-linux-2023/), or [Bottlerocket](https://bottlerocket.dev/).

## Testing connectivity

To guarantee connectivity, clients and servers communicating with Chainguard FIPS products must, at minimum, support the following  TLS requirements:

* TLSv1.3 with the TLS_AES_256_GCM_SHA384 cipher suite
* TLSv1.2 with
    * ECDHE-ECDSA-AES256-GCM-SHA384 cipher string
    * [RFC 7627](https://datatracker.ietf.org/doc/html/rfc7627) Extended Master Secret Extension support
* Signatures using P-256 with SHA-256
* Signatures using RSA with 2048 bits and SHA-256

These requirements can be approximately tested with the following OpenSSL client command:

```shell
openssl s_client -cipher @SECLEVEL=2:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 -ciphersuites TLS_AES_256_GCM_SHA384 -groups P-256 -connect HOST:PORT
```

> Note that in the case of TLSv1.2 connectivity you must check the output for `Extended master secret: yes`.

---

### Chainguard FIPS containers
_Path: platform/fips/fips-images.md_

## What is FIPS?

[Federal Information Processing Standards](https://www.nist.gov/itl/publications-0/federal-information-processing-standards-fips) (FIPS) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA). FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard provides FIPS-validated container images to help organizations meet federal compliance requirements, including [FedRAMP](https://www.fedramp.gov/) and Department of Defense security frameworks. These FIPS-enabled containers feature a kernel-independent design that simplifies deployment while maintaining compliance.

## What to expect from Chainguard FIPS containers

Chainguard offers 700+ FIPS image variants covering language runtimes (Go, Java, Python, Node.js, .NET, PHP, C/C++), databases, web servers, and Kubernetes components. These images use NIST-validated cryptographic modules including the OpenSSL FIPS provider (CMVP Certificate [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282)) and Bouncy Castle FIPS for Java.

All FIPS images include STIG hardening, daily builds with zero-to-minimal CVEs under SLA, and build-time SBOMs. Chainguard's warranties and certification details are on the [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) page.

## Kernel-independent FIPS architecture

Traditionally, FIPS-compliant containers required the host kernel to be configured in FIPS mode to provide a validated entropy source. This limited deployment options and prevented testing on developer machines.

Chainguard FIPS Containers use a userspace entropy source (the Jitterentropy library with SP 800-90B validation) instead of relying on the kernel. This allows FIPS containers to run on any recent Linux kernel, including developer workstations, standard CI/CD environments, and cloud platforms like GKE, AWS Bottlerocket, and Azure Linux.

**Limitations**: Some workloads (certain Kubernetes CNI plugins, LUKS2 encryption, StrongSwan VPN) still require a kernel configured in FIPS mode. As of August 2025, Java-based FIPS images support kernel-independent operation.

For technical details, refer to [Kernel-Independent FIPS Containers](https://www.chainguard.dev/unchained/kernel-independent-fips-images).

## Using FIPS containers

FIPS images are available for language runtimes (Go, Java, Node.js, Python, .NET, PHP), databases (PostgreSQL, Elasticsearch, Redis), web servers (nginx, HAProxy), Kubernetes components, and monitoring tools. View the complete catalog at [images.chainguard.dev/?category=fips](https://images.chainguard.dev/?category=fips).

All Chainguard FIPS Containers include [STIG hardening](/chainguard/containers/security-and-compliance/stigs/) in addition to FIPS validation. For images not currently available with FIPS, [contact Chainguard](https://www.chainguard.dev/contact) to discuss custom requirements.

## Additional resources

- [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) - Warranties and certifications
- [Frequently asked questions](/chainguard/fips/faqs/) - Common FIPS questions
- [OpenSSL FIPS module documentation](https://www.openssl.org/docs/manmaster/man7/fips_module.html)
- [Bouncy Castle FIPS Crypto package](https://www.bouncycastle.org/about/bouncy-castle-fips-faq/)

Chainguard FIPS Containers are not included in the free tier. To request access, [contact Chainguard](https://www.chainguard.dev/contact).

---

### Chainguard FIPS container FAQs
_Path: platform/fips/faqs/index.md_

Answers to your questions about Chainguard FIPS container images.

## Is there a way to enable or disable the FIPS mode in a FIPS image?

All Chainguard FIPS Containers are configured in approved-only mode as noted in our [FIPS commitment](https://www.chainguard.dev/legal/fips-commitment).

For non-approved mode, our recommendation is to use a non-FIPS Chainguard Container.

Because it is error prone, difficult to support, and fragile, Chainguard does not provide the ability to switch to non-FIPS from a FIPS container image. If you require that, please contact a [NIST-approved security lab](https://csrc.nist.gov/projects/testing-laboratories) to help you achieve your certification needs when using our FIPS modules.

## Does a given Chainguard FIPS container require me to “bring my own license”?

From the Containers Directory or Containers Console, search for the container image you would like to know more about, and check if it has the "Bring Your Own License" badge. If it does, one can or must (depending on the container image) bring their own license keys for the product. Review the Overview documentation for the given image, and review the application’s documentation for further guidance.

## Which Chainguard Containers tags have kernel-independent FIPS?

For Chainguard Containers built from November 7, 2024 onward, the minimum requirements for kernel-independent FIPS are based on the package listings in their relevant SBOMs. The SBOMs must contain:

* `libcrypto3>=3.4.0-r2`
* `openssl-config-fipshardened>=3.4.0-r3`

This enables the use of a user-space entropy source with the ESV (Entropy Source Validation) certificate as listed on our [FIPS commitment](https://www.chainguard.dev/legal/fips-commitment) page.

Note there is no change to the CMVP (Cryptographic Module Validation Program) certificate, as the entropy source is outside of the FIPS boundary. The ESV certificate satisfies the entropy requirements caveat of the CMVP certificate.

The following packages are excluded:

* `bouncycastle-fips`
* `bouncycastle-fips-1.0`
* Any with `-cni-` in the name

You can read more about [kernel-independent FIPS Container in our blog announcement](https://www.chainguard.dev/unchained/kernel-independent-fips-images).

## How can I block SHA-1 in OpenSSL or FIPS?

Right now, there are limitations on blocking specific algorithms.

OpenSSL currently only offers a limited set of policies that can be applied to block generic algorithms. It has better runtime configuration options for TLS (with regard to CipherSuite selection and ECDH Curves), but nothing that can be more specific (like blocking RSA signatures with SHA2-224).

Chainguard engineering is actively working with the relevant upstream groups to offer more solutions in the future.

## How long does it take to develop and submit a new module for FIPS certification?

FIPS submission requirements continuously evolve. No project is always compliant with all the latest requirements, and typically requires testing by a certification lab followed by patching and fixing.

Once the testing and patching are done, a project moves onto getting entropy certifications. Once the certifications and relevant code changes are in order, the project can submit to FIPS. Once submitted, it must move through several states: pending review, coordination, finalization, and if everything is in order a certificate will be issued.

The current average wait time from submission to certificate received is 590 days.

## Many popular applications use Mozilla NSS, and have no alternative (that is, they cannot switch to use OpenSSL or Bouncy Castle). Can these applications get Chainguard FIPS containers?

Given [Mozilla NSS](https://firefox-source-docs.mozilla.org/security/nss/index.html)’s [rapid release cycles](https://wiki.mozilla.org/NSS:Release_Versions) that quickly reach EOL (end-of-life), coupled with the length of time necessary for FIPS certification, the likely scenarios where NSS could become FIPS certified would not be compatible with Chainguard’s product commitments. Because Chainguard provides up-to-date software with zero-to-limited CVEs, it is not currently feasible for us to offer FIPS container images of software that use NSS.

NSS does not have a stable API/ABI as it is a collection of low-level libraries, which typically are tightly coupled with the application that uses them.

This is in contrast to OpenSSL, which presents one application facing API-ABI, and has an internal provider (plugin) architecture allowing the use of a separately built FIPS provider. For example, OpenSSL v3.4 released in 2024 is using the FIPS provider v3.0 released in 2021 due to strong API-ABI stability commitments.

## Are Go binaries compiled with the upstream Golang provided `GOEXPERIMENT=boringcrypto` covered by the Chainguard FIPS commitment?

For older OpenSSL-based Go FIPS workflows, the short answer is no. If you want a Chainguard-supported Go-native FIPS path, use the `go-geomys-fips` Chainguard Container. That image is based on the upstream Geomys Go Cryptographic Module, defaults to the validated module, removes the non-validated alternatives, blocks many disallowed algorithms by default, uses a validated entropy source for kernel-independent FIPS, and includes `go-fips-test` to verify that produced binaries are using the validated module.

If you are using older workflows, we strongly recommend using the [go-fips](https://images.chainguard.dev/directory/image/go-fips/versions), [go-msft-fips](https://images.chainguard.dev/directory/image/go-msft-fips/versions), and [go-openssl](https://images.chainguard.dev/directory/image/go-openssl/versions) Chainguard Containers. These Chainguard Containers use system OpenSSL as the cryptographic module in approved mode, are covered by the [Chainguard FIPS commitment](https://www.chainguard.dev/legal/fips-commitment), and are in scope for [Kernel-Independent FIPS Containers](https://www.chainguard.dev/unchained/kernel-independent-fips-images)

Google and Golang upstream do not provide any support for `GOEXPERIMENT=boringcrypto` compiled binaries. The security policy for those modules contains many unapproved algorithms. The Golang upstream toolchain does not indicate missbuilt binaries that do not use boringcrypto (at all or partially) at runtime, and correctly compiled binaries allow using unapproved algorithms without restriction. Using the Golang upstream `GOEXPERIMENT=boringcrypto` requires strict adherence to the security policy, manual code audits of all source code, and all go.sum vendored copies of code.

## Can WireGuard with Tailscale or Shadowsocks be used for Chainguard FIPS containers?

No, the WireGuard protocol, and popular ways to use it with Tailscale and Shadowsocks cannot use approved cryptography, because the [protocol](https://www.wireguard.com/protocol/) requires unapproved algorithms.

As it stands today, the WireGuard protocol is not customizable (like TLS), and it is not possible to replace any of the unapproved cryptographic primitives with approved equivalents as it will not be a WireGuard protocol anymore.

For approved cryptography and similar functionality, please consider using OpenVPN or Strongswan, both of which can be configured to use approved cryptography only, with a FIPS cryptographic module.

## How to add a custom certificate to the default cacerts Java truststore?

Note these instructions work correctly for both FIPS and non-FIPS Java images.
Note the "changeit" password is the default password for cacerts public certificate trust store.
It is FIPS compliant to not change it, and it is best left as is.

```sh
USER root
RUN keytool -importcert -noprompt -cacerts -storepass changeit -file /tmp/servercert.pem -alias servercert
```

Explanation of every option:

* `-importcert` import a PEM formatted certificate
* `-noprompt` do not interactively ask `Yes/No` confirmation to trust the certificate, for non-interactive usage
* `-cacerts` access the default trust store
* `-storepass changeit` specify the cacerts default password, the default password like this is FIPS compliant for public certificates
* `-file /tmp/servercert.pem` filepath to your PEM certificate
* `-alias servercert` desired alias for your certificate, must be unique. Otherwise import will fail or will ask interactively to specify server alias

After import, execute list command to check if the certificate was imported successfully:

```sh
RUN keytool -list -cacerts -storepass changeit -alias servercert
```

If you have an existing Java truststore, you can import all certificates from it using the `-importkeystore` command.

```sh
USER root
RUN keytool -importkeystore -noprompt \
-srckeystore mytruststore.jks -destkeystore /etc/ssl/certs/java/cacerts  \
-srcstoretype JKS -deststoretype JKS \
-srcstorepass changeit -deststorepass changeit
```

Review the list for an explanation of each option.

* `-importkeystore` bulk import all aliases from one keystore to another
* `-noprompt` do not interactively ask `Yes/No` confirmation to trust the certificates, best for non-interactive usage
* `-srckeystore mytruststore.jks` specify source trust store
* `-destkeystore /etc/ssl/certs/java/cacerts` specify destination trust store, this is the default cacerts trust store
* `-srcstoretype JKS` specify source trust store type, note this can be autodetected from extension as well
* `-deststoretype JKS` specify destination trust store type
* `-srcstorepass changeit` specify source trust store password, the default password like this is FIPS compliant for public certificates
* `-deststorepass changeit` specify destination trust store password, the default password like this is FIPS compliant for public certificates

---

### chainctl reference
_Path: platform/chainctl/_index.md_

The CLI tool `chainctl` helps you interact with the account model that Chainguard provides. The tool uses the familiar `<context> <noun> <verb>` style of CLI interactions. The current `chainctl` reference is below.

To install `chainctl`, follow our <ins>[installation guide](/platform/chainctl-usage/how-to-install-chainctl/)</ins>. Additionally, you may find these resources on working with `chainctl` to be of interest:

* <ins>[How to Manage chainctl Configuration](/platform/chainctl-usage/manage-chainctl-config/)</ins>
* <ins>[How To Compare Chainguard Containers with chainctl](/platform/chainctl-usage/comparing-images/)</ins>

---

### chainctl version
_Path: platform/chainctl/chainctl-docs/chainctl_version.md_

## chainctl version

Prints the version

```
chainctl version [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control

---

### chainctl config validate
_Path: platform/chainctl/chainctl-docs/chainctl_config_validate.md_

## chainctl config validate

Run diagnostics on local config.

```
chainctl config validate [--output=json|table] [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl libraries cache status
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache_status.md_

## chainctl libraries cache status

Show resolution cache status.

### Synopsis

Show the org's per-ecosystem resolution cache state: the current zap
generation, how many zaps have run, opt-out state, and the most recent zap
time. Ecosystems that have never been zapped or opted out are in the default
state and are not listed.

```
chainctl libraries cache status [--parent ORG] [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the organization to report on. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.

---

### chainctl config set
_Path: platform/chainctl/chainctl-docs/chainctl_config_set.md_

## chainctl config set

Set an individual configuration value property.

### Synopsis

Set an individual configuration value property. Property names are dot delimited and lowercase (for example, output.color.pass).

```
chainctl config set PROPERTY_NAME PROPERTY_VALUE
```

### Examples

```
  # Set the api URL
  chainctl config set platform.api https://console-api.enforce.dev
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl libraries policy enable
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_enable.md_

## chainctl libraries policy enable

Enable a Libraries policy for an organization.

### Synopsis

Enable a Libraries policy by creating a binding. If a binding already exists
for the (organization, ecosystem, mode), its mode is updated. The default mode
is ENFORCE.

```
chainctl libraries policy enable [POLICY] [--parent ORG] [--ecosystem ECOSYSTEM] [--mode ENFORCE|PREVIEW] [flags]
```

### Options

```
      --ecosystem string   The ecosystem the binding applies to (JAVA, JAVASCRIPT, PYTHON).
      --mode string        The binding mode (ENFORCE or PREVIEW).
      --parent string      The name or id of the organization to scope the binding to.
      --policy string      The name or UIDP of the policy. Provide this or the positional argument, not both.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl iam account-associations
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations.md_

## chainctl iam account-associations

Configure and manage cloud provider account associations.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam account-associations check](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check/)	 - Check the OIDC federation configurations for cloud providers.
* [chainctl iam account-associations describe](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_describe/)	 - Describe cloud provider account associations for a location.
* [chainctl iam account-associations set](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set/)	 - Set cloud provider account associations for a location.
* [chainctl iam account-associations unset](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset/)	 - Remove cloud provider account associations from a location.

---

### chainctl iam folders describe
_Path: platform/chainctl/chainctl-docs/chainctl_iam_folders_describe.md_

## chainctl iam folders describe

Describe a folder.

```
chainctl iam folders describe [FOLDER_NAME | FOLDER_ID] [--output=json]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam folders](/platform/chainctl/chainctl-docs/chainctl_iam_folders/)	 - IAM folders interactions.

---

### chainctl skills delete
_Path: platform/chainctl/chainctl-docs/chainctl_skills_delete.md_

## chainctl skills delete

Remove a published version of a skill.

### Synopsis

Remove a published version of a skill.

Delete a single version:   org/name:tag
A tag is required to prevent accidental deletion of "latest", and deleting the
"latest" tag requires additional confirmation. Digest references are not supported.
When you delete a skill's last remaining version, the now-empty skill entry is
removed too, so it no longer
lingers in "skills list" with no pullable content.

Clear an already-empty skill:   org/name
A tagless reference is accepted only for a skill that has no versions left (the
residue of versions deleted before this cleanup existed). A skill that still has
versions requires an explicit tag.

```
chainctl skills delete <ref> [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl libraries cache
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache.md_

## chainctl libraries cache

Manage the Libraries resolution cache.

### Synopsis

Manage your organization's Libraries resolution cache. Once your org is
served a package version from a tier (Chainguard-built or upstream), that
resolution is recorded and held stable so lockfile hashes keep verifying.
Zapping retires recorded resolutions so the next fetch re-resolves to the
current best tier; clients that hold lockfiles must regenerate them to pick
up new hashes.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.
* [chainctl libraries cache list](/platform/chainctl/chainctl-docs/chainctl_libraries_cache_list/)	 - List resolution cache entries.
* [chainctl libraries cache opt-in](/platform/chainctl/chainctl-docs/chainctl_libraries_cache_opt-in/)	 - Opt the org back into the resolution cache.
* [chainctl libraries cache opt-out](/platform/chainctl/chainctl-docs/chainctl_libraries_cache_opt-out/)	 - Opt the org out of the resolution cache.
* [chainctl libraries cache status](/platform/chainctl/chainctl-docs/chainctl_libraries_cache_status/)	 - Show resolution cache status.
* [chainctl libraries cache zap](/platform/chainctl/chainctl-docs/chainctl_libraries_cache_zap/)	 - Zap resolution cache entries.

---

### chainctl events subscriptions delete
_Path: platform/chainctl/chainctl-docs/chainctl_events_subscriptions_delete.md_

## chainctl events subscriptions delete

Delete a subscription.

```
chainctl events subscriptions delete SUBSCRIPTION_ID [--yes] [--output=id] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl events subscriptions](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions/)	 - Subscription interactions.

---

### chainctl skills entitlements list
_Path: platform/chainctl/chainctl-docs/chainctl_skills_entitlements_list.md_

## chainctl skills entitlements list

List skills entitlements of an organization.

```
chainctl skills entitlements list --parent=PARENT [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the org to list skills entitlements for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills entitlements](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements/)	 - Manage skills entitlements for an organization.

---

### chainctl starter
_Path: platform/chainctl/chainctl-docs/chainctl_starter.md_

## chainctl starter

Manage catalog starter organizations

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl starter add-images](/platform/chainctl/chainctl-docs/chainctl_starter_add-images/)	 - Add catalog images to your catalog starter organization.
* [chainctl starter init](/platform/chainctl/chainctl-docs/chainctl_starter_init/)	 - Initialize a new catalog starter organization.
* [chainctl starter request-access](/platform/chainctl/chainctl-docs/chainctl_starter_request-access/)	 - Request access to a catalog starter organization.
* [chainctl starter status](/platform/chainctl/chainctl-docs/chainctl_starter_status/)	 - Show catalog starter organization status, quota, and image readiness.

---

### chainctl auth token capabilities
_Path: platform/chainctl/chainctl-docs/chainctl_auth_token_capabilities.md_

## chainctl auth token capabilities

Print the capabilities of the local Chainguard Token.

```
chainctl auth token capabilities [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth token](/platform/chainctl/chainctl-docs/chainctl_auth_token/)	 - Print the local Chainguard Token.

---

### chainctl libraries policy binding delete
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_delete.md_

## chainctl libraries policy binding delete

Delete a Libraries policy binding.

### Synopsis

Delete a Libraries policy binding to deactivate the policy for its bound (organization, ecosystem) pair.

```
chainctl libraries policy binding delete BINDING_ID [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy binding](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding/)	 - Manage Libraries policy bindings.

---

### chainctl
_Path: platform/chainctl/chainctl-docs/chainctl.md_

## chainctl

Chainguard Control

```
chainctl [flags]
```

### Options

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions](/platform/chainctl/chainctl-docs/chainctl_actions/)	 - Interact with the Chainguard Actions product.
* [chainctl agent](/platform/chainctl/chainctl-docs/chainctl_agent/)	 - Agent-powered commands.
* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.
* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.
* [chainctl events](/platform/chainctl/chainctl-docs/chainctl_events/)	 - Events related commands for the Chainguard platform.
* [chainctl guardener](/platform/chainctl/chainctl-docs/chainctl_guardener/)	 - Manage guardener integrations.
* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.
* [chainctl packages](/platform/chainctl/chainctl-docs/chainctl_packages/)	 - Interact with Chainguard packages
* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.
* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.
* [chainctl starter](/platform/chainctl/chainctl-docs/chainctl_starter/)	 - Manage catalog starter organizations
* [chainctl update](/platform/chainctl/chainctl-docs/chainctl_update/)	 - Update chainctl.
* [chainctl version](/platform/chainctl/chainctl-docs/chainctl_version/)	 - Prints the version

---

### chainctl skills describe
_Path: platform/chainctl/chainctl-docs/chainctl_skills_describe.md_

## chainctl skills describe

Show metadata for a published skill.

```
chainctl skills describe <ref> [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl iam role-bindings update
_Path: platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_update.md_

## chainctl iam role-bindings update

Update a role-binding.

```
chainctl iam role-bindings update BINDING_ID [--role=ROLE] [--identity=IDENTITY] [--output=id|json|table]
```

### Examples

```
  # Update the role an identity is bound to
  chainctl iam role-bindings update fb694596eb1678321f94eec283e1e0be690f655c/a2973bac66ebfde3 --role=editor
  
  # Update the identity bound to a role
  chainctl iam role-bindings update fb694596eb1678321f94eec283e1e0be690f655c/a2973bac66ebfde3 --identity=support-identity
```

### Options

```
      --identity string   The name or ID of the identity to bind.
      --role string       The name or ID of the role to bind to the identity.
  -y, --yes               Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam role-bindings](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/)	 - IAM role-bindings resource interactions.

---

### chainctl policy binding list
_Path: platform/chainctl/chainctl-docs/chainctl_policy_binding_list.md_

## chainctl policy binding list

List policy bindings.

### Synopsis

List active policy bindings to see which policies are enabled and
in which mode.

Bindings are scoped to one organization: pass --parent, or omit it to
use your configured default group, or (with no default configured) the
single organization you can access — you are prompted when several are
available. Each binding shows the policy it activates and the
enforcement mode (enforced or dry-run).

Each binding's parameters are cross-checked against the referenced
policy's current parameters. The STATUS column reports OK,
INVALID (parameters no longer satisfy the schema), or UNKNOWN.
Rows flagged INVALID are elaborated below the table with the
concrete reasons; the JSON output carries the same detail when at
least one binding is invalidated.

```
chainctl policy binding list [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Examples

```
  # List bindings for your default (or only) organization
  chainctl policy binding list
  
  # List bindings for a specific organization
  chainctl policy binding list --parent=engineering
```

### Options

```
      --parent string          The name or id of the organization to list bindings for.
      --resource-type string   Only list entries for this resource type (shorthand: Repo, Python, Java, Javascript; or a full type).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy binding](/platform/chainctl/chainctl-docs/chainctl_policy_binding/)	 - Manage policy bindings.

---

### chainctl iam roles list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_list.md_

## chainctl iam roles list

List IAM roles.

```
chainctl iam roles list [--name=NAME] [--capabilities=CAPABILITY,...] [--parent=PARENT | --managed] [--recursive] [--output=id|json|table]
```

### Examples

```
  # List all accessible roles
  chainctl iam roles list
  
  # List all managed (built-in) roles
  chainctl iam roles list --managed
  
  # List all roles that can create groups
  chainctl iam roles list --capabilities=groups.create
  
  # List only roles directly in an organization, excluding nested locations
  chainctl iam roles list --parent=my-org --recursive=false
```

### Options

```
      --capabilities strings   A comma separated list of capabilities to grant this role.
      --managed                Only list managed (built-in) roles.
      --name string            The exact name of roles to list.
      --parent string          Location to list roles from. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive              List roles from the parent location and all nested locations. Set to false to list only the parent location. (default true)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.

---

### chainctl iam identities create aws role
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws_role.md_

## chainctl iam identities create aws role

```
chainctl iam identities create aws role NAME --aws-account-id=ACCOUNT --aws-role-name=NAME [--aws-role-id=ID] [--aws-partition=PARTITION] [--parent=PARENT] [--description=DESC] [--role=ROLE,ROLE,...] [--output=id|json|table]
```

### Examples

```
  # Create an assumable identity for an AWS IAM role.
  chainctl iam identities create aws role my-aws-identity --aws-account-id=123456789012 --aws-role-name=my-role
  
  # Create an assumable identity for an AWS IAM role. Bind it to the registry.pull role.
  chainctl iam identities create aws role my-aws-identity --aws-account-id=123456789012 --aws-role-name=my-role --role=registry.pull
  
  # Provide the unique ID of an AWS IAM role. This prevents the identity from being assumed if the role is deleted and then recreated with the same name.
  chainctl iam identities create aws role my-aws-identity --aws-account-id=123456789012 --aws-role-name=my-role --aws-role-id=AROAEXAMPLEC2UL7LUB
  
  # Create an assumable identity for an AWS IAM role in the aws-us-gov partition.
  chainctl iam identities create aws role my-aws-identity --aws-partition=aws-us-gov --aws-account-id=123456789012 --aws-role-name=my-role
```

### Options

```
      --aws-account-id string   The ID of the AWS account.
      --aws-partition string    The partition in which the role is located. For instance: aws, aws-cn or aws-us-gov. (default "aws")
      --aws-role-id string      The unique ID of the IAM role.
      --aws-role-name string    The name of the IAM role.
  -d, --description string      The description of the resource.
  -n, --name string             Given name of the resource.
      --parent string           The name or id of the parent location to create this identity under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --role strings            A comma separated list of names or IDs of roles to bind this identity to (optional).
  -y, --yes                     Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities create aws](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws/)	 - Create a new identity for an AWS IAM resource.

---

### chainctl skills entitlements
_Path: platform/chainctl/chainctl-docs/chainctl_skills_entitlements.md_

## chainctl skills entitlements

Manage skills entitlements for an organization.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.
* [chainctl skills entitlements create](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements_create/)	 - Create a skills entitlement for an organization.
* [chainctl skills entitlements delete](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements_delete/)	 - Delete the skills entitlement from an organization.
* [chainctl skills entitlements list](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements_list/)	 - List skills entitlements of an organization.

---

### chainctl guardener github
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github.md_

## chainctl guardener github

Link and unlink a GitHub organization to a Chainguard group.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener](/platform/chainctl/chainctl-docs/chainctl_guardener/)	 - Manage guardener integrations.
* [chainctl guardener github link](/platform/chainctl/chainctl-docs/chainctl_guardener_github_link/)	 - Link a GitHub organization to a Chainguard group.
* [chainctl guardener github migrate](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate/)	 - Migrate a repository's GitHub Actions to their Chainguard equivalents.
* [chainctl guardener github status](/platform/chainctl/chainctl-docs/chainctl_guardener_github_status/)	 - List the GitHub organizations linked to a Chainguard group.
* [chainctl guardener github unlink](/platform/chainctl/chainctl-docs/chainctl_guardener_github_unlink/)	 - Unlink a GitHub organization from its Chainguard group.

---

### chainctl iam account-associations check
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check.md_

## chainctl iam account-associations check

Check the OIDC federation configurations for cloud providers.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations/)	 - Configure and manage cloud provider account associations.
* [chainctl iam account-associations check aws](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_aws/)	 - Checks that the given location has been properly configured for OIDC federation with AWS
* [chainctl iam account-associations check azure](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_azure/)	 - Checks that the given location has been properly configured for OIDC federation with AZURE
* [chainctl iam account-associations check gcp](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_gcp/)	 - Checks that the given location has been properly configured for OIDC federation with GCP

---

### chainctl libraries remediate
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_remediate.md_

## chainctl libraries remediate

Discover and apply Chainguard -cgr.N CVE remediations for a JavaScript project

### Synopsis

remediate finds the highest installable Chainguard remediation (-cgr.N) for each
package in a JavaScript project's resolved dependency tree, then writes the
direct-dependency pins and package-manager overrides that deliver it.

Provide a project directory, or omit it to use the current directory. The
package manager is detected from the lockfile: package-lock.json (npm),
pnpm-lock.yaml (pnpm), yarn.lock (Yarn Classic and Berry), bun.lock/bun.lockb
(Bun), or deno.lock (Deno).

For Deno projects, chainctl requires Deno 2.7 or later, package.json, and deno.lock.
It uses npm overrides in package.json to pin dependencies to -cgr.N versions.
It rejects Deno projects with deno.json or deno.jsonc in the project root.

A -cgr.N prerelease is never matched by a normal range such as ^1.3.1, so
adoption is always deliberate: delivery is an exact pin plus a package-manager
override, never a silent substitution.

Modes:
  - No flag: plan only. Reports what would change and writes nothing.
  - --apply: write the planned changes, then synchronize the lockfile with the real package manager in an isolated copy of the project. The project is left untouched until the selected -cgr.N artifacts and the unchanged unrelated dependencies are both verified.
  - --check: CI gate. Writes nothing and exits non-zero when any package in the tree has a remediation available that the project has not adopted.

--apply additionally needs a project .npmrc pointing at the Chainguard registry,
because the lockfile synchronization resolves the -cgr.N artifacts through it.
Run 'chainctl auth configure-npm' once per project to write one. Neither the
default plan mode nor --check needs it.

Discovery is registry-highest: for each exactly resolved version it selects the
greatest -cgr.N published for that base version. Packages resolved from a
non-public registry, and those whose lockfile entry cannot be proven to resolve
through a public registry, are excluded.

Authentication matches 'chainctl libraries update-hashes': a libraries-scoped
session ('chainctl auth login --audience=libraries.cgr.dev') is used directly;
otherwise pass --token, --username/--password, or --parent to authenticate via
'chainctl auth pull-token'. With no credential source and no --parent, remediate
prompts for an organization.

```
chainctl libraries remediate [project-dir] [flags]
```

### Examples

```
  # Show the remediations available for the project in the current directory
  chainctl libraries remediate

  # Apply them and synchronize the lockfile
  chainctl libraries remediate --apply

  # Fail a CI job when an unadopted remediation exists
  chainctl libraries remediate --check

  # Machine-readable plan for a project in another directory
  chainctl libraries remediate --check --format json ./services/api
```

### Options

```
      --apply                   Write the planned pins and overrides and synchronize the lockfile. Mutually exclusive with --check.
      --check                   Report available remediations and exit non-zero if any are unapplied, without writing changes. Use as a CI gate. Mutually exclusive with --apply.
      --ecosystems-url string   URL for the Ecosystems Proxy (defaults to https://libraries.cgr.dev). The /javascript path segment is appended automatically. Candidates are still validated against tarball URLs under https://libraries.cgr.dev/javascript, so only production or a proxy that preserves those URLs will yield remediations.
      --format string           Output format alias for --output: "json" or "none". Takes precedence over --output when both are set.
      --ignore-netrc            Do not read credentials from ~/.netrc ($NETRC).
      --no-auth                 Send no authentication when discovering remediations. Overrides all ambient credential sources. Does not affect --apply, whose lockfile synchronization still authenticates to the registry with the project .npmrc. Mutually exclusive with the explicit --token and --username/--password flags.
      --no-color                Disable colored output
      --parent string           Parent organization for authentication via 'chainctl auth pull-token'. Not needed when --token, --username/--password, the CHAINCTL_AUTH_TOKEN/CHAINCTL_REGISTRY_USERNAME env vars, or a matching ~/.netrc entry provides credentials.
      --password ps             Basic-auth password. Must be paired with --username. Also readable from $CHAINCTL_REGISTRY_PASSWORD. Prefer the env-var form to avoid leaking the value via ps or shell history.
      --token string            Literal bearer token to use as the basic-auth password (username is set to "token-user"). Mutually exclusive with --username/--password.
      --username string         Basic-auth username. Must be paired with --password. Also readable from $CHAINCTL_REGISTRY_USERNAME.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.

---

### chainctl images helm
_Path: platform/chainctl/chainctl-docs/chainctl_images_helm.md_

## chainctl images helm

Helm chart related commands

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl images helm add-chart](/platform/chainctl/chainctl-docs/chainctl_images_helm_add-chart/)	 - Add a Chainguard Helm chart and its image dependencies to an organization.
* [chainctl images helm history](/platform/chainctl/chainctl-docs/chainctl_images_helm_history/)	 - Show digest history for a Chainguard Helm chart tag.
* [chainctl images helm refs](/platform/chainctl/chainctl-docs/chainctl_images_helm_refs/)	 - List image references pinned in a Chainguard Helm chart
* [chainctl images helm values](/platform/chainctl/chainctl-docs/chainctl_images_helm_values/)	 - Generate relocation overrides for a Chainguard Helm chart

---

### chainctl libraries packages malware list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware_list.md_

## chainctl libraries packages malware list

List the Chainguard malware/greyware blocklist.

### Synopsis

List Chainguard's malware/greyware blocklist across language ecosystems.

Filter to a single package with --package (and optionally --version) to check
whether a specific artifact is flagged; rows returned means blocked, empty means
clear.

```
chainctl libraries packages malware list [--ecosystem ECOSYSTEM] [--package NAME] [--version VERSION] [--since TIME] [--before TIME] [--sort KEYS] [--exit-code] [--output=json|table] [flags]
```

### Options

```
      --before string      Only show entries blocked strictly before this RFC3339 time. Combine with --since to query a bounded range.
      --ecosystem string   Only show blocklist entries for this ecosystem (JAVA, JAVASCRIPT, PYTHON). If empty, all ecosystems are returned.
      --exit-code          Exit with a non-zero status if any entries match, so the command can be used as a CI gate.
      --limit int32        The maximum number of entries to return; results are paginated automatically up to this limit. (default 50)
      --package string     Only show entries whose package name matches (exact).
      --since string       Only show entries blocked at or after this RFC3339 time (e.g. 2026-05-01T00:00:00Z).
      --sort string        Comma-separated keys to sort by, ascending, in precedence order (e.g. package,version). Keys: blocked, package, version (blocked is oldest-first; version is semver-aware). Defaults to newest-blocked first.
      --version string     Only show entries matching this version. Requires --package.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages malware](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware/)	 - Inspect the Chainguard malware/greyware blocklist.

---

### chainctl starter add-images
_Path: platform/chainctl/chainctl-docs/chainctl_starter_add-images.md_

## chainctl starter add-images

Add catalog images to your catalog starter organization.

### Synopsis

Add catalog images to your catalog starter organization.

The target organization is the single verified kind=starter org the
caller's identity is bound to — auto-discovered, no flags needed.

Images are resolved against the catalog by exact name match. The server
picks the active starter entitlement that has remaining capacity. The
total cap across all starter images is enforced by the server.

```
chainctl starter add-images IMAGE_NAME [IMAGE_NAME ...] [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl starter](/platform/chainctl/chainctl-docs/chainctl_starter/)	 - Manage catalog starter organizations

---

### chainctl actions entitlements list
_Path: platform/chainctl/chainctl-docs/chainctl_actions_entitlements_list.md_

## chainctl actions entitlements list

List Actions product entitlements for an organization.

```
chainctl actions entitlements list --parent=PARENT [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the org to list Actions entitlements for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions entitlements](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements/)	 - Manage Actions product entitlements.

---

### chainctl config edit
_Path: platform/chainctl/chainctl-docs/chainctl_config_edit.md_

## chainctl config edit

Edit the current chainctl config file.

### Synopsis

Edit the current chainctl config file. Use the environment variable EDITOR to set the path to your preferred editor (default: nano).

```
chainctl config edit [--config FILE] [--yes] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl iam role-bindings create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_create.md_

## chainctl iam role-bindings create

Create a role-binding

```
chainctl iam role-bindings create [--identity=IDENTITY] [--role=ROLE] [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--output=id|json|table]
```

### Examples

```
  # Bind a user-created identity as viewer to a location
  chainctl iam role-bindings create --identity=guest-identity --role=viewer --parent=engineering
  
  # Create a new role-binding using interactive selection for identity, role, and location
  chainctl iam role-bindings create
```

### Options

```
      --identity string   The name or ID of the identity to bind.
      --parent string     The name or ID of the location the role-binding belongs to. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --role string       The name or ID of the role to bind to the identity.
  -y, --yes               Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam role-bindings](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/)	 - IAM role-bindings resource interactions.

---

### chainctl iam organizations delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_organizations_delete.md_

## chainctl iam organizations delete

Delete an organization.

```
chainctl iam organizations delete [ORGANIZATION_NAME | ORGANIZATION_ID] [--skip-refresh] [--yes]
```

### Examples

```

# Delete an organization by ID
chainctl iam organizations delete e533448ca9770c46f99f2d86d60fc7101494e4a3

# Delete an organization by name
chainctl iam organizations delete my-org

# Delete an organization to be selected interactively
chainctl iam organizations delete

```

### Options

```
      --skip-refresh   Skips attempting to reauthenticate and refresh the Chainguard auth token if it becomes out of date.
  -y, --yes            Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam organizations](/platform/chainctl/chainctl-docs/chainctl_iam_organizations/)	 - IAM organization interactions.

---

### chainctl images tags
_Path: platform/chainctl/chainctl-docs/chainctl_images_tags.md_

## chainctl images tags

Tags related commands for images.

### Synopsis

Commands for listing and resolving image tags.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl images tags list](/platform/chainctl/chainctl-docs/chainctl_images_tags_list/)	 - List tags from repositories using --parent, --public, or --repo flags.
* [chainctl images tags resolve](/platform/chainctl/chainctl-docs/chainctl_images_tags_resolve/)	 - Resolve tags for a specific image reference.

---

### chainctl libraries policy binding update
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_update.md_

## chainctl libraries policy binding update

Update a Libraries policy binding.

### Synopsis

Update the mode of an existing Libraries policy binding.

```
chainctl libraries policy binding update BINDING_ID --mode ENFORCE|PREVIEW [flags]
```

### Options

```
      --mode string   The binding mode (ENFORCE or PREVIEW).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy binding](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding/)	 - Manage Libraries policy bindings.

---

### chainctl iam invites list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_invites_list.md_

## chainctl iam invites list

List organization and folder invites.

```
chainctl iam invites list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--output=id|json|table]
```

### Examples

```
  # List all accessible invites
  chainctl iam invites list
  
  # Filter invites by location
  chainctl iam invites list --parent=my-org
```

### Options

```
      --parent string   List invites from this location. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam invites](/platform/chainctl/chainctl-docs/chainctl_iam_invites/)	 - Manage invite codes that register identities with Chainguard.

---

### chainctl guardener github migrate
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate.md_

## chainctl guardener github migrate

Migrate a repository's GitHub Actions to their Chainguard equivalents.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)	 - Link and unlink a GitHub organization to a Chainguard group.
* [chainctl guardener github migrate create](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_create/)	 - Enqueue a GitHub Actions migration for a repository.
* [chainctl guardener github migrate get](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_get/)	 - Show the state of a migration operation.

---

### chainctl iam role-bindings list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_list.md_

## chainctl iam role-bindings list

List role-bindings.

```
chainctl iam role-bindings list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--recursive] [--output=json|table|tree]
```

### Examples

```
  # List role-bindings
  chainctl iam role-bindings list
  
  # Filter role-bindings by organization
  chainctl iam role-bindings list --parent=my-org
  
  # List only role-bindings directly in an organization, excluding nested locations
  chainctl iam role-bindings list --parent=my-org --recursive=false
```

### Options

```
      --parent string   List role-bindings from this location. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive       List role-bindings from the parent location and all nested locations. Set to false to list only the parent location. (default true)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam role-bindings](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/)	 - IAM role-bindings resource interactions.

---

### chainctl config view
_Path: platform/chainctl/chainctl-docs/chainctl_config_view.md_

## chainctl config view

View the current chainctl config.

```
chainctl config view [--diff] [flags]
```

### Options

```
      --diff   Show the difference between the local config file and the active configuration.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl policy binding create
_Path: platform/chainctl/chainctl-docs/chainctl_policy_binding_create.md_

## chainctl policy binding create

Create a policy binding.

### Synopsis

Create a binding to activate a policy for an organization.
If the policy is already enabled with the same mode, this is a no-op. To
change the mode of an existing binding, pass --mode explicitly.

--mode is required and controls enforcement behavior:
  ENFORCE  Blocks image pulls that violate the policy.
  DRY_RUN  Records violations without blocking pulls.

Binding to an organization applies the policy to all repos within it.

Use --param=KEY=VALUE (repeatable) to supply parameter values declared by
the policy's schema. For STRING_LIST parameters, items are comma-separated
within a single --param value.

```
chainctl policy binding create --policy POLICY [--parent ORGANIZATION_NAME | ORGANIZATION_ID] --mode MODE [--param KEY=VALUE] [--output=json|table] [flags]
```

### Examples

```

# Enforce a policy on all repos in an organization
chainctl policy binding create --policy=no-eol --parent=engineering --mode=ENFORCE

# Enable a policy in dry-run mode
chainctl policy binding create --policy=no-eol --parent=engineering --mode=DRY_RUN

# Create a binding with interactive organization selection
chainctl policy binding create --policy=no-eol --mode=ENFORCE

# Create a binding with a parameter value
chainctl policy binding create --policy=cooldown --parent=engineering --mode=ENFORCE --param=days=14

```

### Options

```
      --mode string         The policy mode (ENFORCE or DRY_RUN).
      --param stringArray   Parameter value as key=value. Repeatable.
      --parent string       The name or id of the organization to scope the binding to.
      --policy string       The name or UIDP of the policy to bind.
      --resources strings   The resource types this binding applies to. (default [registry.chainguard.dev/Repo])
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy binding](/platform/chainctl/chainctl-docs/chainctl_policy_binding/)	 - Manage policy bindings.

---

### chainctl libraries packages blocked
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_blocked.md_

## chainctl libraries packages blocked

List blocked Libraries packages.

### Synopsis

List packages that were withheld by an active Libraries policy. Defaults to ENFORCE-mode events from the last 30 days.

```
chainctl libraries packages blocked [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--ecosystem ECOSYSTEM] [--package NAME] [--mode ENFORCE|PREVIEW] [--limit N] [--output=json|table] [flags]
```

### Options

```
      --ecosystem string   Only show events for this ecosystem (JAVA, JAVASCRIPT, PYTHON).
      --limit int32        The number of blocked packages per page in an interactive terminal; otherwise the maximum number to return. (default 50)
      --mode string        Only show events in this mode (ENFORCE or PREVIEW). Defaults to ENFORCE.
      --package string     Only show events whose package name matches (exact, case-insensitive).
      --parent string      The name or id of the organization to scope events to.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.

---

### chainctl iam external-group-role-mappings delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_delete.md_

## chainctl iam external-group-role-mappings delete

Delete IdP group-to-role mappings.

```
chainctl iam external-group-role-mappings delete {MAPPING_ID | --all --idp IDP} [--yes] [flags]
```

### Examples

```
  # Delete a single group mapping by ID
  chainctl iam external-group-role-mappings delete MAPPING_UIDP

  # Delete all group mappings for an identity provider
  chainctl iam external-group-role-mappings delete --all --idp IDP_UIDP
```

### Options

```
      --all          Delete all mappings for the identity provider given by --idp
      --idp string   Identity provider (name or UIDP) whose mappings to delete (with --all)
  -y, --yes          Skip confirmation prompt
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam external-group-role-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings/)	 - Manage IdP group-to-role mappings (also available under 'iam identity-providers group-mappings').

---

### chainctl guardener scans list
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_scans_list.md_

## chainctl guardener scans list

List a group's dependency scans.

### Synopsis

List summaries of a group's dependency scans.

Guardener continuously scans the repositories of the group's linked GitHub
installations. The listing shows one summary per repository — its most recent
scan — newest first. Resolve a summary's ID to the full scan with "scans get".

Requires the guardener.scan.list capability on the group.

```
chainctl guardener scans list [flags]
```

### Options

```
  -o, --output string   Output format: table or json. (default "table")
      --parent string   Name or UIDP of the Chainguard group whose scans to list. Prompts interactively if omitted.
      --repo string     Only list scans of this repository (a github.com URL or "owner/repo").
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener scans](/platform/chainctl/chainctl-docs/chainctl_guardener_scans/)	 - View guardener dependency scans.

---

### chainctl policy enable
_Path: platform/chainctl/chainctl-docs/chainctl_policy_enable.md_

## chainctl policy enable

Enable a policy for an organization.

### Synopsis

Enable a policy by creating a binding for an organization.
If the policy is already enabled, its mode (or parameter values) is updated.

This is a shortcut for "policies binding create".

--mode is required and must be either ENFORCE or DRY_RUN. Pass
--param=KEY=VALUE (repeatable) to supply values for policies that declare
a parameter schema; omitted parameters fall back to the schema's declared
default.

```
chainctl policy enable --policy POLICY [--parent ORG] --mode MODE [--param KEY=VALUE] [--output=json|table] [flags]
```

### Examples

```

# Enable a policy in DRY_RUN mode
chainctl policy enable --policy=no-eol --parent=example.com --mode=DRY_RUN

# Enable a policy in enforce mode
chainctl policy enable --policy=no-eol --parent=example.com --mode=ENFORCE

# Enable a policy with a parameter value
chainctl policy enable --policy=cooldown --parent=example.com --mode=ENFORCE --param=days=14

```

### Options

```
      --mode string         The policy mode (ENFORCE or DRY_RUN).
      --param stringArray   Parameter value as key=value. Repeatable.
      --parent string       The name or id of the organization to scope the binding to.
      --policy string       The name or UIDP of the policy to bind.
      --resources strings   The resource types this binding applies to. (default [registry.chainguard.dev/Repo])
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.

---

### chainctl images catalog
_Path: platform/chainctl/chainctl-docs/chainctl_images_catalog.md_

## chainctl images catalog

List the Chainguard Images catalog.

### Synopsis

List the Chainguard Images catalog.

Shows every image Chainguard publishes, along with the upstream images each one
replaces. This is the full catalog, not the images your organization is
entitled to pull: use 'chainctl images repos list' for that.

--name matches any image whose name contains the given text, so --name jdk
finds both "jdk" and "adoptium-jdk".

An image can carry hundreds of active tags, so a long page previews a few per
image and reports how many are left. A page short enough to afford it lists
every tag instead, which is what narrowing down gets you; --all-tags asks for
the full list whatever the page length. JSON always carries every tag.

In a terminal the catalog is shown a page at a time and --limit sets the page
size, so the whole catalog stays reachable. When the output is piped or JSON,
--limit is the maximum number of images returned.

```
chainctl images catalog
```

### Examples

```
  chainctl images catalog
  chainctl images catalog --name postgres
  chainctl images catalog --name go --all-tags
  chainctl images catalog --limit 200 -o json
```

### Options

```
      --all-tags      List every active tag for each image, however long the page. A short page does this anyway.
      --limit int32   The number of images per page in an interactive terminal; otherwise the maximum number to return. (default 50)
      --name string   Show only images whose name contains this substring.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl libraries packages
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages.md_

## chainctl libraries packages

Inspect Libraries packages.

### Synopsis

Browse the Chainguard Libraries package catalog. Packages are served by
Chainguard Libraries across language ecosystems; these commands list packages,
their versions, and per-ecosystem counts, and report packages withheld by
active Libraries policy.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.
* [chainctl libraries packages blocked](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_blocked/)	 - List blocked Libraries packages.
* [chainctl libraries packages count](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_count/)	 - Count Libraries packages per ecosystem.
* [chainctl libraries packages list](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_list/)	 - List Libraries packages.
* [chainctl libraries packages malware](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware/)	 - Inspect the Chainguard malware/greyware blocklist.
* [chainctl libraries packages versions](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_versions/)	 - List the versions of a Libraries package.

---

### chainctl policy custom validate
_Path: platform/chainctl/chainctl-docs/chainctl_policy_custom_validate.md_

## chainctl policy custom validate

Validate a custom policy manifest or expression without persisting it.

### Synopsis

Validate a policy without creating it to catch problems.

Two modes are supported:

  --file: validates a full policy manifest (YAML). Expression and
  parameters are both checked.

  --expression: validates just a Rego expression (a raw .rego file).
  Useful during authoring for a fast parse + compile check. Pass
  --resource-type to say which resource types the expression is for; a
  manifest declares its own.

An expression is validated against the input document its resource type is
evaluated with, so the same expression can be valid for one type and read an
undefined field under another. A manifest naming several types is checked
against each, and a diagnostic that holds for only some of them names those.

Prints structured diagnostics on errors, indicating if the policy is
invalid. Expression errors include the line and column in the Rego
source; parameter-schema errors identify the offending field
(e.g. parameter_schemas[0].name).

Policy expressions must be declared under `package chainguard.policies` and
must define an `allow` rule; validation rejects a module that defines neither.

```
chainctl policy custom validate --file POLICY.yaml | --expression POLICY.rego [flags]
```

### Examples

```

# Check an existing policy layout for reference
chainctl policy describe --policy cooldown --parent example.com -o json

# Validate a manifest before creating the policy
chainctl policy custom validate --file policy.yaml

# Validate just the Rego expression
chainctl policy custom validate --expression policy.rego --resource-type registry.chainguard.dev/Repo@v1

# Validate an expression for several library ecosystems at once
chainctl policy custom validate --expression policy.rego \
  --resource-type libraries.chainguard.dev/NPMPackage@v1 \
  --resource-type libraries.chainguard.dev/PythonPackage@v1

```

### Options

```
  -e, --expression string           Path to a Rego expression (.rego) file. Validates the expression only; skips parameters.
  -f, --file string                 Path to a policy manifest YAML file.
      --resource-type stringArray   Resource type to validate the expression against (e.g. registry.chainguard.dev/Repo@v1). Required with --expression, repeat for several, and rejected with --file.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy custom](/platform/chainctl/chainctl-docs/chainctl_policy_custom/)	 - Manage your custom policies.

---

### chainctl iam identities create github
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create_github.md_

## chainctl iam identities create github

```
chainctl iam identities create github NAME --github-repo=REPO [--github-ref=REF] [--github-audience=AUD] [--parent=PARENT] [--description=DESC] [--role=ROLE,ROLE,...] [--output=id|json|table]
```

### Examples

```
  # Create a GitHub Actions identity for any branch in a repo
  chainctl iam identities create github my-gha-identity --github-repo=my-org/repo-name --parent=eng-org
  
  # Create a GitHub Actions identity for a given branch in a repo and bind to a role
  chainctl iam identities create github my-gha-identity --github-repo=my-org/repo-name --github-ref=refs/heads/test-branch --role=owner
```

### Options

```
  -d, --description string       The description of the resource.
      --github-audience string   The audience for the GitHub OIDC token
      --github-ref string        The branch reference for the executing action (optional).
      --github-repo string       The name of a GitHub repo where the action executes.
  -n, --name string              Given name of the resource.
      --parent string            The name or id of the parent location to create this identity under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --role strings             A comma separated list of names or IDs of roles to bind this identity to (optional).
  -y, --yes                      Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities create](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/)	 - Create a new identity.

---

### chainctl iam organizations list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_organizations_list.md_

## chainctl iam organizations list

List organizations.

```
chainctl iam organizations list [--output=id|json|table|tree]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam organizations](/platform/chainctl/chainctl-docs/chainctl_iam_organizations/)	 - IAM organization interactions.

---

### chainctl images repos build
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_build.md_

## chainctl images repos build

Manage custom image builds

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.
* [chainctl images repos build apply](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_apply/)	 - Apply a build config
* [chainctl images repos build edit](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_edit/)	 - Edit a build config, optionally creating a new repo with --save-as
* [chainctl images repos build list](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_list/)	 - List build reports
* [chainctl images repos build logs](/platform/chainctl/chainctl-docs/chainctl_images_repos_build_logs/)	 - Get build logs

---

### chainctl libraries policy delete
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_delete.md_

## chainctl libraries policy delete

Delete a custom Libraries policy.

```
chainctl libraries policy delete POLICY [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [flags]
```

### Options

```
      --parent string   The name or id of the organization that owns the policy. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl policy describe
_Path: platform/chainctl/chainctl-docs/chainctl_policy_describe.md_

## chainctl policy describe

Describe a policy and its parameter schema.

### Synopsis

Show the full definition of a policy: its description, type, resource
type, and the set of configurable parameters it accepts. The output
includes a copyable example invocation suitable for
`chainctl policy enable`.

Use this command to discover what's configurable on a system policy
before enabling it for your organization.

```
chainctl policy describe --policy POLICY [--parent ORG] [--output=json|table] [flags]
```

### Examples

```

# Describe the cooldown policy
chainctl policy describe --policy=cooldown --parent=example.com

# JSON output (useful for scripts that need the full schema)
chainctl policy describe --policy=cooldown --parent=example.com -o json

```

### Options

```
      --parent string          The name or id of the organization to scope the lookup to.
      --policy string          The name or UIDP of the policy to describe.
      --resource-type string   Resource type used to disambiguate a policy referenced by name (shorthand: Repo, Python, Java, Javascript; or a full type). Ignored when the policy is given by UIDP.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.

---

### chainctl policy custom delete
_Path: platform/chainctl/chainctl-docs/chainctl_policy_custom_delete.md_

## chainctl policy custom delete

Delete a custom policy.

### Synopsis

Delete a custom policy by name or UIDP. Use --force to skip the
confirmation prompt.

Deletion is permanent, once a policy is deleted it cannot be recovered.

Deletion cascades: every binding that referenced the policy is removed,
and every override waiving this policy is removed as well. It is
reported the number of bindings and overrides that will be affected
before you confirm.

If the target policy's name is not unique within the organization
(more than 1 policy can share a name when their resource types
differ), pass --resource-type to disambiguate. Ignored when --policy
is given by UIDP.

```
chainctl policy custom delete --policy NAME_OR_ID [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--force] [flags]
```

### Examples

```

# Delete a custom policy by name
chainctl policy custom delete --policy cooldown-30 --parent example.com

# Delete by UIDP, skipping confirmation
chainctl policy custom delete --policy 720a...c81 --force

# Disambiguate a policy name shared across resource types
chainctl policy custom delete --policy cooldown-30 --resource-type Python --parent example.com

```

### Options

```
      --force                  Skip the confirmation prompt.
      --parent string          The name or id of the organization the policy belongs to. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --policy string          The name or UIDP of the custom policy to delete.
      --resource-type string   Resource type used to disambiguate a policy referenced by name (shorthand: Repo, Python, Java, Javascript; or a full type). Ignored when the policy is given by UIDP.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy custom](/platform/chainctl/chainctl-docs/chainctl_policy_custom/)	 - Manage your custom policies.

---

### chainctl iam roles delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_delete.md_

## chainctl iam roles delete

Delete a custom IAM role.

```
chainctl iam roles delete ROLE_NAME|ROLE_ID [--yes] [--output=id|json|table]
```

### Examples

```
  # Delete a role by ID
  chainctl iam roles delete 3ed98fc...
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.

---

### chainctl policy override list
_Path: platform/chainctl/chainctl-docs/chainctl_policy_override_list.md_

## chainctl policy override list

List policy overrides.

### Synopsis

List active policy overrides to see which artifacts have been
waived and for which policy.

Overrides are scoped to one organization: pass --parent, or omit it to
use your configured default group, or (with no default configured) the
single organization you can access — you are prompted when several are
available. Each override shows its ID, the policy it waives, the
targeted artifact, and the reason.

```
chainctl policy override list [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Examples

```
  # List overrides for your default (or only) organization
  chainctl policy override list
  
  # List overrides for a specific organization
  chainctl policy override list --parent=engineering
```

### Options

```
      --parent string   The name or id of the organization to list overrides for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy override](/platform/chainctl/chainctl-docs/chainctl_policy_override/)	 - Manage policy overrides.

---

### chainctl iam identities
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities.md_

## chainctl iam identities

Identity management.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam identities create](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/)	 - Create a new identity.
* [chainctl iam identities delete](/platform/chainctl/chainctl-docs/chainctl_iam_identities_delete/)	 - Delete one or more identities.
* [chainctl iam identities describe](/platform/chainctl/chainctl-docs/chainctl_iam_identities_describe/)	 - View the details of an identity.
* [chainctl iam identities list](/platform/chainctl/chainctl-docs/chainctl_iam_identities_list/)	 - List identities.
* [chainctl iam identities update](/platform/chainctl/chainctl-docs/chainctl_iam_identities_update/)	 - Update an identity

---

### chainctl images tags resolve
_Path: platform/chainctl/chainctl-docs/chainctl_images_tags_resolve.md_

## chainctl images tags resolve

Resolve tags for a specific image reference.

```
chainctl images tags resolve IMAGE_REF
```

### Options

```
      --all   Return all tags that match the digest of the specified image reference.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images tags](/platform/chainctl/chainctl-docs/chainctl_images_tags/)	 - Tags related commands for images.

---

### chainctl config save
_Path: platform/chainctl/chainctl-docs/chainctl_config_save.md_

## chainctl config save

Save the current chainctl config to a config file.

```
chainctl config save [--config FILE] [--yes] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl images changelog
_Path: platform/chainctl/chainctl-docs/chainctl_images_changelog.md_

## chainctl images changelog

Show changelog for image history

### Synopsis

Show changelog for image history.

This command fetches the tag history for an image, analyzes changes between versions,
and displays human-readable summaries of changes (similar to git log).

```
chainctl images changelog IMAGE_REFERENCE [flags]
```

### Examples

```

# Show changelog for an image (default: last 10 versions)
chainctl images changelog cgr.dev/chainguard/nginx:latest

# Show only last 5 versions
chainctl images changelog cgr.dev/chainguard/nginx:latest --depth 5

# Output as JSON
chainctl images changelog cgr.dev/chainguard/nginx:latest --output json

# Output as table
chainctl images changelog cgr.dev/chainguard/nginx:latest --output table
```

### Options

```
      --depth int         Number of historical versions to show (default 10)
      --platform string   Platform to use for multi-arch images (e.g., linux/amd64, linux/arm64) (default "linux/amd64")
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl iam identity-providers scim
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim.md_

## chainctl iam identity-providers scim

Manage SCIM provisioning for an identity provider.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management
* [chainctl iam identity-providers scim disable](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_disable/)	 - Disable SCIM provisioning for an identity provider.
* [chainctl iam identity-providers scim enable](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_enable/)	 - Enable SCIM provisioning for an identity provider.
* [chainctl iam identity-providers scim token](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token/)	 - Manage the SCIM provisioning bearer token for an identity provider.
* [chainctl iam identity-providers scim users](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_users/)	 - Inspect the SCIM-provisioned users of an identity provider.

---

### chainctl policy override
_Path: platform/chainctl/chainctl-docs/chainctl_policy_override.md_

## chainctl policy override

Manage policy overrides.

### Synopsis

A policy override is an admin-granted waiver that flips a DENIED
policy result to ALLOWED for one specific artifact. It does not change
the policy or its binding; it records a deliberate, attributable
exception that the engine applies after evaluation.

Each override names exactly one policy and one artifact. Creating an
override requires the policies.override.create capability, which is
typically held by organization owners.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.
* [chainctl policy override create](/platform/chainctl/chainctl-docs/chainctl_policy_override_create/)	 - Create a policy override.
* [chainctl policy override delete](/platform/chainctl/chainctl-docs/chainctl_policy_override_delete/)	 - Delete a policy override.
* [chainctl policy override list](/platform/chainctl/chainctl-docs/chainctl_policy_override_list/)	 - List policy overrides.

---

### chainctl iam account-associations unset gcp
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_gcp.md_

## chainctl iam account-associations unset gcp

Remove GCP account configuration for a location.

```
chainctl iam account-associations unset gcp ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [--yes] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations unset](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset/)	 - Remove cloud provider account associations from a location.

---

### chainctl policy decision list
_Path: platform/chainctl/chainctl-docs/chainctl_policy_decision_list.md_

## chainctl policy decision list

List policy decisions.

### Synopsis

List recorded policy decisions to see which image digests a policy
allowed or denied at pull time.

Each decision shows the repository, the digest, the policy that
evaluated it, the mode, the outcome, and when it was pulled.

Decisions are scoped to one organization: pass --parent, or omit it to
use your configured default group, or (with no default configured) the
single organization you can access — you are prompted when several are
available. Within that scope, filter by --repo for a single repository,
by --policy for a single policy, by --mode or --result for a subset of
outcomes, and by --since for a time window.

Decisions are listed most recent first. By default the 20 most recent
are shown; use --limit (1-100) to change how many are returned.

For a multi-arch image the ARTIFACT ID column may show the index digest,
while pulls are enforced against the per-platform child manifest; run
"chainctl policy check" to find the child digest an override must
target. The table view shows the artifact in short form; -o json returns
the full value.

Use --show-decision-details to print each decision as an expanded
block, grouped by artifact. Every verdict is rendered so a
--artifact-id lookup shows the full decision picture.

Use --show-artifact-ids to print the unique full artifact IDs from the
result set, one per line.

With -o json the output is an object with an "items" array (one entry
per decision) and a string "totalCount"; read .items[] rather than
treating the output as a top-level array.

```
chainctl policy decision list [--parent ORG] [--repo REPO] [--artifact-id ARTIFACT] [--policy POLICY] [--mode MODE] [--result RESULT] [--since Nd] [--limit N] [--show-decision-details] [--show-artifact-ids] [--output=json|table] [flags]
```

### Examples

```
  # List decisions for your default (or only) organization
  chainctl policy decision list
  
  # List decisions for a specific organization
  chainctl policy decision list --parent=engineering
  
  # List what the cooldown policy would have blocked in the last day
  chainctl policy decision list --parent=engineering --policy=cooldown --result=DENIED --since=1d
  
  # List all decisions recorded for a single repository
  chainctl policy decision list --parent=engineering --repo=nginx
  
  # Show the 50 most recent decisions
  chainctl policy decision list --parent=engineering --limit=50
  
  # Print each decision as an expanded block with per-policy reasons
  chainctl policy decision list --show-decision-details
  
  # List the unique full artifact IDs from the result set
  chainctl policy decision list --show-artifact-ids
  
  # Show every policy's verdict and reasons for a single artifact
  chainctl policy decision list --artifact-id=sha256:<full-artifact-id> --show-decision-details
  
  # List decisions as JSON for scripting; the payload is an object, so read .items[]
  chainctl policy decision list --parent=engineering -o json | jq '.items[]'
```

### Options

```
      --artifact-id string      Only show decisions for this artifact: an image digest for container policies (sha256:...) or a PURL for library policies (pkg:npm/left-pad@1.3.0).
      --limit int               Maximum number of decisions to return, most recent first (1-100). (default 20)
      --mode string             Only show decisions evaluated in this mode (ENFORCE or DRY_RUN; the POLICY_MODE_ prefixed value from -o json is also accepted).
      --parent string           The name or id of the organization to list decisions for.
      --policy string           Only show decisions for this policy (name or UIDP).
      --repo string             Only show decisions for this repository.
      --resource-type string    Resource type used to disambiguate a policy referenced by name (shorthand: Repo, Python, Java, Javascript; or a full type). Ignored when the policy is given by UIDP.
      --result string           Only show decisions with this outcome (ALLOWED, DENIED, or ERROR; the RESULT_ prefixed value from -o json is also accepted).
      --show-artifact-ids       Print the unique full artifact IDs from the result set, one per line.
      --show-decision-details   Print each decision as an expanded block that lists every reason line-by-line.
      --since string            Only show decisions pulled within a window given as a positive whole number of days followed by d, e.g. 7d.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy decision](/platform/chainctl/chainctl-docs/chainctl_policy_decision/)	 - Inspect policy decisions.

---

### chainctl libraries packages malware
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware.md_

## chainctl libraries packages malware

Inspect the Chainguard malware/greyware blocklist.

### Synopsis

Browse Chainguard's malware/greyware blocklist across language ecosystems.

This is a global feed: every entry is blocked by Chainguard for all
organizations, independent of any org's Libraries policy.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.
* [chainctl libraries packages malware list](/platform/chainctl/chainctl-docs/chainctl_libraries_packages_malware_list/)	 - List the Chainguard malware/greyware blocklist.

---

### chainctl iam account-associations set azure
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_azure.md_

## chainctl iam account-associations set azure

Set AZURE account association for a location.

```
chainctl iam account-associations set azure ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID --tenant-id=TENANT_ID --client-ids=COMPONENT_NAME=CLIENT_ID [--name=NAME] [--description=DESCRIPTION] [--yes] [--output=id|json|table] [flags]
```

### Options

```
      --client-ids stringToString   A chainguard component_name to azure client_id map (default [])
  -d, --description string          The description of the resource.
  -n, --name string                 Given name of the resource.
      --tenant-id string            The Azure Tenant ID.
  -y, --yes                         Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations set](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set/)	 - Set cloud provider account associations for a location.

---

### chainctl images helm history
_Path: platform/chainctl/chainctl-docs/chainctl_images_helm_history.md_

## chainctl images helm history

Show digest history for a Chainguard Helm chart tag.

### Synopsis

Show the digest history for a Chainguard Helm chart tag.

Chart tags are mutable. This command lists every digest a chart tag has pointed
at over time, ordered newest first, so you can identify when a regression was
introduced and pin to an earlier digest.

CHART accepts either a bare chart name (with --parent) or a full OCI reference.
If no tag is provided, you will be prompted to select one.

```
chainctl images helm history CHART[:TAG] [flags]
```

### Examples

```

# Bare chart name with an explicit parent group path
chainctl images helm history flux:v2.18.4 --parent my-org/charts

# Bare chart name in the iamguarded-charts folder
chainctl images helm history flux:v2.18.4 --parent my-org/iamguarded-charts

# Interactively pick a tag
chainctl images helm history flux --parent my-org/charts

# Full OCI reference
chainctl images helm history cgr.dev/my-org/charts/flux:v2.18.4

# JSON output
chainctl images helm history flux:v2.18.4 --parent my-org/charts -o json
```

### Options

```
      --parent string   Group path where the chart lives (e.g. my-org/charts or my-org/iamguarded-charts). Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/)	 - Helm chart related commands

---

### chainctl actions discover
_Path: platform/chainctl/chainctl-docs/chainctl_actions_discover.md_

## chainctl actions discover

Discover GitHub Actions dependencies used by your workflows.

### Synopsis

Discover GitHub Actions dependencies.

Walks the target's workflows and composite-action definitions and lists every
action and container image they reference.

TARGET may be:
  - a local directory (default: current directory) — scans .github/workflows/
    and action.{yml,yaml}
  - a repo "owner/repo" — scans the repo's workflows and action.{yml,yaml}
  - a single action ref "owner/repo[/subpath]@version"

By default only the directly-referenced actions are listed. Pass --recursive to
follow each referenced action into its own definition on GitHub and resolve the
full transitive dependency graph.

Requires a GitHub token via $GITHUB_TOKEN or 'gh auth token'.

```
chainctl actions discover [TARGET] [flags]
```

### Examples

```
  chainctl actions discover
  chainctl actions discover .
  chainctl actions discover actions/checkout@v4
  chainctl actions discover chainguard-dev/mono
```

### Options

```
      --cache-dir string   Directory for caching GitHub API responses (default: $TMPDIR/chainctl-discover-cache)
      --clear-cache        Clear the cache directory before running
      --recursive          Recurse into referenced actions' definitions on GitHub to resolve transitive dependencies
      --skip-catalog       Skip matching discovered actions against the Chainguard Actions catalog
      --timeout duration   Maximum time to spend resolving dependencies (default 5m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions](/platform/chainctl/chainctl-docs/chainctl_actions/)	 - Interact with the Chainguard Actions product.

---

### chainctl iam identity-providers create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_create.md_

## chainctl iam identity-providers create

Create an identity provider

```
chainctl iam identity-providers create --parent ORGANIZATION_NAME | ORGANIZATION_ID [--name=NAME] [--description=DESCRIPTION] --oidc-issuer=ISSUER --oidc-client-id=CLIENT_ID {--oidc-client-secret=CLIENT_SECRET | --oidc-pkce-enabled} [--oidc-additional-scopes=SCOPE,...] --default-role=ROLE [--output=id|json|table]
```

### Examples

```
  # Setup a confidential OIDC provider and bind new users to the viewer role
  chainctl iam identity-providers create --name=google --parent=example \
  --oidc-issuer=https://accounts.google.com \
  --oidc-client-id=foo \
  --oidc-client-secret=bar \
  --default-role=viewer
  
  # Setup a public OIDC provider
  chainctl iam identity-providers create --name=google --parent=example \
  --oidc-issuer=https://accounts.google.com \
  --oidc-client-id=foo \
  --oidc-pkce-enabled \
  --default-role=viewer
```

### Options

```
      --configuration-type string                Type of identity provider. Only OIDC supported currently (default "OIDC")
      --default-role string                      Role to grant users on first login
      --description string                       Description of identity provider
      --name string                              Name of identity provider
      --oidc-additional-scopes stringArray       additional scopes to request for OIDC type identity provider
      --oidc-client-id string                    client id for OIDC type identity provider
      --oidc-client-secret string                client secret for OIDC type identity provider
      --oidc-correlation-rule string             How OIDC logins are matched to SCIM-provisioned users: sub_equals_external_id (default; stock Okta) or oid_equals_external_id (Microsoft Entra ID; requires --oidc-additional-scopes=profile). Permanent: the rule cannot be changed after creation.
      --oidc-groups-claim string                 OIDC token claim carrying group memberships, used for group-to-role mappings (empty disables group mapping). Manage the mappings with 'chainctl iam identity-providers group-mappings'.
      --oidc-issuer string                       Issuer URL for OIDC type identity provider
      --oidc-pkce-enabled                        Include a PKCE challenge during authorization code exchange. Upstream IDP must be configured to respond.
      --oidc-token-endpoint-auth-method string   How the client secret is presented at the token endpoint: basic or post. Empty selects the method the IDP advertises in discovery. Set it when the IDP endpoint advertises one method but the specific app registration expects the other.
      --parent string                            The name or ID of the location the identity provider belongs to. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
  -y, --yes                                      Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management

---

### chainctl libraries policy list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_list.md_

## chainctl libraries policy list

List Libraries policies.

### Synopsis

List the Libraries policies available to an organization (SYSTEM policies and the organization's CUSTOM policies).

```
chainctl libraries policy list [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the organization. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl iam folders
_Path: platform/chainctl/chainctl-docs/chainctl_iam_folders.md_

## chainctl iam folders

IAM folders interactions.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam folders delete](/platform/chainctl/chainctl-docs/chainctl_iam_folders_delete/)	 - Delete a folder.
* [chainctl iam folders describe](/platform/chainctl/chainctl-docs/chainctl_iam_folders_describe/)	 - Describe a folder.
* [chainctl iam folders list](/platform/chainctl/chainctl-docs/chainctl_iam_folders_list/)	 - List folders under an organization.
* [chainctl iam folders update](/platform/chainctl/chainctl-docs/chainctl_iam_folders_update/)	 - Update a folder.

---

### chainctl images repos build edit
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_build_edit.md_

## chainctl images repos build edit

Edit a build config, optionally creating a new repo with --save-as

### Synopsis

Extend a Chainguard image with custom packages, environment variables,
certificates, and runtime APK repositories.

You can use Custom Assembly to customize any image you are entitled to by
adding packages from Chainguard's repository, setting environment variables,
adding OCI annotations or customizing user accounts and groups.

Furthermore, Custom Assembly allows you to include any additional custom
certificates in the image. They will be merged with the default certificate
bundle, enabling the image to trust non-standard certificate authorities and
connect to services secured with custom TLS certificates.

You can also configure custom runtime APK repositories using --with-runtime-repositories.
When set, these replace the default virtualapk.cgr.dev repositories in
/etc/apk/repositories, allowing runtime package installation from your own
APK mirrors.

Finally, you can create variants by choosing to save the customized
configuration as a new repository instead of modifying the existing one.

How it works:

You customize the image by editing a YAML configuration manifest. The command
opens your editor with the current repository configuration (or a template for
new repositories). To skip the interactive editor, use the --file flag to
provide a pre-written configuration file.

After editing, the command displays a diff of your changes for review. Upon
confirmation, it updates the repository configuration and starts a custom build
automatically.

Customizable sections:

  contents.packages
    Add additional packages to install in the image (e.g., development tools,
    utilities). Packages must be available in Chainguard's package repository.
    Package names may include the {{major}} and {{minor}} template tokens,
    which expand to the corresponding components of the base image's main
    package version at build time. For example, "py{{major}}.{{minor}}-cryptography"
    becomes "py3.13-cryptography" on an image whose main package is
    python-3.13, and tracks the base image as its version moves.

  contents.runtime_repositories
    Add APK repositories to /etc/apk/repositories in the image for runtime
    package installation. When set, these replace the default virtualapk.cgr.dev
    repositories. Must be HTTPS URLs.

  contents.runtime_keyring
    Trust additional APK signing public keys for the runtime repositories
    (e.g., a re-signing mirror). Each entry has a name and a PEM PUBLIC KEY
    content; the key is written to /etc/apk/keys under its name, which must
    match the filename referenced by the repository's APKINDEX signature
    (.SIGN.RSA256.<name>). Keys can also be loaded from files using the
    --with-runtime-keys flag.

  environment
    Set environment variables that will be available in the image. Variables
    with the 'CHAINGUARD_' prefix are reserved and cannot be used.

  annotations
    Add custom OCI annotations to the image for tracking build information,
    compliance, or metadata. Keys with the 'dev.chainguard' prefix are reserved
    and cannot be used.

  accounts
    Customize image users and groups. You can define custom users with specific
    UIDs/GIDs, home directories, and group memberships. You can also specify
    which user the image should run as.

  certificates
    Provide custom certificates that will be merged with the default certificate
    bundle in the image. This is useful for adding internal CA certificates.
    Certificates can be defined in the YAML manifest or loaded from files using
    the --with-certificates flag (can be specified multiple times). Both methods
    can be combined and all certificates are merged together.
    NOTE: This is a Beta feature that requires enrollment. Contact your Customer
    Success Team to enable this feature.

Notice: Customer shall not provide Chainguard any personal data (or similarly regulated data)
as part of the Custom Assembly tool, other than the personal data that Chainguard collects in
the ordinary course of business, as further detailed in its
[Privacy Notice](https://www.chainguard.dev/legal/privacy-notice).

```
chainctl images repos build edit [flags]
```

### Examples

```

# Edit a repository interactively (prompts for repo selection)
chainctl images repos build edit

# Edit a specific repository
chainctl images repos build edit --repo=my-custom-python

# Edit and save as a new repository
chainctl images repos build edit --repo=my-custom-python --save-as=my-new-python

# Apply configuration from a file
chainctl images repos build edit --repo=my-custom-python --file=config.yaml

# Apply configuration from a file and save as new repository
chainctl images repos build edit --file=config.yaml --save-as=my-new-python

# Add custom certificates (interactive mode)
chainctl images repos build edit --repo=my-custom-python --with-certificates=ca1.pem --with-certificates=ca2.pem

# Add a customer APK signing key for a re-signing mirror (the file's basename
# must match the key name the mirror's APKINDEX signature references)
chainctl images repos build edit --repo=my-custom-python --with-runtime-keys=key-ee8fa0a3.rsa.pub

# Keys can also be set in a --file manifest; the name must match the filename
# referenced by the mirror's APKINDEX signature (.SIGN.RSA256.<name>):
#
#   contents:
#     runtime_keyring:
#       - name: key-ee8fa0a3.rsa.pub
#         content: |
#           -----BEGIN PUBLIC KEY-----
#           ...
#           -----END PUBLIC KEY-----

# Combine file-based config with certificates
chainctl images repos build edit --file=config.yaml --with-certificates=internal-ca.pem

```

### Options

```
  -f, --file string                         The name of the file containing the build config.
      --parent string                       The name or id of the parent location to apply build config. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --repo string                         The name or id of the repo to apply build config.
      --save-as string                      Create a new repo with the edited configuration instead of updating the existing one.
      --with-certificates strings           Comma separated list of files to read the custom certificates from.
      --with-runtime-keys strings           Comma separated list of files to read customer APK signing public keys from. Each file becomes a key in /etc/apk/keys named after the file's basename, which must match the filename referenced by the repository's APKINDEX signature (.SIGN.RSA256.<name>).
      --with-runtime-repositories strings   Comma separated list of runtime APK repository URLs to write to /etc/apk/repositories in the image.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos build](/platform/chainctl/chainctl-docs/chainctl_images_repos_build/)	 - Manage custom image builds

---

### chainctl guardener github unlink
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_unlink.md_

## chainctl guardener github unlink

Unlink a GitHub organization from its Chainguard group.

### Synopsis

Unlink a GitHub organization from its Chainguard group.

If --parent is set, this first tries your Chainguard credentials: if you hold
guardener.association.manage on the group, the org is unlinked with no browser
involved. Otherwise (or if those credentials are insufficient) it falls back to
the GitHub authorization flow, which proves you own the organization. Either way
you must be logged in to Chainguard; the GitHub flow just needs no access to the
group.

```
chainctl guardener github unlink [flags]
```

### Options

```
      --github-org string   GitHub account login to unlink (an organization, or your own user).
      --parent string       Name or UIDP of the Chainguard group; enables unlinking with your Chainguard credentials (no browser).
      --port int            Local loopback port for the GitHub OAuth callback. (default 8989)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)	 - Link and unlink a GitHub organization to a Chainguard group.

---

### chainctl auth configure-npm
_Path: platform/chainctl/chainctl-docs/chainctl_auth_configure-npm.md_

## chainctl auth configure-npm

Configure npm credentials for Chainguard Libraries for JavaScript

### Synopsis

Configure npm to use Chainguard Libraries for JavaScript.

By default, this command authenticates using your current Chainguard session
and writes a project-level .npmrc file with a bearer token.

With the --pull-token flag, it creates a longer-lived pull token that can be
used in environments that don't support OIDC (CI systems, build servers, etc.)
and writes a project-level .npmrc with basic auth credentials.

```
chainctl auth configure-npm [flags]
```

### Examples

```
  # Configure npm using your current Chainguard session.
  chainctl auth configure-npm
  
  # Configure npm with a long-lived pull token.
  chainctl auth configure-npm --pull-token
  
  # Configure npm with a pull token for a specific organization.
  chainctl auth configure-npm --pull-token --parent=my-org
  
  # Configure npm with a pull token that lasts for 24 hours.
  chainctl auth configure-npm --pull-token --ttl=24h
```

### Options

```
      --headless                   Skip browser authentication and use device flow.
      --identity string            The unique ID of the identity to assume when logging in.
      --identity-provider string   The unique ID of the customer managed identity provider to authenticate with. Mutually exclusive with --org-name.
      --identity-token string      Use an explicit passed identity token or token path.
      --name string                Optional name for the pull token. (default "pull-token")
      --org-name string            Organization to use for authentication. If configured the organization's custom identity provider will be used. Mutually exclusive with --identity-provider.
      --parent string              The IAM organization or folder with which the pull-token identity is associated.
      --pull-token                 Whether to create a pull token for npm authentication.
      --social-login string        Which of the default identity providers to use for authentication. Must be one of: email, google, github, gitlab
      --ttl ns                     Time To Live for the validity of the pull token. Valid unit strings range from nanoseconds to hours and are ns, `us`, `ms`, `s`, `m`, and `h`. Maximum value is 8760h or one year. (default 720h0m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl libraries
_Path: platform/chainctl/chainctl-docs/chainctl_libraries.md_

## chainctl libraries

Ecosystem library related commands.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.
* [chainctl libraries entitlements](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/)	 - Manage entitlements to language ecosystem libraries.
* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.
* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.
* [chainctl libraries remediate](/platform/chainctl/chainctl-docs/chainctl_libraries_remediate/)	 - Discover and apply Chainguard -cgr.N CVE remediations for a JavaScript project
* [chainctl libraries update-hashes](/platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes/)	 - Update lockfile integrity hashes with Chainguard Libraries checksums
* [chainctl libraries verify](/platform/chainctl/chainctl-docs/chainctl_libraries_verify/)	 - A tool to analyze the use of Chainguard Libraries in various artifacts

---

### chainctl auth login
_Path: platform/chainctl/chainctl-docs/chainctl_auth_login.md_

## chainctl auth login

Login to the Chainguard platform.

```
chainctl auth login [--invite-code=INVITE_CODE] [--identity-token=PATH_TO_TOKEN] [--identity=IDENTITY_ID] [--identity-provider=IDP_ID] [--org-name=ORG_NAME] [--audience=AUDIENCE]... [--social-login={email|google|github|gitlab}] [--headless] [--prefer-ambient-credentials] [--refresh] [--output=id|json|none|table]
```

### Examples

```
  # Default auth login flow:
  chainctl auth login
  
  # Refreshing a token within a Kubernetes context:
  chainctl auth login --identity-token=PATH_TO_TOKEN --refresh
  
  # Headless login using --org-name
  chainctl auth login --headless --org-name my-org
  
  # Register by accepting an invite to an existing location
  chainctl auth login --invite-code eyJncnAiOiI5MzA...
```

### Options

```
      --audience stringArray         The Chainguard token audience to request. Can be specified multiple times to create separate tokens.
      --headless                     Skip browser authentication and use device flow.
      --identity string              The unique ID of the identity to assume when logging in.
      --identity-provider string     The unique ID of the customer managed identity provider to authenticate with. Mutually exclusive with --org-name.
      --identity-token string        Use an explicit passed identity token or token path.
      --invite-code string           Registration invite code.
      --org-name string              Organization to use for authentication. If configured the organization's custom identity provider will be used. Mutually exclusive with --identity-provider.
      --prefer-ambient-credentials   Auth with ambient credentials, if present, before using a supplied identity token.
      --refresh                      Enable auto refresh of the Chainguard token (for workloads).
      --refresh-all                  Refresh every cached token, discovered from the local token cache instead of --audience (implies --refresh-only). Re-evaluated on each refresh cycle, so tokens created after startup are picked up without a restart.
      --refresh-only                 Only refresh existing tokens, skip initial token creation (implies --refresh). Must authenticate separately.
      --social-login string          Which of the default identity providers to use for authentication. Must be one of: email, google, github, gitlab
      --sts-http1-downgrade          Downgrade STS requests to HTTP/1.x
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl auth token
_Path: platform/chainctl/chainctl-docs/chainctl_auth_token.md_

## chainctl auth token

Print the local Chainguard Token.

```
chainctl auth token [flags]
```

### Options

```
      --capabilities strings   Request a token narrowed to the given capabilities.
      --scope strings          Request a token with scope reduced to the given groups.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.
* [chainctl auth token capabilities](/platform/chainctl/chainctl-docs/chainctl_auth_token_capabilities/)	 - Print the capabilities of the local Chainguard Token.

---

### chainctl policy custom update
_Path: platform/chainctl/chainctl-docs/chainctl_policy_custom_update.md_

## chainctl policy custom update

Update a custom policy.

### Synopsis

Update a custom policy in one of two modes:

  --file: full replacement from a YAML manifest. The manifest supplants
  the entire policy definition. The resulting policy is exactly what
  the manifest declares (name, description, expression,
  supported_resource_type, and parameters).

  Flag mode: partial update via individual flags. Only the fields you
  pass are changed; everything else is preserved. Flag mode is
  restricted to policies that do NOT declare parameter schemas. For
  parameterized policies, use --file.

The supported resource type is immutable. A --file update whose
manifest declares a different resource type than the current policy is
rejected. Update addresses one policy, so a manifest using the repeated
`supported_resource_types` to name several — the form
`create` fans out — is rejected here; update each resource type
in turn instead.

If the target policy's name is not unique within the organization
(more than 1 policy can share a name when their resource types
differ), pass --resource-type to disambiguate. Ignored when --policy
is given by UIDP.

See `chainctl policy custom create --help` for the manifest fields and the
required Rego package and `allow` rule.

```
chainctl policy custom update --policy NAME_OR_ID --file POLICY.yaml | [--name NAME] [--description DESC] [--expression FILE.rego] [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Examples

```

# Full replacement from a manifest
chainctl policy custom update --policy cooldown-30 --file policy.yaml --parent example.com

# Rename only
chainctl policy custom update --policy cooldown-30 --name cooldown-strict --parent example.com

# Change just the description
chainctl policy custom update --policy cooldown-30 --description "block pulls from images newer than 30 days"

# Replace the expression from a new .rego (parameterless policies only)
chainctl policy custom update --policy cooldown-30 --expression new-cooldown.rego

# Disambiguate a policy name shared across resource types
chainctl policy custom update --policy cooldown-30 --resource-type Python --description "python-only variant"

```

### Options

```
      --description string     New description. Flag mode only; mutually exclusive with --file.
  -e, --expression string      Path to a new Rego expression (.rego) file. Flag mode only; mutually exclusive with --file.
  -f, --file string            Path to a policy manifest YAML file. Full replacement — supplants the entire policy definition.
      --name string            New policy name. Flag mode only; mutually exclusive with --file.
      --parent string          The name or id of the organization the policy belongs to. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --policy string          The name or UIDP of the custom policy to update.
      --resource-type string   Resource type used to disambiguate a policy referenced by name (shorthand: Repo, Python, Java, Javascript; or a full type). Ignored when the policy is given by UIDP.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy custom](/platform/chainctl/chainctl-docs/chainctl_policy_custom/)	 - Manage your custom policies.

---

### chainctl libraries cache list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache_list.md_

## chainctl libraries cache list

List resolution cache entries.

### Synopsis

List the org's recorded resolutions: which tier each package version was
served from. Live entries govern serving; retired entries were superseded by
a zap and are kept until cleaned up.

```
chainctl libraries cache list [--ecosystem ECOSYSTEM] [--group G | --scope S | --package P] [--tier TIER] [--live] [--limit N] [--parent ORG] [--output=json|table] [flags]
```

### Options

```
      --ecosystem string   Only list entries for this ecosystem (JAVA, PYTHON, JAVASCRIPT).
      --group string       Only list entries under a Maven group prefix. Requires --ecosystem.
      --limit int32        Maximum number of entries to show. (default 100)
      --live               Only list live entries (the ones that govern serving).
      --package string     Only list entries for one package. Requires --ecosystem.
      --parent string      The name or id of the organization whose resolution cache to list.
      --registry string    Only list entries for one registry.
      --scope string       Only list entries under an npm scope prefix. Requires --ecosystem.
      --tier string        Only list entries recording this tier (CHAINGUARD or UPSTREAM).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.

---

### chainctl iam identity-providers scim token generate
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_generate.md_

## chainctl iam identity-providers scim token generate

Generate the first SCIM bearer token for an identity provider.

### Synopsis

Generate the first SCIM bearer token for an identity provider. Provisioning stays off until SCIM is explicitly enabled for the identity provider. The plaintext token is shown exactly once; only its SHA-256 digest is stored. If a token already exists (even expired or revoked), regenerate it instead.

```
chainctl iam identity-providers scim token generate IDENTITY_PROVIDER [--output=json] [flags]
```

### Examples

```
  # Generate a SCIM token that expires in a year
  chainctl iam identity-providers scim token generate my-idp --expires-in 8760h
```

### Options

```
      --expires-in duration   How long until the token expires (maximum two years). Unset defaults to one year.
      --never-expires         Explicitly issue a token without a planned expiry.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim token](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token/)	 - Manage the SCIM provisioning bearer token for an identity provider.

---

### chainctl auth pull-token create
_Path: platform/chainctl/chainctl-docs/chainctl_auth_pull-token_create.md_

## chainctl auth pull-token create

Create a pull token.

```
chainctl auth pull-token create [--save=true|false] [--name=NAME] [--description=DESC] [--ttl=NUM_HOURS_ACTIVE] [--parent=PARENT] [--repository={oci|apk|dotnet|go_athena|java|python|javascript|java_athena|python_athena|javascript_athena|dotnet_athena|go}] [flags]
```

### Examples

```
  # Create a pull token for container registry pull access.
  chainctl auth pull-token create
  
  # Create a pull token for pull access to a library ecosystem.
  chainctl auth pull-token create --repository=java
  
  # Create a pull token that lasts for 24 hours.
  chainctl auth pull-token create --ttl=24h
  
  # Create a pull token for a particular organization.
  chainctl auth pull-token create --parent=my-org
  
  # Create a pull token with a description.
  chainctl auth pull-token create --description="CI builds for service-foo"
```

### Options

```
      --description string   Optional description for the pull token.
      --name string          Optional name for the pull token. (default "pull-token")
      --parent string        The IAM organization or folder with which the pull token identity is associated.
      --repository string    The repository type to create a pull token for. Must be one of: oci, apk, dotnet, go_athena, java, python, javascript, java_athena, python_athena, javascript_athena, dotnet_athena, go. (default "oci")
      --save                 Save the OCI registry pull token to the Docker configuration.
      --ttl ns               Time To Live for the validity of the pull token. Valid unit strings range from nanoseconds to hours and are ns, `us`, `ms`, `s`, `m`, and `h`. Maximum value is 8760h or one year. (default 720h0m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth pull-token](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/)	 - Create a pull token.

---

### chainctl guardener entitlement get
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_entitlement_get.md_

## chainctl guardener entitlement get

Show the guardener entitlement for a group.

### Synopsis

Show the guardener entitlement for a group.

The entitlement records the configured repository visibility scope for the
group. This administrative setting does not determine current repository
coverage, which is controlled by the guardener GitHub App's repository
selection. A group with no configured entitlement shows the default public
scope.

Requires the guardener.entitlement.list capability on the group.

```
chainctl guardener entitlement get [flags]
```

### Options

```
      --parent string   Name or UIDP of the Chainguard group. Prompts interactively if omitted.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener entitlement](/platform/chainctl/chainctl-docs/chainctl_guardener_entitlement/)	 - Manage a group's guardener entitlement.

---

### chainctl iam identity-providers delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_delete.md_

## chainctl iam identity-providers delete

Delete an identity provider.

```
chainctl iam identity-providers delete IDENTITY_PROVIDER_ID|IDENTITY_PROVIDER_NAME [--yes] [--output=id]
```

### Examples

```
  # Delete an identity provider by ID
  chainctl iam identity-providers delete 9b6da6e64b45129eb4e9f9f3ce9b69ca2a550c6b/034e4afcda8c0b07
  
  # Delete an identity provider by name
  chainctl iam identity-providers delete my-idp
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management

---

### chainctl auth pull-token
_Path: platform/chainctl/chainctl-docs/chainctl_auth_pull-token.md_

## chainctl auth pull-token

Create a pull token.

```
chainctl auth pull-token [flags]
```

### Options

```
      --description string   Optional description for the pull token.
      --name string          Optional name for the pull token. (default "pull-token")
      --parent string        The IAM organization or folder with which the pull token identity is associated.
      --repository string    The repository type to create a pull token for. Must be one of: oci, apk, dotnet, go_athena, java, python, javascript, java_athena, python_athena, javascript_athena, dotnet_athena, go. (default "oci")
      --save                 Save the OCI registry pull token to the Docker configuration.
      --ttl ns               Time To Live for the validity of the pull token. Valid unit strings range from nanoseconds to hours and are ns, `us`, `ms`, `s`, `m`, and `h`. Maximum value is 8760h or one year. (default 720h0m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.
* [chainctl auth pull-token create](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token_create/)	 - Create a pull token.
* [chainctl auth pull-token list](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token_list/)	 - List all pull-tokens

---

### chainctl auth logout
_Path: platform/chainctl/chainctl-docs/chainctl_auth_logout.md_

## chainctl auth logout

Logout from the Chainguard platform.

```
chainctl auth logout [--audience=AUDIENCE]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl iam identity-providers scim enable
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_enable.md_

## chainctl iam identity-providers scim enable

Enable SCIM provisioning for an identity provider.

```
chainctl iam identity-providers scim enable IDENTITY_PROVIDER [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim/)	 - Manage SCIM provisioning for an identity provider.

---

### chainctl libraries packages versions
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_versions.md_

## chainctl libraries packages versions

List the versions of a Libraries package.

### Synopsis

List all versions of a single package, identified by the id returned by 'chainctl libraries packages list'.

```
chainctl libraries packages versions PACKAGE_ID [--output=json|table] [flags]
```

### Options

```
      --upstream   Also include upstream-registry versions. By default only Chainguard-built versions are listed.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.

---

### chainctl libraries verify
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_verify.md_

## chainctl libraries verify

A tool to analyze the use of Chainguard Libraries in various artifacts

### Synopsis

verify analyzes various artifacts
(directories, archives, packages) to analyze how much was built from source by Chainguard,
based on SBOM data, signatures, and artifact inspection.

You can specify one or more paths to analyze multiple artifacts in a single command.

For container images, you can use:
  - Registry references (e.g., cgr.dev/chainguard/nginx:latest)
  - Local single-part images (e.g., redis:latest, nginx:alpine)
  - Docker archive format (docker-archive:/path/to/image.tar)
  - Local images with prefixes (localhost/myapp:latest)

JavaScript package manager caches (npm, pnpm, Yarn Classic) are auto-detected
in container images and local directories by their structure.

Passing a JavaScript lockfile (package-lock.json, npm-shrinkwrap.json,
pnpm-lock.yaml, yarn.lock, bun.lock) reports which of its registry entries carry
a digest covered by a Chainguard attestation, using the integrity hashes the
lockfile records. No install or package cache is required.

An entry counts as verified only when the attested digest is bound to the
tarball bytes the entry permits — that is, when any install honoring the entry's
integrity constraint must use the attested bytes. A lone integrity hash binds:
the package manager rejects any tarball that does not match it. An entry listing
several hashes does not, since any of them may be satisfied — those are reported
as attested but not bound, unless the resolved URL names the same package on
Chainguard's built route (libraries.cgr.dev/javascript/), which fixes the
source. The upstream proxy route serves upstream bytes and does not bind.

A lockfile rewritten by "libraries update-hashes" in its default append mode
keeps the original registry hash alongside the Chainguard one. Such entries
verify only while resolved points at the Chainguard built route, so behind a
private proxy or custom --registry-url they report as not bound. Use
"libraries update-hashes --replace" to record a single Chainguard hash per
entry, which binds regardless of where the entry resolves from.

No downloaded bytes are examined, and platform, optional dependencies, overrides,
and registry configuration still affect what a package manager selects. Entries
with no usable digest — linked and git dependencies, and Yarn Berry's non-SRI
checksums — are reported at zero coverage.

Entries the registry could not answer for — an outage, or rejected credentials —
are reported as unchecked rather than unverified, since a service problem is not
a provenance finding. Requests are retried before an entry is called unchecked.

This report is informational: the exit status does not reflect coverage. Coverage
counts entries Chainguard built from source, so a package that is simply not
built from source is not a defect, and gating a build on the percentage is not
the intended use. Per-entry results are available with "-o json --detailed".

Remediated (CVE-patched) Java artifacts, whose versions carry a "-0.cgr.<rev>" suffix
(e.g. 3.5.0-0.cgr.2), are resolved from the java-remediated repository; other Java
artifacts are resolved from the java repository.

```
chainctl libraries verify [path...] [flags]
```

### Examples

```
  # Analyze a local JAR file
  chainctl libraries verify myapp.jar

  # Analyze multiple files
  chainctl libraries verify build/libs/*.jar build/libs/*.war

  # Analyze a local Python virtual environment
  chainctl libraries verify ./venv/

  # Analyze with JSON output
  chainctl libraries verify -o json build/libs/*.jar

  # Analyze container images
  chainctl libraries verify cgr.dev/chainguard/maven:latest

  # Analyze remote artifact
  chainctl libraries verify remote:example.com/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar

  # Verify a lockfile without installing anything
  chainctl libraries verify package-lock.json
  chainctl libraries verify pnpm-lock.yaml

  # Per-entry results for machine consumption
  chainctl libraries verify package-lock.json -o json --detailed

  # Verify npm cache (auto-detected by _cacache/index-v5/ structure)
  chainctl libraries verify "$(npm config get cache)"

  # Verify pnpm store (auto-detected; supports pnpm 10+ index dirs and the
  # pnpm 11 SQLite index, and the versioned path reported by newer pnpm)
  chainctl libraries verify "$(pnpm store path)"

  # Verify Yarn Classic (v1.x) cache
  chainctl libraries verify yarn:
  chainctl libraries verify yarn:~/Library/Caches/Yarn/v6
```

### Options

```
      --concurrency int         Number of artifacts verified in parallel: nested archives within a single input, or inputs across a multi-path run (0 = default of 16)
  -d, --detailed                Show detailed per-artifact results
      --ecosystems-url string   URL for the Ecosystems Proxy (defaults to https://libraries.cgr.dev)
      --no-color                Disable colored output
  -o, --output string           Output format (text, json, yaml) (default "text")
      --parent string           Parent organization for authentication
      --verbose                 Enable verbose output
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.

---

### chainctl iam identity-providers group-mappings
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings.md_

## chainctl iam identity-providers group-mappings

Manage IdP group-to-role mappings for an identity provider.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management
* [chainctl iam identity-providers group-mappings create](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_create/)	 - Create an IdP group-to-role mapping.
* [chainctl iam identity-providers group-mappings delete](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_delete/)	 - Delete an identity provider's group-to-role mappings.
* [chainctl iam identity-providers group-mappings list](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_list/)	 - List an identity provider's group-to-role mappings.

---

### chainctl images repos update
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_update.md_

## chainctl images repos update

Update image repositories.

```
chainctl images repos update {REPO_NAME|REPO_ID} --parent ORGANIZATION_NAME | ORGANIZATION_ID
```

### Options

```
      --bundles string       Comma-separated list of bundles to assign to the repo.
      --description string   Updated description for the repo.
      --expiration time      Sync expiration time (e.g., 1970-01-01).
      --name string          Updated name for the repo.
      --parent string        The name or id of the parent location of the repo to update. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --source string        Repository ID to sync from.
      --tier string          Catalog tier. One of: [APPLICATION,BASE,FIPS,AI,DEVTOOLS,COMMERCIAL]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.

---

### chainctl guardener scans
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_scans.md_

## chainctl guardener scans

View guardener dependency scans.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener](/platform/chainctl/chainctl-docs/chainctl_guardener/)	 - Manage guardener integrations.
* [chainctl guardener scans get](/platform/chainctl/chainctl-docs/chainctl_guardener_scans_get/)	 - Show one dependency scan.
* [chainctl guardener scans list](/platform/chainctl/chainctl-docs/chainctl_guardener_scans_list/)	 - List a group's dependency scans.

---

### chainctl libraries policy binding create
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_create.md_

## chainctl libraries policy binding create

Create a Libraries policy binding.

### Synopsis

Create a binding to activate a Libraries policy for an (organization, ecosystem) pair. The default mode is ENFORCE.

```
chainctl libraries policy binding create --policy POLICY [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--ecosystem ECOSYSTEM] [--mode ENFORCE|PREVIEW] [flags]
```

### Options

```
      --ecosystem string   The ecosystem the binding applies to (JAVA, JAVASCRIPT, PYTHON).
      --mode string        The binding mode (ENFORCE or PREVIEW). Defaults to ENFORCE.
      --parent string      The name or id of the organization to scope the binding to.
      --policy string      The name or UIDP of the policy to bind.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy binding](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding/)	 - Manage Libraries policy bindings.

---

### chainctl iam roles create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_create.md_

## chainctl iam roles create

Create an IAM role.

```
chainctl iam roles create ROLE_NAME --parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID --capabilities=CAPABILITY,... [--description=DESCRIPTION] [--yes] [--output=id|json|table]
```

### Examples

```
  # Create a role
  chainctl iam roles create my-role --parent=engineering --capabilities=policy.list,groups.list
  
  # Create a role and choose parameters interactively
  chainctl iam roles create my-role
```

### Options

```
      --capabilities strings   A comma separated list of capabilities to grant this role.
      --description string     A description of the role.
      --parent string          Location to create this role under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
  -y, --yes                    Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.

---

### chainctl guardener entitlement
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_entitlement.md_

## chainctl guardener entitlement

Manage a group's guardener entitlement.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener](/platform/chainctl/chainctl-docs/chainctl_guardener/)	 - Manage guardener integrations.
* [chainctl guardener entitlement get](/platform/chainctl/chainctl-docs/chainctl_guardener_entitlement_get/)	 - Show the guardener entitlement for a group.

---

### chainctl guardener scans get
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_scans_get.md_

## chainctl guardener scans get

Show one dependency scan.

### Synopsis

Show one dependency scan by the ID a "scans list" summary carried: every
declared artifact (its package URL and the files that declared it) and the
relationships between artifacts.

Requires the guardener.scan.get capability on the group that owns the scan.

```
chainctl guardener scans get SCAN_ID [flags]
```

### Options

```
  -o, --output string   Output format: table or json. (default "table")
      --parent string   Name or UIDP of the Chainguard group that owns the scan. Prompts interactively if omitted.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener scans](/platform/chainctl/chainctl-docs/chainctl_guardener_scans/)	 - View guardener dependency scans.

---

### chainctl libraries update-hashes
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_update-hashes.md_

## chainctl libraries update-hashes

Update lockfile integrity hashes with Chainguard Libraries checksums

### Synopsis

update-hashes reads package lockfiles and updates integrity hashes with checksums from Chainguard Libraries.

Provide a path to a specific lockfile, or omit it to auto-detect a lockfile in the current directory.

By default, Chainguard hashes are appended alongside existing hashes in
supported formats (e.g. pip-tools, poetry). Use --replace to replace them.

Note: formats that store a single hash per artifact (uv.lock, pdm.lock, pylock.toml) always replace — --replace has no effect on them.

JavaScript formats:
  - package-lock.json (npm v2/v3)
  - yarn.lock (v1 and berry/v2+)
  - pnpm-lock.yaml
  - bun.lock

Python formats:
  - requirements.txt (pip-tools, with --hash)
  - poetry.lock
  - pdm.lock
  - uv.lock
  - pylock.toml (PEP 751)
  - Pipfile.lock

The ecosystem is auto-detected from the lockfile name. Use --ecosystem to override.

For Python, hashes are fetched from the Chainguard Libraries "python" catalog by default.
Use --remediated to fetch from "python-remediated" (CVE-patched packages), and --cuda
to also include packages from the matching CUDA variant catalog.

Authentication:
  If you log in scoped to the libraries registry
  ('chainctl auth login --audience=libraries.cgr.dev'), that session token is
  used directly — no --parent or prompt needed. A plain 'chainctl auth login'
  (console-api audience) does NOT work: the libraries registry requires a
  libraries.cgr.dev-scoped token and a console-api token cannot be re-audienced
  to it. In that case, with no other credential, update-hashes prompts for an
  organization and authenticates via 'chainctl auth pull-token'; pass --parent to
  skip the prompt. To
  authenticate without an issuer connection (e.g. from a rebuilder workflow), pass
  --token or set CHAINCTL_AUTH_TOKEN (its audience must include libraries.cgr.dev;
  mint one with 'chainctl auth token --audience libraries.cgr.dev'). To
  authenticate against a private proxy (e.g. Artifactory/JFrog) with real
  basic-auth credentials, use --username and --password (or set
  CHAINCTL_REGISTRY_USERNAME and CHAINCTL_REGISTRY_PASSWORD). Credentials are also
  read from ~/.netrc ($NETRC if set) for the registry's host; an explicit --parent
  takes precedence over a matching .netrc entry, and --ignore-netrc skips ~/.netrc
  entirely (useful when an ambient entry for npm/yarn/pip would otherwise shadow
  the Chainguard-native methods).

  To send no authentication at all (for a network-limited private registry that
  requires none and rejects any Authorization header), pass --no-auth. It overrides
  every ambient credential source — the CHAINCTL_AUTH_TOKEN / CHAINCTL_REGISTRY_USERNAME /
  CHAINCTL_REGISTRY_PASSWORD env vars, ~/.netrc, and 'chainctl auth pull-token' —
  so no credential can leak to the registry. It is
  mutually exclusive with the explicit --token and --username/--password flags
  (passing both is a contradiction and is rejected).

Custom registry URLs:
  Use --registry-url <url> to point at a private proxy whose path layout does not
  match libraries.cgr.dev (no /javascript or /python/simple suffix is appended;
  the value is used verbatim as the per-ecosystem base).

  When --registry-url is set, the Chainguard-specific token sources are not
  consulted (CHAINCTL_AUTH_TOKEN env var and 'chainctl auth pull-token') — sending
  the Chainguard JWT as a basic-auth password to a third-party host would be a
  credential leak. Authenticate with --token, --username/--password,
  $CHAINCTL_REGISTRY_USERNAME + $CHAINCTL_REGISTRY_PASSWORD, or a matching ~/.netrc
  entry instead.

```
chainctl libraries update-hashes [lockfile-path] [flags]
```

### Examples

```
  # Auto-detect lockfile in the current directory
  chainctl libraries update-hashes

  # Update hashes in a specific npm lockfile
  chainctl libraries update-hashes package-lock.json

  # Update hashes in a Python pip-tools requirements file
  chainctl libraries update-hashes path/to/requirements.txt

  # Preview changes without writing the file
  chainctl libraries update-hashes --dry-run package-lock.json

  # Replace hashes (instead of appending alongside existing ones)
  chainctl libraries update-hashes --replace uv.lock

  # Include CUDA variant packages for Python
  chainctl libraries update-hashes --cuda cu128 uv.lock

  # Query an unauthenticated private registry, sending no credentials
  chainctl libraries update-hashes --registry-url https://registry.internal/cg --no-auth uv.lock
```

### Options

```
      --cuda string                    CUDA variant to include alongside python (e.g. "cu124", "cu130")
      --dry-run                        Show what would change without writing
      --ecosystem string               Ecosystem: "auto", "js", or "python" (default "auto")
      --ecosystems-url string          URL for the Ecosystems Proxy (defaults to https://libraries.cgr.dev). Paths /javascript/{name}/{version} (JS) and /{python,python-remediated,cu###}/simple (Python) are appended automatically. Mutually exclusive with --registry-url.
      --fallback-registry-url string   Registry URL used to synthesize tarball URLs for JS packages not found in Chainguard Libraries (e.g. https://registry.npmjs.org). Empty (the default) disables fallback synthesis; if any package requires a fallback URL, the command fails with a list of offenders. WARNING: pointing this at a public registry such as https://registry.npmjs.org can cause installation of malicious packages — prefer a private/internal registry you trust.
      --ignore-netrc                   Do not read credentials from ~/.netrc ($NETRC). Use this to keep an ambient .netrc entry (e.g. one configured for npm/yarn/pip) from shadowing the Chainguard-native methods: with this set, a stale or unrelated .netrc entry for the registry host is ignored, so authentication falls through to 'chainctl auth pull-token' (with --parent) or the interactive organization prompt.
      --include-all-scopes             Ignore per-scope registries configured in .npmrc and reroute every package to Chainguard. JavaScript only. Mutually exclusive with --include-scope.
      --include-scope strings          npm scope(s) (e.g. @myorg) to reroute to Chainguard even when .npmrc configures them to a different registry. By default, packages in a scope that .npmrc pins to a non-Chainguard registry are left untouched. Repeatable and/or comma-separated. JavaScript only.
      --no-auth                        Send no authentication to the registry. Use for a network-limited private registry that requires none and rejects any Authorization header. Overrides all ambient credential sources ($CHAINCTL_AUTH_TOKEN, $CHAINCTL_REGISTRY_USERNAME/$CHAINCTL_REGISTRY_PASSWORD, ~/.netrc, and 'chainctl auth pull-token'). Mutually exclusive with the explicit --token and --username/--password flags.
      --no-color                       Disable colored output
      --parent string                  Parent organization for authentication via 'chainctl auth pull-token'. Not needed when --token, --username/--password, the CHAINCTL_AUTH_TOKEN/CHAINCTL_REGISTRY_USERNAME env vars, or a matching ~/.netrc entry provides credentials.
      --password ps                    Basic-auth password. Must be paired with --username. Also readable from $CHAINCTL_REGISTRY_PASSWORD. Prefer the env-var form to avoid leaking the value via ps or shell history.
      --registry-url string            Full base URL of the registry to query, used verbatim (no /javascript or /python/simple suffix is appended). Use this when pointing at a private proxy (Artifactory/JFrog) whose path layout differs from libraries.cgr.dev. Mutually exclusive with --ecosystems-url, --remediated, --cuda. NOTE: when this flag is set, Chainguard-specific token sources (CHAINCTL_AUTH_TOKEN, 'chainctl auth pull-token') are NOT consulted, to avoid leaking the Chainguard JWT to a third-party host. Authenticate with --token, --username/--password, $CHAINCTL_REGISTRY_USERNAME/$CHAINCTL_REGISTRY_PASSWORD, or ~/.netrc.
      --remediated                     Use python-remediated registry (Python only)
      --replace                        Replace integrity hashes instead of appending (no-op for formats that only support replacement)
      --token string                   Literal bearer token to use as the basic-auth password (username is set to "token-user"). Against libraries.cgr.dev this behaves like setting CHAINCTL_AUTH_TOKEN; under --registry-url, only --token is honored (the env var is ignored to avoid leaking the Chainguard JWT to a third-party host). Mutually exclusive with --username/--password.
      --username string                Basic-auth username. Must be paired with --password. Use for private proxies (Artifactory/JFrog) that require real credentials. Also readable from $CHAINCTL_REGISTRY_USERNAME.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.

---

### chainctl skills versions
_Path: platform/chainctl/chainctl-docs/chainctl_skills_versions.md_

## chainctl skills versions

List all published versions (tags) for a skill.

### Synopsis

List all published versions (tags) for a skill.

<ref> is the skill name without a tag: org/name

```
chainctl skills versions <ref> [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl skills accept-terms
_Path: platform/chainctl/chainctl-docs/chainctl_skills_accept-terms.md_

## chainctl skills accept-terms

Accept legal terms required to publish skills.

### Synopsis

Accept the legal documents required to publish skills to skills.cgr.dev.

An org owner must run this once per org before any 'chainctl skills push' will
succeed. Re-running after acceptance is a no-op. --group accepts either the
org name (e.g. "acme.com") or its UIDP; omit it for an interactive picker.

For CI use cases where an interactive TUI isn't available, pass --yes. By
using --yes you confirm you have read and agreed to the legal documents
referenced in https://www.chainguard.dev/legal/agent-skills-disclosure.

```
chainctl skills accept-terms [flags]
```

### Options

```
      --group string   Name or UIDP of the org to accept terms for
      --yes            Accept legal terms non-interactively. By using this flag you confirm you have read and agreed to the documents referenced in https://www.chainguard.dev/legal/agent-skills-disclosure.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl iam external-group-role-mappings create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_create.md_

## chainctl iam external-group-role-mappings create

Create an IdP group-to-role mapping.

```
chainctl iam external-group-role-mappings create --external-group-id GROUP --role ROLE --scope SCOPE --idp IDP [flags]
```

### Examples

```
  # Map IdP group "Platform-SRE" to the owner role at the org root
  chainctl iam external-group-role-mappings create --external-group-id "Platform-SRE" --role owner --scope my-org --idp my-idp
```

### Options

```
      --external-group-id string   IdP group identifier (the claim value from the IdP token)
      --idp string                 Identity provider (name or UIDP) that owns this mapping
      --role string                Role UIDP or name to grant
      --scope string               Organization or group (name or UIDP) where the role applies
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam external-group-role-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings/)	 - Manage IdP group-to-role mappings (also available under 'iam identity-providers group-mappings').

---

### chainctl config reset
_Path: platform/chainctl/chainctl-docs/chainctl_config_reset.md_

## chainctl config reset

Remove local chainctl config files and restore defaults.

```
chainctl config reset [--yes]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl iam identities create aws user
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws_user.md_

## chainctl iam identities create aws user

```
chainctl iam identities create aws user NAME --aws-account-id=ACCOUNT --aws-user-name=NAME [--aws-user-id=ID] [--aws-partition=PARTITION] [--parent=PARENT] [--description=DESC] [--role=ROLE,ROLE,...] [--output=id|json|table]
```

### Examples

```
  # Create an assumable identity for an IAM user
  chainctl iam identities create aws user my-aws-identity --aws-account-id=123456789012 --aws-user-name=my-user
  
  # Create an assumable identity for an IAM user. Bind it to the registry.pull role.
  chainctl iam identities create aws user my-aws-identity --aws-account-id=123456789012 --aws-user-name=my-user --role=registry.pull
  
  # Provide the unique ID of the user. This prevents the identity from being assumed if the user is deleted and then recreated with the same name.
  chainctl iam identities create aws user my-aws-identity --aws-account-id=123456789012 --aws-user-name=my-user --aws-user-id=AIDAEXAMPLEC2UL7LUB
  
  # Create an assumable identity for a user in the aws-us-gov partition
  chainctl iam identities create aws user my-aws-identity --aws-partition=aws-us-gov --aws-account-id=123456789012 --aws-user-name=my-user
```

### Options

```
      --aws-account-id string   The ID of the AWS account.
      --aws-partition string    The partition in which the user is located. For instance: aws, aws-cn or aws-us-gov. (default "aws")
      --aws-user-id string      The unique ID of the IAM user.
      --aws-user-name string    The name of the IAM user.
  -d, --description string      The description of the resource.
  -n, --name string             Given name of the resource.
      --parent string           The name or id of the parent location to create this identity under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --role strings            A comma separated list of names or IDs of roles to bind this identity to (optional).
  -y, --yes                     Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities create aws](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws/)	 - Create a new identity for an AWS IAM resource.

---

### chainctl libraries policy binding
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding.md_

## chainctl libraries policy binding

Manage Libraries policy bindings.

### Synopsis

A Libraries policy binding activates a policy for an (organization, ecosystem) pair in either ENFORCE or PREVIEW mode.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.
* [chainctl libraries policy binding create](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_create/)	 - Create a Libraries policy binding.
* [chainctl libraries policy binding delete](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_delete/)	 - Delete a Libraries policy binding.
* [chainctl libraries policy binding list](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_list/)	 - List Libraries policy bindings.
* [chainctl libraries policy binding update](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_update/)	 - Update a Libraries policy binding.

---

### chainctl iam identities list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_list.md_

## chainctl iam identities list

List identities.

```
chainctl iam identities list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--name=NAME] [--relationship={aws|claim_match|pull_token|service_principal|static}] [--expired] [--recursive] [--output=id|json|table]
```

### Examples

```
  # List all identities.
  chainctl iam identities list
  
  # List all static identities.
  chainctl iam identities list --relationship=static
  
  # Filter identities by name.
  chainctl iam identities list --name=my-identity
  
  # List expired identities
  chainctl iam identities list --expired
  
  # List only identities directly in an organization, excluding nested locations
  chainctl iam identities list --parent=my-org --recursive=false
```

### Options

```
      --expired         Return only expired static identities.
      --name string     Filter identities by name.
      --parent string   The name or id of the parent location to list identities from. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive       List identities from the parent location and all nested locations. Set to false to list only the parent location. (default true)
      --type string     Filter identities by type (one of aws, claim_match, pull_token, service_principal, static).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.

---

### chainctl libraries entitlements
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_entitlements.md_

## chainctl libraries entitlements

Manage entitlements to language ecosystem libraries.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.
* [chainctl libraries entitlements create](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create/)	 - Create ecosystem library entitlements for an organization.
* [chainctl libraries entitlements delete](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_delete/)	 - Delete an ecosystem library entitlement from an organization.
* [chainctl libraries entitlements list](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_list/)	 - List entitlements of an organization.

---

### chainctl iam role-bindings delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_delete.md_

## chainctl iam role-bindings delete

Delete a role-binding.

```
chainctl iam role-bindings delete ROLE_BINDING_ID [--yes] [--output=id]
```

### Examples

```
  # Delete a role-binding
  chainctl iam role-bindings delete 9b6da6e64b45129eb4e9f9f3ce9b69ca2a550c6b/034e4afcda8c0b07/55b470f08e38b4d2
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam role-bindings](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/)	 - IAM role-bindings resource interactions.

---

### chainctl iam identities create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create.md_

## chainctl iam identities create

Create a new identity.

```
chainctl iam identities create NAME {--filename FILE | {--identity-issuer=ISS | --identity-issuer-pattern=PAT} {--subject=SUB | --subject-pattern=PAT} [--audience=AUD | --audience-pattern=PAT] [--claim-pattern=claim:pattern,claim:pattern...] | --identity-issuer=ISS --issuer-keys=KEYS --subject=SUB [--expiration=yyyy-mm-dd]} [--parent=PARENT] [--description=DESC] [--role=ROLE,ROLE,...] [--output=id|json|table]
```

### Examples

```
  # Create a static identity using the default expiration.
  chainctl iam identities create my-identity --identity-issuer=https://issuer.mycompany.com --issuer-keys=deadbeef --subject=1234
  
  # Create an identity with literal values to match from claims.
  chainctl iam identities create my-identity --identity-issuer=https://issuer.mycompany.com --subject=1234
  
  # Create an identity using patterns to match claims
  chainctl iam identities create my-identity --identity-issuer-pattern="https://*.mycompany\.com" --subject-pattern="^\d{4}$"
  
  # Create an identity from a JSON file definition and bind to a role
  chainctl iam identities create my-identity -f path/to/identity-definition.json --role=viewer
```

### Options

```
      --audience string                  The audience of the identity (optional).
      --audience-pattern string          A pattern to match the audience of the identity (optional).
      --claim-pattern stringArray        A comma-separated list of claim:pattern pairs of custom claims to match for this identity (optional).
  -d, --description string               The description of the resource.
      --expiration string                The time when the issuer_keys will expire. Defaults to / Maximum of 30 days after creation time (yyyy-mm-dd).
  -f, --filename string                  A file that contains the identity definition, in either YAML or JSON.
      --identity-issuer string           The issuer of the identity.
      --identity-issuer-pattern string   A pattern to match the issuer of the identity.
      --issuer-keys string               JWKS-formatted public keys for the issuer.
  -n, --name string                      Given name of the resource.
      --parent string                    The name or id of the parent location to create this identity under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --role strings                     A comma separated list of names or IDs of roles to bind this identity to (optional).
      --service-principal string         The service principal that is allowed to assume this identity.
      --subject string                   The subject of the identity.
      --subject-pattern string           A pattern to match the subject of the identity.
  -y, --yes                              Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.
* [chainctl iam identities create aws](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws/)	 - Create a new identity for an AWS IAM resource.
* [chainctl iam identities create github](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_github/)	 - 
* [chainctl iam identities create gitlab](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_gitlab/)	 -

---

### chainctl packages
_Path: platform/chainctl/chainctl-docs/chainctl_packages.md_

## chainctl packages

Interact with Chainguard packages

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl packages versions](/platform/chainctl/chainctl-docs/chainctl_packages_versions/)	 - Package version related commands for the Chainguard platform.

---

### chainctl images diff
_Path: platform/chainctl/chainctl-docs/chainctl_images_diff.md_

## chainctl images diff

Diff images.

### Synopsis

Diffs 2 images together, based on their SBOM and Vulnerability scan.

SBOM packages are diffed based on their PURL (https://github.com/package-url/purl-spec) and version.
PURLs are grouped without their @version component. If identical PURLs are found, the first one found is used.
If an SBOM package contains multiple PURLs, results will contain multiple entries for the same package name based on the purl type.

Vulnerability scans are done via grype, which must be available on the system PATH.

```
chainctl images diff FROM_IMAGE TO_IMAGE [flags]
```

### Options

```
  -t, --artifact-types strings   Specifies the purl artifact types to diff. If "-" is provided, all types are included. (default [apk])
  -o, --output string            Output format. One of: [go-template, json, markdown] (default "json")
      --platform string          Specifies the platform in the form os/arch (e.g. linux/amd64, linux/arm64) (default "linux/amd64")
      --template string          Go template to use when --output=go-template
      --template-file string     Path to a file containing the Go template
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl images advisories
_Path: platform/chainctl/chainctl-docs/chainctl_images_advisories.md_

## chainctl images advisories

Security advisory commands for images.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl images advisories list](/platform/chainctl/chainctl-docs/chainctl_images_advisories_list/)	 - List security advisories for packages in an image.

---

### chainctl iam identity-providers scim users
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_users.md_

## chainctl iam identity-providers scim users

Inspect the SCIM-provisioned users of an identity provider.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim/)	 - Manage SCIM provisioning for an identity provider.
* [chainctl iam identity-providers scim users list](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_users_list/)	 - List the SCIM-provisioned users of an identity provider.

---

### chainctl auth status
_Path: platform/chainctl/chainctl-docs/chainctl_auth_status.md_

## chainctl auth status

Inspect the local Chainguard Token.

```
chainctl auth status [--output=json|table|terse] [flags]
```

### Options

```
      --headless                   Skip browser authentication and use device flow.
      --identity string            The unique ID of the identity to assume when logging in.
      --identity-provider string   The unique ID of the customer managed identity provider to authenticate with. Mutually exclusive with --org-name.
      --identity-token string      Use an explicit passed identity token or token path.
      --org-name string            Organization to use for authentication. If configured the organization's custom identity provider will be used. Mutually exclusive with --identity-provider.
      --quick                      Whether to perform quick offline token checks (vs. calling the Validate API).
      --social-login string        Which of the default identity providers to use for authentication. Must be one of: email, google, github, gitlab
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl iam account-associations unset azure
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_azure.md_

## chainctl iam account-associations unset azure

Remove AZURE account configuration for a location.

```
chainctl iam account-associations unset azure ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [--yes] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations unset](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset/)	 - Remove cloud provider account associations from a location.

---

### chainctl skills list
_Path: platform/chainctl/chainctl-docs/chainctl_skills_list.md_

## chainctl skills list

List skills published by an org.

```
chainctl skills list [flags]
```

### Options

```
  -g, --group string    Org or folder to list, e.g. "chainguard" or "chainguard/github" (default: current context).
  -r, --recursive       Recurse into nested folders and list every skill by its full path.
      --source string   Which namespace to list: "skills" (hardened, skills.cgr.dev), "uploads" (user uploads, uploads.cgr.dev), or "all". (default "skills")
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl iam folders delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_folders_delete.md_

## chainctl iam folders delete

Delete a folder.

```
chainctl iam folders delete [FOLDER_NAME | FOLDER_ID] [--skip-refresh] [--yes]
```

### Examples

```

# Delete a folder by ID
chainctl iam folders delete 19d3a64f20c64ba3ccf1bc86ce59d03e705959ad/efb53f2857d567f2

# Delete a folder by name
chainctl iam folders delete my-folder

# Delete a folder to be selected interactively
chainctl iam folders delete

```

### Options

```
      --skip-refresh   Skips attempting to reauthenticate and refresh the Chainguard auth token if it becomes out of date.
  -y, --yes            Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam folders](/platform/chainctl/chainctl-docs/chainctl_iam_folders/)	 - IAM folders interactions.

---

### chainctl iam identities update
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_update.md_

## chainctl iam identities update

Update an identity

```
chainctl iam identities update IDENTITY_NAME | IDENTITY_ID [--description=DESC] [--identity-issuer=ISS | --identity-issuer-pattern=PAT] [--subject=SUB | --subject-pattern=PAT] [--audience=AUD | --audience-pattern=PAT] [--claim-pattern=claim:pattern,claim:pattern...] [--issuer-keys=KEYS] [--expiration=yyyy-mm-dd] [--output=id|json|table] [flags]
```

### Examples

```
  # Update the issuer of an identity.
  chainctl iam identities update my-identity --identity-issuer=https://new-issuer.mycompany.com
  
  # Update the subject to a pattern and update the audience of an identity.
  chainctl iam identities update my-identity --subject-pattern="^\d{4}$" --audience=some-audience
```

### Options

```
      --audience string                  The audience of the identity (optional).
      --audience-pattern string          A pattern to match the audience of the identity (optional).
      --claim-pattern stringArray        A comma-separated list of claim:pattern pairs of custom claims to match for this identity.
      --description string               A description of the identity (optional).
      --expiration string                The time when the issuer_keys will expire. Defaults to / Maximum of 30 days after creation time (yyyy-mm-dd).
      --identity-issuer string           The issuer of the identity.
      --identity-issuer-pattern string   A pattern to match the issuer of the identity.
      --issuer-keys string               JWKS-formatted public keys for the issuer.
      --subject string                   The subject of the identity.
      --subject-pattern string           A pattern to match the subject of the identity.
  -y, --yes                              Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.

---

### chainctl skills pull
_Path: platform/chainctl/chainctl-docs/chainctl_skills_pull.md_

## chainctl skills pull

Download a published skill to a local directory.

### Synopsis

Download a published skill to a local directory.

The reference accepts org/name:tag or org/name@sha256:DIGEST.
The optional directory sets the download destination.

```
chainctl skills pull <ref> [<dir>] [flags]
```

### Examples

```
  # Pull into a specific directory:
  chainctl skills pull chainguard/github/lint ./my-skills/lint
```

### Options

```
      --force   Overwrite destination directory if it already exists.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl agent accept-terms
_Path: platform/chainctl/chainctl-docs/chainctl_agent_accept-terms.md_

## chainctl agent accept-terms

Accept required legal terms.

### Synopsis

Presents the legal agreement prompt for the given group.

```
chainctl agent accept-terms [flags]
```

### Options

```
      --parent string   Name or UIDP of the group to accept terms for. Defaults to your configured default group; prompts if unset. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl agent](/platform/chainctl/chainctl-docs/chainctl_agent/)	 - Agent-powered commands.

---

### chainctl policy override create
_Path: platform/chainctl/chainctl-docs/chainctl_policy_override_create.md_

## chainctl policy override create

Create a policy override.

### Synopsis

Create an override that waives a policy for one specific artifact.

The override flips the policy's result to ALLOWED for the artifact
identified by --artifact-id, under the policy named by --policy. Which
form the artifact takes follows from the policy's resource type: an image
digest for a Repo policy, written as sha256: followed by exactly 64
lowercase hex characters, or a PURL for a library policy, such as
pkg:npm/left-pad@1.3.0. A malformed value is rejected locally before any
API call, as is a digest aimed at a library policy or a PURL aimed at an
image policy. A --reason is required to record why the waiver was
granted.

An override matches exactly one artifact. For a multi-arch image, pulls
are enforced against the per-platform child manifest, not the index
digest, so override the child digest that "chainctl policy check"
reports as enforced; overriding the index digest alone may not unblock
the pull. A library override matches either one exact version, when the
PURL carries one, or every version of the package, when it does not.

Because a policy is identified by its name and resource type together,
the same name can exist for images and for each library ecosystem. Pass
--resource-type to say which one you mean.

Creating an override requires the policies.override.create capability,
a separate capability typically held by organization owners.

```
chainctl policy override create --policy POLICY --artifact-id ARTIFACT --reason REASON [--parent ORG] [--output=json|table] [flags]
```

### Examples

```
  # Waive the no-eol policy for a specific image digest
  chainctl policy override create --policy=no-eol --parent=engineering \
  --artifact-id=sha256:<64-hex-digest> --reason="approved exception, ticket OPS-42"
  
  # Waive the cooldown gate for one npm package version
  chainctl policy override create --policy=cooldown --resource-type=Javascript \
  --parent=engineering --artifact-id=pkg:npm/left-pad@1.3.0 \
  --reason="hotfix dependency, approved by SEC, OPS-42"
  
  # Waive the malware gate for one PyPI package version
  chainctl policy override create --policy=malware --resource-type=Python \
  --parent=engineering --artifact-id=pkg:pypi/acme-telemetry@1.4.2 \
  --reason="scanner false positive confirmed by SEC, OPS-42"
```

### Options

```
      --artifact-id string     The artifact to waive: an image digest for a Repo policy, as sha256: followed by exactly 64 lowercase hex characters, or a PURL for a library policy, e.g. pkg:npm/left-pad@1.3.0. For a multi-arch image use the per-platform child digest that "chainctl policy check" reports, not the index digest.
      --parent string          The name or id of the organization to scope the override to.
      --policy string          The name or UIDP of the policy to override.
      --reason string          The justification for the override.
      --resource-type string   Resource type used to disambiguate a policy referenced by name (shorthand: Repo, Python, Java, Javascript; or a full type). Ignored when the policy is given by UIDP.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy override](/platform/chainctl/chainctl-docs/chainctl_policy_override/)	 - Manage policy overrides.

---

### chainctl iam account-associations check azure
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_azure.md_

## chainctl iam account-associations check azure

Checks that the given location has been properly configured for OIDC federation with AZURE

```
chainctl iam account-associations check azure ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations check](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check/)	 - Check the OIDC federation configurations for cloud providers.

---

### chainctl iam identity-providers update
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_update.md_

## chainctl iam identity-providers update

Update an identity provider

```
chainctl iam identity-providers update IDENTITY_PROVIDER_ID [--name=NAME] [--description=DESCRIPTION] [--oidc-issuer=ISSUER] [--oidc-client-id=CLIENTID] [--oidc-client-secret=CLIENTSECRET] [--oidc-additional-scopes=SCOPE,...] [--oidc-pkce-enabled] [--default-role=ROLE] [--output=id|json|table]
```

### Examples

```
  # Update name and description of an identity provider by ID
  chainctl iam identity-providers update fb694596eb1678321f94eec283e1e0be690f655c/a2973bac66ebfde3 --name=new-name --description=new-description
  
  # Update the default role for an identity provider by name
  chainctl iam identity-providers update my-idp --default-role=viewer
```

### Options

```
      --configuration-type string                Type of identity provider. Only OIDC supported currently (default "OIDC")
      --default-role string                      Optional role to grant users on first login
      --description string                       Description of identity provider
      --name string                              Name of identity provider
      --oidc-additional-scopes stringArray       additional scopes to request for OIDC type identity provider
      --oidc-client-id string                    client id for OIDC type identity provider
      --oidc-client-secret string                client secret for OIDC type identity provider
      --oidc-groups-claim string                 OIDC token claim carrying group memberships, used for group-to-role mappings (empty disables group mapping). Manage the mappings with 'chainctl iam identity-providers group-mappings'.
      --oidc-issuer string                       Issuer URL for OIDC type identity provider
      --oidc-pkce-enabled                        Include a PKCE challenge during authorization code exchange. Upstream IDP must be configured to respond.
      --oidc-token-endpoint-auth-method string   How the client secret is presented at the token endpoint: basic or post. Empty selects the method the IDP advertises in discovery. Set it when the IDP endpoint advertises one method but the specific app registration expects the other.
  -y, --yes                                      Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management

---

### chainctl images list
_Path: platform/chainctl/chainctl-docs/chainctl_images_list.md_

## chainctl images list

List tagged images from Chainguard registries.

```
chainctl images list [--repo=REPO_NAME] [--public | --parent=PARENT_NAME|PARENT_ID] [--updated-within=DURATION] [--show-dates] [--show-epochs] [--show-referrers] [--active-only] [--output=csv|id|json|table|terse|tree|wide]
```

### Options

```
      --active-only               Whether to only show active tags.
      --parent string             The name or id of the parent location to list image repos. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --public                    List repos from the public Chainguard registry.
      --recursive                 Search repositories recursively through all descendants instead of just children
      --repo string               Search for a specific repo by name.
      --show-dates                Whether to show date tags of the form latest-{date}.
      --show-epochs               Whether to show epoch tags of the form 1.2.3-r4.
      --show-referrers            Whether to show referrer tags of the form sha256-deadbeef.{sig,sbom,att}.
      --updated-within duration   The duration within which an image must have been updated (0 disables the filter).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl iam external-group-role-mappings list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_list.md_

## chainctl iam external-group-role-mappings list

List IdP group-to-role mappings.

```
chainctl iam external-group-role-mappings list --parent PARENT [--idp IDP] [flags]
```

### Examples

```
  # List all group mappings in an organization
  chainctl iam external-group-role-mappings list --parent my-org

  # List mappings for a specific identity provider
  chainctl iam external-group-role-mappings list --parent my-org --idp my-idp
```

### Options

```
      --idp string      Narrow results to a specific identity provider (name or UIDP)
      --parent string   Organization or folder (name or UIDP) to list mappings under
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam external-group-role-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings/)	 - Manage IdP group-to-role mappings (also available under 'iam identity-providers group-mappings').

---

### chainctl policy list
_Path: platform/chainctl/chainctl-docs/chainctl_policy_list.md_

## chainctl policy list

List policies.

### Synopsis

List the policies available for an organization.

Each available policy is shown with its name, resource type, and description.
Several policies can share a name across resource types, so --resource-type
narrows the list to one of them.

```
chainctl policy list [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Examples

```

# List all policies for an organization
chainctl policy list --parent=example.com

# List policies using interactive organization selection
chainctl policy list

# List only the policies that apply to Python packages
chainctl policy list --parent=example.com --resource-type=Python

# List policies in JSON format
chainctl policy list --parent=example.com -o json

```

### Options

```
      --parent string          The name or id of the organization. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --resource-type string   Only list entries for this resource type (shorthand: Repo, Python, Java, Javascript; or a full type).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.

---

### chainctl images
_Path: platform/chainctl/chainctl-docs/chainctl_images.md_

## chainctl images

Images related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl images advisories](/platform/chainctl/chainctl-docs/chainctl_images_advisories/)	 - Security advisory commands for images.
* [chainctl images catalog](/platform/chainctl/chainctl-docs/chainctl_images_catalog/)	 - List the Chainguard Images catalog.
* [chainctl images changelog](/platform/chainctl/chainctl-docs/chainctl_images_changelog/)	 - Show changelog for image history
* [chainctl images diff](/platform/chainctl/chainctl-docs/chainctl_images_diff/)	 - Diff images.
* [chainctl images discover](/platform/chainctl/chainctl-docs/chainctl_images_discover/)	 - Find Chainguard replacements for the images your project uses.
* [chainctl images entitlements](/platform/chainctl/chainctl-docs/chainctl_images_entitlements/)	 - Manage entitlements to registry repositories.
* [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/)	 - Helm chart related commands
* [chainctl images history](/platform/chainctl/chainctl-docs/chainctl_images_history/)	 - Show history for a specific image tag.
* [chainctl images list](/platform/chainctl/chainctl-docs/chainctl_images_list/)	 - List tagged images from Chainguard registries.
* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.
* [chainctl images tags](/platform/chainctl/chainctl-docs/chainctl_images_tags/)	 - Tags related commands for images.

---

### chainctl policy
_Path: platform/chainctl/chainctl-docs/chainctl_policy.md_

## chainctl policy

Manage policies.

### Synopsis

Policies are a registry governance feature that controls which images
your organization can pull. Each policy is a guardrail (for example,
"block end-of-life images") that each image is evaluated against at pull.

## Availability

Policies is an opt-in feature. To enable it for your organization,
contact your Chainguard Customer Success representative. If your
organization is not entitled, `chainctl policy list` will return
an error.

## Concepts

**Policy** — A reusable rule that determines whether an image is allowed.
Each policy has a name, a description, and the resource types it applies
to. Policies apply to registry repositories. `chainctl` currently
manages bindings to system policies that ship with the platform. Use
`chainctl policy list` to see which policies are available to your
organization.

**Binding** — A link between a policy and an organization. While a binding
exists, the policy is active for image pulls under that organization.
Without a binding, the policy has no effect.

**Mode** — A binding's mode controls what happens when the policy denies an
image:

- `ENFORCE` — Block the pull.
- `DRY_RUN` — Allow the pull but record the violation.

Passing `--mode` is required when creating or enabling a binding.

**Parameter** — A configurable value declared by a policy's schema (for
example, `days` on the cooldown policy). Supply values when you enable a
policy with `--param=KEY=VALUE` (repeatable). Omitted parameters fall
back to the schema's declared default. Use
`chainctl policy describe --policy NAME` to see which parameters a
policy accepts and what defaults apply.

## What happens at pull time

Each active policy is evaluated for every image pull. Policies are
`enabled and disabled independently`, and multiple policies can be active
at the same time. An image is allowed only when every active policy
allows it.

### Examples

```

# Recommended rollout: start in DRY_RUN mode, review violations, then promote to ENFORCE.

# 1. List the policies available to your organization.
chainctl policy list --parent=example.com

# 2. Inspect a specific policy
chainctl policy describe --policy=cooldown --parent=example.com

# 3. Activate a policy in DRY_RUN mode (records, does not block).
# Note: if a policy declares configurable parameters and --param is omitted,
# the schema's default value is applied.
chainctl policy enable --policy=cooldown --parent=example.com --mode=DRY_RUN

# 4. Review which policies are currently active.
chainctl policy binding list --parent=example.com

# 5. Evaluate a specific image against active policies
chainctl policy check cgr.dev/example.com/python:latest

# 6. Promote the policy to ENFORCE mode.
chainctl policy enable --policy=cooldown --parent=example.com --mode=ENFORCE

# 7. Update the parameters for your binding
chainctl policy enable --policy=cooldown --parent=example.com --mode=ENFORCE --param=days=14

# 8. Disable if no longer needed.
chainctl policy disable --policy=cooldown --parent=example.com

```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl policy binding](/platform/chainctl/chainctl-docs/chainctl_policy_binding/)	 - Manage policy bindings.
* [chainctl policy check](/platform/chainctl/chainctl-docs/chainctl_policy_check/)	 - Check an image against active policies.
* [chainctl policy custom](/platform/chainctl/chainctl-docs/chainctl_policy_custom/)	 - Manage your custom policies.
* [chainctl policy decision](/platform/chainctl/chainctl-docs/chainctl_policy_decision/)	 - Inspect policy decisions.
* [chainctl policy describe](/platform/chainctl/chainctl-docs/chainctl_policy_describe/)	 - Describe a policy and its parameter schema.
* [chainctl policy disable](/platform/chainctl/chainctl-docs/chainctl_policy_disable/)	 - Disable a policy.
* [chainctl policy enable](/platform/chainctl/chainctl-docs/chainctl_policy_enable/)	 - Enable a policy for an organization.
* [chainctl policy list](/platform/chainctl/chainctl-docs/chainctl_policy_list/)	 - List policies.
* [chainctl policy override](/platform/chainctl/chainctl-docs/chainctl_policy_override/)	 - Manage policy overrides.

---

### chainctl libraries policy create
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_create.md_

## chainctl libraries policy create

Create a custom Libraries policy.

### Synopsis

Create a CUSTOM Libraries policy for an organization.

A policy configures the gates applied when your organization pulls upstream
packages. Use --cooldown-days to quarantine newly published versions for N
days (0 disables the cooldown, 1-30 sets an explicit window, omit to inherit
the system default), --block to always deny a package, and --allow to let a
package override the cooldown and/or malware gates.

Packages are identified by their package URL (purl). The purl namespace
selects the ecosystem, so the same --block and --allow flags work for Java, JavaScript, and Python:

```
Java (Maven)       pkg:maven/<group>/<artifact>
JavaScript (npm)   pkg:npm/<name>
                   pkg:npm/%40<scope>/<name>   (scoped packages)
Python (PyPI)      pkg:pypi/<name>
```

Append a version with @ to scope an entry to a single version (for example
pkg:npm/lodash@4.17.20); omit the version to match every version of the
package. --block and --allow are repeatable, so a single policy may list many
packages across ecosystems.

A newly created policy is inactive: activate it for an ecosystem with
"chainctl libraries policy enable".

```
chainctl libraries policy create --name NAME [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--cooldown-days N] [--block ...] [--allow ...] [flags]
```

### Examples

```
  # Block a specific package and apply a 14-day cooldown (Python / PyPI)
  chainctl libraries policy create --name=trusted --parent=example.com \
  --cooldown-days=14 --block=purl=pkg:pypi/evil
  
  # Block specific packages across ecosystems (repeat --block per package)
  chainctl libraries policy create --name=blocklist --parent=example.com \
  --block=purl=pkg:pypi/evil \
  --block=purl=pkg:npm/left-pad \
  --block=purl=pkg:maven/com.example/bad-lib
  
  # Block a single version, leaving other versions of the package allowed
  chainctl libraries policy create --name=pin --parent=example.com \
  --block=purl=pkg:npm/lodash@4.17.20
  
  # Allow a package to override the malware gate (justification required)
  chainctl libraries policy create --name=trusted --parent=example.com \
  --allow=purl=pkg:pypi/requests,override-malware=true,justification="vetted internally"
  
  # Allow a Java package to skip the cooldown window
  chainctl libraries policy create --name=trusted --parent=example.com \
  --allow=purl=pkg:maven/org.apache.commons/commons-lang3,override-cooldown=true
```

### Options

```
      --allow stringArray     A package permitted to override gates, as comma-separated key=value pairs: purl=<package-url>[,override-cooldown=true][,override-malware=true][,justification="..."]. justification is required with override-malware. Repeatable.
      --block stringArray     A package to always deny, as purl=<package-url>. The purl namespace selects the ecosystem (pkg:maven/<group>/<artifact>, pkg:npm/<name>, pkg:pypi/<name>); append @<version> to block a single version. Repeatable.
      --cooldown-days int32   The cooldown window in days (0 disables, 1-30 explicit, omit to inherit the default). (default -1)
      --description string    The description of the policy.
      --name string           The name of the policy.
      --parent string         The name or id of the organization to scope the policy to.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl skills
_Path: platform/chainctl/chainctl-docs/chainctl_skills.md_

## chainctl skills

Skills registry related commands.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl skills accept-terms](/platform/chainctl/chainctl-docs/chainctl_skills_accept-terms/)	 - Accept legal terms required to publish skills.
* [chainctl skills delete](/platform/chainctl/chainctl-docs/chainctl_skills_delete/)	 - Remove a published version of a skill.
* [chainctl skills describe](/platform/chainctl/chainctl-docs/chainctl_skills_describe/)	 - Show metadata for a published skill.
* [chainctl skills entitlements](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements/)	 - Manage skills entitlements for an organization.
* [chainctl skills install](/platform/chainctl/chainctl-docs/chainctl_skills_install/)	 - Download a skill and install it into agent directories.
* [chainctl skills list](/platform/chainctl/chainctl-docs/chainctl_skills_list/)	 - List skills published by an org.
* [chainctl skills pull](/platform/chainctl/chainctl-docs/chainctl_skills_pull/)	 - Download a published skill to a local directory.
* [chainctl skills push](/platform/chainctl/chainctl-docs/chainctl_skills_push/)	 - Package a skill directory and publish it to uploads.cgr.dev.
* [chainctl skills uninstall](/platform/chainctl/chainctl-docs/chainctl_skills_uninstall/)	 - Remove a skill from agent directories on the local machine.
* [chainctl skills validate](/platform/chainctl/chainctl-docs/chainctl_skills_validate/)	 - Check a skill directory for spec compliance without making network calls.
* [chainctl skills versions](/platform/chainctl/chainctl-docs/chainctl_skills_versions/)	 - List all published versions (tags) for a skill.

---

### chainctl guardener github migrate create
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_create.md_

## chainctl guardener github migrate create

Enqueue a GitHub Actions migration for a repository.

### Synopsis

Enqueue a GitHub Actions migration for a repository.

The migration opens (or updates) a single pull request replacing upstream GitHub
Actions with their Chainguard equivalents at version-equivalent tags. It returns
a long-running operation; by default this command waits for it to complete and
prints the resulting pull request. Pass --wait=false to return immediately with
the operation name, which you can pass to "migrate get" later.

REPOSITORY may be a full URL (https://github.com/owner/repo) or the "owner/repo"
shorthand; only github.com is supported today.

Requires the guardener.actions.migrate capability on the group, which must own
the repository's GitHub App installation.

```
chainctl guardener github migrate create REPOSITORY [flags]
```

### Options

```
      --parent string      Name or UIDP of the Chainguard group that owns the installation. Prompts interactively if omitted.
      --timeout duration   How long to wait for the migration when --wait is set. (default 10m0s)
      --wait               Wait for the migration operation to complete before returning. (default true)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github migrate](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate/)	 - Migrate a repository's GitHub Actions to their Chainguard equivalents.

---

### chainctl iam identities delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_delete.md_

## chainctl iam identities delete

Delete one or more identities.

```
chainctl iam identities delete {IDENTITY_NAME | IDENTITY_ID | --expired [--parent=PARENT]} [--yes]
```

### Examples

```
  # Delete an identity by name
  chainctl iam identities delete my-identity
  
  # Delete all expired static identities in an organization
  chainctl iam identities delete --expired --parent=my-org
```

### Options

```
      --expired         Delete all expired identities.
      --parent string   Name or ID of the parent location to delete expired identities from. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
  -y, --yes             Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.

---

### chainctl skills entitlements delete
_Path: platform/chainctl/chainctl-docs/chainctl_skills_entitlements_delete.md_

## chainctl skills entitlements delete

Delete the skills entitlement from an organization.

### Synopsis

Delete the skills entitlement from an organization.

WARNING: This removes the skills folder and entitlement record for the org.
All skill repos under the org become inaccessible. There is no recovery path.

```
chainctl skills entitlements delete --parent=PARENT [flags]
```

### Options

```
      --parent string   The name or id of the org to delete the skills entitlement from.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills entitlements](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements/)	 - Manage skills entitlements for an organization.

---

### chainctl libraries packages list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_list.md_

## chainctl libraries packages list

List Libraries packages.

### Synopsis

List packages in the Chainguard Libraries catalog for an ecosystem, optionally filtered by a search query.

```
chainctl libraries packages list --ecosystem ECOSYSTEM [--query QUERY] [--output=json|table] [flags]
```

### Options

```
      --ecosystem string   The ecosystem to list packages for (JAVA, JAVASCRIPT, PYTHON).
      --limit int32        The maximum number of packages to return; results are paginated automatically up to this limit. (default 50)
      --query string       A search string to filter packages by name. If empty, all packages in the ecosystem are returned.
      --remediated         Only return remediated packages.
      --upstream           Also include upstream-registry packages. By default only Chainguard-built packages are listed.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.

---

### chainctl iam identities create gitlab
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create_gitlab.md_

## chainctl iam identities create gitlab

```
chainctl iam identities create gitlab NAME --project-path=GITLAB-GROUP/GITLAB-PROJECT --ref-type={tag|branch} [--ref=REF] [--parent=PARENT] [--description=DESC] [--role=ROLE,ROLE,...] [--output=id|json|table]
```

### Examples

```
  # Create a Gitlab CI identity for any branch in a given Gitlab project
  chainctl iam identities create gitlab my-gitlab-identity --project-path=my-group/my-project --ref-type=branch --parent=eng-org
  
  # Create a Gitlab CI identity for a given branch in a Gitlab project and bind to a role
  chainctl iam identities create gitlab my-gitlab-identity --project-path=my-group/my-project --ref-type=branch --ref=main --role=owner
```

### Options

```
  -d, --description string    The description of the resource.
  -n, --name string           Given name of the resource.
      --parent string         The name or id of the parent location to create this identity under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --project-path string   The name of a Gitlab project where the action executes in the form "group-name/project-name[/foo/bar]". You can use a "*" for project-name (or sub-projects) to match any project in the group.
      --ref string            The reference for the executing action. If left empty or "*", all references will match.
      --ref-type string       The type of reference for the executing action, must be either "tag" or "branch".
      --role strings          A comma separated list of names or IDs of roles to bind this identity to (optional).
  -y, --yes                   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities create](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/)	 - Create a new identity.

---

### chainctl libraries entitlements list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_list.md_

## chainctl libraries entitlements list

List entitlements of an organization.

```
chainctl libraries entitlements list --parent=PARENT [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the org to list an entitlements for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries entitlements](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/)	 - Manage entitlements to language ecosystem libraries.

---

### chainctl actions entitlements create
_Path: platform/chainctl/chainctl-docs/chainctl_actions_entitlements_create.md_

## chainctl actions entitlements create

Enable the Actions product for an organization.

```
chainctl actions entitlements create --parent=PARENT [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the org to enable the Actions product for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions entitlements](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements/)	 - Manage Actions product entitlements.

---

### chainctl guardener github migrate get
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate_get.md_

## chainctl guardener github migrate get

Show the state of a migration operation.

### Synopsis

Show the state of a migration operation returned by "migrate create".

OPERATION is the operation name (operations/migrate/{group}/{id}). The owning
group is derived from the name unless --parent is given. Pass --wait to poll
until the operation completes.

Requires the guardener.actions.migrate capability on the group.

```
chainctl guardener github migrate get OPERATION [flags]
```

### Options

```
      --parent string      Name or UIDP of the owning group. Derived from the operation name if omitted.
      --timeout duration   How long to poll when --wait is set. (default 10m0s)
      --wait               Poll until the migration operation completes.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github migrate](/platform/chainctl/chainctl-docs/chainctl_guardener_github_migrate/)	 - Migrate a repository's GitHub Actions to their Chainguard equivalents.

---

### chainctl images repos build list
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_build_list.md_

## chainctl images repos build list

List build reports

```
chainctl images repos build list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [flags]
```

### Options

```
      --parent string   The name or id of the parent location to list build reports. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive       Search repositories recursively through all descendants instead of just children
      --repo string     Search for a specific repo by name, or ID.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos build](/platform/chainctl/chainctl-docs/chainctl_images_repos_build/)	 - Manage custom image builds

---

### chainctl config unset
_Path: platform/chainctl/chainctl-docs/chainctl_config_unset.md_

## chainctl config unset

Unset a configuration property and return it to default.

### Synopsis

Unset a configuration property and return it to default. Property names are dot delimited and lowercase (for example, output.color.pass).

```
chainctl config unset PROPERTY_NAME
```

### Examples

```
  # Return the pass color to its default
  chainctl config unset output.color.pass
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl config](/platform/chainctl/chainctl-docs/chainctl_config/)	 - Local config file commands for chainctl.

---

### chainctl iam identity-providers scim disable
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_disable.md_

## chainctl iam identity-providers scim disable

Disable SCIM provisioning for an identity provider.

```
chainctl iam identity-providers scim disable IDENTITY_PROVIDER [flags]
```

### Options

```
  -y, --yes   Skip confirmation prompt
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim/)	 - Manage SCIM provisioning for an identity provider.

---

### chainctl images entitlements
_Path: platform/chainctl/chainctl-docs/chainctl_images_entitlements.md_

## chainctl images entitlements

Manage entitlements to registry repositories.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl images entitlements list](/platform/chainctl/chainctl-docs/chainctl_images_entitlements_list/)	 - List registry entitlements of an organization.

---

### chainctl policy custom
_Path: platform/chainctl/chainctl-docs/chainctl_policy_custom.md_

## chainctl policy custom

Manage your custom policies.

### Synopsis

Manage the lifecycle of your organization's custom policies:
validate a manifest before submitting, create a new policy, update an
existing one, and delete when it's no longer needed.

A custom policy is a Rego expression paired with a single supported
resource type and an optional parameter schema. Each policy is
identified by (name, resource type) within an organization.

The supported resource type is set at create time and cannot be changed
afterwards.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.
* [chainctl policy custom create](/platform/chainctl/chainctl-docs/chainctl_policy_custom_create/)	 - Create a custom policy.
* [chainctl policy custom delete](/platform/chainctl/chainctl-docs/chainctl_policy_custom_delete/)	 - Delete a custom policy.
* [chainctl policy custom update](/platform/chainctl/chainctl-docs/chainctl_policy_custom_update/)	 - Update a custom policy.
* [chainctl policy custom validate](/platform/chainctl/chainctl-docs/chainctl_policy_custom_validate/)	 - Validate a custom policy manifest or expression without persisting it.

---

### chainctl actions entitlements
_Path: platform/chainctl/chainctl-docs/chainctl_actions_entitlements.md_

## chainctl actions entitlements

Manage Actions product entitlements.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions](/platform/chainctl/chainctl-docs/chainctl_actions/)	 - Interact with the Chainguard Actions product.
* [chainctl actions entitlements create](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements_create/)	 - Enable the Actions product for an organization.
* [chainctl actions entitlements delete](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements_delete/)	 - Disable the Actions product for an organization.
* [chainctl actions entitlements list](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements_list/)	 - List Actions product entitlements for an organization.

---

### chainctl images history
_Path: platform/chainctl/chainctl-docs/chainctl_images_history.md_

## chainctl images history

Show history for a specific image tag.

### Synopsis

Show history for a specific image tag.

If a digest does not represent a multi-arch image, only a single digest without architecture information will be displayed.
Architecture information may not be available for all digests.

Examples:
  # Show history for a specific tag (selected interactively)
  chainctl images history nginx

  # Show history for a specific tag (specified in the command)
  chainctl images history nginx:1.21.0

  # Show history for a tag in a specific organization
  chainctl images history nginx:1.21.0 --parent=my-org

```
chainctl images history IMAGE[:TAG] [flags]
```

### Options

```
      --parent string   Organization to view image history from Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive       Search repositories recursively through all descendants instead of just children
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl iam invites delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_invites_delete.md_

## chainctl iam invites delete

Delete invite codes

```
chainctl iam invites delete {INVITE_ID... | --expired} [--yes] [flags]
```

### Options

```
      --expired   When true, delete all expired invite codes.
  -y, --yes       Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam invites](/platform/chainctl/chainctl-docs/chainctl_iam_invites/)	 - Manage invite codes that register identities with Chainguard.

---

### chainctl iam account-associations unset aws
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_aws.md_

## chainctl iam account-associations unset aws

Remove AWS account configuration for a location.

```
chainctl iam account-associations unset aws ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [--yes] [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations unset](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset/)	 - Remove cloud provider account associations from a location.

---

### chainctl skills push
_Path: platform/chainctl/chainctl-docs/chainctl_skills_push.md_

## chainctl skills push

Package a skill directory and publish it to uploads.cgr.dev.

### Synopsis

Package a skill directory and publish it to uploads.cgr.dev.

Reads SKILL.md from the specified directory (default: current directory),
validates the skill, and pushes an OCI artifact to uploads.cgr.dev/<org>/<name>:<tag>.

```
chainctl skills push [<path>] [flags]
```

### Options

```
      --dry-run           Build and validate without pushing.
  -g, --group string      Org or folder to publish under, e.g. "chainguard" or "chainguard/github" (default: current chainctl context).
  -t, --tag stringArray   Version tag to apply (repeatable, e.g. -t v1.0.0 -t latest). (default [latest])
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl packages versions
_Path: platform/chainctl/chainctl-docs/chainctl_packages_versions.md_

## chainctl packages versions

Package version related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl packages](/platform/chainctl/chainctl-docs/chainctl_packages/)	 - Interact with Chainguard packages
* [chainctl packages versions list](/platform/chainctl/chainctl-docs/chainctl_packages_versions_list/)	 - List version stream data for a managed package.

---

### chainctl iam identities create aws
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws.md_

## chainctl iam identities create aws

Create a new identity for an AWS IAM resource.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities create](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/)	 - Create a new identity.
* [chainctl iam identities create aws role](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws_role/)	 - 
* [chainctl iam identities create aws user](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create_aws_user/)	 -

---

### chainctl iam roles capabilities list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_capabilities_list.md_

## chainctl iam roles capabilities list

List IAM role capabilities.

```
chainctl iam roles capabilities list [--actions=ACTION,...] [--resources=RESOURCE,...] [--output=json|table|tree]
```

### Examples

```
  # List all capabilities
  chainctl iam roles capabilities list
  
  # List all capabilities for groups and repos
  chainctl iam roles capabilities list --resources=groups,repos
  
  # List all capabilities that include list
  chainctl iam roles capabilities list --actions=list
```

### Options

```
      --actions strings     Capability actions to list.
      --resources strings   Capability resources to list.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles capabilities](/platform/chainctl/chainctl-docs/chainctl_iam_roles_capabilities/)	 - IAM role capabilities

---

### chainctl actions
_Path: platform/chainctl/chainctl-docs/chainctl_actions.md_

## chainctl actions

Interact with the Chainguard Actions product.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl actions catalog](/platform/chainctl/chainctl-docs/chainctl_actions_catalog/)	 - Browse the public Chainguard Actions catalog.
* [chainctl actions discover](/platform/chainctl/chainctl-docs/chainctl_actions_discover/)	 - Discover GitHub Actions dependencies used by your workflows.
* [chainctl actions entitlements](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements/)	 - Manage Actions product entitlements.
* [chainctl actions list](/platform/chainctl/chainctl-docs/chainctl_actions_list/)	 - List Chainguard Actions catalog entries for an organization.

---

### chainctl skills validate
_Path: platform/chainctl/chainctl-docs/chainctl_skills_validate.md_

## chainctl skills validate

Check a skill directory for spec compliance without making network calls.

```
chainctl skills validate [<path>] [flags]
```

### Options

```
      --strict   Also report warnings for optional recommended fields.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl skills install
_Path: platform/chainctl/chainctl-docs/chainctl_skills_install.md_

## chainctl skills install

Download a skill and install it into agent directories.

### Synopsis

Download a skill and place it into the skills directories of detected agents.

<ref> is a skill reference, optionally host-qualified: a bare org/name (or
org/owner/name) resolves to the hardened catalog on skills.cgr.dev, while an
uploads.cgr.dev/org/name reference installs a private skill straight from the
uploads namespace (the same reference `chainctl skills list --source uploads`
prints).

By default, a shared canonical copy is written to .agents/skills/<name>/ and
agent-specific symlinks are created. Use --copy to write independent copies.

```
chainctl skills install <ref> [flags]
```

### Options

```
  -a, --agent stringArray   Target specific agents by ID (repeatable). Use --agent '*' for all known agents.
      --copy                Copy files per agent instead of using a shared canonical copy + symlinks.
      --global              Install to global (~/) directories instead of project-local.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl iam roles capabilities
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_capabilities.md_

## chainctl iam roles capabilities

IAM role capabilities

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.
* [chainctl iam roles capabilities list](/platform/chainctl/chainctl-docs/chainctl_iam_roles_capabilities_list/)	 - List IAM role capabilities.

---

### chainctl events subscriptions list
_Path: platform/chainctl/chainctl-docs/chainctl_events_subscriptions_list.md_

## chainctl events subscriptions list

List subscriptions.

```
chainctl events subscriptions list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--output=id|json|table]
```

### Options

```
      --parent string   The parent location name or id of the subscription. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl events subscriptions](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions/)	 - Subscription interactions.

---

### chainctl iam folders list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_folders_list.md_

## chainctl iam folders list

List folders under an organization.

```
chainctl iam folders list ORGANIZATION_NAME | ORGANIZATION_ID [--output=id|json|table|tree]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam folders](/platform/chainctl/chainctl-docs/chainctl_iam_folders/)	 - IAM folders interactions.

---

### chainctl images repos delete
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_delete.md_

## chainctl images repos delete

Remove an image repository.

```
chainctl images repos delete {REPO_NAME|REPO_ID} --parent ORGANIZATION_NAME | ORGANIZATION_ID
```

### Options

```
      --allow-missing   Exit with status 0 if the repo does not exist
      --parent string   The name or id of the parent location to remove an image repo. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.

---

### chainctl images tags list
_Path: platform/chainctl/chainctl-docs/chainctl_images_tags_list.md_

## chainctl images tags list

List tags from repositories using --parent, --public, or --repo flags.

```
chainctl images tags list [--repo=REPO_NAME] [--public | --parent=PARENT_NAME|PARENT_ID] [--updated-within=DURATION] [--show-dates] [--show-epochs] [--show-referrers] [--active-only] [--output=id|json|table]
```

### Options

```
      --active-only               Whether to only show active tags.
      --all                       Return all tags that match the digest of the specified image reference.
      --parent string             The name or id of the parent location to list image repos. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --public                    List repos from the public Chainguard registry.
      --recursive                 Search repositories recursively through all descendants instead of just children
      --repo string               Search for a specific repo by name.
      --show-dates                Whether to show date tags of the form latest-{date}.
      --show-epochs               Whether to show epoch tags of the form 1.2.3-r4.
      --show-referrers            Whether to show referrer tags of the form sha256-deadbeef.{sig,sbom,att}.
      --updated-within duration   The duration within which an image must have been updated (0 disables the filter).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images tags](/platform/chainctl/chainctl-docs/chainctl_images_tags/)	 - Tags related commands for images.

---

### chainctl guardener github status
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_status.md_

## chainctl guardener github status

List the GitHub organizations linked to a Chainguard group.

### Synopsis

List the GitHub organizations linked to a Chainguard group.

Which repositories guardener acts on is controlled by the guardener GitHub App's
repository selection on GitHub — follow the SETTINGS link in the output to review
or change it.

Requires the guardener.association.list capability on the group (read-only; no
GitHub authorization or browser flow is involved). When --parent is omitted, you
are prompted to pick from your groups.

```
chainctl guardener github status [flags]
```

### Options

```
      --parent string   Name or UIDP of the Chainguard group to list. Prompts interactively if omitted.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)	 - Link and unlink a GitHub organization to a Chainguard group.

---

### chainctl policy binding
_Path: platform/chainctl/chainctl-docs/chainctl_policy_binding.md_

## chainctl policy binding

Manage policy bindings.

### Synopsis

A policy binding is a link between a policy and a group of image
resources. When a binding exists, the linked policy is active for image
pulls within that group; without a binding the policy has no effect.

Currently, bindings support linking a policy to an organization ID,
which applies the policy to all images under that organization.

Use these commands to create or delete bindings.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.
* [chainctl policy binding create](/platform/chainctl/chainctl-docs/chainctl_policy_binding_create/)	 - Create a policy binding.
* [chainctl policy binding delete](/platform/chainctl/chainctl-docs/chainctl_policy_binding_delete/)	 - Delete a policy binding.
* [chainctl policy binding list](/platform/chainctl/chainctl-docs/chainctl_policy_binding_list/)	 - List policy bindings.

---

### chainctl skills uninstall
_Path: platform/chainctl/chainctl-docs/chainctl_skills_uninstall.md_

## chainctl skills uninstall

Remove a skill from agent directories on the local machine.

### Synopsis

Remove a skill from agent directories on the local machine.

<name> is the skill name (no org or tag needed — operates on local files only).

By default uninstall removes the project-local copy. If a global copy also
exists, it is left in place and a warning is printed; re-run with --global to
remove it.

uninstall is a local-only operation and does not modify the registry.

```
chainctl skills uninstall <name> [flags]
```

### Options

```
  -a, --agent stringArray   Remove from specific agents only (default: all installed locations).
      --global              Remove from global directories instead of project-local.
  -y, --yes                 Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills](/platform/chainctl/chainctl-docs/chainctl_skills/)	 - Skills registry related commands.

---

### chainctl libraries entitlements create
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_create.md_

## chainctl libraries entitlements create

Create ecosystem library entitlements for an organization.

```
chainctl libraries entitlements create --parent=PARENT --ecosystems=LANGUAGE1,LANGUAGE2,... [--output=json|table] [flags]
```

### Options

```
      --ecosystems strings   The language ecosystems to entitle to the parent org.
      --parent string        The name or id of the org to create an entitlement for.
      --policy string        The policy to apply to the entitlement (e.g. chainguard, chainguard_and_upstream). (default "chainguard")
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries entitlements](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/)	 - Manage entitlements to language ecosystem libraries.

---

### chainctl iam identity-providers
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers.md_

## chainctl iam identity-providers

customer managed identity provider management

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam identity-providers create](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_create/)	 - Create an identity provider
* [chainctl iam identity-providers delete](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_delete/)	 - Delete an identity provider.
* [chainctl iam identity-providers group-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings/)	 - Manage IdP group-to-role mappings for an identity provider.
* [chainctl iam identity-providers list](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_list/)	 - List identity providers.
* [chainctl iam identity-providers scim](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim/)	 - Manage SCIM provisioning for an identity provider.
* [chainctl iam identity-providers update](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_update/)	 - Update an identity provider

---

### chainctl agent
_Path: platform/chainctl/chainctl-docs/chainctl_agent.md_

## chainctl agent

Agent-powered commands.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl agent accept-terms](/platform/chainctl/chainctl-docs/chainctl_agent_accept-terms/)	 - Accept required legal terms.

---

### chainctl images discover
_Path: platform/chainctl/chainctl-docs/chainctl_images_discover.md_

## chainctl images discover

Find Chainguard replacements for the images your project uses.

### Synopsis

Find Chainguard replacements for the images your project uses.

Reads every image reference under DIR (default: the current directory).
For each upstream image, it reports whether Chainguard publishes a hardened
replacement and whether your organization can pull it today.

Private-registry references are supported. An exact catalog alias is
preferred. Otherwise, repository suffixes are tried from most to least
specific. Thus registry.example/cache/dotnet/sdk retains dotnet/sdk, while
a reference ending in nginx can still suggest Chainguard's nginx. Namesake
matching identifies a catalog offering, not identical image contents.

Both what you build and what you run are covered: Dockerfile FROM
instructions, Kubernetes manifests, Compose files, Helm values, Terraform,
shell scripts and Makefiles.

Helm values are read as written, not rendered. An image assembled from
registry, repository, tag and digest keys is resolved. This includes a
chart-wide imageRegistry or imageNamespace and an empty tag standing for
the chart's appVersion. A reference computed inside templates is beyond
what reading values can see, so treat the result as what values declare.

Your immutability choice stays as written: a digest-pinned reference comes
back digest-pinned. A maintained tag is kept. A variant or older patch
resolves to its maintained version line when possible. An untagged reference
is made explicit as latest, which is what Docker already uses. When no
requested version is maintained, the suggestion uses a maintained latest
tag. An image not yet entitled is named with a tag because its digest cannot
be resolved until it is in your catalog.

Every reference is listed with what you can do: pull the replacement today,
ask for entitlement, nothing (already on Chainguard), or nothing to move to.
What has no replacement is as much of the answer as what does.

```
chainctl images discover [DIR]
```

### Examples

```
chainctl images discover
chainctl images discover ./services
chainctl images discover --parent my-org
chainctl images discover -o json
```

### Options

```
      --parent string   Name or UIDP of the organization whose entitlements to check. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.

---

### chainctl libraries entitlements delete
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_entitlements_delete.md_

## chainctl libraries entitlements delete

Delete an ecosystem library entitlement from an organization.

```
chainctl libraries entitlements delete --parent=PARENT --ecosystem=LANGUAGE [flags]
```

### Options

```
      --ecosystem string   The language ecosystem to remove the entitlement for.
      --parent string      The name or id of the org to delete an entitlement from.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries entitlements](/platform/chainctl/chainctl-docs/chainctl_libraries_entitlements/)	 - Manage entitlements to language ecosystem libraries.

---

### chainctl libraries policy
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy.md_

## chainctl libraries policy

Manage Libraries policies.

### Synopsis

Libraries policies control which upstream packages your organization can
pull. A policy configures automatic gates (cooldown, malware) and explicit
block/allow lists; a binding activates a policy for an (organization,
ecosystem) pair in either ENFORCE or PREVIEW mode.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries](/platform/chainctl/chainctl-docs/chainctl_libraries/)	 - Ecosystem library related commands.
* [chainctl libraries policy binding](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding/)	 - Manage Libraries policy bindings.
* [chainctl libraries policy create](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_create/)	 - Create a custom Libraries policy.
* [chainctl libraries policy delete](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_delete/)	 - Delete a custom Libraries policy.
* [chainctl libraries policy describe](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_describe/)	 - Describe a Libraries policy.
* [chainctl libraries policy disable](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_disable/)	 - Disable a Libraries policy for an organization.
* [chainctl libraries policy enable](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_enable/)	 - Enable a Libraries policy for an organization.
* [chainctl libraries policy list](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_list/)	 - List Libraries policies.
* [chainctl libraries policy update](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_update/)	 - Update a custom Libraries policy.

---

### chainctl policy disable
_Path: platform/chainctl/chainctl-docs/chainctl_policy_disable.md_

## chainctl policy disable

Disable a policy.

### Synopsis

Disable a policy by deleting its binding.

This is a shortcut for "policies binding delete".

```
chainctl policy disable --policy POLICY [--parent ORG] [flags]
```

### Examples

```

# Disable a policy by name
chainctl policy disable --policy=no-eol --parent=example.com

```

### Options

```
      --parent string   The name or id of the organization (required when deleting by policy).
      --policy string   The name or id of the policy to disable.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.

---

### chainctl auth
_Path: platform/chainctl/chainctl-docs/chainctl_auth.md_

## chainctl auth

Auth related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl auth configure-docker](/platform/chainctl/chainctl-docs/chainctl_auth_configure-docker/)	 - Configure a Docker credential helper
* [chainctl auth configure-npm](/platform/chainctl/chainctl-docs/chainctl_auth_configure-npm/)	 - Configure npm credentials for Chainguard Libraries for JavaScript
* [chainctl auth delete-account](/platform/chainctl/chainctl-docs/chainctl_auth_delete-account/)	 - Permanently delete your user account.
* [chainctl auth login](/platform/chainctl/chainctl-docs/chainctl_auth_login/)	 - Login to the Chainguard platform.
* [chainctl auth logout](/platform/chainctl/chainctl-docs/chainctl_auth_logout/)	 - Logout from the Chainguard platform.
* [chainctl auth pull-token](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/)	 - Create a pull token.
* [chainctl auth status](/platform/chainctl/chainctl-docs/chainctl_auth_status/)	 - Inspect the local Chainguard Token.
* [chainctl auth token](/platform/chainctl/chainctl-docs/chainctl_auth_token/)	 - Print the local Chainguard Token.

---

### chainctl iam account-associations check aws
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_aws.md_

## chainctl iam account-associations check aws

Checks that the given location has been properly configured for OIDC federation with AWS

```
chainctl iam account-associations check aws ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations check](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check/)	 - Check the OIDC federation configurations for cloud providers.

---

### chainctl iam identities describe
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identities_describe.md_

## chainctl iam identities describe

View the details of an identity.

```
chainctl iam identities describe {IDENTITY_NAME | IDENTITY_ID} [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.

---

### chainctl events subscriptions create
_Path: platform/chainctl/chainctl-docs/chainctl_events_subscriptions_create.md_

## chainctl events subscriptions create

Subscribe to events under an organization or folder.

```
chainctl events subscriptions create SINK_URL [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--yes] [--output=id|json|table]
```

### Options

```
      --parent string   The parent location name or id of the subscription. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
  -y, --yes             Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl events subscriptions](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions/)	 - Subscription interactions.

---

### chainctl starter request-access
_Path: platform/chainctl/chainctl-docs/chainctl_starter_request-access.md_

## chainctl starter request-access

Request access to a catalog starter organization.

### Synopsis

Request access to an existing catalog starter organization.

If a catalog starter organization for your email domain already exists, this
command sends an access request to the organization's owners. They can
choose whether to invite you; if they do, you will receive an email with
instructions to join.

You must be authenticated as a Chainguard identity (e.g. via 'chainctl auth
login') before running this command. The candidate organization is derived
from the email domain on your authenticated session.

For privacy, this command intentionally returns the same response whether or
not a matching organization exists. If your domain has no associated starter
organization, no request is sent and no error is reported.

```
chainctl starter request-access [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl starter](/platform/chainctl/chainctl-docs/chainctl_starter/)	 - Manage catalog starter organizations

---

### chainctl starter init
_Path: platform/chainctl/chainctl-docs/chainctl_starter_init.md_

## chainctl starter init

Initialize a new catalog starter organization.

### Synopsis

Initialize a new catalog starter organization.

A catalog starter organization gives a team free access to a small set of
Chainguard images for evaluation. Each starter org is entitled to a
limited number of images of your choice (base or application); the
exact quota is shown by 'chainctl starter status'. Other Chainguard
platform features may be unavailable to starter organizations; refer
to the documentation for the current scope.

This command is interactive. It will:

    1. Prompt you to authenticate with a supported identity provider.
    2. Register a new Chainguard identity for your email address.
    3. Create a new starter organization tied to your email domain.

Once your organization exists, the Chainguard platform will automatically
entitle it to choose images to be added. It should be ready within a
few minutes.

Authentication requirements:

    * You must use a business email address. Personal email providers (Gmail,
      Yahoo, etc.) are not eligible.
    * Authentication must use one of:
        - Email and password; or
        - Google, only if your business uses a Google Workspace account
          registered to your business domain.

If this command fails and you think the organization already exists,
you may follow up by running 'chainctl starter request-access'
to request access.

```
chainctl starter init [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl starter](/platform/chainctl/chainctl-docs/chainctl_starter/)	 - Manage catalog starter organizations

---

### chainctl policy decision
_Path: platform/chainctl/chainctl-docs/chainctl_policy_decision.md_

## chainctl policy decision

Inspect policy decisions.

### Synopsis

A policy decision records the outcome of evaluating one policy
against one image digest at pull time. Decisions are recorded for both
enforced and dry-run policies, so you can review what a policy blocked,
or would have blocked, before promoting it to enforce mode.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.
* [chainctl policy decision list](/platform/chainctl/chainctl-docs/chainctl_policy_decision_list/)	 - List policy decisions.

---

### chainctl guardener github link
_Path: platform/chainctl/chainctl-docs/chainctl_guardener_github_link.md_

## chainctl guardener github link

Link a GitHub organization to a Chainguard group.

### Synopsis

Link a GitHub organization to a Chainguard group.

Requires that you are an owner of both the Chainguard group (the
guardener.association.manage capability) and the GitHub organization. A browser
window opens to authorize with GitHub; the guardener GitHub App must already be
installed on the organization.

```
chainctl guardener github link [flags]
```

### Options

```
      --github-org string   GitHub account login to link (an organization, or your own user).
      --parent string       Name or UIDP of the Chainguard group to link to. Prompts interactively if omitted.
      --port int            Local loopback port for the GitHub OAuth callback. (default 8989)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl guardener github](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)	 - Link and unlink a GitHub organization to a Chainguard group.

---

### chainctl iam account-associations set gcp
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_gcp.md_

## chainctl iam account-associations set gcp

Set GCP account association for a location.

```
chainctl iam account-associations set gcp ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID --project-id=PROJECT_ID --project-number=PROJECT_NUMBER [--name=NAME] [--description=DESCRIPTION] [--yes] [--output=id|json|table] [flags]
```

### Options

```
  -d, --description string      The description of the resource.
  -n, --name string             Given name of the resource.
      --project-id string       The GCP project ID.
      --project-number string   The GCP project number.
  -y, --yes                     Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations set](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set/)	 - Set cloud provider account associations for a location.

---

### chainctl auth configure-docker
_Path: platform/chainctl/chainctl-docs/chainctl_auth_configure-docker.md_

## chainctl auth configure-docker

Configure a Docker credential helper

```
chainctl auth configure-docker [flags]
```

### Options

```
      --headless                   Skip browser authentication and use device flow.
      --identity string            The unique ID of the identity to assume when logging in.
      --identity-provider string   The unique ID of the customer managed identity provider to authenticate with. Mutually exclusive with --org-name.
      --identity-token string      Use an explicit passed identity token or token path.
      --name string                Optional name for the pull token (default "pull-token")
      --org-name string            Organization to use for authentication. If configured the organization's custom identity provider will be used. Mutually exclusive with --identity-provider.
      --parent string              The IAM organization or folder with which the pull-token identity is associated.
      --pull-token                 Whether to register a pull token that can pull images
      --save                       If true with --pull-token, save the pull token to the Docker config
      --social-login string        Which of the default identity providers to use for authentication. Must be one of: email, google, github, gitlab
      --ttl ns                     Time To Live for the validity of the pull token. Valid unit strings range from nanoseconds to hours and are ns, `us`, `ms`, `s`, `m`, and `h`. Maximum value is 8760h or one year. (default 720h0m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl iam organizations describe
_Path: platform/chainctl/chainctl-docs/chainctl_iam_organizations_describe.md_

## chainctl iam organizations describe

Describe an organization.

```
chainctl iam organizations describe [ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam organizations](/platform/chainctl/chainctl-docs/chainctl_iam_organizations/)	 - IAM organization interactions.

---

### chainctl config
_Path: platform/chainctl/chainctl-docs/chainctl_config.md_

## chainctl config

Local config file commands for chainctl.

### Synopsis

Local config file commands for chainctl.

Every config property can also be set with an environment variable, which is
useful for scripts and CI. Take the property name, uppercase it, replace dots
with underscores, and add a `CHAINGUARD_` prefix:

  - `default.group` becomes `CHAINGUARD_DEFAULT_GROUP`
  - `platform.api` becomes `CHAINGUARD_PLATFORM_API`
  - `output.silent` becomes `CHAINGUARD_OUTPUT_SILENT`

Environment variables take precedence over the config file, and command line
flags take precedence over both.

Setting `default.group` supplies the default for --parent, so exporting
`CHAINGUARD_DEFAULT_GROUP` avoids passing --parent to every command.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl config edit](/platform/chainctl/chainctl-docs/chainctl_config_edit/)	 - Edit the current chainctl config file.
* [chainctl config reset](/platform/chainctl/chainctl-docs/chainctl_config_reset/)	 - Remove local chainctl config files and restore defaults.
* [chainctl config save](/platform/chainctl/chainctl-docs/chainctl_config_save/)	 - Save the current chainctl config to a config file.
* [chainctl config set](/platform/chainctl/chainctl-docs/chainctl_config_set/)	 - Set an individual configuration value property.
* [chainctl config unset](/platform/chainctl/chainctl-docs/chainctl_config_unset/)	 - Unset a configuration property and return it to default.
* [chainctl config validate](/platform/chainctl/chainctl-docs/chainctl_config_validate/)	 - Run diagnostics on local config.
* [chainctl config view](/platform/chainctl/chainctl-docs/chainctl_config_view/)	 - View the current chainctl config.

---

### chainctl iam invites
_Path: platform/chainctl/chainctl-docs/chainctl_iam_invites.md_

## chainctl iam invites

Manage invite codes that register identities with Chainguard.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam invites create](/platform/chainctl/chainctl-docs/chainctl_iam_invites_create/)	 - Generate an invite code to identities with Chainguard.
* [chainctl iam invites delete](/platform/chainctl/chainctl-docs/chainctl_iam_invites_delete/)	 - Delete invite codes
* [chainctl iam invites list](/platform/chainctl/chainctl-docs/chainctl_iam_invites_list/)	 - List organization and folder invites.

---

### chainctl iam external-group-role-mappings
_Path: platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings.md_

## chainctl iam external-group-role-mappings

Manage IdP group-to-role mappings (also available under 'iam identity-providers group-mappings').

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam external-group-role-mappings create](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_create/)	 - Create an IdP group-to-role mapping.
* [chainctl iam external-group-role-mappings delete](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_delete/)	 - Delete IdP group-to-role mappings.
* [chainctl iam external-group-role-mappings list](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings_list/)	 - List IdP group-to-role mappings.

---

### chainctl policy override delete
_Path: platform/chainctl/chainctl-docs/chainctl_policy_override_delete.md_

## chainctl policy override delete

Delete a policy override.

### Synopsis

Delete a policy override to revoke a waiver.

Deletion happens immediately and is not confirmed: there is no prompt
and no --force flag, so the override is removed as soon as you run the
command. Once removed, the targeted artifact is again subject to the
policy's result.

Pass the override's full ID (a UIDP) as the positional argument; it is
globally unique, so no --parent is needed. Use
"chainctl policy override list" to find it.

```
chainctl policy override delete OVERRIDE_ID [flags]
```

### Examples

```
  # Delete an override by ID
  chainctl policy override delete <override-id>
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy override](/platform/chainctl/chainctl-docs/chainctl_policy_override/)	 - Manage policy overrides.

---

### chainctl actions entitlements delete
_Path: platform/chainctl/chainctl-docs/chainctl_actions_entitlements_delete.md_

## chainctl actions entitlements delete

Disable the Actions product for an organization.

```
chainctl actions entitlements delete --parent=PARENT [flags]
```

### Options

```
      --parent string   The name or id of the org to disable the Actions product for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions entitlements](/platform/chainctl/chainctl-docs/chainctl_actions_entitlements/)	 - Manage Actions product entitlements.

---

### chainctl policy check
_Path: platform/chainctl/chainctl-docs/chainctl_policy_check.md_

## chainctl policy check

Check an image against active policies.

### Synopsis

Evaluate an image against any active policies and print the
result for each.

Exit status is non-zero if any policy returned DENIED or ERROR, regardless
of the policy's mode, so this command is suitable for use in CI.

```
chainctl policy check IMAGE_REF [flags]
```

### Examples

```

# Check an image by tag
chainctl policy check cgr.dev/example.com/python:latest

# Check an image by digest
chainctl policy check cgr.dev/example.com/python@sha256:abc...

```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy](/platform/chainctl/chainctl-docs/chainctl_policy/)	 - Manage policies.

---

### chainctl actions catalog
_Path: platform/chainctl/chainctl-docs/chainctl_actions_catalog.md_

## chainctl actions catalog

Browse the public Chainguard Actions catalog.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions](/platform/chainctl/chainctl-docs/chainctl_actions/)	 - Interact with the Chainguard Actions product.
* [chainctl actions catalog list](/platform/chainctl/chainctl-docs/chainctl_actions_catalog_list/)	 - List Chainguard Actions in the public catalog.

---

### chainctl iam
_Path: platform/chainctl/chainctl-docs/chainctl_iam.md_

## chainctl iam

IAM related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl iam account-associations](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations/)	 - Configure and manage cloud provider account associations.
* [chainctl iam external-group-role-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_external-group-role-mappings/)	 - Manage IdP group-to-role mappings (also available under 'iam identity-providers group-mappings').
* [chainctl iam folders](/platform/chainctl/chainctl-docs/chainctl_iam_folders/)	 - IAM folders interactions.
* [chainctl iam identities](/platform/chainctl/chainctl-docs/chainctl_iam_identities/)	 - Identity management.
* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management
* [chainctl iam invites](/platform/chainctl/chainctl-docs/chainctl_iam_invites/)	 - Manage invite codes that register identities with Chainguard.
* [chainctl iam organizations](/platform/chainctl/chainctl-docs/chainctl_iam_organizations/)	 - IAM organization interactions.
* [chainctl iam role-bindings](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings/)	 - IAM role-bindings resource interactions.
* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.

---

### chainctl guardener
_Path: platform/chainctl/chainctl-docs/chainctl_guardener.md_

## chainctl guardener

Manage guardener integrations.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl guardener entitlement](/platform/chainctl/chainctl-docs/chainctl_guardener_entitlement/)	 - Manage a group's guardener entitlement.
* [chainctl guardener github](/platform/chainctl/chainctl-docs/chainctl_guardener_github/)	 - Link and unlink a GitHub organization to a Chainguard group.
* [chainctl guardener scans](/platform/chainctl/chainctl-docs/chainctl_guardener_scans/)	 - View guardener dependency scans.

---

### chainctl iam organizations
_Path: platform/chainctl/chainctl-docs/chainctl_iam_organizations.md_

## chainctl iam organizations

IAM organization interactions.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam organizations delete](/platform/chainctl/chainctl-docs/chainctl_iam_organizations_delete/)	 - Delete an organization.
* [chainctl iam organizations describe](/platform/chainctl/chainctl-docs/chainctl_iam_organizations_describe/)	 - Describe an organization.
* [chainctl iam organizations list](/platform/chainctl/chainctl-docs/chainctl_iam_organizations_list/)	 - List organizations.

---

### chainctl images repos
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos.md_

## chainctl images repos

Image repo related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images](/platform/chainctl/chainctl-docs/chainctl_images/)	 - Images related commands for the Chainguard platform.
* [chainctl images repos build](/platform/chainctl/chainctl-docs/chainctl_images_repos_build/)	 - Manage custom image builds
* [chainctl images repos create](/platform/chainctl/chainctl-docs/chainctl_images_repos_create/)	 - Create an image repository.
* [chainctl images repos delete](/platform/chainctl/chainctl-docs/chainctl_images_repos_delete/)	 - Remove an image repository.
* [chainctl images repos list](/platform/chainctl/chainctl-docs/chainctl_images_repos_list/)	 - List image repositories.
* [chainctl images repos update](/platform/chainctl/chainctl-docs/chainctl_images_repos_update/)	 - Update image repositories.

---

### chainctl auth delete-account
_Path: platform/chainctl/chainctl-docs/chainctl_auth_delete-account.md_

## chainctl auth delete-account

Permanently delete your user account.

```
chainctl auth delete-account [flags]
```

### Options

```
  -y, --yes   Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth](/platform/chainctl/chainctl-docs/chainctl_auth/)	 - Auth related commands for the Chainguard platform.

---

### chainctl skills entitlements create
_Path: platform/chainctl/chainctl-docs/chainctl_skills_entitlements_create.md_

## chainctl skills entitlements create

Create a skills entitlement for an organization.

### Synopsis

Create a skills entitlement for an organization.

This enables the org to push and pull skill artifacts via skills.cgr.dev.
The command is idempotent: re-running it on an already-entitled org
converges to the correct state without returning an error.

```
chainctl skills entitlements create --parent=PARENT [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the org to create a skills entitlement for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl skills entitlements](/platform/chainctl/chainctl-docs/chainctl_skills_entitlements/)	 - Manage skills entitlements for an organization.

---

### chainctl iam roles update
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles_update.md_

## chainctl iam roles update

Update an IAM role.

```
chainctl iam roles update ROLE_NAME|ROLE_ID [--capabilities=CAPABILITY,...] [--add-capabilities=CAPABILITY,...] [--remove-capabilities=CAPABILITY,...] [--description=DESCRIPTION] [--yes] [--output=id|json|table]
```

### Examples

```
  # Update a role with a complete set of capabilities
  chainctl iam roles update my-role --capabilities=policy.list,groups.list,identity.list
  
  # Add new capabilities to a role
  chainctl iam roles update my-role --add-capabilities=policy.create
  
  # Remove an existing capabilities from a role
  chainctl iam roles update my-role --remove-capabilities=identity.list
  
  # Interactively choose capabilities to add to a role
  chainctl iam roles update my-role --add-capabilities=
```

### Options

```
      --add-capabilities strings      A comma separated list of capabilities to add to this role (can't be used with --capabilities).
      --capabilities strings          A comma separated list of capabilities to grant this role.
      --description string            A description of the role.
      --remove-capabilities strings   A comma separated list of capabilities to remove from this role (can't be used with --capabilities).
  -y, --yes                           Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam roles](/platform/chainctl/chainctl-docs/chainctl_iam_roles/)	 - IAM role resource interactions.

---

### chainctl images advisories list
_Path: platform/chainctl/chainctl-docs/chainctl_images_advisories_list.md_

## chainctl images advisories list

List security advisories for packages in an image.

### Synopsis

List security advisories for APK packages in a container image.

This command fetches the SBOM attestation from the image registry,
extracts the list of APK packages, and queries the Chainguard advisory
database for each package.

The image reference can be any valid OCI image reference that has
SBOM attestations attached.

```
chainctl images advisories list {IMAGE_REF} [--platform=PLATFORM] [--status=STATUS,...]
```

### Examples

```
  # List advisories for a Chainguard image
  chainctl images advisories list cgr.dev/chainguard/nginx:latest

  # List advisories for a specific platform
  chainctl images advisories list cgr.dev/chainguard/python:latest --platform=linux/arm64

  # Filter by status (e.g., only show detected vulnerabilities)
  chainctl images advisories list cgr.dev/chainguard/go:latest --status=detected

  # Filter by multiple statuses (comma-separated or multiple flags)
  chainctl images advisories list cgr.dev/chainguard/go:latest --status=detected,pending-upstream
  chainctl images advisories list cgr.dev/chainguard/go:latest --status=detected --status=pending-upstream

  # Output as JSON
  chainctl images advisories list cgr.dev/chainguard/go:latest -o json
```

### Options

```
      --platform string   Platform to fetch SBOM for (e.g., linux/amd64, linux/arm64) (default "linux/amd64")
      --status strings    Filter advisories by status; can be specified multiple times or comma-separated (e.g., --status=detected,pending-upstream)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images advisories](/platform/chainctl/chainctl-docs/chainctl_images_advisories/)	 - Security advisory commands for images.

---

### chainctl libraries cache zap
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache_zap.md_

## chainctl libraries cache zap

Zap resolution cache entries.

### Synopsis

Retire resolution cache entries at the chosen scope: a Maven group or npm
scope prefix, a single package or version, one ecosystem, or the whole org.
Zapped coordinates re-resolve to the current best tier on their next fetch,
which changes artifact hashes for them — regenerate lockfiles afterwards.
Use --dry-run first to see how many entries a zap would retire. Real zaps
prompt for confirmation; pass --yes to skip the prompt in scripts.

```
chainctl libraries cache zap [--ecosystem ECOSYSTEM] [--group G | --scope S | --package P [--version V]] [--registry R] [--dry-run] [--yes] [--parent ORG] [flags]
```

### Options

```
      --dry-run            Report how many entries the zap would retire without changing anything.
      --ecosystem string   Scope the zap to one ecosystem (JAVA, PYTHON, JAVASCRIPT). Omit for an org-wide zap.
      --group string       Zap a Maven group prefix (e.g. com.fasterxml.jackson). Requires --ecosystem.
      --package string     Zap a single package (java: group:artifact). Requires --ecosystem.
      --parent string      The name or id of the organization whose resolution cache to zap.
      --registry string    Narrow a package or prefix zap to one registry.
      --scope string       Zap an npm scope prefix (e.g. @angular). Requires --ecosystem.
      --version string     Zap a single version. Requires --package.
  -y, --yes                Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.

---

### chainctl packages versions list
_Path: platform/chainctl/chainctl-docs/chainctl_packages_versions_list.md_

## chainctl packages versions list

List version stream data for a managed package.

### Synopsis

List version stream data for a managed package.

PACKAGE_NAME is the name of a Chainguard-managed version stream, not an arbitrary apk
package name. Examples include 'bazel', 'airflow', 'python-3.13', and 'actions-runner'.
For arbitrary apk packages such as 'bash' or 'curl', use 'apk info' or 'apk search'
inside a Chainguard image instead.

```
chainctl packages versions list PACKAGE_NAME [--show-eol] [--show-active] [--show-fips] [--include-inactive] [--output=csv|json|table|wide]
```

### Examples

```
  # List version data for the bazel version stream
  chainctl packages versions list bazel

  # List a specific minor stream
  chainctl packages versions list python-3.13
```

### Options

```
      --include-inactive   Include only packages within the EOL grace period end date. No end date is considered inclusive.
      --show-active        Show only active versions.
      --show-eol           Show only EOL versions.
      --show-fips          Show only FIPS versions.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl packages versions](/platform/chainctl/chainctl-docs/chainctl_packages_versions/)	 - Package version related commands for the Chainguard platform.

---

### chainctl iam identity-providers group-mappings delete
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_delete.md_

## chainctl iam identity-providers group-mappings delete

Delete an identity provider's group-to-role mappings.

```
chainctl iam identity-providers group-mappings delete IDENTITY_PROVIDER {MAPPING_ID | --all} [--yes] [flags]
```

### Examples

```
  # Delete a single group mapping by ID
  chainctl iam identity-providers group-mappings delete my-idp MAPPING_UIDP

  # Delete all group mappings for an identity provider
  chainctl iam identity-providers group-mappings delete my-idp --all
```

### Options

```
      --all   Delete all mappings for the identity provider
  -y, --yes   Skip confirmation prompt
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers group-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings/)	 - Manage IdP group-to-role mappings for an identity provider.

---

### chainctl iam identity-providers scim token
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token.md_

## chainctl iam identity-providers scim token

Manage the SCIM provisioning bearer token for an identity provider.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim/)	 - Manage SCIM provisioning for an identity provider.
* [chainctl iam identity-providers scim token generate](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_generate/)	 - Generate the first SCIM bearer token for an identity provider.
* [chainctl iam identity-providers scim token regenerate](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_regenerate/)	 - Regenerate the SCIM bearer token for an identity provider.
* [chainctl iam identity-providers scim token revoke](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_revoke/)	 - Revoke the SCIM bearer token for an identity provider.

---

### chainctl iam role-bindings
_Path: platform/chainctl/chainctl-docs/chainctl_iam_role-bindings.md_

## chainctl iam role-bindings

IAM role-bindings resource interactions.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam role-bindings create](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_create/)	 - Create a role-binding
* [chainctl iam role-bindings delete](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_delete/)	 - Delete a role-binding.
* [chainctl iam role-bindings list](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_list/)	 - List role-bindings.
* [chainctl iam role-bindings update](/platform/chainctl/chainctl-docs/chainctl_iam_role-bindings_update/)	 - Update a role-binding.

---

### chainctl events subscriptions
_Path: platform/chainctl/chainctl-docs/chainctl_events_subscriptions.md_

## chainctl events subscriptions

Subscription interactions.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl events](/platform/chainctl/chainctl-docs/chainctl_events/)	 - Events related commands for the Chainguard platform.
* [chainctl events subscriptions create](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions_create/)	 - Subscribe to events under an organization or folder.
* [chainctl events subscriptions delete](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions_delete/)	 - Delete a subscription.
* [chainctl events subscriptions list](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions_list/)	 - List subscriptions.

---

### chainctl images helm values
_Path: platform/chainctl/chainctl-docs/chainctl_images_helm_values.md_

## chainctl images helm values

Generate relocation overrides for a Chainguard Helm chart

### Synopsis

Generate minimal Helm value overrides to relocate a chart's images to a
different registry and/or organization. The output contains only the values
that differ from the chart defaults and can be passed directly to helm install -f.

Use --registry to point images at a different registry host, and --org to
change the organization prefix. If neither flag is set the output is empty.

If the chart reference has no tag or digest, the highest semver tag in the
repository is selected, matching Helm's behaviour.

```
chainctl images helm values CHART_REFERENCE [flags]
```

### Examples

```

# Point images at a registry mirror
chainctl images helm values cgr.dev/my-org/charts/nginx:latest --registry myregistry.example.com

# Change the organization prefix (my-org -> other-org)
chainctl images helm values cgr.dev/my-org/charts/nginx:latest --org other-org

# Both registry and organization
chainctl images helm values cgr.dev/my-org/charts/nginx:latest \
  --registry myregistry.example.com --org other-org

# Install with relocated images
helm install my-release oci://cgr.dev/my-org/charts/nginx \
  -f <(chainctl images helm values cgr.dev/my-org/charts/nginx:latest --registry myregistry.example.com)

# Output as JSON
chainctl images helm values cgr.dev/my-org/charts/nginx:latest --registry myregistry.example.com -o json
```

### Options

```
      --org string        Override the organization prefix for image repositories (e.g., other-org)
      --registry string   Override the registry host for all image references
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/)	 - Helm chart related commands

---

### chainctl actions list
_Path: platform/chainctl/chainctl-docs/chainctl_actions_list.md_

## chainctl actions list

List Chainguard Actions catalog entries for an organization.

```
chainctl actions list --parent=PARENT [--upstream-owner=OWNER [--upstream-repo=REPO]] [--output=json|table] [flags]
```

### Options

```
      --page-size int32         Maximum number of actions to fetch per page (0 uses the server default).
      --parent string           The name or id of the org to list actions for.
      --upstream-owner string   Filter to actions mirroring this upstream owner (e.g. "actions").
      --upstream-repo string    Filter to actions mirroring this upstream repo (requires --upstream-owner).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions](/platform/chainctl/chainctl-docs/chainctl_actions/)	 - Interact with the Chainguard Actions product.

---

### chainctl images repos list
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_list.md_

## chainctl images repos list

List image repositories.

```
chainctl images repos list [--repo=REPO_NAME] [--public | --parent=PARENT_NAME|PARENT_ID] [--updated-within=DURATION] [--show-dates] [--show-epochs] [--show-referrers] [--active-only]
```

### Options

```
      --parent string   The name or id of the parent location to list image repos. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --public          List repos from the public Chainguard registry.
      --recursive       Search repositories recursively through all descendants instead of just children
      --repo string     Search for a specific repo by name.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.

---

### chainctl images helm refs
_Path: platform/chainctl/chainctl-docs/chainctl_images_helm_refs.md_

## chainctl images helm refs

List image references pinned in a Chainguard Helm chart

### Synopsis

List every distinct image reference pinned in a Chainguard Helm
chart's chart-lock attestation, including images from subcharts.

By default each ref is printed on its own line as
{registry}/{repoName}:{tag}@{digest}, with the {registry}/{org} prefix derived
from the chart-lock's chart reference. Use --repository to override that
prefix when emitting refs for a relocated copy of the chart's images.

Use --requirement to narrow the output to refs the chart-lock template
marks "required" or "optional"; the default empty value emits every ref.

With -o json, each ref is emitted as a JSON object containing the repoName,
tag and digest fields recorded in the chart-lock; the repository override
does not affect the JSON output.

If the chart reference has no tag or digest, the highest semver tag in the
repository is selected, matching Helm's behaviour.

```
chainctl images helm refs CHART_REFERENCE [flags]
```

### Examples

```

# Print pinned image refs for a chart
chainctl images helm refs cgr.dev/my-org/charts/flux:v2.18.4

# Emit as JSON
chainctl images helm refs cgr.dev/my-org/charts/flux:v2.18.4 -o json

# Override the prefix to describe a relocated mirror of the images
chainctl images helm refs cgr.dev/my-org/charts/flux:v2.18.4 \
  --repository myregistry.internal/images/chainguard

# Only refs the chart-lock template marks required (and any without a
# template entry, which default to required)
chainctl images helm refs cgr.dev/my-org/charts/flux:v2.18.4 \
  --requirement required

# Only refs the chart-lock template marks optional
chainctl images helm refs cgr.dev/my-org/charts/flux:v2.18.4 \
  --requirement optional
```

### Options

```
      --repository string    Override the {registry}/{org} prefix for image references (e.g., myregistry.internal/images/chainguard)
      --requirement string   Filter image references by chart-lock template requirement. One of: [required,optional] (default: include all)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/)	 - Helm chart related commands

---

### chainctl libraries policy describe
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_describe.md_

## chainctl libraries policy describe

Describe a Libraries policy.

### Synopsis

Show a Libraries policy in full, including every block-list and allow-list entry.

```
chainctl libraries policy describe POLICY [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the organization. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl iam invites create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_invites_create.md_

## chainctl iam invites create

Generate an invite code to identities with Chainguard.

```
chainctl iam invites create [ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--role=ROLE_ID|ROLE_NAME] [--ttl=TTL_DURATION] [--email=EMAIL] [--single-use] [--output=id|json|table]
```

### Examples

```

# Create an invite that will be valid for 5 days:
chainctl iam invite create my-org-name --role=viewer --ttl=5d

# Create an invite that only Kim can accept:
chainctl iam invite create my-org-name --email=kim@example.com

# Create an invite code that can only be used once.
chainctl iam invite create my-org-name --single-use

```

### Options

```
      --email string   The email address that is allowed to accept this invite code.
      --role string    Role is used to role-bind the invited to the associated location.
      --single-use     The invite can only be used once before it is invalidated.
      --ttl duration   Duration the invite code will be valid. (default 168h0m0s)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam invites](/platform/chainctl/chainctl-docs/chainctl_iam_invites/)	 - Manage invite codes that register identities with Chainguard.

---

### chainctl images entitlements list
_Path: platform/chainctl/chainctl-docs/chainctl_images_entitlements_list.md_

## chainctl images entitlements list

List registry entitlements of an organization.

```
chainctl images entitlements list --parent=PARENT [--all] [--output=json|table|wide] [flags]
```

### Options

```
  -a, --all             Include expired entitlements in the output.
      --parent string   The name or id of the org to list registry entitlements for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images entitlements](/platform/chainctl/chainctl-docs/chainctl_images_entitlements/)	 - Manage entitlements to registry repositories.

---

### chainctl libraries policy update
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_update.md_

## chainctl libraries policy update

Update a custom Libraries policy.

### Synopsis

Update a CUSTOM Libraries policy for an organization.

By default --block and --allow ADD to the policy's existing lists: a new
--block purl is appended (duplicates are ignored) and a new --allow purl
replaces any existing allow entry for the same purl. Use --remove-block and
--remove-allow to drop entries, or --replace-block and --replace-allow to
replace an entire list with the flag's entries (pass a replace flag with no
entries to clear that list).

Packages are identified by their package URL (purl); see
"chainctl libraries policy create --help" for the supported purl formats.

```
chainctl libraries policy update POLICY [--cooldown-days N] [--block ...] [--allow ...] [--remove-block ...] [--remove-allow ...] [--replace-block] [--replace-allow] [flags]
```

### Examples

```
  # Add a package to the existing block list (other entries are kept)
  chainctl libraries policy update trusted --parent=example.com \
  --block=purl=pkg:pypi/evil
  
  # Add or update an allow-list override for a package
  chainctl libraries policy update trusted --parent=example.com \
  --allow=purl=pkg:npm/left-pad,override-cooldown=true
  
  # Remove entries from the block and allow lists by purl
  chainctl libraries policy update trusted --parent=example.com \
  --remove-block=pkg:pypi/evil \
  --remove-allow=pkg:npm/left-pad
  
  # Replace the entire block list, discarding the previous entries
  chainctl libraries policy update trusted --parent=example.com \
  --replace-block --block=purl=pkg:pypi/only-this
  
  # Clear the allow list entirely
  chainctl libraries policy update trusted --parent=example.com --replace-allow
```

### Options

```
      --allow stringArray          A package permitted to override gates, as comma-separated key=value pairs: purl=<package-url>[,override-cooldown=true][,override-malware=true][,justification="..."]. Added to the existing allow list, replacing any existing entry for the same purl (use --replace-allow to replace the whole list instead). Repeatable.
      --block stringArray          A package to always deny, as purl=<package-url> (pkg:pypi/<name>, pkg:npm/<name>, pkg:maven/<group>/<artifact>); append @<version> to block a single version. Added to the existing block list (use --replace-block to replace it instead). Repeatable.
      --cooldown-days int32        The cooldown window in days (0 disables, 1-30 explicit, omit to inherit the default). (default -1)
      --description string         The updated description of the policy.
      --parent string              The name or id of the organization that owns the policy.
      --remove-allow stringArray   A package to remove from the allow list, as a purl or purl=<package-url> (match the purl shown by 'describe'). Repeatable.
      --remove-block stringArray   A package to remove from the block list, as a purl or purl=<package-url> (match the purl shown by 'describe'). Repeatable.
      --replace-allow              Replace the entire allow list with the --allow entries instead of adding to it; pass with no --allow to clear the allow list.
      --replace-block              Replace the entire block list with the --block entries instead of adding to it; pass with no --block to clear the block list.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl update
_Path: platform/chainctl/chainctl-docs/chainctl_update.md_

## chainctl update

Update chainctl.

### Synopsis

Update chainctl to the latest release.

The downloaded binary's signature is verified before it is installed; a binary
that fails verification is never installed. Verification requires network
access to the download host (dl.enforce.dev) and, at least on first use, to the
Sigstore TUF CDN (tuf-repo-cdn.sigstore.dev). If those hosts are unreachable
(for example, behind a restrictive proxy), the update fails and the current
binary is left in place; as a fallback, download the latest release directly
from https://dl.enforce.dev/chainctl/latest/.

```
chainctl update [--yes] [--force]
```

### Options

```
      --force   Skip the version check and update chainctl regardless of the current version.
  -y, --yes     Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control

---

### chainctl iam account-associations check gcp
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check_gcp.md_

## chainctl iam account-associations check gcp

Checks that the given location has been properly configured for OIDC federation with GCP

```
chainctl iam account-associations check gcp ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations check](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_check/)	 - Check the OIDC federation configurations for cloud providers.

---

### chainctl auth pull-token list
_Path: platform/chainctl/chainctl-docs/chainctl_auth_pull-token_list.md_

## chainctl auth pull-token list

List all pull-tokens

```
chainctl auth pull-token list [--parent=PARENT] [--expired=true|false] [--repository={oci|apk|dotnet|go_athena|java|python|javascript|java_athena|python_athena|javascript_athena|dotnet_athena|go}] [flags]
```

### Examples

```
  # List all pull tokens.
  chainctl auth pull-token list
  
  # List all pull tokens associated with the Java library ecosystem.
  chainctl auth pull-token list --repository=java
  
  # List expired pull tokens.
  chainctl auth pull-token list --expired
  
  # List pull tokens associated to a particular organization.
  chainctl auth pull-token list --parent=my-org
  
  # List all expired APK pull tokens.
  chainctl auth pull-token list --repository=apk --expired
```

### Options

```
      --expired             If true return only expired pull tokens.
      --parent string       The IAM organization or folder with which the pull-token identity is associated.
      --repository string   The repository type to list pull tokens for. Must be one of: oci, apk, dotnet, go_athena, java, python, javascript, java_athena, python_athena, javascript_athena, dotnet_athena, go
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl auth pull-token](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token/)	 - Create a pull token.

---

### chainctl iam account-associations set aws
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_aws.md_

## chainctl iam account-associations set aws

Set AWS account association for a location.

```
chainctl iam account-associations set aws ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID --account=ACCOUNT [--name=NAME] [--description=DESCRIPTION] [--yes] [--output=id|json|table] [flags]
```

### Options

```
      --account string       The AWS account ID.
  -d, --description string   The description of the resource.
  -n, --name string          Given name of the resource.
  -y, --yes                  Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations set](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set/)	 - Set cloud provider account associations for a location.

---

### chainctl iam identity-providers scim users list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_users_list.md_

## chainctl iam identity-providers scim users list

List the SCIM-provisioned users of an identity provider.

### Synopsis

List the users a SCIM connector has provisioned for an identity provider, including users provisioned but not yet logged in — their linked identity is empty until first login. If the identity provider is omitted, the single identity provider in your organization is used, or you are prompted to choose.

```
chainctl iam identity-providers scim users list [IDENTITY_PROVIDER] [--output=json|table] [flags]
```

### Examples

```
  # List SCIM users for your organization's identity provider
  chainctl iam identity-providers scim users list
  
  # List for a specific identity provider, showing only active users
  chainctl iam identity-providers scim users list my-idp --active
  
  # Find a provisioned user by their SCIM userName
  chainctl iam identity-providers scim users list --user-name=alice@example.com
```

### Options

```
      --active               Show only active users.
      --external-id string   Filter by exact IdP-assigned externalId.
      --inactive             Show only inactive (deprovisioned) users.
      --user-name string     Filter by exact SCIM userName (case-insensitive).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim users](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_users/)	 - Inspect the SCIM-provisioned users of an identity provider.

---

### chainctl iam account-associations describe
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_describe.md_

## chainctl iam account-associations describe

Describe cloud provider account associations for a location.

```
chainctl iam account-associations describe ORGANIZATION_NAME|ORGANIZATION_ID|FOLDER_NAME|FOLDER_ID [--aws] [--gcp] [--chainguard] [--output=id|json|table] [flags]
```

### Options

```
      --aws          Include the AWS account association.
      --chainguard   Include the Chainguard service principal account association.
      --gcp          Include the GCP account association.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations/)	 - Configure and manage cloud provider account associations.

---

### chainctl images helm add-chart
_Path: platform/chainctl/chainctl-docs/chainctl_images_helm_add-chart.md_

## chainctl images helm add-chart

Add a Chainguard Helm chart and its image dependencies to an organization.

### Synopsis

Add a Chainguard Helm chart and its image dependencies to an organization.

Creates synced image repositories in the destination organization for the given
Helm chart and all image dependencies listed in the chart's metadata. Repositories
that already exist in the destination organization are skipped. All tags are synced.

Charts are looked up by name in the community catalog by default. To add a chart
from the iamguarded catalog, prefix the name with "iamguarded-charts/".

The chart's image dependencies are read from a single chart tag. By default the
newest non-FIPS tag is used; pass --tag to inspect a specific chart version
instead (including a FIPS variant).

Examples:
  # Add the argo-cd community chart and all of its image dependencies to an organization
  chainctl images helm add-chart argo-cd --parent my-org

  # Add a specific version of the argo-cd chart
  chainctl images helm add-chart argo-cd --tag 9.5.20 --parent my-org

  # Add the redis iamguarded chart and all of its image dependencies to an organization
  chainctl images helm add-chart iamguarded-charts/redis --parent my-org

```
chainctl images helm add-chart CHART [flags]
```

### Options

```
      --dry-run         Dry-run mode: don't create repos, only show what would change.
      --parent string   The organization to add the chart and its images to.
      --tag string      The chart tag to inspect for image dependencies. Defaults to the newest non-FIPS tag.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images helm](/platform/chainctl/chainctl-docs/chainctl_images_helm/)	 - Helm chart related commands

---

### chainctl libraries policy binding list
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding_list.md_

## chainctl libraries policy binding list

List Libraries policy bindings.

### Synopsis

List active Libraries policy bindings to see which policies are enabled and in which mode.

```
chainctl libraries policy binding list [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Options

```
      --parent string   The name or id of the organization to list bindings for.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy binding](/platform/chainctl/chainctl-docs/chainctl_libraries_policy_binding/)	 - Manage Libraries policy bindings.

---

### chainctl policy binding delete
_Path: platform/chainctl/chainctl-docs/chainctl_policy_binding_delete.md_

## chainctl policy binding delete

Delete a policy binding.

### Synopsis

Delete a policy binding to deactivate a policy for its bound scope.

Removing a binding disables the policy — image pulls will no longer be
checked against it.

You can pass a binding ID directly as a positional argument, or use
--policy to specify the policy name and --parent to identify the
organization if needed.

```
chainctl policy binding delete [BINDING_ID | --policy POLICY] [--parent ORG] [flags]
```

### Examples

```
  # Delete a binding by ID
  chainctl policy binding delete <binding-id>
  
  # Delete a binding by policy name
  chainctl policy binding delete --policy=no-eol --parent=engineering
```

### Options

```
      --parent string   The name or id of the organization (required when deleting by policy).
      --policy string   The name or id of the policy to disable.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy binding](/platform/chainctl/chainctl-docs/chainctl_policy_binding/)	 - Manage policy bindings.

---

### chainctl images repos build apply
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_build_apply.md_

## chainctl images repos build apply

Apply a build config

### Synopsis

Apply a pre-written YAML configuration file, custom certificates, and/or runtime repositories to customize one or more Chainguard images.

You can use Custom Assembly to customize any image you are entitled to by
adding packages from Chainguard's repository, setting environment variables,
adding OCI annotations, customizing user accounts and groups, or including
custom certificates. The customized image is built automatically without
requiring you to fork images or maintain custom build pipelines.

This command applies Custom Assembly configurations without opening an interactive
editor. Use this for automated workflows, CI/CD pipelines, or when you have
configuration files managed in version control.

You can create variants by choosing to save the customized configuration as a
new repository instead of modifying the existing one (single-repo only).

How it works:

You can customize the image by providing configuration through a YAML file,
certificates, runtime repositories, or any combination.

At least one of --file, --with-certificates, --with-runtime-repositories, or
--with-runtime-keys must be provided. When --file is used alone, the YAML
configuration from the file is applied as-is. When only flags are used, only
those values will be applied to the image. When multiple inputs are provided,
they are merged together.

The command validates the resulting configuration and displays a diff comparing
it to the current repository configuration (or an empty baseline for new
repositories). After reviewing the diff, you confirm the changes. The command
then updates the repository configuration and starts a custom build automatically.

Batch mode:

Apply the same config to multiple repos by passing --repo multiple times, or by using a wildcard pattern. Supported syntax: * matches any string, ? matches a single character, [abc] matches a character class:

  - --repo=nginx --repo=redis   Target explicit repos
  - --repo="nginx*"             Match repos whose name starts with "nginx"
  - --repo="*"                  Match all repos under the group
  - --repo="*fips*"             Match repos containing "fips" in the name

In batch mode the command shows per-repo diffs, then asks for a single confirmation before applying all matched repos in parallel (up to 10 concurrent). Results are printed as a summary at the end. --save-as is not available in batch mode.

Dry-run mode:

Pass --dry-run to preview changes without applying them. No confirmation is requested and no changes are made. Exits with a non-zero code if changes would be applied, suitable for CI drift detection.

Customizable sections:

  contents.packages
    Add additional packages to install in the image (e.g., development tools,
    utilities). Packages must be available in Chainguard's package repository.
    Package names may include the {{major}} and {{minor}} template tokens,
    which expand to the corresponding components of the base image's main
    package version at build time. For example, "py{{major}}.{{minor}}-cryptography"
    becomes "py3.13-cryptography" on an image whose main package is
    python-3.13, and tracks the base image as its version moves.

  contents.runtime_repositories
    Add APK repositories to /etc/apk/repositories in the image for runtime
    package installation. When set, these replace the default virtualapk.cgr.dev
    repositories. Must be HTTPS URLs.

  contents.runtime_keyring
    Trust additional APK signing public keys for the runtime repositories
    (e.g., a re-signing mirror). Each entry has a name and a PEM PUBLIC KEY
    content; the key is written to /etc/apk/keys under its name, which must
    match the filename referenced by the repository's APKINDEX signature
    (.SIGN.RSA256.<name>). Keys can also be loaded from files using the
    --with-runtime-keys flag.

  environment
    Set environment variables that will be available in the image. Variables
    with the 'CHAINGUARD_' prefix are reserved and cannot be used.

  annotations
    Add custom OCI annotations to the image for tracking build information,
    compliance, or metadata. Keys with the 'dev.chainguard' prefix are reserved
    and cannot be used.

  accounts
    Customize image users and groups. You can define custom users with specific
    UIDs/GIDs, home directories, and group memberships. You can also specify
    which user the image should run as.

  certificates
    Provide custom certificates that will be merged with the default certificate
    bundle in the image. This is useful for adding internal CA certificates.
    Certificates can be defined in the YAML manifest or loaded from files using
    the --with-certificates flag (can be specified multiple times). Both methods
    can be combined and all certificates are merged together.
    NOTE: This is a Beta feature that requires enrollment. Contact your Customer
    Success Team to enable this feature.

Notice: Customer shall not provide Chainguard any personal data (or similarly regulated data)
as part of the Custom Assembly tool, other than the personal data that Chainguard collects in
the ordinary course of business, as further detailed in its
[Privacy Notice](https://www.chainguard.dev/legal/privacy-notice).

```
chainctl images repos build apply [flags]
```

### Examples

```

# Apply configuration from a file (interactive repo selection)
chainctl images repos build apply --file=config.yaml

# Apply to a specific repository
chainctl images repos build apply --repo=my-custom-python --file=config.yaml

# Apply and save as a new repository
chainctl images repos build apply --repo=my-custom-python --file=config.yaml --save-as=my-new-python

# Apply with automatic confirmation (for CI/CD)
chainctl images repos build apply --repo=my-custom-python --file=config.yaml --yes

# Add only custom certificates (no config file needed)
chainctl images repos build apply --repo=my-custom-python --with-certificates=ca1.pem --with-certificates=ca2.pem

# Set custom runtime APK repositories (replaces default virtualapk.cgr.dev)
chainctl images repos build apply --repo=my-custom-python --with-runtime-repositories=https://apk-mirror.example.com/chainguard

# Set multiple runtime repositories
chainctl images repos build apply --repo=my-custom-python --with-runtime-repositories=https://apk-mirror.example.com/chainguard,https://apk-mirror.example.com/extras

# Add custom certificates alongside a config file
chainctl images repos build apply --repo=my-custom-python --file=config.yaml --with-certificates=ca1.pem --with-certificates=ca2.pem

# Apply to all repos under a group (batch mode)
chainctl images repos build apply --parent=my-org --repo="*" --file=config.yaml

# Apply to repos matching a wildcard pattern (batch mode)
chainctl images repos build apply --parent=my-org --repo="nginx*" --file=config.yaml

# Apply to multiple explicit repos (batch mode)
chainctl images repos build apply --repo=nginx --repo=nginx-fips --file=config.yaml

# Batch apply with automatic confirmation (for CI/CD)
chainctl images repos build apply --parent=my-org --repo="*" --file=config.yaml --yes

# Dry-run: preview changes without applying (exits 1 if diff detected)
chainctl images repos build apply --repo=my-custom-python --file=config.yaml --dry-run

# Dry-run across all repos (useful for CI drift detection)
chainctl images repos build apply --parent=my-org --repo="*" --file=config.yaml --dry-run

```

### Options

```
      --dry-run                             Print the diff without applying changes. Exits with a non-zero code if changes would be made.
  -f, --file string                         The name of the file containing the build config.
      --parent string                       The name or id of the parent location to apply build config. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --repo stringArray                    The name or id of the repo to apply build config. Supports wildcards (*, ?, [abc]). Can be specified multiple times.
      --save-as string                      Create a new repo with the edited configuration instead of updating the existing one.
      --with-certificates strings           Comma separated list of files to read the custom certificates from.
      --with-runtime-keys strings           Comma separated list of files to read customer APK signing public keys from. Each file becomes a key in /etc/apk/keys named after the file's basename, which must match the filename referenced by the repository's APKINDEX signature (.SIGN.RSA256.<name>).
      --with-runtime-repositories strings   Comma separated list of runtime APK repository URLs to write to /etc/apk/repositories in the image.
  -y, --yes                                 Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos build](/platform/chainctl/chainctl-docs/chainctl_images_repos_build/)	 - Manage custom image builds

---

### chainctl libraries policy disable
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_policy_disable.md_

## chainctl libraries policy disable

Disable a Libraries policy for an organization.

### Synopsis

Disable a Libraries policy by deleting its binding. If --mode is omitted, both
the ENFORCE and PREVIEW bindings for the (organization, ecosystem) are deleted.

```
chainctl libraries policy disable [POLICY] [--parent ORG] [--ecosystem ECOSYSTEM] [--mode ENFORCE|PREVIEW] [flags]
```

### Options

```
      --ecosystem string   The ecosystem the binding applies to (JAVA, JAVASCRIPT, PYTHON).
      --mode string        The binding mode (ENFORCE or PREVIEW).
      --parent string      The name or id of the organization to scope the binding to.
      --policy string      The name or UIDP of the policy. Provide this or the positional argument, not both.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries policy](/platform/chainctl/chainctl-docs/chainctl_libraries_policy/)	 - Manage Libraries policies.

---

### chainctl policy custom create
_Path: platform/chainctl/chainctl-docs/chainctl_policy_custom_create.md_

## chainctl policy custom create

Create a custom policy.

### Synopsis

Create a custom policy from a YAML manifest, or from a raw Rego
expression as a shortcut for parameterless policies.

Two modes are supported:

  --file: creates a policy from a full YAML manifest (name, description,
  expression, supported_resource_type, and optional parameters). Use
  this when your policy declares parameters.

  --expression: creates a parameterless policy directly from a raw .rego
  file. --name and --resource-type are required in this mode;
  --description is optional. Policies with parameters must be authored as
  a manifest and passed via --file.

Policy expressions must be declared under `package chainguard.policies` and
must define an `allow` rule (start from `default allow := false` and
add an `allow if { ... }` block); validation rejects a module defining neither.

A minimal manifest looks like:

```yaml
name: my-policy
description: What this policy enforces.
supported_resource_type: registry.chainguard.dev/Repo@v1
expression_type: EXPRESSION_TYPE_REGO
parameters:                       # optional; omit for parameterless policies
  - name: days
    type: PARAMETER_TYPE_INTEGER  # STRING | INTEGER | BOOLEAN | STRING_LIST
    description: Minimum age in days.
    default: 7
    minimum: 1
    maximum: 365
expression: |
  package chainguard.policies
  import rego.v1

  default allow := false

  allow if {
    # replace with your real conditions
    input.parameters.days >= 1
  }
```

Each parameter accepts: name, type (a PARAMETER_TYPE_* value), description,
default, minimum, maximum, allowed_values, required, deprecated.

--resource-type accepts a shorthand (Repo, Java, Javascript, Python) or a
full type:
  - Repo       -> registry.chainguard.dev/Repo@v1
  - Java       -> libraries.chainguard.dev/JavaPackage@v1
  - Javascript -> libraries.chainguard.dev/NPMPackage@v1
  - Python     -> libraries.chainguard.dev/PythonPackage@v1

The resource type is set at create time and cannot be changed later.
Within an organization, (name, resource type) is unique. The same name
may be reused across different resource types.

A manifest whose rule reads the same for every ecosystem may name them
all at once with the repeated `supported_resource_types` in place of the
scalar `supported_resource_type`:

```yaml
supported_resource_types:
  - libraries.chainguard.dev/NPMPackage@v1
  - libraries.chainguard.dev/PythonPackage@v1
  - libraries.chainguard.dev/JavaPackage@v1
```

That creates one policy per entry, all sharing the manifest's name. A
resource type that already carries a policy of this name is skipped and
reported, so a re-run fills in whichever types are missing.

For an authoritative live example, inspect a system policy with
`chainctl policy describe --policy <name> -o json`.

```
chainctl policy custom create --file POLICY.yaml | --expression POLICY.rego --name NAME --resource-type TYPE [--parent ORGANIZATION_NAME | ORGANIZATION_ID] [--output=json|table] [flags]
```

### Examples

```

# Create a custom policy from a full manifest
chainctl policy custom create --file policy.yaml --parent example.com

# Create a parameterless policy from a raw Rego expression
chainctl policy custom create --expression allow.rego --name allow-all \
  --resource-type Repo --parent example.com

```

### Options

```
      --description string     Human-readable description of the policy. Only valid with --expression.
  -e, --expression string      Path to a Rego expression (.rego) file. Shortcut for parameterless policies; requires --name and --resource-type.
  -f, --file string            Path to a policy manifest YAML file.
      --name string            Policy name. Required with --expression.
      --parent string          The name or id of the organization to create the policy under. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --resource-type string   The resource type the policy applies to (shorthand: Repo, Python, Java, Javascript; or a full type). Required with --expression.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl policy custom](/platform/chainctl/chainctl-docs/chainctl_policy_custom/)	 - Manage your custom policies.

---

### chainctl iam roles
_Path: platform/chainctl/chainctl-docs/chainctl_iam_roles.md_

## chainctl iam roles

IAM role resource interactions.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam](/platform/chainctl/chainctl-docs/chainctl_iam/)	 - IAM related commands for the Chainguard platform.
* [chainctl iam roles capabilities](/platform/chainctl/chainctl-docs/chainctl_iam_roles_capabilities/)	 - IAM role capabilities
* [chainctl iam roles create](/platform/chainctl/chainctl-docs/chainctl_iam_roles_create/)	 - Create an IAM role.
* [chainctl iam roles delete](/platform/chainctl/chainctl-docs/chainctl_iam_roles_delete/)	 - Delete a custom IAM role.
* [chainctl iam roles list](/platform/chainctl/chainctl-docs/chainctl_iam_roles_list/)	 - List IAM roles.
* [chainctl iam roles update](/platform/chainctl/chainctl-docs/chainctl_iam_roles_update/)	 - Update an IAM role.

---

### chainctl iam identity-providers group-mappings create
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_create.md_

## chainctl iam identity-providers group-mappings create

Create an IdP group-to-role mapping.

```
chainctl iam identity-providers group-mappings create IDENTITY_PROVIDER --external-group-id GROUP --role ROLE --scope SCOPE [flags]
```

### Examples

```
  # Map IdP group "Platform-SRE" to the owner role at the org root
  chainctl iam identity-providers group-mappings create my-idp --external-group-id "Platform-SRE" --role owner --scope my-org
```

### Options

```
      --external-group-id string   IdP group identifier (the claim value from the IdP token)
      --role string                Role UIDP or name to grant
      --scope string               Organization or group (name or UIDP) where the role applies
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers group-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings/)	 - Manage IdP group-to-role mappings for an identity provider.

---

### chainctl iam folders update
_Path: platform/chainctl/chainctl-docs/chainctl_iam_folders_update.md_

## chainctl iam folders update

Update a folder.

```
chainctl iam folders update FOLDER_NAME | FOLDER_ID [--name FOLDER_NAME] [--description FOLDER_DESCRIPTION]
```

### Examples

```

# Update a folder's name
chainctl iam folders update my-folder --name new-folder-name

# Update a folder's description
chainctl iam folders update 19d3a64f20c64ba3ccf1bc86ce59d03e705959ad/efb53f2857d567f2 --description "A description of the folder."

# Remove a folder's description
chainctl iam folders update my-folder --description ""
```

### Options

```
  -d, --description string   The updated description for the folder.
  -n, --name string          The updated name for the folder.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam folders](/platform/chainctl/chainctl-docs/chainctl_iam_folders/)	 - IAM folders interactions.

---

### chainctl iam identity-providers scim token regenerate
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_regenerate.md_

## chainctl iam identity-providers scim token regenerate

Regenerate the SCIM bearer token for an identity provider.

### Synopsis

Regenerate the SCIM bearer token, whether the current one is live, expired, or revoked. A live token keeps authenticating for the overlap window (at most 24h) while the IdP connector is reconfigured with the new one. The new plaintext token is shown exactly once. If the current token may be exposed, do not rely on the overlap: revoke it, or regenerate with --overlap 0 for an immediate cutover.

```
chainctl iam identity-providers scim token regenerate IDENTITY_PROVIDER [--output=json] [flags]
```

### Examples

```
  # Regenerate with a one-hour overlap for reconfiguring the IdP
  chainctl iam identity-providers scim token regenerate my-idp --overlap 1h

  # Regenerate with a one-year expiry and an immediate cutover
  chainctl iam identity-providers scim token regenerate my-idp --overlap 0 --expires-in 8760h
```

### Options

```
      --expires-in duration   How long until the new token expires (maximum two years). Unset defaults to one year.
      --never-expires         Explicitly issue a token without a planned expiry.
      --overlap duration      How long a live previous token keeps authenticating (at most 24h). 0 cuts over immediately; unset defaults to one hour.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim token](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token/)	 - Manage the SCIM provisioning bearer token for an identity provider.

---

### chainctl iam account-associations unset
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset.md_

## chainctl iam account-associations unset

Remove cloud provider account associations from a location.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations/)	 - Configure and manage cloud provider account associations.
* [chainctl iam account-associations unset aws](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_aws/)	 - Remove AWS account configuration for a location.
* [chainctl iam account-associations unset azure](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_azure/)	 - Remove AZURE account configuration for a location.
* [chainctl iam account-associations unset gcp](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_unset_gcp/)	 - Remove GCP account configuration for a location.

---

### chainctl actions catalog list
_Path: platform/chainctl/chainctl-docs/chainctl_actions_catalog_list.md_

## chainctl actions catalog list

List Chainguard Actions in the public catalog.

```
chainctl actions catalog list [--upstream-owner=OWNER [--upstream-repo=REPO]] [--output=json|table] [flags]
```

### Options

```
      --page-size int32         Maximum number of actions to fetch per page (0 uses the server default).
      --upstream-owner string   Filter to actions mirroring this upstream owner (e.g. "actions").
      --upstream-repo string    Filter to actions mirroring this upstream repo (requires --upstream-owner).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl actions catalog](/platform/chainctl/chainctl-docs/chainctl_actions_catalog/)	 - Browse the public Chainguard Actions catalog.

---

### chainctl libraries packages count
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_packages_count.md_

## chainctl libraries packages count

Count Libraries packages per ecosystem.

### Synopsis

Report the total number of packages available in the Chainguard Libraries catalog, optionally scoped to a single ecosystem.

```
chainctl libraries packages count [--output=json|table] [flags]
```

### Options

```
      --ecosystem string   The ecosystem to count packages for (JAVA, JAVASCRIPT, PYTHON).
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries packages](/platform/chainctl/chainctl-docs/chainctl_libraries_packages/)	 - Inspect Libraries packages.

---

### chainctl images repos build logs
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_build_logs.md_

## chainctl images repos build logs

Get build logs

```
chainctl images repos build logs [flags]
```

### Options

```
      --build-id string   The id of the build to get logs for.
      --parent string     The name or id of the parent location to get build logs. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --repo string       The name or id of the repo to get build logs.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos build](/platform/chainctl/chainctl-docs/chainctl_images_repos_build/)	 - Manage custom image builds

---

### chainctl starter status
_Path: platform/chainctl/chainctl-docs/chainctl_starter_status.md_

## chainctl starter status

Show catalog starter organization status, quota, and image readiness.

### Synopsis

Show the status of your catalog starter organization.

Reports the registry path, account provisioning status, image quota
usage, and per-image readiness — INITIALIZING until the catalog
syncer has both created the repo and mirrored at least one tag, READY
afterwards.

Use this command to check whether a newly-added image is pullable yet,
or to confirm your starter org has finished provisioning before
running 'chainctl starter add-images'.

```
chainctl starter status [flags]
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl starter](/platform/chainctl/chainctl-docs/chainctl_starter/)	 - Manage catalog starter organizations

---

### chainctl iam account-associations set
_Path: platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set.md_

## chainctl iam account-associations set

Set cloud provider account associations for a location.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam account-associations](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations/)	 - Configure and manage cloud provider account associations.
* [chainctl iam account-associations set aws](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_aws/)	 - Set AWS account association for a location.
* [chainctl iam account-associations set azure](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_azure/)	 - Set AZURE account association for a location.
* [chainctl iam account-associations set gcp](/platform/chainctl/chainctl-docs/chainctl_iam_account-associations_set_gcp/)	 - Set GCP account association for a location.

---

### chainctl libraries cache opt-out
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache_opt-out.md_

## chainctl libraries cache opt-out

Opt the org out of the resolution cache.

### Synopsis

Opt the org out of the resolution cache: it stops recording resolutions and
recorded ones stop being enforced, so every fetch resolves to the current
best tier. Recorded entries are retained; opting back in resumes from them.

```
chainctl libraries cache opt-out [--ecosystem ECOSYSTEM] [--parent ORG] [flags]
```

### Options

```
      --ecosystem string   Change one ecosystem (JAVA, PYTHON, JAVASCRIPT). Omit for all ecosystems.
      --parent string      The name or id of the organization whose opt-out to change.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.

---

### chainctl iam identity-providers list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_list.md_

## chainctl iam identity-providers list

List identity providers.

```
chainctl iam identity-providers list [--parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID] [--recursive] [--output=json|table|tree]
```

### Examples

```
  # List identity providers
  chainctl iam identity-providers list
  
  # Filter list by location
  chainctl iam identity-providers list --parent=my-org
  
  # List only identity providers directly in an organization, excluding nested locations
  chainctl iam identity-providers list --parent=my-org --recursive=false
```

### Options

```
      --parent string   List identity providers from this location. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --recursive       List identity providers from the parent location and all nested locations. Set to false to list only the parent location. (default true)
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers/)	 - customer managed identity provider management

---

### chainctl iam identity-providers scim token revoke
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token_revoke.md_

## chainctl iam identity-providers scim token revoke

Revoke the SCIM bearer token for an identity provider.

### Synopsis

Immediately invalidate the identity provider's SCIM bearer tokens (current and regeneration-overlap). No SCIM request can authenticate until a new token is issued, so inbound provisioning stops at once. Regenerate to install a fresh credential.

```
chainctl iam identity-providers scim token revoke IDENTITY_PROVIDER [--yes] [flags]
```

### Options

```
  -y, --yes   Skip confirmation prompt
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers scim token](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_scim_token/)	 - Manage the SCIM provisioning bearer token for an identity provider.

---

### chainctl images repos create
_Path: platform/chainctl/chainctl-docs/chainctl_images_repos_create.md_

## chainctl images repos create

Create an image repository.

```
chainctl images repos create {REPO_NAME} --parent ORGANIZATION_NAME | ORGANIZATION_ID | FOLDER_NAME | FOLDER_ID --tier=APPLICATION|BASE|FIPS|AI|DEVTOOLS|COMMERCIAL
```

### Options

```
      --description string   Description for the repo (max 255 characters).
      --parent string        The name or id of the parent location to create an image repo. Defaults to the default.group config value (env: CHAINGUARD_DEFAULT_GROUP).
      --source string        Repository ID to sync from.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl images repos](/platform/chainctl/chainctl-docs/chainctl_images_repos/)	 - Image repo related commands for the Chainguard platform.

---

### chainctl libraries cache opt-in
_Path: platform/chainctl/chainctl-docs/chainctl_libraries_cache_opt-in.md_

## chainctl libraries cache opt-in

Opt the org back into the resolution cache.

### Synopsis

Opt the org back into the resolution cache after an opt-out. Recording and
enforcement resume from the retained entries.

```
chainctl libraries cache opt-in [--ecosystem ECOSYSTEM] [--parent ORG] [flags]
```

### Options

```
      --ecosystem string   Change one ecosystem (JAVA, PYTHON, JAVASCRIPT). Omit for all ecosystems.
      --parent string      The name or id of the organization whose opt-out to change.
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl libraries cache](/platform/chainctl/chainctl-docs/chainctl_libraries_cache/)	 - Manage the Libraries resolution cache.

---

### chainctl events
_Path: platform/chainctl/chainctl-docs/chainctl_events.md_

## chainctl events

Events related commands for the Chainguard platform.

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl](/platform/chainctl/chainctl-docs/chainctl/)	 - Chainguard Control
* [chainctl events subscriptions](/platform/chainctl/chainctl-docs/chainctl_events_subscriptions/)	 - Subscription interactions.

---

### chainctl iam identity-providers group-mappings list
_Path: platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings_list.md_

## chainctl iam identity-providers group-mappings list

List an identity provider's group-to-role mappings.

```
chainctl iam identity-providers group-mappings list IDENTITY_PROVIDER [flags]
```

### Examples

```
  # List all group mappings for an identity provider
  chainctl iam identity-providers group-mappings list my-idp
```

### Options inherited from parent commands

```
      --api string         The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string    The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string      A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string     The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --force-color        Force color output even when stdout is not a TTY.
  -h, --help               Help for chainctl
      --issuer string      The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
      --log-level string   Set the log level (debug, info) (default "ERROR")
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
  -v, --v int              Set the log verbosity level.
```

### SEE ALSO

* [chainctl iam identity-providers group-mappings](/platform/chainctl/chainctl-docs/chainctl_iam_identity-providers_group-mappings/)	 - Manage IdP group-to-role mappings for an identity provider.

---

### Inside the Chainguard Factory - Assemble 2025
_Path: platform/factory/assemble.md_

{{< youtube iU9hmW6hrGs >}}

## Transcript

**Sam (Introduction)**: We're very fortunate our Vice President of Engineering, Dustin Kirkland, is going to be walking us through the Chainguard Factory, which you would have heard a little bit about during the keynote today. So I'll go ahead and turn things over to Dustin. We will have time at the end for questions, so keep that in mind. Thank you.

**Dustin Kirkland**: All right, thank you Sam. Cool, so thank you for joining us. This is the technical session we can call it a factory tour. I once went on a factory tour when I was, I don't know, a teenager or so to the Corvette factory in Bowling Green, Kentucky, and I still think back to that—what a cool experience that was. Once upon a time, we've got a lot of analogies in here that, you know, sort of point to what we build is a lot like a modern automotive factory.

### Overview

So just an overview of what we're going to talk about and hopefully what you can take away from this. We've built a new operating system distro designed from the ground up, completely modern, overwhelmingly using cloud technologies and automation in a way that has provided tremendous advantages and opportunities to scale this and secure the entire software supply chain. That's a bold statement, but I'm going to walk you through some of how that comes together.

At the heart of that is a factory, and we really call it that because flowing through the factory constantly is a ton of inputs: source code, open source code, third-party libraries, compilers, tool chains, scripting languages, runtimes—all of that assimilates together into a software system that our customers can then build and depend on, build their own software on top of and depend on in production. And then we're going to pull all of that together with what we call the Chainguard Operating System, and it truly is an OS from end to end. I would say now that we have added this capability to run full operating systems inside of virtual machine environments and then stripe that across other OSs with our libraries product.

Just a little bit about my background: I have spent two halves of my career—one as an engineer and a second as a product manager. I've also spent two halves of my career—one with some of the world's biggest companies (IBM, Google, and Goldman Sachs) and then another in startups and growth mode. And so with that comes a lot of experience and a real personal interest in solving the operating system Linux distro security problem and fitting that into the overall mission of Chainguard to secure the software supply chain.

### Our SLA: The foundation

All right, we're going to kick this off and start with our SLA—our service level agreement. This is what it says, this is on our website. Not everyone publishes their SLA on the website—we do publish our SLA on the website, and this is the fine print. This says that Chainguard will remediate security vulnerabilities that are rated critical within seven calendar days and highs, mediums, and lows within 14 calendar days. Seven and 14—we remediate criticals within seven, highs, mediums, and lows within 14.

Where did those numbers come from? That actually came from FedRAMP, believe it or not. Is anyone here subject to FedRAMP requirements directly or indirectly? Have you read the FedRAMP spec? Yes, exactly. I'll zoom into the most important piece, which is 30, 90, and 180. This is what FedRAMP says: if you are a vendor selling software or services to the government, you've got 30, 90, or 180 days to remediate those vulnerabilities. This is the piece on page 97 1.5 where this comes into focus.

What this actually looks like from a Chainguard perspective is this right here: an nginx image that is completely free of CVEs as of 15 hours ago when these screenshots were taken. And there's a bit of data in here in terms of when the image was updated—less than a week before that—and it was scanned on a daily or an hourly basis constantly. So if you care about, say, nginx, you're not worried about meeting those 30, 90, or 180-day obligations. As long as you're using the latest Chainguard image, you will have those CVEs remediated for you.

Now I said seven and 14. In actuality, it takes us less than two days typically to remediate a CVE that we even know exists. And I want to add that last asterisk in there: there are hundreds of CVEs that are remediated that you never even see, that we never even see, that are getting fixed upstream before the scanner is able to find that inside of a Chainguard image—it's gone. I'm not even waiting, using those effectively zeros that would stack that histogram even more. Our average time to remediate any CVE that we know about is actually under two.

Here's a pie chart of all of the CVEs that we've known about since January 1st of this year. So this is year to date with 65% within two days, 28% within seven, the pink within 14—6% within 14. What's that last sliver? Less than a half a percent. These are CVEs that are either still awaiting an upstream fix typically, at which point we work as quickly as possible to patch and remediate that, rebuild that as soon as upstream has that fix available.

### How we do it: The Factory

How do we do that? It's the factory. We are continuously rebuilding the entirety of the Chainguard OS. So let's dig into some of those pieces.

First of all, this is the hard part: we build from source. Yes, everything, constantly. I want to make that part abundantly clear, especially for anyone who's maybe new to the Chainguard story. We are not a derivative of any other operating system. We don't start with Debian or Fedora or Alpine or any other Linux and harden that. And that's a little bit different than some of the other alternatives to Chainguard's technology. We literally start at the source code—the tarballs or the git checkouts—and build everything from scratch, including the compilers. We've bootstrapped the actual tool chain itself all the way down to GCC.

And so a change in GCC, the C compiler that underpins almost everything including Python, including Java and C bindings—we rebuild everything up from that. That takes a lot of, first of all, expertise, but a whole lot of automation in order to do that.

### The Wolfi OS repository

So this is just one piece of our OS. This is the Wolfi Dev OS. This is a snapshot from GitHub. You can see that this gigantic mono repo had 2,600 entries, and it shows a thousand but there's another 2,600. These are our source packages. And it's just for the piece that we call Wolfi, which is this open source core, with 63,000 commits, and that's going up by a couple hundred commits per day. Many of those are driven by our automation. Our automation is a bot that we call Octos, and it's what enables us to securely do this in GitHub and GitHub Actions itself.

### Package building example: sed

Securely, this is what a single package looks like to build, and this is a lot simpler. I've long been a packager of Debian packages and Fedora packages. The fact that we can define the entirety of the sed package—my favorite editor, I don't know, anyone else a sed fan? If I need to edit a file, this is the way I'm going to do it.

This is sed 4.9, which is the latest version. You can see the version, the name, the epoch, the build, and then the URI—the URL where to get that from. And this is a GNU package, the tarball and the expected SHA. If that changes—and we have monitors that are constantly watching this—as soon as that changes upstream, our automation will kick in and download the new tarball. We'll apply these same build rules, the build configure rules, the test against it. We'll then, if it passes, we'll republish that, and then we'll restart building all the images that might include sed inside of it.

### Vim example

For those who are not sed fans for editing their files, we've also got a Vim example. All of 77 lines. And again, to compare this to another distro's package manager, that's going to be dozens of files in a directory. It's going to be probably hundreds of lines of code and a stack of carried patches. There are no carried patches against either of these, so this is farm-to-market pure, straight from the upstream source with easy to view build rules, configure build rules.

And you can see some of these have, you know, security implications. Without X, this is going to be a command line-only Vim that cuts out a whole bunch of code and vulnerabilities that might come along with code that's not necessarily needed. There's also a handful of tests, so every almost every one of our packages itself includes tests that have to run and execute and succeed at the package build time, or else the package itself doesn't get published, which means that, you know, we'll hold that back and that will need to get attention from one of our engineers who's going to dig into what we need to fix in order to satisfy that build or those tests.

### Git-based packages

So this one is just slightly different in that we're not fetching a tarball. We actually prefer, much prefer to fetch directly from a git repo at a particular tagged version. And again, we will check that expected commit and that hash. Again, we've got these watchers—event-driven automation that's constantly watching for a new commit to, or sorry, a new tagged release from any of the 6,000 source packages that we're monitoring. As soon as that happens, within minutes we trigger a whole new build, which then creates this entire directed acyclic graph, a DAG tree of all the other things that we're going to need to do based on the success criteria of each of those.

Vim is a little bit interesting in that the way that this open source project is set up, with every single commit, Vim auto-tags a new release, which is kind of crazy to think about. But typically within 30 minutes of the upstream Vim developer making a commit to Vim, we've already built and tested and published a whole new version of that package. Now this, of course, is a, you know, human interactive thing. This isn't making its way typically into your production containers, but to me it's just a great example of how fast we've taken that farm to market from that upstream open source developer straight to, you know, this distro itself and tested it.

### Automated updates

And this is what an update looks like. This was merged by Octos—that's our automated bot. This is all it took to bump the Vim package from version 9.1.189 to 9.1.194: a change in the version which affected the variable of the tag itself and then the difference in commit. With that, this package automatically rebuilt, retested, and made its way through the entirety of the process.

So this is a very, very important key point: we typically don't, except for exceptional circumstances, we typically don't backport patches from some cherry-pick from head of the open source project and try to munge that and make that work with a codebase that's months or potentially years and years old. Instead, we bring everything forward, fast forward to the latest and greatest release. And in doing so, that's how we solve many security vulnerabilities that will go unpatched in other distros because it's just not practical, possible, or feasible to backport that really complicated patch to an older codebase.

That's largely how we solve the lows and mediums, right? The highs and criticals are, you know, maybe possible with excessive effort to backport, but the lows and mediums you can't even fix typically in open source code without moving the entire codebase forward. So that's how we solve that.

Now we can and do carry patches when we have to, but it's typically for a very small period of time. It's usually just until that upstream maintainer tags a new release, then we can discard that patch and get right back onto the vanilla interpretation of that upstream maintainer's code. For the most part, you know, we have really good signals from maintainers who really prefer this approach. We're not creating some Frankenstein of the code that they've put their heart and soul into developing and building and maintaining. What we've done is really just taken a secure snapshot of that, and we keep it moving forward.

### Real-world impact

So this is like a random two-hour window from a couple of weeks ago of our backend build system catching new releases. And you can see that Grafana had a fix, had a new release going from 10.4 to 10.4.16 that addressed a CVE. You can see GitLab, you can see Helm and Argo and GCP and Azure. This was just like one little piece of one page during one hour of the automation doing its work, and you can see it fixing CVEs along the way.

In fact, you can zoom in a little bit and you can see the majority of these are happening by the Octos. So the actual bot that's constantly pushing the factory and pushing the factory forward. I'll actually zoom into the status of a couple of these, and you can see that for this snapshot, these three were in progress, not yet done—that's with the amber light, five of six tests complete. You can see the ones that completed successfully, checks all the way across the board. And then you can see some ones that needed a little bit more attention. This meant that five out of the six passed, but there was something else failing in the process. That's when we get a member of our sustaining team, an engineer who has expertise in this type of problem, to dig in and figure out, you know, what's gone wrong. But we estimate almost 90% of the time this is flowing through without any human interaction whatsoever.

### Security Advisories

So we start minimal, we fast forward, the third piece of the puzzle is publishing advisories—and a lot of them. We've got a couple of different advisory repositories. This is the one that maps to Wolfi, which was the open source package repository that I showed you before. Here we have some 1,200 files which are the advisory files. These are constantly growing YAML files with something like 17,000 commits and growing every single day.

This is what an advisory looks like, and these files can go on for hundreds and hundreds of lines. But I grabbed one for containerd. Containerd will have this stanza that tags a particular unique vulnerability. You can see this is 2023 CVE-2023-45283. There's a timestamp for when it was first found. Our research—and this one did involve human research—was that it was a false positive determination, and we documented why. This particular vulnerability only affects code in Windows. This is a container that is not running—this is not containerd running on Windows. Therefore, we provide this, we publish this, we attest this, and then we feed that information to the scanners. The scanners read these advisory files, and the scanner itself is able to provide you, the customer, the user of containerd scanning containerd with better information on is this actually a vulnerability. Because it's no good if you just get this fire hose of information that is, you know, unreadable. You know, if you're overwhelmed by false positives, you really stop trusting the value of your scanner itself.

### Scanner partnerships

This is something that you can't just DIY. You know, we're often asked, "Look, I've got a team," you know, we may be talking to a director of platform engineering, "Hey, I've got a team, they handle the vulnerability fixes." Well, what do they do? "Well, they're constantly apt-get update, apt-get upgrading our distro, and you know, we've got all the patches that the upstream distro has provided." Yeah, but what about the false positives? "Well, I mean, those we just kind of have to ignore."

Becoming a trusted source of advisory data to the actual scanner itself—that's a very privileged position. And we're delighted to partner with Snyk and Wiz and Grype and Trivy and X-Ray and Prisma amongst others as well and provide those advisories to them in a machine-readable format that's able to make the quality of that scanner information even better. If your favorite scanner isn't up here, please do come talk to the product team. We've definitely got people busy working on the right partnerships and ensuring that our trusted advisory data is accessible to them as well.

### The build and test pipeline

Okay, so with all of that, we're able to build, test, sign, publish packages as soon as any upstream project tags a release. And so this is what happens. I showed you the first piece—this is what's actually happening inside of the testing. You can see these are 19 checks and growing that we run. And you can see the Wiz scanners are running, we've got Malcontent, which is running looking for malicious data that might have been injected in the build. We've got static analysis, lint analysis, as well as the actual build process. I showed you the testing that we actually execute those binaries. We check the libraries, we check the SO files, we ensure that Python modules are loadable, Ruby modules are loadable and listable. And then, you know, we've got logs that we can drill into.

### Testing at scale

Now I really want to double down on the testing—the testing part. If I really have to talk about, you know, the place that we've invested most heavily, once we completed the initial build—build is great, but man, how do you trust a rolling distro? A distro that every time an upstream maintainer presses a release button that worked for them on their laptop, how do you trust that that's going to make its way through the Chainguard automation into production in your environment? And that is the testing.

So hopefully some people perked up at the quality part of the discussion. So I showed you some YAML files. We were going to pull GCC, all right, so a compiler. This one's now, this is a bigger build, this is 400 lines, but arguably one of the most important core critical pieces of an entire distro. We're going to zoom into this entire test section, which goes on for pages and pages. And I just pulled out one little piece for easily readable bit of C code, right? Hash includes stdio, int main, print, return zero. Doesn't do a whole lot, but this has to compile in order, you know, for the entire build to succeed. And that's not much, and there's a whole bunch of other things, but if this breaks, boy, I really don't want to get into, you know, what else is going to break. So let's fail early and fail often.

This is just one example. We've got, you know, somewhere around 3,500 open source package specifications in Wolfi itself, the vast majority of which have, you know, various degrees of testing. But that's just the functional verification—that's the FVT on the package itself.

### Image testing

If we go into the actual image testing, this is what an image test file is going to look like. And I'll zoom into, you know, once we've actually put that image together, we go and docker run that. And this is RabbitMQ, so we're actually running the RabbitMQ image and running it through its own tests—one, two, three, four shown right here. And we do that for every single image, and we ensure that that goes all the way through before we publish that image.

In some other cases, we've actually got to start up an entire Kubernetes, and we'll use K3s or we'll use EKS in Amazon. We've got to spin up a whole Kubernetes to test some of these images. And some of these image tests take orders of magnitude longer than the actual build. We may be able to build it within the first five or 10 or 15 minutes, but it may take a couple of hours to really put a core and critical image through full testing.

### The results: Our image catalog

All right, so how does that work in practice? And for those of you who might be prospects and not yet customers, maybe that sounds great, but you know, you don't believe us yet. Dan mentioned in the keynote we've got over 1,200 images. Again, these images were taken a couple of weeks ago—this was at 1,254 images, 1,200 and counting. There's a handful of different types of images that we've sort of grouped things into. We've got some customers who are more interested in the AI front, others are more interested in the base or the starter front. We've got, you know, some customers who use a single image and they start there. We've got others that leverage a handful, five or 10 images and get started. And then we've got some other customers who've gone all in on this, and Chainguard is the only way that their developers are allowed to build on, or they're encouraged to use.

### Public image view: PostgreSQL FIPS example

All right, so it's the factory that enables all of this at scale. Now let me show you what this looks like publicly. You could see this on images.chainguard.dev. This is PostgreSQL FIPS. This is the PostgreSQL database, this is with FIPS encryption enabled. So this is compiled against our OpenSSL FIPS libraries and ensures that if you're storing data and doing any cryptographic transactions on that data in PostgreSQL, you're doing so in accordance with the FIPS cryptography standard.

Here, starting on this page, you can see the versions. We've of course got multiple versions of that PostgreSQL FIPS image available. The latest and latest-dev are floating tags that move. You can see the dotted versions, you can see 17, 17.4, 16.8, all the way back to 15.12. You can see the last time those changed. And you know, the 24/7 rebuilding means that something inside of that PostgreSQL image changed, which meant that we had to rebuild that image because there was probably a security vulnerability somewhere in that image that needed to be addressed, and we addressed that by sucking in a newer version of that.

### Beyond containers: Virtual machines

Now what we heard from a number of customers over the last year was, "You know, that thing that you've done for containers, can you do that for our virtual machines and our libraries?" In particular on the virtual machine front, we had some customers who said, "Look, this is great. We've deployed Chainguard everywhere we can deploy it inside of the containers, but those containers are running on Amazon Linux hosts in AWS or EKS. They're a couple of years old, there's hundreds of unpatched vulnerabilities. I feel great about my container estate, but what about the thing running under my containers? And I've got hundreds of thousands of those."

So the first one to mention is that same factory—everything that I've talked about that powers the packages and the images front—we've extended to also produce virtual machine images. That meant that we had to add a couple of packages we didn't have before: a package called linux.yaml, which tracks Greg Kroah-Hartman (Greg KH)—he's the maintainer of the security stable tree, the LTS and the stable tree in the Linux kernel. Within minutes of Greg tagging a new release of Linux the kernel that fixes a CVE, our automation catches that and rebuilds that kernel on two different architectures across three clouds, as well as VMware and QEMU—so five different environments—and is constantly rebuilding that and applying, you know, multiple different kernel configs, hardened kernel configs on it.

We also had to add systemd, which is how a Linux system typically boots and manages the processes on it. And then for our initial target use case for this virtual machine image, we've targeted the container runner. So back to that customer feedback: "You've helped us with all of our container images, what about the thing running under the containers?"

So as of today, we've announced we have a Chainguard virtual machine running in Amazon EKS. You can bring your own node running Chainguard VM with a Chainguard hardened kernel, systemd, containerd, the cloud agents, the Amazon agents as well. And the other clouds are works in progress right now, as well as other formats.

### Libraries: Starting with Java

The other piece are our libraries. And we started very much with Java. The signal that we got was Java was the biggest pain point in some of the enterprise, especially financial services, healthcare, government organizations. And this idea that everything that these technologists are getting from a trusted source is great, but there's this other realm of dependencies that aren't as well understood yet, perhaps by the scanners number one, and by their developers number two. But I can guarantee you that the malicious actors out there in the world absolutely know about this. And you know, there's a long list of bodies, a trail of bodies where pulling in code from an untrusted third party has created real vulnerabilities.

So we've started rebuilding Java itself—Java archives, JARs—from source. To date, we've got 20,000 JARs, which include from our analysis the most heavily depended upon JARs across the last five years. And this covers about 98, 99% of the most used JARs over the last five years in dependencies. If it's not on the list, we can—we have a process by which we can add others as well. Java is the start. We're working on Python next. PyPI is the next target. That's a work in progress, and definitely come talk to us if you're interested in that.

### The Chainguard operating system

So that's containers, VMs, libraries, all built from source the hard way. It's that same factory that I've spent the last 30, 40 minutes talking about cranking through that. And then ultimately it's the Chainguard operating system that's powering all of this. It's at the core of it. It's not the value that we project as, you know, the thing that we've built, but it's the thing behind what we've built that enables all of this to go and go really fast.

### A personal story

So I thought I would tell you one little story, and this is pretty much the end of the presentation. I grew up in South Louisiana, and I was about 10 or 11 years old, and my uncle invited me to come help him dig a well—a water well. And I remember this like it was yesterday. Has anyone ever dug a well before? Wow, okay. I'm going to tell you how digging a well in South Louisiana works.

First of all, it's a lot of people, and this was very manual labor. It starts with a drill bit that's about this big and probably cost $20,000, okay? And then you attach to that drill bit a galvanized pipe, 10 foot long galvanized pipe, and you attach two pipe wrenches to it at 180 degrees, and you have two people that walk around in a circle and make that go down 10 feet. And when it goes down 10 feet, guess what you do? You take a galvanized coupler, you put another 10-foot pipe on the top of that, and you attach the pipe wrenches and walk around in a circle. And you do that 20 times because you need to go 200 feet deep to get to water, the water table in South Louisiana.

Now, thankfully we're drilling through swamp and not mud, and so that's why two humans can walk around in a circle. When you're done, you're not done, because remember that $20,000 bit I told you about? You got to get that back out of the ground. How do you get it back out of the ground? You walk all 20 of those pipes up, and then you replace the bit with—I forgot the name of it—but the filter you put at the bottom, and then you go right back down. It's a little easier going the second time around.

What I learned from this is that there are some things in life I love doing myself, and there are some things in life I do not love doing myself. And accessing drinkable water is one of those. The other one is security. Security is definitely something that I think if you can trust someone who's really good at doing what they do, you'll end up in a much better place. I hope that we, Chainguard, can be that for you. That's the end of my talk.

[Applause]

### Q&A session

**Sam**: Thank you, Dustin. We got about 10 minutes for questions. I believe we have somebody with a microphone, so I'll go ahead and open up the floor if anybody has any questions on what you just heard. We got some in the front here.

**Question 1**: Short and sweet—Twistlock. I didn't see it on the slide. I think there's a ton of presence in APAC. We'd love to see support for that.

**Dustin**: Twistlock, yes, on the scanners for sure. Very familiar with it. I know that we have some customers—we've got a list of things that we typically require doing in order to ensure that we can fully certify that. But Twistlock is definitely a common one. I think the driving reason was that I think Go series were not getting captured by active scan, and then a lot of time Twistlock was picking them up. Okay, one of the reasons. Noted.

**Question 2**: How do you skip some of those vulnerabilities from the scanners? Like you have mentioned that some of the vulnerabilities you are making some modifications which will—the scanners will not be able to find those, right? So one of that file which you are showing...

**Dustin**: So we ingest the CVE and the GHSA from GitHub and the National Vulnerability Database, so those are feeds that we consume. We run that through—I guess I didn't show that part of the factory—but yes, there's an ingestion piece. As soon as a vulnerability, especially a Go vulnerability gets published, we take that. That does typically hit a person, you know, hits a human who analyzes that. We'll rescore it. You know, there are places where things are certainly more severe than they're thought to be upstream. There are places where it might be super severe on Windows but is not applicable to us, so you know, we can raise and lower that. That's what drives the CVE automation side of things is consuming information from those feeds. The scanners also consume that information as well, and then what they have to do is map that against a whole bunch of different operating systems and versions and so forth. So part of working with Twistlock is ensuring that Twistlock understands Chainguard, our packaging system, our versioning system, and then ultimately our advisory feed format.

**Question 3**: Nice job, Dustin. The testing—so the unit tests and all the automated tests you showed, is that something you guys are maintaining yourselves or you're deriving from open source or some combination? Maybe you can talk through how you're building up the tests over time?

**Dustin**: Great question. Bit of both. Where there is an upstream test harness, we should be running that. And sometimes it's configure, make, make install, make test. We can do that, and that would fail at the build step. The runtime tests are largely things that we've generated or written ourselves. Some of it's automatically generated. If you had eagle eyes and you could see many of those were running whatever the binary is --help and --version, which doesn't do a whole lot functionally, but you know what has to happen in order for that thing to run? The linker, the loader, all of that had to work. And there are certainly cases where if you don't compile a thing right, running foo --version is just going to fail out. So we call those sniff tests. A couple of scripts that we created generated thousands of those, and that gave us at least a starting point to know that you can run vim --help. Now that's actually not editing a file, but in order for vim --help to work, it has to link against all of those binaries. There's a whole bunch of others that are much more sophisticated that configure, make file—sorry, that GCC hello world file. There are a bunch of others that, you know, with a little bit of sophistication you can test it out, you can run a thing and grep for some output, and we've created a bunch of those manually as well.

**Question 4**: So you've mentioned a lot of manual efforts around all these packages and writing the tests and making sure the CVEs rescore—that's like a lot of humans in the loop. How do you actually scale that, or do you even plan to trust AI/LLMs? How much do you trust them to do all of this work?

**Dustin**: Yeah, it may seem like a lot of humans. It's not. I mean, the entire engineering team at Chainguard is just about a hundred people. I think we're doing the work of 10,000 people using the automation. I would compare that to, you know, Debian, another distro that I've been involved in for a very long time. There are one or more human maintainers tied to every single Debian package. There's 25, 30,000 Debian packages with 25 or 30,000 or more emails associated with every one of those packages. And only a maintainer whose key has been signed as a Debian maintainer in the, you know, GPG root of trust in Debian can upload. That's not how we've designed Chainguard the OS. We've designed it without an individual being responsible for any package. Do we have people who are experts at what they do? Yes, absolutely. If there's a GCC FIPS bug, it's going to be Dmitri or Luca Cage who fixes that. For sure, we love them for it, but their name is not exclusively tied to that. So yeah, I appreciate the question, but I mean, I think the automation that we have is overwhelmingly driving what we do.

The second part of the question though, I think is smart though, and we are leaning into AI in certain places, especially for the debugging. So when something fails, Octos is able to query a couple of the AI engines, Gemini especially, and it looks at it and often makes suggestions on how to fix it. So the first thing a sustaining engineer does when they're looking at a build failure is look at what our trained models tell us could be the problem. And when it's right, we give it a thumbs up, and that retrains and improves the model. When it's wrong, we can give it a thumbs down, and you know, we can bury that suggestion in the future.

**Question 5**: Hi, my question is related to testing again. When you're building a Docker image, maybe depends on a bunch of packages, libraries. So how do you detect the incompatibility between the software versions, and then when you detect it, how do you fix—what, how do you find the right combination?

**Dustin**: Yeah, so I actually didn't go into—if we go back to the factory analogy—I didn't go into the order intake side of things, which is when a customer comes with a list of images, Docker images that they need that we don't have. So I showed you the 1,254 and counting that we do have, but that's not all of them that we need. And so we'll end up with a customer or prospect who says, "Yeah, you've got these, but we have all of these that we don't have yet."

So what happens is we take those requests, and those go to a different engineering team we call it the delivery team. And that team looks at the customer's request for images that we don't have and we've maybe never seen before—maybe we've seen it, it's on our backlog, but we might have never seen. And then that delivery engineer—it is a very human process to build an image the first time. Sometimes that means packaging software that we've never packaged before and creating an image for something that we've never created an image for. In some cases, there's a reference Docker image that we can go and look at at Docker Hub or somewhere else. In other cases, it's just a git repo. A customer says, "Look, we start with an Alpine base or Debian base, and our developers are git cloning this thing that we don't know anything about, but we would love to have a hardened image and resilient against CVEs."

So the human creates it for the first time, and after that it's constantly rebuilding, and the automation takes care of that. Only when it fails does a human have to get involved the second time. And the testing—we have continued to raise the standards on what it takes to publish that image the first time and ensure that the testing is in place. It's—that's a hard one. It's complicated, and we're not able to automate all of that yet.

**Question 6**: Yeah, so you guys are building like a lot of images and packages like all the time. What's your underlying build system? Is it all GitHub Actions or Surface CI?

**Dustin**: Yeah, good question. It's a lot of GitHub Actions. The builds—or excuse me, are you self-hosting those or using just GitHub's built-in?

We use GitHub. The builds actually take place in GCP largely. The tests happen in various clouds—AWS, EKS—where we need it. The libraries product is using a lot of Argo CI, you know, to build those at scale. We test with Cloudsmith there. Cloudflare is typically the CDN side of things for images. Yeah, I didn't get into some of the underlying tech, but yeah, happy to tell you more if you need it.

**Sam**: Cool, thank you. Will you be at the expert table?

**Dustin**: Yeah, sure.

**Sam**: Thank you. If we just want to give Dustin one more round of applause.

[Applause]

---

### What is the Chainguard Factory?
_Path: platform/factory/what-is-factory.md_

{{< youtube KyO4ppSR9Lo >}}

## Transcript

**Interviewer**: So Dustin, can you explain what the Chainguard Factory is?

**Dustin Kirkland**: Yeah, so the Chainguard Factory is the automation that's at the heart of what we do here at Chainguard. Essentially, we have this build system that's constantly monitoring over 10,000 open source projects, and the moment that any upstream maintainer tags a new release, our automation springs into action—fetching that source code, checking the checksums, applying our build rules, rebuilding and recompiling that software, retesting that software at the package and unit level.

And then, if all of that works, publishing a new package with signatures of that package that's been rebuilt from source, bootstrapped from source with our toolchain and our testing.

Once we have that package, we're then able to assemble that package into multiple different image formats. We can do container images, we can do virtual machine images, and we're now building libraries—Java, Python, and Node libraries—from source.

---

### Chainguard Factory FAQs
_Path: platform/factory/faq.md_

## What is the Chainguard Factory?

The Chainguard Factory refers to all the engineering and automation work that goes into building, publishing, and maintaining the software packaged in Chainguard's products. This includes continuously monitoring, testing, and updating thousands of open source projects that make up Chainguard containers, libraries, and VMs.

## How does Chainguard keep its software up to date?

Chainguard uses automated systems to vigilantly monitor for new releases using
the GitHub API, [the Release Monitoring project](https://release-monitoring.org),
[PyPI](https://pypi.org/), [Maven
Central](https://mvnrepository.com/repos/central) and the [npm
registry](https://docs.npmjs.com/about-the-public-npm-registry). When a new
release is detected, automation opens a pull request, patches the relevant
software, and kicks off a suite of tests. If issues arise, AI analyzes logs and
suggests fixes before human engineers review and approve changes. This process
ensures prompt, high-quality updates.

## How often are Chainguard packages, containers, and VMs updated?

Updates happen constantly and at high speed. There are over 1,500 containers, plus VMs, and libraries – each of which is updated daily as needed, depending on upstream changes and security events.

## What happens when a core dependency (like Go, OpenSSL, or glibc) is updated?

Updates to foundational packages require cascading rebuilds of all dependent packages and images. For updates to core dependencies, this results in rebuilds of hundreds, or even thousands, of packages and containers. Major updates like these receive additional engineering focus to ensure a smooth transition.

## How does Chainguard handle software that goes end-of-life (EOL) upstream?

After a package goes EOL, it is no longer supported upstream, and updates will cease in the Wolfi repository. However, customers benefit from an extended EOL Grace Period with Chainguard OS, during which Chainguard continues to build old versions for an additional timeframe.

## How are CVEs (security advisories) managed?

Chainguard uses the [grype](https://github.com/anchore/grype) security scanner to detect when a CVE affects one of its packages. Automation flags these CVEs for investigation by engineers. If determined to be a false positive, the status is set to `Not Affected`; if real, the issue is resolved by patching or updating dependencies and the status changes to `Fixed`.

## How does Chainguard prevent malware or malicious updates?

The factory analyzes code for known malware and checks for unexpected changes in software behavior, such as new network connections not mentioned in changelogs. This helps detect subverted upstream projects or supply chain attacks (like the recent XZ utils incident) before they affect customers.

## What infrastructure is used for building?

GitHub is used for source code management, but our builds execute on Kubernetes clusters for scalability and observability. The build environment is hardened following SLSA (Supply-chain Levels for Software Artifacts) and OpenSSF security guidelines, reinforcing both integrity and provenance.

## What is the role of automation, AI, and human engineers?

Automation and AI enable high-velocity operations, handling the bulk of routine updates and testing. However, due to the complexity and variability of open source, human engineers with diverse technological expertise play a critical role in resolving exceptions, complex updates, and security events.

## Why is the Chainguard Factory important for customers?

The factory enables Chainguard to reliably convert open source into ready-to-use, highly secure containers, VMs, and libraries, giving customers timely access to updates while minimizing their security risk and operational overhead.

---

### Chainguard Factory
_Path: platform/factory/_index.md_

The Chainguard Factory is our automated build system that continuously monitors, builds, tests, and publishes secure software artifacts from thousands of open source projects.

## Documentation

- [Factory overview](/platform/factory/overview/) - Technical details about how the Factory works
- [Factory FAQ](/platform/factory/faq/) - Frequently asked questions

## Video resources

Learn about the Factory through these informative videos, each with full transcripts:

### Getting started

- [What is the Chainguard Factory?](/platform/factory/what-is-factory/) - An introduction to the Factory concept
- [Touring the Chainguard Factory](/platform/factory/touring-the-factory/) - A guided tour through the Factory components

### Deep dives

- [What does the Chainguard Factory build?](/platform/factory/what-factory-builds/) - Understanding the Factory's outputs
- [Inside the Chainguard Factory - Assemble 2025](/platform/factory/assemble/) - Full conference presentation

### Looking forward

- [What is the future of the Chainguard Factory?](/platform/factory/future-of-factory/) - Roadmap and vision

---

### What does the Chainguard Factory build?
_Path: platform/factory/what-factory-builds.md_

{{< youtube V4xIcHDhBhw >}}

## Transcript

**Interviewer**: So Dustin, what does the Factory actually build every day?

**Dustin Kirkland**: Yeah, so the input is open source software that's coming in from thousands of upstream maintainers who are very much the experts in what they do. That goes into our Factory. We apply our build automation system and, importantly, our quality control and testing system.

Out of that comes a series of artifacts. We produce APKs, which is our package format. We produce container images, which is the output that our customers typically run in their Docker and Kubernetes environments. We also produce virtual machines that get loaded automatically into Google, Amazon, and Azure public clouds, as well as images that can run in QEMU and VMware on-prem.

And it also produces libraries. So we're rebuilding from source not just open source projects that yield packages, but we're also rebuilding open source software that yields Java artifacts—JAR files—and Python modules—Python wheels. All of those are packaged up and built and tested from a Chainguard perspective, and we publish those into a variety of different registries and artifact repositories that our customers can then consume securely inside of their environment.

---

### What is the future of the Chainguard Factory?
_Path: platform/factory/future-of-factory.md_

{{< youtube eF9EYK6AKPA >}}

## Transcript

**Interviewer**: So what do you see as the future for the Factory?

**Dustin Kirkland**: Well, I'm not going to get into the super secret plans we have for next generation products, but I will tell you that we are constantly expanding the scope of the open source projects that we're building. So more and more packages—each of those show up as new packages that we're now able to add to our existing images or build new images around.

More and more images—there's a long list, a backlog of images that our customers have requested from us at Chainguard. We continue to expand that catalog from 1,300 to 1,400 to 1,500 images. We're growing by 50 to 100 images per month in that catalog. So even more packages, even more images, and more libraries too, for that matter.

We are adding Java packages that one would typically find and add using the Maven tool. More and more Python libraries that one would typically install using pip. We're building more and more of those from source and getting greater coverage. And it's not just the projects themselves, but more versions of those projects.

The fact that we can reproduce those builds means that we can apply patches. So we're fixing vulnerabilities and backporting fixes—CVEs that are fixed in latest versions—and now starting to backport some of those to older versions of those libraries.

And then in terms of the virtual machines form factor, super interesting that we can take any container image that we have and render that as a VM appliance, fully tested, fully qualified, running in various different environments. And we found some customers that just prefer to run some very specific workloads directly on the VM without a containerization layer.

So there's plenty of room to expand. The Factory gives us all of the power that we need to scale out the coverage across the open source ecosystem.

**Interviewer**: Excellent. And what about supply chain security in general? What do you see as the future there?

**Dustin Kirkland**: Yeah, so I mean, I think we've taken—very importantly, I think we've taken a key step in supply chain security by bootstrapping everything, building it from source, doing it well, doing it the right way, doing it all day every day, 24/7, 365, constantly. We don't snapshot the world and then attempt to backport patches to a version that just constantly drifts from where upstream is.

And that goes for compilers and toolchains, script interpreters, as well as the end applications, databases, and application frameworks. We're constantly rebuilding with exactly the same work that the upstream maintainers are using. And that fact, I think, is the important part. And what makes the rolling distro work for us is that we're matching the pace of upstream development here.

---

### Touring the Chainguard Factory
_Path: platform/factory/touring-the-factory.md_

{{< youtube gg_EdCrhzL4 >}}

## Transcript

**Interviewer**: So Dustin, can you give us a quick tour of the Chainguard Factory?

**Dustin Kirkland**: Yeah, so the Chainguard Factory is the automation that we have inside of Chainguard itself that is able to reproducibly build thousands of open-source projects.

We start from a fully bootstrapped-from-source version of the source code. We pull the source code down, we apply our build rules, build that code, test that code, sign that code, and publish that code—first as packages.

And then we take those packages and put them into various different form factors. In the nominal case, we put them into container images that typically run inside of a Docker or Kubernetes. But we also can take those same packages and build virtual machine appliances, fully booting with a Linux kernel. And then we also twist some of these into libraries, also built entirely from source.

---

### Overview of the Chainguard Factory
_Path: platform/factory/overview/index.md_

Chainguard Factory is the automated build infrastructure that continuously monitors, builds, and updates thousands of open source projects to deliver containers, libraries, and VMs with a strong security posture and the latest patches. This massive automation system tackles one of the industry's biggest challenges: keeping software dependencies current at scale while maintaining security and compatibility across the entire open source ecosystem.

![Diagram of a factory](factory.png)

It is hard to overstate the sheer scale of Chainguard’s task of being the
secure source for open source. There are **thousands** of projects that we
constantly monitor, build, test, and update. Some of these are
foundational projects like [LLVM](https://llvm.org/) and
[glibc](https://www.gnu.org/software/libc/). Others are applications central to
modern infrastructure like PostgreSQL and nginx. Still more are the small utilities
and libraries that we use all the time and almost forget about, such as sed and jq.
These projects are then built into our 1,500
containers, plus our VMs and libraries, each of which are updated daily.

If you look inside the factory, you will find a complex build system running
parallel builds at high speed, constantly being updated and refined by
engineers supported by AI.

## The pace of updates

Open source projects are constantly evolving and updating. The factory keeps up
through vigilant and automated monitoring that leverages the [GitHub
API](https://docs.github.com/en/rest), the [Release Monitoring
project](https://release-monitoring.org/), [PyPI](https://pypi.org/), [Maven
Central](https://mvnrepository.com/repos/central) and the [npm
registry](https://docs.npmjs.com/about-the-public-npm-registry). To give you an
idea of how many updates happen in a short window of time, here is a screenshot
of 5 hours of our automation finding updates to projects.

![Screenshot showing package updates committed by Factory automation](octo-prs.png)

Automation opens a Pull Request (PR) when a new release is detected which updates the builds
to the latest version. After building the new version, a suite of tests will
then run to ensure it works as expected.  If a test fails, AI analyzes the logs
and suggests updates. Human engineers then step in to approve the update or fix
any issues. Once approved, the package is built and is added to one of our package
repositories. The process combines fast, automated updates from AI, with
reviews and guidance from engineers to ensure all changes meet our high
standards of quality and security.

As every software engineer knows, not all updates are equal. Some are simple
updates to applications which build cleanly and are not used in other packages.
Some updates are a lot more complicated however, with other packages being
dependent on them, either at buildtime or runtime. Consider a bump to the Go
compiler. Not only do we need to update the Go package and release a new Go
compiler image, we also need to rebuild all the packages that are dependent on
Go and their dependencies. Some of these builds will fail due to changes caused
by the update, and will require extra attention from engineers. Updates to core
packages like the Go compiler, OpenSSL, or glibc are major events that require
considerable engineering effort to successfully conclude. They are also
happening all the time.

Once an update passes through the package stage, we still need to update all
container images that are dependent on it. For applications like PostgreSQL,
this affects a handful of images, but an update to OpenSSL or glibc requires
practically all our images to be rebuilt. After new versions of images are
built, they are tested, often as part of a Helm chart deployed to a Kubernetes
cluster (sometimes even a specially provisioned EKS cluster for images such as
[eks-distro-kube-proxy!](https://images.chainguard.dev/directory/image/eks-distro-kube-proxy/overview?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement)).

On top of this, software is constantly going End-of-Life (EOL). When software
is no longer supported upstream, we will cease updating it in Wolfi (refer to [Wolfi
Packages in chainguard
Containers](/chainguard/containers/concepts/lifecycle-and-eol/versions/#wolfi-packages-in-chainguard-containers)).
Customers benefit from an extended [EOL grace
Period](/chainguard/containers/concepts/lifecycle-and-eol/eol-grace-period/)
with Chainguard OS where we continue to build old versions).

The result is a relentless, orchestrated flow of updates — ensuring our
software remains secure, current, and reliable.

## Handling CVEs

Projects like [NVD](https://nvd.nist.gov/) and
[GHSA](https://github.com/advisories) are constantly issuing security
advisories, for example in 2024 an [average of 108 CVEs were issued every
day](https://jerrygamblin.com/2025/01/05/2024-cve-data-review/). These
advisories are ingested by [scanners](https://www.chainguard.dev/scanners?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement) such
as grype and snyk. We use these scanners internally to alert whenever a CVE is
identified as affecting one of our packages. Automation adds the CVE to an
internal queue for further investigation and an advisory is issued with
the status of `Under Investigation`.

After an engineer investigates the issue, the most likely outcomes are:

- We determine the advisory to be a false positive and change the status to
    `Not Affected`.
- We determine it to be a real issue and take further action to resolve it.
    This could mean pulling in a patch or bumping a dependency in the project,
before rebuilding and updating the status to `Fixed`.

Refer to [How Chainguard issues security
Advisories](/chainguard/containers/security-and-compliance/security-advisories/how-chainguard-issues/)
for full information on the lifecycle of advisories.

## Identifying malware and malicious updates

It is essential that the factory is secure and we do not inadvertently publish
malware. There have been multiple cases of supply chain attacks where reputable
open source projects have been subverted or taken over and used for the
distribution of malware, the XZ utils attack being a case-in-point.
Avoiding the propagation of such malware is a key goal of the factory and there
are several steps that we take to ensure security. One of the most important is
analyzing code for known malware, but we also automatically identify any
unexpected changes in the functionality of software from an update. For
example: an update would be flagged as suspicious if it makes new network
connections but there are no references to this in the project's changelog.

## Infrastructure and build security

We use GitHub for source code management, but our builds themselves run on Kubernetes
clusters to provide the scaling and observability we require. As you can
imagine, there is a considerable cost associated with building at the pace
described.

We take security in our build environment seriously and adhere to the
[SLSA](https://slsa.dev/) guidelines for ensuring build integrity and
provenance. The builds themselves follow [OpenSSF guidance for security
hardening via compiler flag
settings](https://www.chainguard.dev/unchained/enhanced-compiler-flags-for-building-chainguards-guarded-images?utm_source=cg-academy&utm_medium=referral&utm_campaign=dev-enablement).

## On automation, AI and human engineers

To keep the factory running at the pace it does, we leverage automation and AI
to streamline operations. But the vast number of changes results in constant
exceptions and unexpected events that require domain specific knowledge to
resolve. For this reason, we rely on a large and experienced engineering team
with backgrounds in a wide range of technologies, from low-level kernel and VM
engineers to those who know their way around higher level ecosystems like Node,
Java and PHP.

## Conclusion

The Chainguard Factory operates at an enormous scale. The number of builds and
workflows that are happening every second is staggering. The factory is a
critical component in Chainguard and effectively what our customers are paying
for — the ability to turn open source projects into easily consumable
containers, VMs, and libraries quickly and securely.

---

### Using Chainguard with Cursor
_Path: platform/integrations/cursor.md_

AI coding agents write code and install dependencies faster than any security team can review them manually. Every `pip install`, `npm install`, or `docker pull` an agent kicks off is a trust decision being made on your behalf against public registries.

The [Chainguard and Cursor partnership](https://www.chainguard.dev/partners/cursor) follows a clear separation of responsibilities: Cursor is where your developers and agents plan, write, and review code. Chainguard is where developers reach for open source artifacts: Python, Java, and JavaScript libraries plus 2,300+ container images, all rebuilt from verifiable sources in the Chainguard Factory.

This page explains how to start using Chainguard artifacts in Cursor.

## Prerequisites

Before you begin, you'll need:

* A [Cursor](https://cursor.com/) account
* A [Chainguard account](https://console.enforce.dev/) and organization in domain format (for example, `acme-corp.com`).
* [`chainctl` installed and authenticated](/platform/chainctl-usage/how-to-install-chainctl/)
    * Chainguard authentication should be configured in the environment where Cursor runs commands.
    * Your Chainguard pull token credentials should be injected via environment variables, and not hard-coded in source.

## Install the Chainguard plugin

The Chainguard integration is delivered as an official plugin through the Cursor marketplace. To get started:

1. Open the Cursor marketplace and search for Chainguard.
1. On the Chainguard plugin screen, click **Add to Cursor**.
1. In your Cursor settings, navigate to the **Tools & MCPs** section. Connect all Chainguard MCP servers to your account.

You will be prompted to authenticate Chainguard MCPs. After authenticating, Cursor displays an overview of how the plugin works.

## Migrate a project to use Chainguard

After installing the plugin, open a project in Cursor. When writing prompts, tell Cursor to use Chainguard libraries and images:

```prompt
I'd like to migrate this project to use Chainguard images and libraries.
```

Cursor will update your Dockerfiles to reference Chainguard container images and reconfigure your build files to pull dependencies from Chainguard Libraries.

You can also reference specific Chainguard library skills in prompts. For example:

```prompt
/chainguard-libraries-python set up my token
```

> **Note**: Cursor's output is prompt-driven and may vary depending on your project's structure and complexity. Review all changes before running a build or deploying to production.

### Using Chainguard container images

Chainguard provides thousands of minimal, CVE-free container images. When Cursor updates a Dockerfile to use Chainguard images, it will reference the images like the following example:

```dockerfile
FROM cgr.dev/chainguard/python:latest-dev AS builder
FROM cgr.dev/chainguard/python:latest
```

You can browse available images and their tags in the [Chainguard Images directory](https://images.chainguard.dev/).

This Dockerfile references both the `python` image's `latest` and `latest-dev` variants. Learn more about Chainguard image variants in [Chainguard’s container variants docs](/chainguard/containers/concepts/container-variants/).

> **Note**: `latest` tags are not recommended for production workloads. For production, we recommend pinning to a specific version or digest to ensure reproducible builds.

Learn more about Chainguard's container images in the [Containers documentation](/chainguard/containers/).

### Using Chainguard Libraries

[Chainguard Libraries](/chainguard/libraries/) provide malware-resistant Python, Java, and JavaScript packages. When Cursor migrates a project, it reconfigures your build files to pull dependencies from Chainguard instead of public registries.

You can browse available packages in the [Chainguard Console](https://console.chainguard.dev/), under the **Libraries** section.

> **Note**: Chainguard Libraries does not mirror every package available on public registries. If a required package is unavailable, your build may fail. Refer to [Package not found / build fails after migration](#package-not-found--build-fails-after-migration) for ecosystem-specific fallback options.

Learn more about configuring libraries in the documentation for each ecosystem:

* [Chainguard Libraries for JavaScript](/chainguard/libraries/javascript/)
* [Chainguard Libraries for Python](/chainguard/libraries/python/)
* [Chainguard Libraries for Java](/chainguard/libraries/java/)

## Troubleshooting

### Authentication errors on install

If you see a 401 or 403 when running `npm install`, `pip install`, or a Maven build after Cursor configures your project:

* Confirm the pull token was created for the correct ecosystem (`java`, `python`, or `javascript`).
* Check that the token hasn't expired. The default TTL is 720 hours (30 days).
* For npm: verify your `.npmrc` has both the registry line and the auth line for the correct host.

### Image not found / tag doesn't exist

If Cursor references an image tag that doesn't exist:

* Check available tags for the image in the [Chainguard Images directory](https://images.chainguard.dev/). Ensure that you have access to the tag.
* Use `latest` or `latest-dev` as a reliable starting point. Image digests are also available for production use.

### Package not found / build fails after migration

If your build fails because a package is unavailable from Chainguard:

* **JavaScript**: The Chainguard Repository includes a configurable upstream fallback for npm packages; [enable fallback](/chainguard/libraries/javascript/overview/#upstream-fallback-policy-and-controls) if you want to pull from upstream when a package isn't available from Chainguard.
* **Python**: To enable fallback to PyPI for unavailable packages, add `extra-index-url = https://pypi.org/simple/` to your `pip.conf` or `pyproject.toml`.
* **Java**: To enable upstream fallback, add `mavenCentral()` after the Chainguard Libraries for Java repository in your Gradle configuration, or add Maven Central as a second `repository` entry in your `pom.xml`.

---

### Using Chainguard with Kiro
_Path: platform/integrations/kiro.md_

[Kiro](https://kiro.dev/) helps developers move quickly, but speed alone does not reduce supply chain risk.
Every `docker pull`, `pip install`, `npm install`, or Maven dependency resolution an AI assistant initiates is still a trust decision against a software source.

The Chainguard Power for Kiro brings Chainguard context directly into that workflow.
Kiro remains the place where developers and agents plan, write, and review code.
Chainguard provides the trusted artifacts those workflows depend on: hardened container images, malware-resistant language packages, and related supply chain guidance.

This page explains how to install the Chainguard Power for Kiro and use it to start migrating projects to Chainguard.

## Prerequisites

Before you begin, you'll need:

* A [Kiro](https://kiro.dev/) account, with [Kiro IDE](https://kiro.dev/downloads/) downloaded.
* A [Chainguard account](https://console.chainguard.dev/) and organization in domain format (for example, `acme-corp.com`).
* [`chainctl`](/chainguard/chainctl-usage/how-to-install-chainctl/) installed and authenticated
* Access to the Chainguard products you plan to use
    * [Chainguard Containers](/chainguard/containers/overview/) for container image migration
    * [Chainguard Libraries](/chainguard/libraries/introduction/overview/) for Java, JavaScript, or Python dependency migration. Learn how to create an entitlement in the [Libraries access docs](/chainguard/libraries/introduction/access/#manage-library-entitlements).

The Chainguard Power uses your existing `chainctl` session for image and package lookups in Kiro.
If you want Kiro to help reconfigure a project to use Chainguard Libraries, make sure your organization also has access to the relevant Libraries ecosystem.

Note: Chainguard MCP authentication depends on the Chainguard authentication flows available to your organization. If your users do not sign in through one of the currently supported social identity providers (Google, GitHub, or GitLab), then MCP-based IDE workflows may not work as expected. If your organization uses a different IdP, confirm the authentication path before rolling out the Kiro integration broadly.

## Install the Chainguard Power

The Kiro integration is delivered through the Kiro Powers panel.

To install it:

1. Open Kiro IDE and navigate to the **Powers** panel in the sidebar.
1. Scroll down to the Chainguard Power.
1. Select the Chainguard Power and click **Install**.

After installation, Kiro automatically registers the Chainguard MCP servers included with the power.
You do not need to manually edit JSON configuration files or perform separate CLI setup for the power itself.

## Using the Chainguard Power

Kiro can use Chainguard context to help with tasks such as:

* Migrating Dockerfiles to [Chainguard Containers](https://images.chainguard.dev/)
* Reconfiguring Java, JavaScript, and Python projects to use [Chainguard Libraries](/chainguard/libraries/introduction/overview/)
* Looking up Chainguard image tags
* Finding Wolfi package equivalents for packages currently installed with `apt` or similar package managers
* Guiding Chainguard platform tasks such as policy, cluster, and IAM workflows

The power includes the following MCP servers:

* `cg-api` for Chainguard platform and organization workflows
* `cg-apk` for Wolfi package discovery
* `cg-oci` for container image discovery and tag lookup
* `cg-versions` for version and upgrade-path lookup

### Migrate a project to use Chainguard

After installing the power, open your project in Kiro and describe the migration you want.

For example:

```Prompt
Can you help me migrate this project to use Chainguard container images and libraries?
```

Kiro can then inspect the relevant files in your project and suggest changes such as:

* Replacing public base images with Chainguard container images
* Translating OS packages to Wolfi equivalents
* Updating package manager configuration to use Chainguard Libraries
* Explaining the changes it made so you can review them before building or deploying

As with any AI-assisted code change, review the output before you run a build or ship it to production.

### Example: Migrate a Dockerfile

One of the most direct ways to get started is to paste a Dockerfile into Kiro and ask for help migrating it.

For example:

```dockerfile
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y curl git libpq-dev
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
```

Prompt Kiro with a request such as:

```Prompt
Can you help me migrate this Dockerfile to use Chainguard Images?
```

Kiro can then look up a Chainguard replacement image, translate system package installation to the appropriate Wolfi packages, rewrite the Dockerfile, and explain any important tradeoffs.

A resulting Dockerfile might look similar to this:

```dockerfile
FROM cgr.dev/chainguard/python:3.11-dev
WORKDIR /app
RUN apk add --no-cache curl git libpq-dev
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
```

In this example, Kiro may also point out that:

* a `-dev` image is useful when build-time tooling is required
* a production runtime image may use a different tag
* Chainguard images run as non-root by default

To browse available images and tags, refer to the [Chainguard Containers directory](https://images.chainguard.dev/).

### Use Chainguard Libraries with Kiro

The Chainguard Power can also help migrate language dependencies to Chainguard Libraries.

For example, you can ask Kiro to help with prompts such as:

* `Help me configure npm to use Chainguard Libraries`
* `How do I set up my Maven project to use Chainguard Libraries?`
* `Help me migrate this Python project to Chainguard Libraries`

Kiro can help update build files and package manager configuration, but your build environment still needs valid Chainguard credentials for package installation.

For ecosystem-specific instructions, see:

* [Chainguard Libraries for JavaScript](/chainguard/libraries/javascript/overview/)
* [Chainguard Libraries for Python](/chainguard/libraries/python/overview/)
* [Chainguard Libraries for Java](/chainguard/libraries/java/overview/)

## Learn more

* [Chainguard Images directory](https://images.chainguard.dev/)
* [Chainguard Libraries](https://www.chainguard.dev/libraries)
* [Kiro Powers directory](https://kiro.dev/powers/)

---

### How to compare Chainguard Containers with chainctl
_Path: platform/chainctl-usage/comparing-images.md_

Chainguard's `chainctl images diff` command provides detailed comparisons between container image versions, enabling you to track security improvements, package updates, and vulnerability changes across builds. This powerful feature helps you understand exactly what changes between image versions, whether comparing daily builds, analyzing CVE remediation, or evaluating custom image updates.

The [`chainctl`](/platform/chainctl/) diff functionality supports informed deployment decisions by revealing package-level differences, security posture changes, and build variations between any two Chainguard container images.

## Prerequisites

In order to use the `chainctl images diff` subcommand, you'll need to have a few tools installed.

* You'll need `chainctl` installed on your local machine. Follow our guide on [How to install chainctl](/platform/chainctl-usage/how-to-install-chainctl/) to set this up. If you already have `chainctl` installed, be sure to update it to the latest version with `chainctl update`.
* Next, ensure you have Cosign installed. Our guide on [How to install Cosign](/open-source/sigstore/cosign/how-to-install-cosign/) outlines several methods for installing Cosign.
* You'll also need Grype installed on your local machine, as `chainctl` uses this to scan the images when performing the diff. Follow the installation instructions for your operating system on the [Grype project GitHub repository](https://github.com/anchore/grype#installation).
* Lastly, an example command in this guide uses `jq` — a command-line JSON processor — to make the command's output more readable. You don't strictly need to have `jq` installed in order to use the `diff` subcommand, but if you'd like you can install it by following [the official documentation](https://jqlang.github.io/jq/download/).

## Using `chainctl images diff`

The `chainctl images diff` subcommand accepts the names of two Chainguard Containers as arguments and uses Grype to perform a vulnerability scan on each of them. It then retrieves both container images' SBOM information and outputs the difference between the two along with the previously obtained Grype data.

The `diff` subcommand follows this general syntax.

```sh
chainctl images diff $FROM_IMAGE $TO_IMAGE
```

As an example, try comparing the `latest` public `go` Chainguard Container with its `latest-dev` version.

```sh
chainctl images diff cgr.dev/chainguard/go:latest cgr.dev/chainguard/go:latest-dev | jq
```

This will return output like the following.

```output
Fetching vulnerabilities for cgr.dev/chainguard/go@sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc
Fetching vulnerabilities for cgr.dev/chainguard/go@sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3
{
  "packages": {
    "added": [
      {
     "name": "sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3",
     "reference": "pkg:oci/index@sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3?mediaType=application%2Fvnd.oci.image.index.v1%2Bjson"
      },
      {
     "name": "sha256:a5910c192d3bd6e473cd98a0553d55dba1e9ddee240732a91bf4985116f893d0",
     "reference": "pkg:oci/image@sha256:a5910c192d3bd6e473cd98a0553d55dba1e9ddee240732a91bf4985116f893d0?arch=amd64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      },
      {
     "name": "sha256:35b2716760a4ec6652830a453d692cc7c55893eb8a6b4cc2afabc2bdfad2a10f",
     "reference": "pkg:oci/image@sha256:35b2716760a4ec6652830a453d692cc7c55893eb8a6b4cc2afabc2bdfad2a10f?arch=arm64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      }
    ],
    "removed": [
      {
     "name": "sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc",
     "reference": "pkg:oci/index@sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc?mediaType=application%2Fvnd.oci.image.index.v1%2Bjson"
      },
      {
     "name": "sha256:eaeb73fe40e46eabd28837f3b981791984fc40cac4833f872169f09c7c3cb4df",
     "reference": "pkg:oci/image@sha256:eaeb73fe40e46eabd28837f3b981791984fc40cac4833f872169f09c7c3cb4df?arch=arm64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      },
      {
     "name": "sha256:87d4c21ede568d79d4ca51271dda3bf46a4164be2bcd7405b6b85b49801d3504",
     "reference": "pkg:oci/image@sha256:87d4c21ede568d79d4ca51271dda3bf46a4164be2bcd7405b6b85b49801d3504?arch=amd64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      }
    ]
  },
  "vulnerabilities": {}
}
```

This command first uses Grype to scan each container image's vulnerability data and then retrieves both images' [SBOMs](/open-source/sbom/what-is-an-sbom/). It then outputs the differences that it finds between the two. This sample output indicates that compared to the `go:latest` container image, the `go:latest-dev` image has three packages added, three removed, and no unique vulnerabilities.

`chainctl`compares the images like this because of the order they appear in the command. If you reversed the order of the images in the example command, the packages shown as `added` and `removed` would also be flipped:

```output
Fetching vulnerabilities for cgr.dev/chainguard/go@sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3
Fetching vulnerabilities for cgr.dev/chainguard/go@sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc
{
  "packages": {
    "added": [
      {
     "name": "sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc",
     "reference": "pkg:oci/index@sha256:6fee3fff87854aa6e4762c7998c127436a68b09877f9c1010deca35e0f1e27bc?mediaType=application%2Fvnd.oci.image.index.v1%2Bjson"
      },
      {
     "name": "sha256:eaeb73fe40e46eabd28837f3b981791984fc40cac4833f872169f09c7c3cb4df",
     "reference": "pkg:oci/image@sha256:eaeb73fe40e46eabd28837f3b981791984fc40cac4833f872169f09c7c3cb4df?arch=arm64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      },
      {
     "name": "sha256:87d4c21ede568d79d4ca51271dda3bf46a4164be2bcd7405b6b85b49801d3504",
     "reference": "pkg:oci/image@sha256:87d4c21ede568d79d4ca51271dda3bf46a4164be2bcd7405b6b85b49801d3504?arch=amd64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      }
    ],
    "removed": [
      {
     "name": "sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3",
     "reference": "pkg:oci/index@sha256:e62ce9fe5e62296186066e647d22cd8d16565d8eee9c2d18541094cec9ddd7a3?mediaType=application%2Fvnd.oci.image.index.v1%2Bjson"
      },
      {
     "name": "sha256:a5910c192d3bd6e473cd98a0553d55dba1e9ddee240732a91bf4985116f893d0",
     "reference": "pkg:oci/image@sha256:a5910c192d3bd6e473cd98a0553d55dba1e9ddee240732a91bf4985116f893d0?arch=amd64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      },
      {
     "name": "sha256:35b2716760a4ec6652830a453d692cc7c55893eb8a6b4cc2afabc2bdfad2a10f",
     "reference": "pkg:oci/image@sha256:35b2716760a4ec6652830a453d692cc7c55893eb8a6b4cc2afabc2bdfad2a10f?arch=arm64&mediaType=application%2Fvnd.oci.image.manifest.v1%2Bjson&os=linux"
      }
    ]
  },
  "vulnerabilities": {}
}
```

Be aware that because this is a relatively new feature, the format of the `diff` subcommand's output is subject to change.

## Potential use cases

Being able to find the exact difference between two Chainguard Containers with a single command allows users to make more informed decisions about what container images they use in their applications. This section goes over a couple scenarios where you may want to use the `chainctl images diff` command.

One potential use case for why you would want to find the differences between two Chainguard Containers is that you're curious about the differences between available release versions. Say you're using Custom Chainguard Containers and your application is pinned to a specific version of `go`. By diffing the two container images, you could check what vulnerabilities you could remove by updating to the next patch or minor version.

Another potential use could be in cases where you're interested in knowing the difference between a Chainguard Container's daily builds. For example, say you'd like to keep your images updated but only when there are significant changes between daily builds. You could diff between the running versions and the latest builds, only updating if there’s a meaningful difference.

## Learn more

To learn more about the `chainctl image` subcommands, we encourage you to check out our
[`chainctl` command resources](/platform/chainctl/chainctl-docs/chainctl_images/). You can also explore the rest of our [Chainguard Containers resources](/chainguard/containers/) to learn more about how images can help you keep your software secure by default.

---

### Authentication options for chainctl
_Path: platform/chainctl-usage/authentication-options.md_

There are several ways to authenticate to the Chainguard platform with `chainctl`, each suited to a different environment:

* **Interactive login**: Good for everyday interactive use, but needs a browser that the current shell can launch.
* **Headless login**: Also good for interactive use. It still requires a browser, but not from within the current shell or even the current device.
* **Social login**: Lets you choose which default identity provider (email, Google, GitHub, or GitLab) to authenticate with.
* **Assumable identities**: Designed for CI/CD and require no interaction, but they need more setup and aren't ideal outside automation.
* **Pull tokens**: Ideal for pulling images and libraries, and they can be long-lived.

## Interactive browser login

To authenticate to the Chainguard platform, run the following command:

```sh
chainctl auth login
```

A browser window opens and prompts you to log in through your chosen OIDC flow. Select the account you want to log in as, and then you can begin managing your Chainguard resources.

## Headless device-code login

If the shell can't launch a browser—for example, on a container or a remote server—use the `--headless` option to log in through a device-code flow:

```sh
chainctl auth login --headless
```

`chainctl` outputs an eight-character code and a URL, [`https://auth.chainguard.dev/activate`](https://auth.chainguard.dev/activate). Open the URL in a browser on any device, enter the code, and complete the login. You can then use Chainguard from the headless device.

The `--headless` code is valid for 900 seconds.

## Select an identity provider with --social-login

To authenticate with a specific default identity provider, pass the `--social-login` flag. The value must be one of `email`, `google`, `github`, or `gitlab`:

```sh
chainctl auth login --social-login github
```

You can also set a default provider in your configuration with the `default.social-login` setting. See [Manage your chainctl configuration](/platform/chainctl-usage/manage-chainctl-config/).

> Note: If your organization has configured a custom identity provider, authenticate with `--org-name` or `--identity-provider` instead. See [custom identity providers](/platform/administration/custom-idps/custom-idps/).

Which provider you authenticate with also determines who manages your multi-factor authentication. To move it to a new device, see [Change or reset your MFA device](/get-started/mfa-devices/).

## Assumable identities for CI/CD

Assumable identities let automation tools like GitHub Actions or AWS Lambda connect to and manage Chainguard resources without interactive login. See the [guide on assumable identities](/platform/administration/assumable-ids/assumable-ids/).

## Pull tokens

Pull tokens are ideal for pulling images and libraries and can be long-lived. You can create them in the Chainguard Console or with `chainctl`. See [authenticating to the Chainguard registry](/chainguard/containers/registry/authenticating/#authenticating-with-a-pull-token).

A pull token is a pair of values that most tools consume as a username and a password. `chainctl` labels that pair differently in each output format, so refer to [pull token output formats and credential names](/platform/chainctl-usage/pull-token-output/) to map the labels to each other.

---

### Manage Chainguard container images with chainctl
_Path: platform/chainctl-usage/chainctl-images.md_

Chainguard's `chainctl images` commands provide comprehensive tools for managing security-hardened container images in your organization's registry. These commands enable you to discover available images, analyze version histories, examine security metadata, and compare different image versions to make informed deployment decisions.

For a full reference of all commands with details and switches, refer to [chainctl reference](/platform/chainctl/).

## List available Chainguard container images

When you want to know which Chainguard Containers are available to your account, use the following command:

```shell
chainctl images list
```

If your account has access to more than one organization, the command asks which one to list images from. Most users belong to a single organization, and `chainctl` selects it automatically. This example shows an account with access to several organizations within the fictional MyCorp.

```output
    Which organization would you like to list images from?

  > [MyCorp-prod]     This group holds the production Chainguard Containers hosted under    cgr.dev/MyCorp-prod
    [MyCorp-starter]     This group holds the Free Chainguard Containers hosted under    cgr.dev/MyCorp-starter
    [MyCorp-eval]     This group holds the evaluation Chainguard Containers hosted under    cgr.dev/MyCorp-eval
```

Move the `>` up and down with the arrow keys and hit `Enter` to select the appropriate org. Then the command will return the list.

Be warned, that list may take a while to generate and is likely to scroll past quickly in your command line terminal. You may prefer to direct the output into a file.

Here's an abbreviated example of what will be returned:

```output
...
├ [python]
│ ├ sha256:038449621d30e512645107e6b141fbfb5320d8f0caacd3d788e5a3be8da16def
│ │ ├ [3.11]
│ │ └ [3.11.12]
│ ├ sha256:07756f3cf511a6227ae70d816c57b01a6fd9e805a587db5ebb4e17a5954b38c4
│ │ └ [3.11.9]
│ ├ sha256:088b946519e5c766685e335366abe8a6160e3bd108a6525309f7186e943a4666
│ │ └ [3.11.9-dev]
│ ├ sha256:09cb17be345eac82e3fdb017590d5907c582b4bd5ac86ed5e054bae739a9babd
│ │ └ [3.13.0]
│ ├ sha256:16b52893f316d9d7074b9c24c30f82eab1e94356461439d4be1a62fe229e6933
│ │ └ [3.12.7]
│ ├ sha256:1b53a821fe44d699687d1ca2318e3f90fed4af97833ab40384ea77c746b54ed9
│ │ └ [3.10.16]
│ ├ sha256:1c3e412aff5bddf54718d1bc0b4598ea30d18005e7dbfeb7e68bdae0f874682b
│ │ ├ [3]
│ │ ├ [3.13]
│ │ ├ [3.13.3]
│ │ └ [latest]
...
```

This will continue until all images (like `python` above) are listed with all their variants (releases like `3.13.3`). Notice that the list is not necessarily in order of release.

## List available container repos

For a list of image repositories available to your account, use:

```shell
chainctl images repos list
```

## Examine the history of container images

To examine the history of an image tag in chainctl, like when it was updated and the associated digests for each update, use `chainctl images history`. This will also return information such as how many times a variant has been built and for which platforms, along with the time and digests for each.

Pass the image and tag directly to skip the menu shown earlier:

```shell
chainctl images history $IMAGE:$TAG
```

For example, let's find the history of one of the `python` image variants from our previous list, `3.12.7`. So we enter:

```shell
chainctl images history python:3.12.7
```

The returned list is longer than is shown here, but here's a useful excerpt:

```output
- time: 2024-11-29 08:11:03 UTC
  digest: sha256:16b52893f316d9d7074b9c24c30f82eab1e94356461439d4be1a62fe229e6933
  architectures:
    amd64: sha256:755b79b43c1e76472cc467c4636bdb75bf4c2fcc551103087df0a4b0dc039164 (23.14 MB)
    arm64: sha256:d7dfaf24f292f490279611afcec49289aa528dba531590bebae059c7d3139ed6 (22.13 MB)
- time: 2024-11-25 23:45:42 UTC
  digest: sha256:025bbe734f9bb3550ea845f028f28c76c6dff742527e2764f4ba40b3773ee4f8
  architectures:
    amd64: sha256:c7b70882c6fe9b563aa5d5bdfb1a960c65b8c73e0830fc809ceb977e7f778e98 (23.14 MB)
    arm64: sha256:864f735794264120aabdc9eda9e1126140762e1c11eed96a89b0ab2056cc3662 (22.13 MB)
- time: 2024-11-22 01:32:55 UTC
  digest: sha256:2a936c40669150e1a92e4c80b27410786925b8619c0ecc1679ec0a0f6b707235
  architectures:
    amd64: sha256:8db3676319588dca04664a4a57c9fa464398fa2fc6874d5a1500273cabdbde04 (23.16 MB)
    arm64: sha256:ec8b8ef474ad6be50649cd9403882569d2cd1e71ac65e3bc263fc78aaef7608e (22.13 MB)

...

- time: 2024-10-02 23:56:00 UTC
  digest: sha256:c7cf9f46124502b9e8aadf26b4c58e0cdbd5a08b0b97b6d3a451b89563a308e8
  architectures:
    amd64: sha256:d4606173598e7103015b37dec4894771bf9cc221db6f7b102006eb81962c0696 (23.43 MB)
    arm64: sha256:f76a0a2f49418b030f3a31bcd2c8bddb8bbef7b006006aa59b74282955ab671d (22.41 MB)
- time: 2024-10-01 23:40:56 UTC
  digest: sha256:0b0daf09eeb92741efe0eae51dbdeea5a66bed870e0e00895630de729b233b7f
  architectures:
    amd64: sha256:637af1b20e5f8cee7e538b07a1ae3934297769216a65acc454e34fac3dcd3828 (23.46 MB)
    arm64: sha256:8dce068942fa4dd155c87b6b8a3e4b8e2482a5fdb5232cb9dd73c39e63003038 (22.41 MB)

```

The command returns a reverse-chronological history of when a specific tag was updated to point to a new manifest digest. If images are not multi-arch, only a single digest without architecture will be displayed.

When the release version tag is not provided, the command will present you with a menu that lets you select which tag you'd like to obtain the history for. For example, if you enter:

```shell
chainctl images history python
```

This will present you with a menu like this:

```output
    Which tag of python would you like to view history for?

  > 3
    3-dev
    3.10
    3.10-dev
    3.10.14
    3.10.14-dev
    3.10.14-r2
    3.10.14-r2-dev
    3.10.14-r3
    3.10.14-r3-dev
    3.10.14-r4
    3.10.14-r4-dev
    3.10.14-r5

```

Once you make a selection, the details will be returned for that variant.

## Compare Chainguard container images

When you want to compare two Chainguard images, enter:

```shell
chainctl images diff $FROM_IMAGE $TO_IMAGE
```

See <ins>[How to compare Chainguard Containers with chainctl](/platform/chainctl-usage/comparing-images/)</ins> to learn more.

---

### chainctl usage
_Path: platform/chainctl-usage/_index.md_

Chainguard's `chainctl` (Chainguard Control) is a command-line interface that provides comprehensive control over your Chainguard resources, including container images, identity management, and security configurations. This CLI tool enables automation and advanced operations beyond what's available in the <ins>[Chainguard Console](https://console.chainguard.dev)</ins>, making it essential for DevOps workflows and CI/CD integration.

Like most control commands that end with `ctl`, such as `systemctl` or `loginctl`, `chainctl` uses the familiar `<context> <noun> <verb>` syntax.

This page lists a curated set of `chainctl` resources to help you get started.

To install `chainctl`, follow our <ins>[installation guide](/platform/chainctl-usage/how-to-install-chainctl/)</ins>.

Once installed, these will help you on your path to success:

* <ins>[Get started with chainctl](/get-started/getting-started-with-chainctl/)</ins>
* <ins>[Authenticate to Chainguard's registry](/chainguard/containers/registry/authenticating/)</ins> - This page includes links to register for a Chainguard account, which is needed to do anything with `chainctl`. You must authenticate to Chainguard to use `chainctl`.
* <ins>[Manage your chainctl configuration](/platform/chainctl-usage/manage-chainctl-config/)</ins>
* <ins>[Find and update your chainctl release version](/platform/chainctl-usage/chainctl-version-update/)</ins>
* <ins>[Compare Chainguard images with chainctl diff](/platform/chainctl-usage/comparing-images/)</ins>
* <ins>[Using chainctl to manage Custom Assembly resources](/chainguard/containers/custom-assembly/custom-assembly-chainctl/)
* <ins>[Automating with chainctl](/platform/chainctl-usage/automating-chainctl/)</ins>
* <ins>[chainctl events](/platform/chainctl-usage/chainctl-events/)</ins>
* <ins>[chainctl iam](/platform/chainctl-usage/chainctl-iam/)</ins>
* <ins>[chainctl images](/platform/chainctl-usage/chainctl-images/)</ins>
* <ins>[chainctl images](/platform/chainctl-usage/chainctl-images/)</ins>

---

### How to install chainctl
_Path: platform/chainctl-usage/how-to-install-chainctl.md_

Chainguard's `chainctl` command-line interface provides essential tools for managing your container security infrastructure, including image management, identity and access control, and resource monitoring. This CLI enables automation of Chainguard operations and integration with CI/CD pipelines.

The tool uses the familiar `<context> <noun> <verb>` style of CLI interactions. For example, to retrieve a list of all the private Chainguard Containers available to your organization, you can run `chainctl images list`.

Before we begin, let’s move into a temporary directory that we can work in. Be sure you have curl installed, which you can achieve through visiting the [curl download docs](https://curl.se/download.html) for your relevant operating system.

```sh
mkdir ~/tmp && cd $_
```

There are currently two ways to install `chainctl`, depending on your operating system and preferences.

## Install `chainctl` with Homebrew

You can install `chainctl` for macOS and Linux with the package manager [Homebrew](https://brew.sh/).

Note that you will need to have the Xcode Command Line Tools installed prior to installing `chainctl` with Homebrew on macOS. Without these installed, you won't be able to use Homebrew to install `chainctl` on your macOS device.

If you haven't already done so, you can install the Xcode Command Line Tools with the following command.

```sh
xcode-select --install
```

Before installing `chainctl` with Homebrew, use `brew tap` to bring in Chainguard's repositories and trust them.

```sh
brew tap chainguard-dev/tap
brew trust --tap chainguard-dev/tap
```

Next, install `chainctl` with Homebrew.

```sh
brew install chainctl
```

You are now ready to use the `chainctl` command. You can verify that it works correctly in the final section of this guide.

## Install with `curl`

A platform-agnostic approach to installing `chainctl` is through using `curl`. We have [specific instructions for Windows users](/platform/chainctl-usage/how-to-install-chainctl/#installing-with-curl-in-windows-powershell) on installing `chainctl` with `curl`, but all others can run the following command:

```bash
PLATFORM="$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/aarch64/arm64/')"
VERSION=$(curl -sS "https://dl.enforce.dev/chainctl/latest/metadata.json" | jq -r .version)
curl -o chainctl "https://dl.enforce.dev/chainctl/${VERSION}/chainctl_${PLATFORM}"
```

We resolve the release version once from `metadata.json` and then download the binary from that explicit version path (rather than from `/latest/` directly). This ensures the binary and the signature you verify it against in the next step come from the same release. Downloading individual artifacts from `/latest/` in separate steps can occasionally pull mismatched files if a new release is published in between, causing signature verification to fail.

Keep this same terminal session for the verification step below so that the `PLATFORM` and `VERSION` values are reused.

Move `chainctl` into your `/usr/local/bin` directory and elevate its permissions so that it can execute as needed.

```sh
sudo install -o $UID -g $(id -g) -m 0755 chainctl /usr/local/bin/
```

At this point, you'll be able to use the `chainctl` command.

### Installing with `curl` in Windows PowerShell

As stated previously, you can also use `curl` install `chainctl` on Windows systems. Running the following command in PowerShell will download the appropriate `.exe` file.

```PowerShell
$VERSION = (curl -UseBasicParsing https://dl.enforce.dev/chainctl/latest/metadata.json | ConvertFrom-Json).version
curl -o chainctl.exe https://dl.enforce.dev/chainctl/$VERSION/chainctl_windows_x86_64.exe
```

It may take several minutes for this operation to complete.

Following that you can use `chainctl`. Be aware that Windows PowerShell does not load commands from the working directory by default so you will need to include `.\` before any `chainctl` commands you run, as in this example.

```PowerShell
.\chainctl auth login
```

Also, please note that while [`chainctl` commands](/platform/chainctl/) will generally work, some are not as thoroughly tested on Windows and may not behave as expected.

## Install with Scoop in Windows

Scoop is a command-line installer for Windows that has a community-contributed and -maintained way of [installing `chainctl`](https://scoop.sh/#/apps?q=chainctl).

If you have Scoop installed, then installing `chainctl` only requires two commands.

First, add the bucket.

```shell
scoop bucket add main
```

And then install `chainctl` from there.

```shell
scoop install main/chainctl
```

## Verifying the `chainctl` binary with Cosign

Before running `chainctl` for the first time, you should verify the integrity of the downloaded binary using Cosign. This ensures the binary has not been tampered with. Ensure that you have the latest version of Cosign installed by following our [How to install Cosign guide](/open-source/sigstore/cosign/how-to-install-cosign/).

If you are continuing in the same terminal session as the installation step above, `PLATFORM` and `VERSION` are already set. Otherwise, resolve them again first. Then verify the binary you just downloaded, pulling the signature and certificate from the same pinned version:

```sh
PLATFORM="$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/aarch64/arm64/')"
VERSION=$(curl -sS "https://dl.enforce.dev/chainctl/latest/metadata.json" | jq -r .version)
cosign verify-blob \
   --signature "https://dl.enforce.dev/chainctl/${VERSION}/chainctl_${PLATFORM}.sig" \
   --certificate "https://dl.enforce.dev/chainctl/${VERSION}/chainctl_${PLATFORM}.cert.pem" \
   --certificate-identity "https://github.com/chainguard-dev/mono/.github/workflows/.release-drop.yaml@refs/tags/v${VERSION}" \
   --certificate-oidc-issuer https://token.actions.githubusercontent.com \
   $(which chainctl)
```

{{< note >}}
Always pin the binary, signature, and certificate downloads to the same explicit `${VERSION}` rather than fetching each from `/latest/` independently. If a new release is published between the individual downloads, you can end up with a binary and a signature from different releases, and verification will fail with an error such as `invalid signature when validating ASN.1 encoded signature`.
{{< /note >}}

You should receive the following output:

```output
Verified OK
```

If you do not see the line `Verified OK` then there is a problem with your `chainctl` binary and you should reinstall it using the instructions at the beginning of this page.

## Verifying installation

Once verified, you can confirm that everything was set up correctly by checking the `chainctl` version.

```sh
chainctl version
```

You should receive output similar to the following.

```output
   ____   _   _      _      ___   _   _    ____   _____   _
  / ___| | | | |    / \    |_ _| | \ | |  / ___| |_   _| | |
 | |     | |_| |   / _ \    | |  |  \| | | |       | |   | |
 | |___  |  _  |  / ___ \   | |  | |\  | | |___    | |   | |___
  \____| |_| |_| /_/   \_\ |___| |_| \_|  \____|   |_|   |_____|
chainctl: Chainguard Control

GitVersion: <semver version>
GitCommit:  <commit hash>
GitTreeState:  clean
BuildDate:  <date here>
GoVersion:  <compiler version>
Compiler:   gc
Platform:   <your platform>
```

If you received output that you did not expect, check your bash profile to make sure that your system is using the expected PATH.

## Authenticating

With chainctl installed, you can authenticate into Chainguard with the following command:

```sh
chainctl auth login
```

This will open your browser window and take you through a workflow to login with your OIDC provider.

{{< blurb/chainctl-auth >}}

### Authentication tokens

If you ever need to retrieve your local Chainguard token, you can do so with the following command:

```shell
chainctl auth token
```

Following the [XDG standard](https://specifications.freedesktop.org/basedir/latest/), chainctl stores tokens in the local OS's cache directory:

* **On Linux systems**, this is typically `~/.cache/`
* **On MacOS**, this is `~/Library/Caches/`
* **On Windows**, this is `%LocalAppData%` (typically `C:\Users\<username>\AppData\Local`)

The token's path is the local cache directory appended with `/chainguard/<audience>/<oidc-token|refresh-token>`. The `oidc-token` is a short-lived access token used for authentication, while the `refresh-token` is a longer-lived credential that allows chainctl to obtain new access tokens without requiring you to log in again.

For example, on Linux you can find the `oidc-token` for the `https://console-api.enforce.dev` audience in the following location:

```
/home/$USER/.cache/chainguard/https:--console-api.enforce.dev/
```

Note that for this audience, chainctl replaces `/` with `-` in order to ensure a valid file path.

On Windows, the same `oidc-token` is stored at:

```
C:\Users\<username>\AppData\Local\chainguard\https---console-api.enforce.dev\oidc-token
```

Windows doesn't allow `:` in file paths either, so on Windows chainctl replaces both `/` and `:` with `-`. The `https://console-api.enforce.dev` audience becomes `https---console-api.enforce.dev` (three hyphens), rather than the `https:--console-api.enforce.dev` form used on Linux and macOS.

## Configure a Docker credential helper

You can configure a Docker credential helper with chainctl by running:

```sh
chainctl auth configure-docker
```

This will:

* Create a link for `docker-credential-cgr` in the same directory as `chainctl`.
* Update your Docker config file to call `docker-credential-cgr` when an auth token is needed. A browser window will open when the token needs to be refreshed.

{{< note >}}
If you installed `chainctl` to a directory that needs root permissions and run as root (eg with `sudo`) when creating the `docker-credential-cgr` symlink, and then complete login in that same session, the Docker credentials will be written to `root`'s `.docker/config.json` instead of your user's Docker config. In that case, run `configure-docker` again as the correct user.
{{< /note >}}

### Docker credential helper on Windows

On Windows, Docker expects a `docker-credential-cgr.exe` helper to be available on your `PATH`. `chainctl auth configure-docker` creates this helper for you by copying `chainctl.exe` to `docker-credential-cgr.exe` in the same directory. Because it copies the binary rather than creating a symbolic link, a standard, non-administrator account can run it without enabling Developer Mode or running PowerShell as an administrator. To make Docker pulls work, perform the following steps:

#### 1. Add `chainctl.exe` to the `PATH` (replace `C:\Tools` with the actual directory you used):

```PowerShell
$env:Path += ";C:\Tools"
```

For a persistent setup, add that directory to your user or system `PATH` via the Windows Environment Variables settings.

#### 2. Authenticate and configure Docker credentials:

```PowerShell
chainctl auth configure-docker
```

`chainctl auth configure-docker` creates `docker-credential-cgr.exe` next to `chainctl.exe` and updates your Docker configuration to use it. You don't need to run `chainctl auth login` first; `configure-docker` authenticates you when no valid token is available. Following this, you can verify Docker pulls from Chainguard by pulling a private image.

## Updating `chainctl`

When your version of `chainctl` is a few weeks old or older, you may consider updating it to make sure that your version is the most up to date. You can update `chainctl` by running the `update` command.

```sh
sudo chainctl update
```

The update command verifies the signature of the downloaded binary in-process before replacing your existing installation, so you don't need a separate `cosign` binary on your `PATH`. Verification needs network access to the download host (`dl.enforce.dev`) and, at least on first use, to the Sigstore trust root at `tuf-repo-cdn.sigstore.dev`. If verification fails or those hosts are unreachable, the update stops, the unverified binary is removed, and your current installation is left in place.

Keeping `chainctl` up to date will ensure that you are using the most up to date version.

---

### Manage your chainctl configuration
_Path: platform/chainctl-usage/manage-chainctl-config.md_

Chainguard's `chainctl` keeps a local configuration file that controls how the CLI behaves: which Chainguard environment it talks to, how it logs you in, the defaults it applies when you omit an argument, and how it formats output. This page explains the commands that manage that file, where it lives, and every setting you can configure.

## chainctl config commands

`chainctl config` groups the commands that read and write the local configuration file. To list them, run:

```shell
chainctl config -h
```

You'll receive output like the following:

```
Local config file commands for chainctl.

Usage:
  chainctl config [command]

Available Commands:
  edit        Edit the current chainctl config file.
  reset       Remove local chainctl config files and restore defaults.
  save        Save the current chainctl config to a config file.
  set         Set an individual configuration value property.
  unset       Unset a configuration property and return it to default.
  validate    Run diagnostics on local config.
  view        View the current chainctl config.

Flags:
  -h, --help   help for config

Global Flags:
      --api string        The url of the Chainguard platform API. (default "https://console-api.enforce.dev")
      --audience string   The Chainguard token audience to request. (default "https://console-api.enforce.dev")
      --config string     A specific chainctl config file. Uses CHAINCTL_CONFIG environment variable if a file is not passed explicitly.
      --console string    The url of the Chainguard platform Console. (default "https://console.chainguard.dev")
      --issuer string     The url of the Chainguard STS endpoint. (default "https://issuer.enforce.dev")
  -o, --output string     Output format. One of: ["", "json", "id", "table", "terse", "tree", "wide"]
  -v, --v int             Set the log verbosity level.

Use "chainctl config [command] --help" for more information about a command.
```

Each command is covered below. The full command reference is available on the [`chainctl config` reference page](/platform/chainctl/chainctl-docs/chainctl_config/).

## View your current configuration

To print the configuration chainctl is currently using, run:

```shell
chainctl config view
```

You'll receive output similar to this:

```output
# Base Config file: /home/erika/.config/chainctl/config.yaml
auth:
    mode: browser
default:
    active-within: 24h0m0s
    autoclose: true
    autoclose-timeout: "10"
    group: ""
    log-level: ""
    identity-provider: ""
    org-name: ""
    skip-auto-login: false
    skip-version-check: false
    social-login: google-oauth2
    use-refresh-token: true
output:
    color:
        fail: '#ff0000'
        pass: '#00ff00'
        warn: '#ffa500'
        info: ""
        highlight: ""
        secondary: ""
        special: ""
    silent: false
platform:
    api: https://console-api.enforce.dev
    audience: https://console-api.enforce.dev
    console: https://console.chainguard.dev
    issuer: https://issuer.enforce.dev
    registry: https://cgr.dev
```

`view` prints the effective values after defaults, the file, and any environment variables are combined. If you have `CHAINGUARD*` environment variables set, they are listed below the file contents. Add `--diff` to compare the effective configuration against what is written on disk.

## Where your configuration lives

chainctl looks for a configuration file in three locations and uses the first one it finds:

1. `./chainctl/config.yaml` (relative to your current directory)
2. `<config-dir>/chainctl/config.yaml`
3. `~/.chainguard/config.yaml`

`<config-dir>` is your operating system's user configuration directory: `~/Library/Application Support` on macOS, and `$XDG_CONFIG_HOME` (usually `~/.config`) on Linux. Passing `--config FILE` (or setting the `CHAINCTL_CONFIG` environment variable) points chainctl at a specific file and bypasses this search. When chainctl writes a file itself (for example with `save` or `edit`), it uses `<config-dir>/chainctl/config.yaml`.

## Edit the chainctl configuration

Settings are resolved in order of precedence, where a higher source overrides a lower one:

```
┌──────────────────────┐
│ command-line flags   │  highest
└──────────┬───────────┘
           │
┌──────────▼───────────┐
│ CHAINGUARD_ env vars │
└──────────┬───────────┘
           │
┌──────────▼───────────┐
│ config file          │
└──────────┬───────────┘
           │
┌──────────▼───────────┐
│ built-in defaults    │  lowest
└──────────────────────┘
```

## Override settings with environment variables

Any setting can be overridden with an environment variable without editing the file. Prefix the property name with `CHAINGUARD_`, uppercase it, and replace the dots with underscores:

```shell
export CHAINGUARD_PLATFORM_API=https://console-api.enforce.dev
export CHAINGUARD_DEFAULT_GROUP=<group-id>
export CHAINGUARD_OUTPUT_SILENT=true
```

Environment variables take precedence over the file, so they are useful for CI jobs or for temporarily targeting a different environment.

## Configurable properties

Properties are addressed with dot-delimited, lowercase names (for example `output.color.pass`) and fall into four groups. The tables below list every property, its default, and what it does.

### Platform endpoints

The `platform` keys tell chainctl which Chainguard environment to use. The defaults target Chainguard's production environment, so you normally only change these when working against a different environment. Each value must be a valid URL; an invalid value is discarded and the default is restored.

| Property | Default | Description |
|---|---|---|
| `platform.api` | `https://console-api.enforce.dev` | Chainguard platform API endpoint. |
| `platform.console` | `https://console.chainguard.dev` | Chainguard Console URL. |
| `platform.issuer` | `https://issuer.enforce.dev` | Token issuer (STS) endpoint used at login. |
| `platform.registry` | `https://cgr.dev` | Registry endpoint. |
| `platform.audience` | same as `platform.api` | Token audience requested at login. |

### Authentication

The `auth` key controls the login flow.

| Property | Default | Description |
|---|---|---|
| `auth.mode` | `browser` | Login flow. One of `browser` (opens a browser) or `headless` (for environments without one). |

### Defaults

The `default` keys supply values chainctl uses when a command needs one and you do not pass it explicitly.

| Property | Default | Description |
|---|---|---|
| `default.group` | (empty) | Group or folder ID used as the parent when a command needs one and you do not specify it. |
| `default.org-name` | (empty) | Organization name to log in to. |
| `default.social-login` | (empty) | Default social login provider. One of `email`, `github`, `gitlab`, or `google`. |
| `default.identity-provider` | (empty) | ID of a custom identity provider to authenticate through. Using it to select a social provider is deprecated; use `default.social-login` instead. |
| `default.active-within` | `24h` | Default time window for commands that filter by recent activity (the `--active-within` flag). Must be a positive duration. |
| `default.autoclose` | `true` | Whether the browser "login successful" page closes itself. |
| `default.autoclose-timeout` | `10` | Seconds before the login-success page closes. |
| `default.use-refresh-token` | `true` | Whether login stores a refresh token so you are prompted to re-authenticate less often. |
| `default.skip-auto-login` | `false` | When `true`, chainctl does not start a login flow automatically. |
| `default.skip-version-check` | `false` | Skip the check for a newer chainctl release. |
| `default.log-level` | (empty) | Log verbosity for chainctl. |

### Output

The `output` keys control console output and coloring.

| Property | Default | Description |
|---|---|---|
| `output.silent` | `false` | Suppress informational messages (printed to standard error). |
| `output.color.pass` | (empty) | Color for success text. |
| `output.color.fail` | (empty) | Color for failure text. |
| `output.color.warn` | (empty) | Color for warnings. |
| `output.color.info` | (empty) | Color for informational text. |
| `output.color.highlight` | (empty) | Highlight color. |
| `output.color.secondary` | (empty) | Secondary text color. |
| `output.color.special` | (empty) | Special-case color. |

Color values accept a hex code such as `#00ff00` or a CSS color name such as `green`. Regardless of these settings, chainctl disables color when the `NO_COLOR` environment variable is set, when output is piped or redirected (not a terminal), or when `TERM=dumb`.

## Change a setting

You can edit the configuration file directly in an editor. The following command opens it in your default command-line text editor (typically `nano`; set the `EDITOR` environment variable to choose another), then prompts you to save your changes:

```shell
chainctl config edit
```

To change a single property instead, use `set` with the property name and value as two separate arguments:

```shell
chainctl config set platform.api https://console-api.enforce.dev
```

To return a property to its default, use `unset`:

```shell
chainctl config unset output.color.pass
```

Both `set` and `unset` write to the configuration file immediately. Refer to the [`chainctl config set` reference page](/platform/chainctl/chainctl-docs/chainctl_config_set/) for more detail.

## Save a configuration file

If you do not have a configuration file yet, `save` writes the current effective configuration (defaults plus any overrides) to disk so you have a file to edit:

```shell
chainctl config save
```

Without `--config`, it writes to the default location, `<config-dir>/chainctl/config.yaml`.

## Validate your configuration

`validate` runs connectivity diagnostics rather than checking the file's contents. It confirms that the platform and required supporting domains resolve, and tests that the API and issuer endpoints are reachable:

```shell
chainctl config validate
```

Use it to diagnose networking or endpoint problems, for example when login fails behind a proxy or firewall.

## Reset your configuration

If you run into issues with your configuration, reset it to the default state:

```shell
chainctl config reset
```

This deletes the configuration files chainctl manages in the default locations and restores default values. Files you passed explicitly with `--config` are not deleted. You can review all available commands in the [`chainctl` reference documentation](/platform/chainctl/chainctl-docs/chainctl/).

---

### Pull token output formats and credential names
_Path: platform/chainctl-usage/pull-token-output.md_

`chainctl auth pull-token create` returns two values:

* An **identity ID**, the identifier of the pull token identity that `chainctl` just created. It takes the form `ORGANIZATION_ID/TOKEN_ID`, where both parts are hexadecimal strings.
* A **token**, a JSON Web Token that authenticates as that identity until the token's time to live expires.

Every tool that consumes a pull token takes that pair as a username and a password for [HTTP basic authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Authentication#basic_authentication_scheme): the identity ID is the username, and the token is the password. What changes between output formats is only the label.

## Terminology mapping

| Value | Default output | `--output=json` | `--output=env` |
| --- | --- | --- | --- |
| Identity ID | `Username` | `identity_id` | `CHAINGUARD_IDENTITY_ID` or `CHAINGUARD_<ECOSYSTEM>_IDENTITY_ID` |
| Token | `Password` | `token` | `CHAINGUARD_TOKEN` or `CHAINGUARD_<ECOSYSTEM>_TOKEN` |

The Chainguard Console labels the same two values **Username** and **Password** when it displays a new access token.

`chainctl auth pull-token` without a subcommand is equivalent to `chainctl auth pull-token create`, so the formats described here apply to both.

`chainctl auth pull-token create` supports two output formats, `env` and `json`, plus the default output you get when you pass no `--output` flag at all.

## Default output

With no `--output` flag, `chainctl` prints instructions for the repository type you asked for.

For `--repository=oci`, the default, it prints a ready-to-run `docker login` command:

```sh
chainctl auth pull-token create
```

```output
To use this pull token in another environment, run this command:

    docker login "cgr.dev" --username "<identity-id>" --password "<pull-token>"
```

The `--username` value is the identity ID and the `--password` value is the token. Both work with any tool that logs in to an OCI registry, including Podman, Helm, and registry mirroring tools. Refer to [Authenticate to Chainguard's Registry](/chainguard/containers/registry/authenticating/#using-a-pull-token-with-podman-helm-and-other-tools) for examples.

For every other repository type, `chainctl` prints the pair as a username and a password:

```sh
chainctl auth pull-token create --repository=java
```

```output
To use this pull token in another environment, supply the following for Basic authorization:

Username: <identity-id>

Password: <pull-token>
```

## JSON output

`--output=json` prints one compact object with an `identity_id` field and a `token` field:

```sh
chainctl auth pull-token create --repository=java --output=json
```

```output
{"identity_id":"<identity-id>","token":"<pull-token>"}
```

The field names stay the same for every repository type. Pipe the object to `jq` or another JSON processor to extract either value:

```sh
TOKEN_JSON=$(chainctl auth pull-token create --repository=java --output=json)
USERNAME=$(echo "$TOKEN_JSON" | jq -r '.identity_id')
PASSWORD=$(echo "$TOKEN_JSON" | jq -r '.token')
```

## Environment output

`--output=env` prints two `export` statements, one per value:

```sh
chainctl auth pull-token create --repository=java --output=env
```

```output
export CHAINGUARD_JAVA_IDENTITY_ID=<identity-id>
export CHAINGUARD_JAVA_TOKEN=<pull-token>
```

Wrap the command in `eval` to run those `export` statements, which sets both variables in your current session:

```sh
eval $(chainctl auth pull-token create --repository=java --output=env)
```

The variable names depend on the repository type. For a library ecosystem, `chainctl` uppercases the `--repository` value and inserts it into the name; for `oci` and `apk` it uses the unqualified names.

| `--repository` | Identity ID variable | Token variable |
| --- | --- | --- |
| `oci` (default) | `CHAINGUARD_IDENTITY_ID` | `CHAINGUARD_TOKEN` |
| `apk` | `CHAINGUARD_IDENTITY_ID` | `CHAINGUARD_TOKEN` |
| `java` | `CHAINGUARD_JAVA_IDENTITY_ID` | `CHAINGUARD_JAVA_TOKEN` |
| `javascript` | `CHAINGUARD_JAVASCRIPT_IDENTITY_ID` | `CHAINGUARD_JAVASCRIPT_TOKEN` |
| `python` | `CHAINGUARD_PYTHON_IDENTITY_ID` | `CHAINGUARD_PYTHON_TOKEN` |

Because the ecosystem name is part of the variable, credentials for two ecosystems can coexist in one shell session or one secrets file:

```sh
eval $(chainctl auth pull-token create --repository=java --output=env)
eval $(chainctl auth pull-token create --repository=python --output=env)
```

Each invocation creates a new pull token identity. Write the `export` statements to a file or a secrets manager rather than rerunning the command whenever you need the values again, because `chainctl` displays the token only once.

### Chainguard and tool-specific variables

`chainctl` emits variables starting with `CHAINGUARD_`. However, build tools that read credentials from the environment typically use their own names, and don't read the `CHAINGUARD_*` variables directly. In such cases, you must map one to the other explicitly.

For example, `uv` reads index-scoped credentials from `UV_INDEX_<NAME>_USERNAME` and `UV_INDEX_<NAME>_PASSWORD`, where `<NAME>` is the index name in uppercase, with underscores replacing hyphens. For an index named `chainguard`:

```sh
export UV_INDEX_CHAINGUARD_USERNAME="${CHAINGUARD_PYTHON_IDENTITY_ID}"
export UV_INDEX_CHAINGUARD_PASSWORD="${CHAINGUARD_PYTHON_TOKEN}"
```

The same pattern applies wherever a tool defines its own variable, such as the `HTTP_AUTH` variable used for [private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/#pull-token-automation):

```sh
export HTTP_AUTH="basic::${CHAINGUARD_IDENTITY_ID}:${CHAINGUARD_TOKEN}"
```

Names you choose yourself, such as GitHub Actions secrets, are also independent of the `CHAINGUARD_*` convention. Whatever you call them, the identity ID is the username and the token is the password.

## Why the `--output` help text lists more formats

If you pass any other value, `chainctl` prints a warning to standard error, then falls back to default output. Requesting `csv`, for example, produces a warning along these lines:

```output
"csv" is not a supported output. Supported: [ env json]. Using print to command line
```

Even when a command returns this warning, it still creates the pull token. It refuses only the formatting request, so a script that expects machine-readable output on standard output receives prose instead. This matters most for `eval`: `eval $(chainctl auth pull-token --output=csv)` creates a token, sends the warning to your terminal, and then tries to run the human-readable text as shell commands.

The `--output` flag is global, so `chainctl --help` and every reference page describe it the same way:

```output
  -o, --output string      Output format. One of: [csv, env, go-template, id, json, markdown, none, table, terse, tree, wide]
```

That list is the union of every format any `chainctl` command supports, not a list of formats that all commands support. Each command declares its own subset. Table-shaped commands such as `chainctl iam identities list` accept `csv` and `markdown`; `pull-token create` returns a single credential pair and accepts only `env` and `json`.

## Related pages

* [Authenticate to Chainguard's Registry](/chainguard/containers/registry/authenticating/#authenticating-with-a-pull-token) for container pull tokens
* [Chainguard Libraries access](/chainguard/libraries/introduction/access/#pull-token) for library pull tokens
* [Private APK repositories](/chainguard/containers/building-and-modifying/packages/private-apk-repos/#pull-token-automation) for APK pull tokens
* [chainctl auth pull-token create](/platform/chainctl/chainctl-docs/chainctl_auth_pull-token_create/) for the generated flag reference
* [Automating with chainctl](/platform/chainctl-usage/automating-chainctl/) for other scripting patterns

---

### Automating with chainctl
_Path: platform/chainctl-usage/automating-chainctl.md_

`chainctl` works well at the command line for interactive use, but it is equally suited to automation. Most `chainctl` commands accept an `--output=json` flag, which lets you pipe their output to `jq` and build reliable scripting patterns around the results.

This page collects practical snippets you can adapt for shell scripts, scheduled jobs, and CI/CD pipelines. Each snippet is a self-contained building block; combine them to fit your workflow.

{{< note >}}
The `jq` field names used in these examples reflect the expected JSON output structure. Run `chainctl <command> --output=json | jq '.'` to inspect the exact structure for your version of chainctl.
{{< /note >}}

## Prerequisites

Before running any of these snippets, you need:

- `chainctl` [installed](/chainguard/chainctl-usage/how-to-install-chainctl/)
- An active [Chainguard account](/chainguard/chainguard-registry/authenticating/)
- `jq` installed (`brew install jq` or `apt install jq`)
- For CI/CD use, a [Chainguard assumable identity](/platform/chainctl/chainctl-docs/chainctl_iam_identities_create/) configured for your pipeline

Many `chainctl` commands drop into an interactive selection menu when run without enough arguments. In scripts and pipelines, always supply flags like `--parent` explicitly so the command runs without waiting for input.

## Get a non-interactive auth token

Every automated workflow that touches Chainguard's registry or API needs a credential. The process is two steps: authenticate with `chainctl auth login`, then capture the resulting token with `chainctl auth token`.

To authenticate non-interactively, you need the UIDP of an assumable identity configured to trust your CI platform's OIDC issuer. Find it with:

```bash
chainctl iam identities list --output=json \
  | jq -r '.items[] | select(.name == "my-ci-identity") | .id'
```

Then authenticate using the identity and your platform's OIDC token, and export the result:

```bash
chainctl auth login \
  --identity="$IDENTITY_ID" \
  --identity-token="$PATH_TO_OIDC_TOKEN"

export CHAINGUARD_TOKEN=$(chainctl auth token)
```

`$PATH_TO_OIDC_TOKEN` is the path to a file containing the OIDC token provided by your CI platform. Refer to the OIDC-aware CI platforms section below for platform-specific examples.

Pass the token to Docker or `crane` to authenticate to `cgr.dev`:

```bash
echo "$CHAINGUARD_TOKEN" | docker login cgr.dev \
  --username=_token \
  --password-stdin
```

### Use in OIDC-aware CI platforms

Many CI platforms can provide a short-lived OIDC token that `chainctl` uses to authenticate without storing long-lived credentials. You configure a Chainguard assumable identity that trusts your platform's OIDC issuer, and your pipeline exchanges the token for registry access at run time.

Tested examples are available for the following platforms:

- [Authenticating with GitHub Actions](/chainguard/chainguard-registry/authenticating/#authenticating-with-github-actions)
- [Authenticating with CircleCI OIDC token](/chainguard/chainguard-registry/authenticating/#authenticating-with-circleci-oidc-token)
- [Authenticating with Microsoft Entra ID OIDC token](/chainguard/chainguard-registry/authenticating/#authenticating-with-microsoft-entra-id-oidc-token)

## Pin an image by its digest

Mutable tags like `latest` can silently change. Pinning to a digest prevents unexpected changes from reaching production. This snippet retrieves the current digest for a given tag and rewrites a Kubernetes manifest in place.

```bash
#!/usr/bin/env bash
ORG="your-org.example.com"
IMAGE="python"
TAG="3.13"
MANIFEST="deployment.yaml"

DIGEST=$(chainctl images history "$IMAGE:$TAG" \
  --parent="$ORG" --output=json \
  | jq -r '.[0].digest')

echo "Pinning $IMAGE:$TAG to $DIGEST"
sed -i "s|cgr.dev/$ORG/$IMAGE:.*|cgr.dev/$ORG/$IMAGE@$DIGEST|g" "$MANIFEST"
```

Add this as a pipeline step that runs after each image update notification to keep your manifests pinned to the most recent verified build.

## Detect when an image has been updated

This script compares the current digest for an image tag against the last known digest and runs a notification when the image changes. Schedule it on a cron or in a recurring GitHub Actions workflow.

```bash
#!/usr/bin/env bash
ORG="your-org.example.com"
IMAGE="nginx"
TAG="latest"
STATE_FILE="/tmp/.${IMAGE}-${TAG}-digest"

CURRENT=$(chainctl images history "$IMAGE:$TAG" \
  --parent="$ORG" --output=json \
  | jq -r '.[0].digest')

if [[ -f "$STATE_FILE" && "$(cat "$STATE_FILE")" != "$CURRENT" ]]; then
  echo "Image updated: cgr.dev/$ORG/$IMAGE:$TAG"
  echo "New digest: $CURRENT"
  # Add your notification logic here: webhook, Slack, GitHub dispatch, etc.
fi

printf '%s' "$CURRENT" > "$STATE_FILE"
```

If you run this in a stateless CI environment, store `STATE_FILE` in a persistent cache between runs — for example, a GitHub Actions cache keyed on the image name.

## Compare images before promotion

Before promoting a new image version to production, use `chainctl images diff` to surface changed packages and CVE-count deltas. This gives you an audit trail for the promotion decision. This command requires [grype](https://github.com/anchore/grype) to be installed and available on the system PATH.

```bash
#!/usr/bin/env bash
ORG="your-org.example.com"
IMAGE="python"
OLD_TAG="3.12"
NEW_TAG="3.13"

echo "Comparing $OLD_TAG -> $NEW_TAG for $IMAGE"
chainctl images diff \
  "cgr.dev/$ORG/$IMAGE:$OLD_TAG" \
  "cgr.dev/$ORG/$IMAGE:$NEW_TAG"
```

Capture the output with `| tee diff-report.txt` to attach it to a pull request or deployment ticket. Refer to [Compare Chainguard Containers with chainctl diff](/platform/chainctl-usage/comparing-images/) for details on reading the diff output.

## Audit role bindings for compliance

This snippet exports a snapshot of all current role bindings to a JSON file. Diff the output against a prior snapshot to detect unexpected access changes — useful for periodic security reviews or SOC 2 evidence collection.

```bash
#!/usr/bin/env bash
DATE=$(date +%Y-%m-%d)
SNAPSHOT="role-bindings-${DATE}.json"

chainctl iam role-bindings list --output=json > "$SNAPSHOT"
echo "Snapshot written to $SNAPSHOT"

# Summarize: binding count per role
jq -r '.items[].role_name' "$SNAPSHOT" | sort | uniq -c | sort -rn
```

Archive snapshots to an S3 bucket or similar to build a durable audit trail. You can compare two snapshots with `diff <(jq -S . previous.json) <(jq -S . current.json)`.

## Batch-onboard new users

When a new team joins or a project kicks off, generate all the invite codes at once from a CSV file rather than creating each one by hand. The CSV should have one `email,role` pair per line with a header row.

```bash
#!/usr/bin/env bash
# Usage: ./onboard-users.sh users.csv your-org.example.com
CSV_FILE="${1:?provide a CSV file}"
ORG="${2:?provide an org name}"

while IFS=',' read -r EMAIL ROLE; do
  [[ "$EMAIL" == "email" ]] && continue   # skip header row
  echo "Creating invite: $EMAIL with role $ROLE"
  chainctl iam invite create "$ORG" \
    --role="$ROLE" \
    --email="$EMAIL" \
    --ttl=7d \
    --single-use
done < "$CSV_FILE"
```

The `--single-use` flag ensures each invite code can only be redeemed once. Adjust `--ttl` to match your onboarding window.

## Revoke a user's access

When someone leaves your organization, remove their Chainguard identity to prevent further authentication. This script looks up the identity by email address using role bindings and prints the delete command for you to confirm before running.

```bash
#!/usr/bin/env bash
# Usage: ./offboard.sh jane@example.com
EMAIL="${1:?provide an email address}"

IDENTITY_ID=$(chainctl iam role-bindings list --output=json \
  | jq -r --arg email "$EMAIL" \
    '.items[] | select(.email == $email) | .identity_id' | head -1)

if [[ -z "$IDENTITY_ID" ]]; then
  echo "No identity found for: $EMAIL"
  exit 1
fi

echo "Found identity: $IDENTITY_ID"
echo "Run the following to delete it:"
echo "  chainctl iam identities delete $IDENTITY_ID --yes"
```

The script prints the delete command rather than running it, so you can verify the identity ID before committing. Replace the final two lines with `chainctl iam identities delete "$IDENTITY_ID"` once you are confident in the match.

## Manage event subscriptions as code

Event subscriptions route Chainguard platform events — such as new vulnerability detections — to an external endpoint. Rather than creating subscriptions by hand, treat them as managed configuration and verify their existence in your infrastructure provisioning pipeline.

```bash
#!/usr/bin/env bash
# Usage: ./ensure-subscription.sh your-org.example.com https://hooks.example.com/chainguard
ORG="${1:?provide an org name}"
ENDPOINT="${2:?provide a webhook URL}"

EXISTING=$(chainctl events subscriptions list --output=json \
  | jq -r --arg url "$ENDPOINT" \
    '.items[] | select(.sink == $url) | .id')

if [[ -n "$EXISTING" ]]; then
  echo "Subscription already present (id: $EXISTING)"
else
  echo "Creating subscription: $ORG -> $ENDPOINT"
  chainctl events subscriptions create "$ENDPOINT" \
    --parent="$ORG"
fi
```

Run this script idempotently during infrastructure provisioning. If the subscription already exists, it exits cleanly without creating a duplicate.

---

For a full reference of every `chainctl` command and flag, refer to the [chainctl reference](/platform/chainctl/).

---

### Create, view, and delete chainctl events
_Path: platform/chainctl-usage/chainctl-events.md_

Chainguard's `chainctl events` commands provide programmatic access to security event streams using the [CloudEvents](https://cloudevents.io/) specification. These commands enable you to monitor container activities, security alerts, and supply chain events across your organization for enhanced observability and compliance.

Chainguard Academy has several deeper guides on [Chainguard CloudEvents](/chainguard/administration/cloudevents/). You may find our guide on [Subscribing to Chainguard CloudEvents](/chainguard/administration/cloudevents/events-example/) to be particularly useful for understanding how to work with events from Chainguard while [Chainguard Events](https://edu.chainguard.dev/chainguard/administration/cloudevents/events-reference/) provides a deeper dive into the content and make up of events.

There are three `chainctl events` commands available: `create`, `list`, and `delete`.

## Create event subscriptions

To create a new event and subscribe to events in that organization or folder, use:

```shell
chainctl events subscriptions create $SINK_URL
```

A sink is an addressable or callable resource that can receive incoming events delivered over HTTPS and will translate the delivered event into a returned response that includes promised information. The style and type of response is set by the sink.

Depending on the sink, you may be prompted to respond to some questions before this action is complete. You can add a `-y` to the command to automatically assume `yes` and run without interaction.

## View your event subscriptions

To retrieve a list of all your Chainguard account's subscriptions, use:

```shell
chainctl events subscriptions list
```

This will return a list of IDs and sinks for all of your subscriptions.

## Delete event subscriptions

To delete an existing event, use:

```shell
chainctl events subscriptions delete $SUBSCRIPTION_ID
```

Depending on the sink, you may be prompted to respond to some questions before this action is complete. You can add a `-y` to the command to automatically assume `yes` and run without interaction.

---

### Find and update your chainctl release version
_Path: platform/chainctl-usage/chainctl-version-update.md_

Chainguard regularly releases updates to `chainctl` with new security features, performance improvements, and expanded capabilities for container management. This guide explains how to check your current version and update to the latest release.

For a full reference of all commands with details and switches, refer to [chainctl reference](/platform/chainctl/).

## View your chainctl version

To see which `chainctl` version you have installed, use:

```shell
chainctl version
```

This command tells you more than just a release number.

```output

               ▄▄▄▄▄▄▄▄▄▄▄
             ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▄▄▄▄▄▄▄     ▄▄▄▄▄▄▄▄

   ____   _   _      _      ___   _   _    ____   _____   _
  / ___| | | | |    / \    |_ _| | \ | |  / ___| |_   _| | |
 | |     | |_| |   / _ \    | |  |  \| | | |       | |   | |
 | |___  |  _  |  / ___ \   | |  | |\  | | |___    | |   | |___
  \____| |_| |_| /_/   \_\ |___| |_| \_|  \____|   |_|   |_____|
chainctl: Chainguard Control

GitVersion:    v0.2.66
GitCommit:     cb0ff7f1806341b20fd72be4769668a1985ed845
GitTreeState:  clean
BuildDate:     2025-04-09T07:49:51Z
GoVersion:     go1.24.1
Compiler:      gc
Platform:      linux/amd64

```

## Update your chainctl install

To update your `chainctl` installation to the latest release, use:

```shell
chainctl update
```

This will present the following:

```output
Current version         v0.2.66
Latest version          0.2.73

Download URL            https://dl.enforce.dev/chainctl/latest/chainctl_linux_x86_64
chainctl filepath       /usr/local/bin/chainctl
Cache                   /root/.cache/chainctl

Operating System        linux
Architecture            x86_64

Do you want to continue? [Y,n]:
```

Enter `Y` to proceed and the upgrade will continue and confirm like this:

```output
   ✔ Download complete!

Backing up current chainctl (/usr/local/bin/chainctl)
Updating chainctl...

   Update complete! ⛓

               ▄▄▄▄▄▄▄▄▄▄▄
             ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
           ▄▄▄▄▄▄▄     ▄▄▄▄▄▄▄▄

   ____   _   _      _      ___   _   _    ____   _____   _
  / ___| | | | |    / \    |_ _| | \ | |  / ___| |_   _| | |
 | |     | |_| |   / _ \    | |  |  \| | | |       | |   | |
 | |___  |  _  |  / ___ \   | |  | |\  | | |___    | |   | |___
  \____| |_| |_| /_/   \_\ |___| |_| \_|  \____|   |_|   |_____|
chainctl: Chainguard Control

GitVersion:    v0.2.73
GitCommit:     bd6a3e9901c85801697599d72e2646a862570cde
GitTreeState:  clean
BuildDate:     2025-04-22T17:27:55Z
GoVersion:     go1.24.2
Compiler:      gc
Platform:      linux/amd64

Temporary files may need to be removed manually:
  rm -f /root/.cache/chainctl/chainctl.bak

```

`chainctl update` verifies the signature of the downloaded binary in-process before installing it, so you don't need a separate `cosign` binary on your `PATH`. Verification needs network access to `dl.enforce.dev` and, at least on first use, to the Sigstore trust root at `tuf-repo-cdn.sigstore.dev`. If verification fails or those hosts are unreachable, the update stops and your current installation is left in place.

---

### Manage identity and access with chainctl
_Path: platform/chainctl-usage/chainctl-iam.md_

Chainguard's identity and access management (IAM) system provides fine-grained control over container registries, security resources, and organizational permissions. The `chainctl iam` commands enable you to manage users, roles, identities, and access policies programmatically for enhanced security and compliance.

For the following, assume that returned information only includes that which your account has permissions to view. Also, actions such as `create` and `delete` are similarly limited.

This page is intended as an introductory overview of IAM with chainctl. For a full reference of all commands with details and switches, refer to [chainctl reference](/platform/chainctl/).

## List folders

Folders contain the catalogs of things your organization has access to.

Find out what folders are available to your organization with:

```shell
chainctl iam folders list $ORGANIZATION_NAME
```

For example, for our Developer Enablement team, which uses the `chainguard.edu` organization, the interaction looks like this:

```shell
chainctl iam folders list chainguard.edu
```

```output
[chainguard.edu] Developer Enablement images catalog
```

This command can also delete, describe, and update folders by replacing `list` with `delete`, `describe`, or `update`. Refer to the reference guide for more details.

## List and describe identities

To list all of the existing identities along with roles, types, and more, use:

```shell
chainctl iam identities list
```

Because this command requests a large amount of information, you may find it useful to direct the output into a file or pipe it into a filter. If you know the specific `IDENTITY_NAME` or `IDENTITY_ID` that you want to know more about, use:

```shell
chainctl iam identities describe {IDENTITY_NAME | IDENTITY_ID}
```

This command can also create, delete, describe, and update identities by replacing `list` with `create`, `delete`, `describe`, or `update`. Refer to the reference guide for more details.

## List and create identity providers

This command enables you to manage your own identity management provider, such as a custom OIDC provider. To list all currently configured identity management providers, use:

```shell
chainctl iam identity-providers list
```

This command can also create, delete, and update your organization's identity providers by replacing `list` with `create`, `delete`, or `update`. Refer to the reference guide for more details.

To tell chainctl about your OIDC provider and enable users to start using it, use create:

```shell
chainctl iam identity-provider create --name=google \
--oidc-issuer=https://accounts.google.com \
--oidc-client-id=foo \
--oidc-client-secret=bar \
--default-role=viewer
```

## List and create invites

This command lets you manage invite codes that register identities with Chainguard. To list current invites, use:

```shell
chainctl iam invites list
```

This will return a list of invites by ID with information about the invite's expiration date, associated roles, and keyID.

This command can also create and delete invites by replacing `list` with `create` or `delete`. Refer to the reference guide for more details.

To create a new invite, use create, like in this example that defines a role, an email address to tie the invite to, the valid length of the invitation, and that it can only be used once:

```shell
chainctl iam invite create ORGANIZATION_NAME
--role=viewer
--email=sandra@organization.dev
--ttl=7d
--single-use
```

## List organizations

To list all of the organizations your account is associated with, use:

```shell
chainctl iam organizations list
```

Most users will only be associated with one organization, but admin and support users may find using this command especially useful to determine whether they have needed permissions to interact with specific organizations when help is needed.

This command can also delete and describe organizations by replacing `list` with `delete` or `describe`. Refer to the reference guide for more details.

## List roles

To list all of the roles your account is associated with, use:

```shell
chainctl iam roles list
```

This command can also create, delete, and update identities by replacing `list` with `create`, `delete` or `update`.

It is possible to define role details during creation or create a role interactively. To create a role interactively, use:

```shell
chainctl iam roles create ROLE_NAME
```

To find out what actions can be done by each role, use:

```shell
chainctl iam roles capabilities list
```

This returns a list like this sample:

```shell
$ chainctl iam roles capabilities list
         RESOURCE        |                 ACTION
-------------------------+-----------------------------------------
  account_associations   | create, delete, list, update
  attestations           | list
  build_report           | list
  clusters               | create, delete, discover, list, update
  group_invites          | create, delete, list
  groups                 | create, delete, list, update
  identity               | create, delete, list, update
  identity_providers     | create, delete, list, update
  libraries.entitlements | create, delete, list
  libraries.java         | list
  libraries.python       | list
  manifest               | create, delete, list, update
  manifest.metadata      | list
  namespaces             | list
  nodes                  | list
  policy                 | create, delete, list, update
  record_contexts        | list
  record_policy_results  | list
  record_signatures      | list
  records                | list
  registry.entitlements  | list
  repo                   | create, delete, list, update
  risks                  | list
  role_bindings          | create, delete, list, update
  roles                  | create, delete, list, update
  sboms                  | list
  sigstore               | create, delete, list, update
  sigstore.certificate   | create
  subscriptions          | create, delete, list, update
  tag                    | create, delete, list, update
  version                | list
  vuln                   | create
  vuln_report            | create, list
  vuln_reports           | list
  workloads              | list
  ```

To find out about role bindings, use:

```shell
chainctl iam role-bindings list
```

The `chainctl iam role-bindings` command can also create, delete, and update identities by replacing `list` with `create`, `delete` or `update`.

---

### Compare chainctl usage with the Chainguard Console
_Path: platform/chainctl-usage/comparing-chainctl-to-console/index.md_

Chainguard provides two powerful interfaces for managing container security resources: the web-based Console for visual exploration and the `chainctl` CLI for automation and scripting. Understanding when to use each tool maximizes your efficiency in managing Chainguard's security-hardened containers and access controls.

## Prerequisites

To access the [Chainguard Console](/platform/console/images-directory/) you need to [create an account and sign in](https://console.chainguard.dev/auth/login). The Console is accessible to everyone, including users who aren't Chainguard customers.

To use `chainctl`, start by [installing chainctl](/chainguard/chainctl-usage/how-to-install-chainctl/). Refer to [Get started with chainctl](/get-started/getting-started-with-chainctl/) to help you begin using it; the examples on this page assume you have `chainctl` installed and are authenticated.

## High-level comparison

The Console is especially useful for one-off information searches, such as when you don't know precisely what you want to know. The Console provides detailed information, but may require a few clicks to hone in on precisely what you are looking for. You can perform useful container-related query tasks from within the Console, as this page will demonstrate with some examples.

If you know specifically what you are looking for or what you want to accomplish, `chainctl` is a powerful way to do so. It can perform some additional tasks that are not yet available in the Console, such as [comparing images with a diff](/chainguard/chainctl-usage/comparing-images/).

This guide will take the reader through a few use cases to illustrate.

## Find available images

### Find available images in the Console

To find the images available to you in the Console, do this:

1. Open the [Console](https://console.chainguard.dev)
![Screenshot showing the Overview page in the Console.](console-overview.png)

1. On the Overview page that opens, click **Images** in the sidebar.
![Screenshot showing the Images page in the Console, which lists all of the images available along with data for each including Status, Latest tag, Pull URL, and when the image was last updated.](console-org-images.png)

### Find available images with chainctl

To find the images available to you using `chainctl`, use this command. The list of available images is likely to be long and will scroll past you quickly in the terminal, so it may be more useful to you by piping the output into a grep search or redirecting the output into a file.

```sh
chainctl images list

```

## Invite users

### Invite users in the Console

To invite a user using the Console, follow these steps:

1. Open the Console.

1. On the Overview page that opens, click the **Manage pull tokens** tab, just below the search box.

1. On the Settings page that opens, click **Users** in the sidebar.
![Screenshot showing the Settings page in the Console.](console-settings.png)

1. Click **Invite users**.
![Screenshot showing the list of users in the Console.](console-users.png)

1. Enter the **Email address** of the user you are inviting and use the dropdown menu to assign a **Role** for this user. Click **Invite**.

### Invite users using chainctl

To invite a user using `chainctl`, use this command, substituting your organization name for ORGANIZATION along with setting the role, email address, length of time for the invite to be valid, and whether this invite may only be used once:

```sh
chainctl iam invite create ORGANIZATION
--role=viewer
--email=sample@organization.dev
--ttl=7d
--single-use

```

## Review container image history

### Review container image history in the Console

To examine the history of an image using the Console:

1. Open the Console and find the image you want to examine more closely. Do this by clicking on an image in the **Recent Changes** list on this page or clicking **View all organization images** to see the full list and find the image you want.

1. On the image page you start on the **Tags** tab and see a list of tags which correspond to the release version of the image, like this one for `kubectl`.
![Screenshot showing the list of image versions for kubectl in the Console.](console-image-version-list.png)

This list contains columns with data about each image release, like the Pull URL, Digest, and when it was last changed. Click the other tabs to learn more about the *latest* release version of this image.

### Review container image history using chainctl

To examine the history of an image using `chainctl`, enter this:

```sh
chainctl image history kubectl:latest
```

This will return a reverse-chronological history of when a specific tag was update to point to a new manifest digest. This list can be long. Here's an excerpt:

```yaml
- time: 2025-05-29 03:08:31 UTC
  digest: sha256:34798f562dffc3746cb69bab49b93ff83aa57bea393a07997e87c37bc83a62db
  architectures:
    amd64: sha256:a71ccfdc86cd73d395d3528ce3f8df1f4dd132b73ff03016b0ec42da23d4ec99 (18.13 MB)
    arm64: sha256:2876b0c3de431f0d7df8f888a0d40bb0c8259c47109f978237d305e7818b704b (16.43 MB)
- time: 2025-05-28 17:19:58 UTC
  digest: sha256:1f798940981573c34e1d11c8b6d266f18d06e95b81251d6880f511d55b833cfd
- time: 2025-05-27 19:53:02 UTC
  digest: sha256:81095db3adc00495fceb064e86dfd81c7ffdf081c55daf6b12be6ef1605bd18c
  architectures:
    amd64: sha256:56db73a4b66ad326a7858ca4157ded2d3b6d11ff1030cfbdf3a3bd879a5a5725 (18.13 MB)
    arm64: sha256:280160c9c422d7526169812cf89401043096f5d4ff385d1b59f3610109486aed (16.43 MB)
- time: 2025-05-23 01:09:22 UTC
  digest: sha256:c0934fc335d8b24923487cb7d0b673490bd393fd4b6cd20f6f0e156a7481ffc7
  architectures:
    amd64: sha256:46e11b8beed94d93272e5a87753f9f43f02f5f1b9d83d8ba279eeb18c114c863 (18.13 MB)
    arm64: sha256:b288bc13da78aa7b2a82d50dbca45ed2fe286f0f1f248fa2e12604ef9a109f33 (16.40 MB)

...

```

The details that are returned here and the details found in the Console vary in focus, but where the same details are provided they should match. Refer to [Examine the history of container images](/chainguard/chainctl-usage/chainctl-images/#examine-the-history-of-container-images) for more information about this command.

## Learn more

To learn more about `chainctl`, see:

* [chainctl usage](/chainguard/chainctl-usage/)
* [chainctl reference](/platform/chainctl/)

To learn more about the Chainguard Console, see:

* [Using the Chainguard Directory and Console](/platform/console/images-directory/).

### Compare a Chainguard Container to a non-Chainguard alternative in the Console

This is a feature unique to the Console and is described in detail in [Using CVE visualizations](/chainguard/containers/security-and-compliance/vulnerability-management/cve-visualizations/).

### Compare two Chainguard Containers with chainctl

This is a feature unique to `chainctl` and is described in detail in [How to compare Chainguard Containers with chainctl](/chainguard/chainctl-usage/comparing-images/).

---


---

## Container Images

_This section contains documentation for Chainguard container images._

### spire-controller-manager-fips

# spire-controller-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spire-controller-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spire-controller-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The SPIRE Controller Manager provides automated workload identity management for Kubernetes clusters through SPIRE

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream SPIRE Controller Manager, which provides automated workload identity management and registration for Kubernetes clusters. While this image maintains functional parity with the upstream version, it is built on Wolfi providing regular security updates and a minimal attack surface. Additionally, the image fully supports all SPIRE Controller Manager CRDs and configurations.

## FIPS Support

The `spiffe-controller-manager` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

To install Chainguard `spire-controller-manager` image on your Kubernetes cluster, you can use the official [Helm chart](https://github.com/spiffe/helm-charts-hardened/tree/main/charts/spire).

Add the SPIRE Helm repository
```shell
helm repo add spire https://spiffe.github.io/helm-charts-hardened/
helm repo update
```

Then override the image by setting the `image.repository` and `image.tag` values in a values.yaml file to Chainguard's image
```yaml
spire-controller-manager:
  image:
    registry: cgr.dev
    repository: chainguard/spire-controller-manager
    tag: latest
```

Next install the CRDs
```shell
helm install spire-crds spire/spire-crds \
  -n spire-system \
  --create-namespace
```

Finally, install SPIRE with Chainguard's image
```shell
helm install spire spire/spire \
  -n spire-system \
  -f values.yaml
```

## Documentation and Resources:

 - [Spire Controller Manager Github Repository](https://github.com/spiffe/spire-controller-manager)
 - [Official SPIFFE Documentation](https://spiffe.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-collector-contrib

# opentelemetry-collector-contrib
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-collector-contrib` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-collector-contrib/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [opentelemetry-collector-contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using this image

Chainguard cgr.dev/chainguard/opentelemetry-collector-contrib is a drop in replacement for the upstream image, tested using the community [helm chart](https://opentelemetry.io/docs/kubernetes/helm/collector/).

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set mode=<daemonset|deployment|statefulset> \
   --set image.repository=cgr.dev/chainguard/opentelemetry-collector-contrib \
   --set image.tag=latest
```

To use custom configuration it is easier to use a values.yaml file:

```yaml
mode: daemonset
configMap:
  create: false
image:
  tag: latest
  repository: cgr.dev/chainguard/opentelemetry-collector-contrib
command:
  extraArgs:
    - "--config=/conf/custom-config.yaml"
extraVolumeMounts:
  - name: "custom-vm"
    mountPath: "/conf"
extraVolumes:
  - name: "custom-vm"
    configMap:
      name: "custom"

```
```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install open-telemetry opentelemetry/opentelemetry-collector --namespace open-telemetry-custom-config -f values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### neo4j

# neo4j
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/neo4j` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/neo4j/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Neo4J is a graph database that is commonly used in applications that require complex relationships between data. Neo4j supports both a standalone and a cluster deployment of Neo4j on Kubernetes using the Neo4j Helm charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the image available from [the Neo4j project](https://github.com/neo4j/docker-neo4j-publish). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
Neo4J is a graph database that is commonly used in applications that require complex relationships between data. This image can be deployed using Docker or on Kubernetes using the Neo4j Helm charts.

### Docker

To run Neo4j using Docker, you can use the following command:

```shell
docker run -d \
  --name neo4j \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/SecurePass123! \
  cgr.dev/ORGANIZATION/neo4j:latest
```

This will start a Neo4j container with:
- HTTP port 7474 exposed for the Neo4j browser
- Authentication set to username `neo4j` and password `SecurePass123!`

The Neo4j web UI will be accessible at `http://localhost:7474` in your browser. Use the username and password configured via `NEO4J_AUTH` to log in.

For data persistence, you can mount a volume:

```shell
docker run -d \
  --name neo4j \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/SecurePass123! \
  -v $HOME/neo4j/data:/data \
  cgr.dev/ORGANIZATION/neo4j:latest
```

**Security Note:** The password `SecurePass123!` is used here for demonstration purposes only. In production environments, always use a strong, unique password by replacing `SecurePass123!` with your secure password.

For more detailed Docker usage and configuration options, visit the [upstream Neo4j Docker documentation](https://neo4j.com/docs/operations-manual/current/docker/).

### Kubernetes

To deploy Neo4j on Kubernetes, you can follow along the official [Neo4j Helm chart repository documentation](https://neo4j.com/docs/operations-manual/current/kubernetes/introduction/#_the_neo4j_helm_chart_repository).

Here is the `values.yaml` file for the Neo4j Helm chart:

```yaml
neo4j:
  name: neo4j
image:
  customImage: cgr.dev/ORGANIZATION/neo4j:latest
```

Add the Neo4j Helm chart repository:

```shell
helm repo add neo4j https://neo4j.github.io/helm-charts
```

Now, you can install the Neo4j Helm chart:

```shell
helm install neo4j neo4j/neo4j -f values.yaml
```

Following that, use port-forwarding to make the service accessible:

```shell
kubectl port-forward svc/neo4j-neo4j 7474:7474 7687:7687
```

Finally, you can access the Neo4j browser by visiting `http://localhost:7474` in your browser.

## Documentation and Resources
- [Neo4j Documentation](https://neo4j.com/docs/)
- [Neo4j Helm Chart](https://neo4j.com/docs/operations-manual/current/kubernetes/quickstart-standalone/server-setup/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apisix-ingress-controller-iamguarded

# apisix-ingress-controller-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apisix-ingress-controller-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apisix-ingress-controller-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache APISIX Ingress Controller for Kubernetes ingress management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `apisix-ingress-controller-iamguarded` image is based on the Apache APISIX Ingress Controller and provides the same functionality as the upstream project with the following differences:

* This image follows IAMGuarded container standards for enterprise compatibility
* The binary is located at `/opt/iamguarded/apisix-ingress-controller/bin/apisix-ingress-controller` instead of the default path
* Configuration files are located under `/opt/iamguarded/apisix-ingress-controller/conf/`
* The container runs as user ID 1001 (non-root) with group ID 0 (root group) following IAMGuarded standards
* Includes enhanced security context and standardized directory permissions

These changes ensure enterprise-grade security compliance while maintaining full compatibility with the upstream Apache APISIX Ingress Controller functionality.

## Prerequisites

To use this ingress controller, you need:

* A running Kubernetes cluster
* An Apache APISIX Gateway cluster
* Appropriate RBAC permissions for the ingress controller

## Getting Started

The APISIX Ingress Controller manages ingress traffic by configuring an APISIX Gateway cluster. Here's how to get started:

### Basic Version Check

First, verify the image works correctly:

```sh
docker run --rm cgr.dev/ORGANIZATION/apisix-ingress-controller-iamguarded:latest version
```

### Running with Kubernetes

The ingress controller typically runs as a deployment in Kubernetes. Create a basic configuration:

```sh
cat > apisix-ingress-controller.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apisix-ingress-controller
  namespace: apisix-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apisix-ingress-controller
  template:
    metadata:
      labels:
        app: apisix-ingress-controller
    spec:
      serviceAccountName: apisix-ingress-controller
      containers:
      - name: apisix-ingress-controller
        image: cgr.dev/ORGANIZATION/apisix-ingress-controller-iamguarded:latest
        command:
        - /opt/iamguarded/apisix-ingress-controller/bin/apisix-ingress-controller
        args:
        - ingress
        - --default-apisix-cluster-base-url=http://apisix-gateway:9180/apisix/admin
        - --log-level=info
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        ports:
        - containerPort: 8080
          name: metrics
        - containerPort: 8443
          name: webhook
        securityContext:
          runAsUser: 1001
          runAsGroup: 0
          runAsNonRoot: true
EOF
```

Apply the configuration:

```sh
kubectl apply -f apisix-ingress-controller.yaml
```

## Configuration

The APISIX Ingress Controller supports various configuration options through command-line arguments and environment variables.

### Key Configuration Parameters

* `--default-apisix-cluster-base-url`: URL to the APISIX admin API (required)
* `--log-level`: Set logging verbosity (debug, info, warn, error)
* `--log-output`: Log destination (stderr, stdout)
* `--namespace`: Kubernetes namespace to watch for resources
* `--ingress-class`: Ingress class name to handle

### Environment Variables

The IAMGuarded image includes these pre-configured environment variables:

* `IAMGUARDED_APP_NAME`: Set to "apisix-ingress-controller"
* `PATH`: Includes `/opt/iamguarded/apisix-ingress-controller/bin`

### Example Configuration with Custom Settings

```sh
docker run --rm \
  cgr.dev/ORGANIZATION/apisix-ingress-controller-iamguarded:latest \
  ingress \
  --default-apisix-cluster-base-url=http://apisix-gateway:9180/apisix/admin \
  --log-level=debug \
  --log-output=stderr \
  --namespace=default
```

## Documentation and Resources

For more information about using Apache APISIX Ingress Controller:

* [Apache APISIX Ingress Controller GitHub Repository](https://github.com/apache/apisix-ingress-controller)
* [Apache APISIX Gateway Documentation](https://apisix.apache.org/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kustomize-mutating-webhook-fips

# kustomize-mutating-webhook-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kustomize-mutating-webhook-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kustomize-mutating-webhook-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A dynamic solution to patch FluxCD Kustomization resources, seamlessly integrating and federating substitution variables across multiple namespaces.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kustomize-mutating-webhook-fips` container image is comparable to [the kustomize-mutating-webhook image](https://ghcr.io/xunholy/kustomize-mutating-webhook). Like most other Chainguard container images, the `kustomize-mutating-webhook-fips` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

### FIPS support

Chainguard's `kustomize-mutating-webhook-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The Chainguard's `kustomize-mutating-webhook-fips` container image can be installed via the [kustomize-mutating-webhook helm chart](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/tree/main/deploy/chart/kustomize-mutating-webhook).

Create a `values.yaml` file with the following values

```
image:
    repository: cgr.dev/ORGANIZATION/kustomize-mutating-webhook-fips
    tag: latest
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add kustomize-mutating-webhook https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/
helm install https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/ deploy/chart/fluxcd-mutating-webhook/ -n kusotmize-mutating-webhook -f values.yaml
```

You can then try to create a new Kustomization resource without the `postBuild` spec:

```
kubectl apply -f - <<EOF
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: test-app
  namespace: default
spec:
  interval: 10m
  path: "./deploy"
  prune: true
  sourceRef:
    kind: GitRepository
    name: test-repo
EOF
```

The webhook should then add the `postBuild` spec for you according to your config.

## Documentation and Resources

* [Official GitHub Repository](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook)
* [Official Usage Guide](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook?tab=readme-ov-file#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### filebrowser

# filebrowser
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/filebrowser` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/filebrowser/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's File Browser image is comparable to the [official File Browser image on Docker Hub](https://hub.docker.com/r/filebrowser/filebrowser), with the following differences:

- Like all other Chainguard Images, the File Browser image features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user
- This image as currently built does not support the agent bundle plugins

## Getting Started

File Browser can be deployed as a binary by running `apk add filebrowser` from the Chainguard alpine repository. It can also be deployed as a Docker container or in a Kubernetes pod.

The database config which is created by the application with BoltDB is created in the `/tmp` directory. It cannot be mounted to the root directory as the user has no permission to write to that location.

The following is an example Kubernetes pod manifest `pod.yaml`:

```
apiVersion: v1
kind: Pod
metadata:
  name: browser-pod
spec:
  containers:
    - name: filebrowser
      image: cgr.dev/ORGANIZATION/filebrowser>
      args:
        - "--database=/tmp/filebrowser.db"
      ports:
        - containerPort: 80
          hostPort: 8080
```

To test out this image, deploy a `filebrowser` pod in a Kubernetes cluster using this manifest:

```shell
kubectl apply -f pod.yaml
```

Ensure that the container is up and running and check the health status of the service

```shell
kubectl -n browser port-forward po/browser-pod 8080 &
sleep 3
```
```shell
curl localhost:8080/health | grep "OK" && exit 0
```

## Documentation and Resources

* [File Browser deployment guide](https://filebrowser.org/)
* [Project repository](https://github.com/filebrowser/filebrowser)
    * [Example Dockerfile](https://github.com/filebrowser/filebrowser/blob/master/Dockerfile)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubelet-csr-approver

# kubelet-csr-approver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubelet-csr-approver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubelet-csr-approver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubelet-csr-approver` container image is comparable to [the kubelet-csr-approver image](https://ghcr.io/postfinance/kubelet-csr-approver). Like most other Chainguard container images, the `kubelet-csr-approver` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's `kubelet-csr-approver` container image can be installed via the [kubelet-csr-approver helm chart](https://github.com/postfinance/kubelet-csr-approver/tree/main/charts/kubelet-csr-approver).

Create a `values.yaml` file with the following values

```
operator:
  image:
    repository: cgr.dev/ORGANIZATION/kubelet-csr-approver
    tag: latest
  providerRegex: '^node-\w*\.int\.company\.ch$'
  providerIpPrefixes: '192.168.8.0/22'
  maxExpirationSeconds: '86400'
  bypassDnsResolution: 'false'
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add kubelet-csr-approver https://postfinance.github.io/kubelet-csr-approver
helm install kubelet-csr-approver kubelet-csr-approver/kubelet-csr-approver -n kube-system -f values.yaml
```

We can then try creating a `CertificateSigningRequest` resource like below:

```
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: test-node-csr-valid
spec:
  request: $(base64 -w0 < /tmp/test-node.csr)
  signerName: kubernetes.io/kubelet-serving
  usages: ["digital signature","key encipherment","server auth"]
  groups: ["system:nodes"]
```

This should be Approved/Denied by the controller accordingly.

## Documentation and Resources

* [Official Quick Start](https://github.com/postfinance/kubelet-csr-approver?tab=readme-ov-file#quick-start)
* [Helm Chart](https://github.com/postfinance/kubelet-csr-approver/tree/main/charts/kubelet-csr-approver)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5891

# request-5891
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5891` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5891/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Highly Available PostgreSQL cluster using Docker

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Spilo. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's Spilo image maintains functional parity with the [upstream image](https://github.com/zalando/spilo).

Spilo is a highly available PostgreSQL distribution for Kubernetes, developed by Zalando. It combines PostgreSQL with Patroni for high availability and automatic failover, providing a robust database solution for cloud-native applications. This image includes PostgreSQL 17 with integrated support for Patroni, WAL-E/WAL-G for continuous archiving, and connection pooling capabilities.

## Getting Started

### Docker

Run a standalone Spilo instance with Docker:

```shell
docker run --rm cgr.dev/ORGANIZATION/custom-5891:latest
```

This deploys a single-node PostgreSQL cluster with Patroni.
### Kubernetes

To deploy Spilo on Kubernetes, use the Zalando Postgres Operator Helm chart. Add the Helm repository:

```shell
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo update
```

Override the default Spilo image in a `values.yaml` file:

```yaml
cat <<EOF > values.yaml
rbac:
  create: true
  createAggregateClusterRoles: false
configGeneral:
  docker_image: cgr.dev/ORGANIZATION/custom-5891:latest
  enable_pgversion_env_var: false
  kubernetes_use_configmaps: true
EOF
```

Install the Postgres Operator:

```shell
helm install postgres-operator \
  postgres-operator-charts/postgres-operator \
  -f values.yaml \
  --namespace spilo \
  --create-namespace \
  --wait
```

Create a PostgreSQL cluster:

```shell
kubectl apply -f - <<EOF
apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: my-postgres-cluster
  namespace: spilo
spec:
  teamId: "my-team"
  volume:
    size: 1Gi
  numberOfInstances: 2
  users:
    myuser:
      - superuser
      - createdb
  databases:
    mydb: myuser
  postgresql:
    version: "17"
EOF
```

Verify the cluster is running:

```shell
kubectl get postgresql -n spilo
kubectl get pods -n spilo -l cluster-name=my-postgres-cluster
```

## Documentation and Resources
- [Spilo GitHub](https://github.com/zalando/spilo)
- [Postgres Operator documentation](https://postgres-operator.readthedocs.io/)
- [Postgres Operator Helm Chart](https://github.com/zalando/postgres-operator/tree/master/charts/postgres-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5278

# request-5278
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5278` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5278/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A custom image based on the Chainguard image container image for Confluent Kafka (community edition), with some modifications per customer requirements.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is built on top of `confluent-kafka` and includes `bcfips-140-3` crypto module. At image config level, we've the following bcfips env variables.
```bash
$ crane config $IMAGE | jq .config.Env | rg fips
  "CLASSPATH=/usr/share/java/bouncycastle-fips/*",
  "JAVA_TOOL_OPTIONS=-Djava.class.path=/usr/share/java/bouncycastle-fips/bc-fips.jar",
  "JDK_JAVA_OPTIONS=--module-path=/usr/share/java/bouncycastle-fips -Djavax.net.ssl.trustStoreType=FIPS",
```
NOTE: THIS IS NOT A FIPS COMPLIANT JAVA IMAGE. It does however include the bcfips-140-3 dependency inside the image.

## Getting Started
To get started with Chainguard's request-5278 image, we can use the following docker command:
```bash
docker run -d \
  --name=kafka-kraft \
  -h kafka-kraft \
  -p 9101:9101 \
  -e KAFKA_NODE_ID=1 \
  -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' \
  -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://kafka-kraft:29092,PLAINTEXT_HOST://localhost:9092' \
  -e KAFKA_JMX_PORT=9101 \
  -e KAFKA_JMX_HOSTNAME=localhost \
  -e KAFKA_PROCESS_ROLES='broker,controller' \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS='1@kafka-kraft:29093' \
  -e KAFKA_LISTENERS='PLAINTEXT://kafka-kraft:29092,CONTROLLER://kafka-kraft:29093,PLAINTEXT_HOST://0.0.0.0:9092' \
  -e KAFKA_INTER_BROKER_LISTENER_NAME='PLAINTEXT' \
  -e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
  -e CLUSTER_ID='MkU3OEVBNTcwNTJENDM2Qk' \
  cgr.dev/ORGANIZATION/request-5278:latest
```

## Documentation and Resources
Please refer to the [upstream documentation](https://docs.confluent.io/platform/current/installation/docker/installation.html), for guidance on how to run and configure.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-helm-controller-fips

# cluster-api-helm-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-helm-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-helm-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CAAPH uses Helm charts to manage the installation and lifecycle of Cluster API add-ons.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `cluster-api-helm-controller-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Compatibility Notes

Chainguard's cluster-api-helm-controller-fips image is compatible with the upstream [Cluster API Addon Provider Helm](https://github.com/kubernetes-sigs/cluster-api-addon-provider-helm). This image contains only the minimum set of dependencies needed to run the Helm controller components.

## Getting Started

The Cluster API Helm Controller allows you to manage Helm charts as addons for your Cluster API managed clusters. It provides a way to declaratively install and manage Helm charts on workload clusters.

### Prerequisites

- A management cluster with Cluster API installed
- `clusterctl` CLI tool
- Access to the cluster-api-helm-controller-fips image

### Installation

Initialize the Helm addon provider using clusterctl:

```bash
clusterctl init --addon helm
```

Or manually install using the Chainguard image:

```bash
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: caaph-controller-manager
  namespace: caaph-system
spec:
  replicas: 1
  selector:
    matchLabels:
      control-plane: controller-manager
  template:
    metadata:
      labels:
        control-plane: controller-manager
    spec:
      containers:
      - name: manager
        image: cgr.dev/ORGANIZATION/cluster-api-helm-controller-fips:latest
        command:
        - /manager
        args:
        - --leader-elect
EOF
```

### Usage Example

Create a HelmChartProxy resource to install a Helm chart on your workload clusters:

```yaml
apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  name: nginx-ingress
spec:
  clusterSelector:
    matchLabels:
      environment: production
  repoURL: https://kubernetes.github.io/ingress-nginx
  chartName: ingress-nginx
  version: "4.7.1"
  namespace: ingress-nginx
  createNamespace: true
  valuesTemplate: |
    controller:
      service:
        type: LoadBalancer
```

## Documentation and Resources

* [Cluster API Addon Provider Helm GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-addon-provider-helm)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Helm Documentation](https://helm.sh/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ipfs-cluster

# ipfs-cluster
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ipfs-cluster` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ipfs-cluster/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Pinset orchestration for IPFS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard IPFS Cluster Image is comparable to the [official IPFS Cluster Image from Docker Hub](https://hub.docker.com/r/ipfs/ipfs-cluster). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

To get started with IPFS Cluster, you can use the [docker-compose.yaml](https://github.com/ipfs-cluster/ipfs-cluster/blob/master/docker-compose.yml) file provided in the [IPFS Cluster GitHub repository](https://github.com/ipfs-cluster/ipfs-cluster). This file contains the necessary configuration to run IPFS Cluster in a Docker environment.

To run IPFS Cluster using Docker Compose, follow these steps:

1. **Modify the compose manifest to use Chainguard's image:**:
```bash
services:
  cluster0:
    image: cgr.dev/ORGANIZATION/ipfs-cluster:latest
```

2. **Create an `.env` file** in the root directory of the cloned repository with the following content:
```env
CLUSTER_SECRET=your_secret
```

3. **Run Docker Compose**:
```bash
docker-compose up -d
```

> **NOTE**: You can learn more about the deployment options and configurations in the [IPFS Cluster Deployment documentation](https://ipfscluster.io/documentation/deployment/).

4. **Interact with IPFS Cluster**:
You can use the IPFS Cluster CLI to interact with the cluster. For example, to list peers, you can run:
```bash
ipfs-cluster-ctl peers ls
```

That's it! You now have a running IPFS Cluster instance using the Chainguard Container image.

## Documentation and Resources

- [IPFS Cluster Documentation](https://ipfscluster.io/documentation/)
- [IPFS Cluster GitHub Repository](https://github.com/ipfs-cluster/ipfs-cluster)
- [Set up server infrastructure with IPFS Cluster](https://docs.ipfs.tech/install/server-infrastructure/#set-up-server-infrastructure-with-ipfs-cluster)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spamcheck

# spamcheck
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spamcheck` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spamcheck/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Spamcheck is a gRPC-based spam classification service for GitLab

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `spamcheck` container image is a drop-in replacement for the upstream [Gitlab Spamcheck image](https://gitlab.com/gitlab-org/gl-security/security-engineering/security-automation/spam/spamcheck). It offers the same functionality as the upstream for gRPC spam detection. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image may require minor adjustments to your existing deployment configuration.

> [!IMPORTANT]
> The Chainguard spamcheck image does **not** include the proprietary `spam_classifiers` component used for machine learning-based detection. This closed-source component must be obtained from GitLab and provided to the container at runtime.

## Getting Started

### Quick Start with Docker

> [!NOTE] 
> This example requires you to have `spam_classifiers` component available locally.

```bash
docker run -d \
  -p 8001:8001 \
  -v /path/to/spam_classifiers:/spam_classifiers:ro \
  -e PYTHONPATH="/spam_classifiers:/usr/lib/python3.10/site-packages" \
  -e GRPC_ADDR="0.0.0.0:8001" \
  -e LOG_LEVEL="info" \
  cgr.dev/ORGANIZATION/spamcheck:latest
```

### Quick Start with Kubernetes

For production use, spamcheck is typically deployed to Kubernetes with an init container that downloads the `spam_classifiers` component and its dependencies. Below is a complete example:

#### Create Namespace and ConfigMap

```bash
kubectl create namespace spamcheck
```

Create a ConfigMap with a script to download spam_classifiers:

```bash
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: spamcheck-download-script
  namespace: spamcheck
data:
  download-classifiers.sh: |
    #!/bin/sh
    set -e
    echo "Downloading spam_classifiers dependencies..."
    python3.10 -m pip install --target=/shared/site-packages \
      --only-binary=:all: \
      'numpy<2' \
      'scikit-learn==1.5.2' \
      'scipy' \
      'joblib' \
      'threadpoolctl'

    # Download spam_classifiers from GitLab GCS bucket
    SPAM_CLASSIFIERS_URL="\${SPAM_CLASSIFIERS_URL:-https://storage.googleapis.com/glsec-spamcheck-ml-artifacts/spam-classifier/pip/4.2.1/spam_classifiers-4.2.1.tar.gz}"

    cd /tmp
    wget -O spam_classifiers.tar.gz "\${SPAM_CLASSIFIERS_URL}"

    echo "Extracting spam_classifiers..."
    tar -xzf spam_classifiers.tar.gz
    cd spam_classifiers-4.2.1
    python3.10 -m pip install --no-deps --target=/shared/site-packages .
EOF
```

#### Deploy Spamcheck

```bash
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spamcheck
  namespace: spamcheck
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spamcheck
  template:
    metadata:
      labels:
        app: spamcheck
    spec:
      initContainers:
      - name: download-spam-classifiers
        image: cgr.dev/ORGANIZATION/python:3.10-dev
        command: ["/bin/sh", "/scripts/download-classifiers.sh"]
        env:
        - name: SPAM_CLASSIFIERS_URL
          value: "https://storage.googleapis.com/glsec-spamcheck-ml-artifacts/spam-classifier/pip/4.2.1/spam_classifiers-4.2.1.tar.gz"
        volumeMounts:
        - name: shared-packages
          mountPath: /shared/site-packages
        - name: download-script
          mountPath: /scripts
      containers:
      - name: spamcheck
        image: cgr.dev/ORGANIZATION/spamcheck:latest
        ports:
        - containerPort: 8001
          name: grpc
          protocol: TCP
        env:
        - name: GRPC_ADDR
          value: "0.0.0.0:8001"
        - name: LOG_LEVEL
          value: "info"
        - name: PYTHONPATH
          value: "/shared/site-packages:/usr/lib/python3.10/site-packages"
        - name: LANG
          value: "C.UTF-8"
        - name: LC_ALL
          value: "C.UTF-8"
        - name: PYTHONDONTWRITEBYTECODE
          value: "1"
        - name: PYTHONFAULTHANDLER
          value: "1"
        - name: TF_CPP_MIN_LOG_LEVEL
          value: "2"
        volumeMounts:
        - name: shared-packages
          mountPath: /shared/site-packages
      volumes:
      - name: shared-packages
        emptyDir: {}
      - name: download-script
        configMap:
          name: spamcheck-download-script
          defaultMode: 0755
---
apiVersion: v1
kind: Service
metadata:
  name: spamcheck
  namespace: spamcheck
spec:
  selector:
    app: spamcheck
  ports:
  - port: 8001
    targetPort: 8001
    protocol: TCP
    name: grpc
  type: ClusterIP
EOF
```

#### Verify Deployment

Wait for the deployment to become ready:

```bash
kubectl wait --for=condition=Available -n spamcheck deployment/spamcheck --timeout=30s
```

Check the logs:

```bash
kubectl logs -n spamcheck -l app=spamcheck
```

## Documentation and Resources

- **[GitLab Repo](https://gitlab.com/gitlab-org/gl-security/security-engineering/security-automation/spam/spamcheck)**
- **[GitLab Akismet Anti-Spam Documentation](https://docs.gitlab.com/ee/integration/akismet.html)**
- **[GitLab's Spamcheck documentation](https://docs.gitlab.com/administration/reporting/spamcheck/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dependency-track

# dependency-track
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dependency-track` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dependency-track/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Dependency Track](https://github.com/DependencyTrack/dependency-track) Dependency-Track is an intelligent Component Analysis platform that allows organizations to identify and reduce risk in the software supply chain.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Dependency Track

This image should be a drop-in replacement for the `bundled` variant of the upstream image.
Documentation is available there: https://hub.docker.com/r/dependencytrack/bundled

You can run it locally with:

```shell
$ docker run -p 8080:8080 cgr.dev/chainguard/dependency-track
2023-11-24 19:01:49,201 INFO [EmbeddedJettyServer] alpine-executable-war v2.2.3 (3aff068a-a1af-4e38-85dc-3a5ee66ee121) built on: 2023-09-21T16:07:30Z
2023-11-24 19:01:56,221 INFO [Config] --------------------------------------------------------------------------------
2023-11-24 19:01:56,223 INFO [Config] OS Name:      Linux
2023-11-24 19:01:56,223 INFO [Config] OS Version:   6.4.16-linuxkit
2023-11-24 19:01:56,224 INFO [Config] OS Arch:      aarch64
2023-11-24 19:01:56,224 INFO [Config] CPU Cores:    12
2023-11-24 19:01:56,228 INFO [Config] Max Memory:   18.9 GB (20,347,092,992.0 bytes)
2023-11-24 19:01:56,228 INFO [Config] Java Vendor:  wolfi
2023-11-24 19:01:56,229 INFO [Config] Java Version: 17.0.10+1-wolfi-r0
2023-11-24 19:01:56,230 INFO [Config] Java Home:    /usr/lib/jvm/java-17-openjdk
2023-11-24 19:01:56,230 INFO [Config] Java Temp:    /tmp
2023-11-24 19:01:56,230 INFO [Config] User:         dtrack
2023-11-24 19:01:56,230 INFO [Config] User Home:    /home/dtrack
2023-11-24 19:01:56,230 INFO [Config] --------------------------------------------------------------------------------
2023-11-24 19:01:56,230 INFO [Config] Initializing Configuration
2023-11-24 19:01:56,231 INFO [Config] System property alpine.application.properties not specified
2023-11-24 19:01:56,232 INFO [Config] Loading application.properties from classpath
2023-11-24 19:01:56,244 INFO [Config] --------------------------------------------------------------------------------
2023-11-24 19:01:56,244 INFO [Config] Application:  Dependency-Track
2023-11-24 19:01:56,244 INFO [Config] Version:      4.9.1
2023-11-24 19:01:56,244 INFO [Config] Built-on:     2023-11-24T16:33:29Z
2023-11-24 19:01:56,245 INFO [Config] --------------------------------------------------------------------------------
2023-11-24 19:01:56,245 INFO [Config] Framework:    Alpine
2023-11-24 19:01:56,245 INFO [Config] Version :     2.2.3
2023-11-24 19:01:56,245 INFO [Config] Built-on:     2023-09-21T16:07:30Z
2023-11-24 19:01:56,245 INFO [Config] --------------------------------------------------------------------------------
2023-11-24 19:01:56,389 INFO [RequirementsVerifier] Initializing requirements verifier
2023-11-24 19:01:56,389 INFO [UpgradeInitializer] Initializing upgrade framework
2023-11-24 19:01:58,102 INFO [PersistenceManagerFactory] Initializing persistence framework
2023-11-24 19:01:58,106 INFO [PersistenceManagerFactory] Creating transactional connection pool
2023-11-24 19:01:58,191 INFO [PersistenceManagerFactory] Creating non-transactional connection pool
2023-11-24 19:01:58,400 INFO [HealthCheckInitializer] Registering health checks
2023-11-24 19:01:58,403 INFO [DefaultObjectGenerator] Initializing default object generator
2023-11-24 19:01:58,405 INFO [DefaultObjectGenerator] Synchronizing permissions to datastore
2023-11-24 19:01:58,660 INFO [DefaultObjectGenerator] Adding default users and teams to datastore
2023-11-24 19:02:00,276 INFO [DefaultObjectGenerator] Synchronizing SPDX license definitions to datastore
2023-11-24 19:02:02,714 INFO [DefaultObjectGenerator] Adding default license group definitions to datastore
2023-11-24 19:02:03,137 INFO [DefaultObjectGenerator] Synchronizing default repositories to datastore
2023-11-24 19:02:03,192 INFO [DefaultObjectGenerator] Synchronizing config properties to datastore
2023-11-24 19:02:03,276 INFO [DefaultObjectGenerator] Synchronizing notification publishers to datastore
2023-11-24 19:02:03,458 INFO [CweImporter] Synchronizing CWEs with datastore
2023-11-24 19:02:05,447 INFO [CweImporter] CWE synchronization complete
2023-11-24 19:02:05,449 INFO [EventSubsystemInitializer] Initializing asynchronous event subsystem
2023-11-24 19:02:05,504 INFO [NotificationSubsystemInitializer] Initializing notification service
2023-11-24 19:02:05,507 INFO [IndexSubsystemInitializer] Building lucene indexes if required
2023-11-24 19:02:05,521 INFO [IndexManager] Checking the health of index PROJECT
2023-11-24 19:02:05,523 WARN [IndexManager] The index PROJECT does not exist
2023-11-24 19:02:05,523 INFO [IndexManager] (Re)Building index project
2023-11-24 19:02:05,536 INFO [IndexManager] Checking the health of index COMPONENT
2023-11-24 19:02:05,537 WARN [IndexManager] The index COMPONENT does not exist
2023-11-24 19:02:05,537 INFO [IndexManager] (Re)Building index component
2023-11-24 19:02:05,537 INFO [IndexManager] Checking the health of index SERVICECOMPONENT
2023-11-24 19:02:05,537 WARN [IndexManager] The index SERVICECOMPONENT does not exist
2023-11-24 19:02:05,537 INFO [IndexManager] (Re)Building index servicecomponent
2023-11-24 19:02:05,538 INFO [IndexManager] Checking the health of index VULNERABILITY
2023-11-24 19:02:05,538 WARN [IndexManager] The index VULNERABILITY does not exist
2023-11-24 19:02:05,538 INFO [IndexManager] (Re)Building index vulnerability
2023-11-24 19:02:05,538 INFO [IndexManager] Checking the health of index LICENSE
2023-11-24 19:02:05,538 WARN [IndexManager] The index LICENSE does not exist
2023-11-24 19:02:05,539 INFO [IndexManager] (Re)Building index license
2023-11-24 19:02:05,539 INFO [IndexManager] Checking the health of index CPE
2023-11-24 19:02:05,539 WARN [IndexManager] The index CPE does not exist
2023-11-24 19:02:05,540 INFO [IndexManager] (Re)Building index cpe
2023-11-24 19:02:05,540 INFO [IndexManager] Checking the health of index VULNERABLESOFTWARE
2023-11-24 19:02:05,541 WARN [IndexManager] The index VULNERABLESOFTWARE does not exist
2023-11-24 19:02:05,541 INFO [IndexManager] (Re)Building index vulnerablesoftware
2023-11-24 19:02:05,546 INFO [ProjectIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:05,546 INFO [IndexManager] Deleting project index
2023-11-24 19:02:05,594 INFO [AlpineServlet] Starting Dependency-Track
2023-11-24 19:02:05,758 INFO [ProjectIndexer] Reindexing complete
2023-11-24 19:02:05,762 INFO [ComponentIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:05,762 INFO [IndexManager] Deleting component index
2023-11-24 19:02:05,779 INFO [ComponentIndexer] Reindexing complete
2023-11-24 19:02:05,781 INFO [ServiceComponentIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:05,781 INFO [IndexManager] Deleting servicecomponent index
2023-11-24 19:02:05,794 INFO [ServiceComponentIndexer] Reindexing complete
2023-11-24 19:02:05,795 INFO [VulnerabilityIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:05,795 INFO [IndexManager] Deleting vulnerability index
2023-11-24 19:02:05,811 INFO [VulnerabilityIndexer] Reindexing complete
2023-11-24 19:02:05,812 INFO [LicenseIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:05,813 INFO [IndexManager] Deleting license index
2023-11-24 19:02:06,587 INFO [LicenseIndexer] Reindexing complete
2023-11-24 19:02:06,589 INFO [CpeIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:06,590 INFO [IndexManager] Deleting cpe index
2023-11-24 19:02:06,601 INFO [CpeIndexer] Reindexing complete
2023-11-24 19:02:06,603 INFO [VulnerableSoftwareIndexer] Starting reindex task. This may take some time.
2023-11-24 19:02:06,603 INFO [IndexManager] Deleting vulnerablesoftware index
2023-11-24 19:02:06,613 INFO [VulnerableSoftwareIndexer] Reindexing complete
2023-11-24 19:02:08,402 INFO [KeyManager] Generating new key pair
2023-11-24 19:02:09,478 INFO [KeyManager] Saving key pair
2023-11-24 19:02:09,548 INFO [AlpineServlet] Dependency-Track is ready
2023-11-24 19:02:09,554 INFO [NvdMirrorServlet] Initializing NVD mirror
2023-11-24 19:02:09,554 INFO [FileSystemResourceServlet] Initializing filesystem resource servlet
```

The admin console should then be available in your browser at [http://localhost:8080](http://localhost:8080).

## Compatibility Notes

### Frontend Image - Nginx Configuration

The `dependency-track-frontend` image requires a custom nginx configuration to work correctly. The default nginx.conf in the image is missing the `include /etc/nginx/conf.d/*.conf;` directive, which means the server configuration with the correct document root (`/opt/owasp/dependency-track-frontend/`) is never loaded.

When deploying the frontend image, you must provide a corrected nginx.conf. Here's a working configuration:

```nginx
worker_processes auto;
pid /tmp/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    client_body_temp_path /tmp/client_body_temp;
    proxy_temp_path /tmp/proxy_temp;
    fastcgi_temp_path /tmp/fastcgi_temp;
    uwsgi_temp_path /tmp/uwsgi_temp;
    scgi_temp_path /tmp/scgi_temp;

    sendfile on;
    keepalive_timeout 65;

    gzip on;
    gzip_min_length 1000;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    server {
        listen 8080;
        server_name localhost;

        root /opt/owasp/dependency-track-frontend;
        index index.html;

        location / {
            try_files $uri $uri/ /index.html;
        }

        location = /index.html {
            add_header Cache-Control "no-store, no-cache, must-revalidate";
        }
    }
}
```

**Docker example:**

```shell
# Save the above configuration to nginx.conf, then:
docker run -p 8080:8080 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  cgr.dev/chainguard/dependency-track-frontend
```

**Kubernetes example:**

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-nginx-config
data:
  nginx.conf: |
    # ... (use the nginx.conf content above)
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: frontend
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
      volumes:
        - name: nginx-config
          configMap:
            name: frontend-nginx-config
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sigstore-policy-controller-fips

# sigstore-policy-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sigstore-policy-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sigstore-policy-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Fips version of Policy Controller image that is part of the Sigstore stack

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-cluster-operator-iamguarded

# rabbitmq-cluster-operator-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-cluster-operator-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-cluster-operator-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ Cluster Kubernetes Operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

RabbitMQ Cluster Operator IAMGuarded is a security-enhanced variant of the RabbitMQ Cluster Operator designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides a Kubernetes operator for declarative deployment and management of RabbitMQ clusters with additional security benefits.

## Helm Chart Installation

The RabbitMQ Cluster Operator IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator
msgTopologyOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ Cluster Operator IAMGuarded installation by checking the operator pod status and creating a sample RabbitMQ cluster. The operator should be able to successfully provision and manage RabbitMQ clusters using the RabbitmqCluster custom resource.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Cluster Operator IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1379

# request-1379
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1379` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1379/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubectl

# kubectl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubectl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubectl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with kubectl binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `kubectl` Chainguard Image provides a low-to-zero CVE environment for [`kubectl`](https://kubernetes.io/docs/reference/kubectl/) suitable for integrating into Kubernetes CI or testing workflows.

## Configuration

To load your own global configuration file, you can set the `KUBECONFIG` environment variable and mount a configuration file on your host machine to the specified location on the container using a volume.

The command below sets the `KUBECONFIG` environment variable to `.kube/config` within the `nonroot` home folder, initializes a volume at that location, and runs the container with a command that prints the current configuration.

```sh
docker run \
 -e KUBECONFIG=/home/nonroot/.kube/config \
 -v $PWD/config:/home/nonroot/.kube/config \
 cgr.dev/ORGANIZATION/kubectl:latest-dev config view
```

Make sure to replace `ORGANIZATION` with the name of your organization.

If you would prefer to test this command without using your own configuration file, you can create a default `config` file in your current working directory as below:

```sh
cat << 'EOF' > config
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {output=json}
users: null
EOF
```

## Getting Started

### Adding to a Kubernetes Cluster

In this example, we'll add the Kubectl Chainguard Image to a Kubernetes cluster. To follow this example, you'll need to install the following software to your host machine:

- [`kind`](https://kind.sigs.k8s.io/docs/user/quick-start#installation). 
- [`chainctl`](https://edu.chainguard.dev/chainguard/chainctl-usage/how-to-install-chainctl/)
- [`kubectl`]( https://kubernetes.io/docs/tasks/tools/)

Once the `kind` utility for creating local Kubernetes clusters is installed and on your path, create a new cluster with the following command:

```sh
kind create cluster
```

This will create a cluster with the default name `kind`.

Next, we'll need to download a pull token using Chainguard's [`chainctl`](https://edu.chainguard.dev/chainguard/chainctl-usage/how-to-install-chainctl/) utility. This will allow us to access your organization's Chainguard Images in environments that do not support OIDC, such as a Kubernetes cluster.

Run the following to generate a pull token:

```
chainctl auth configure-docker --pull-token --save
```

You will need to select your organization name from the menu and confirm the creation of the pull token. This will save your pull token to your Docker configuration, typically at `~/.docker/config.json`.

Now use [kubectl](https://kubernetes.io/docs/tasks/tools/) on your host machine to load the pull token as a secret. The following assumes your current working directory is your home directory, and depending on your system and configuration you may need to update the path to the `config.json`.

```
kubectl create secret generic cgsecret \
 --from-file=.dockerconfigjson=./.docker/config.json \
 --type=kubernetes.io/dockerconfigjson
```

Next, we'll run a shell command to create a configuration for the pod for our `kubectl ` Chainguard Image container. 

Run the following command to create the pod configuration file:

```sh
cat << EOF > kubectl.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kube-pod
spec:
  containers:
  - name: kubectl-container
    image: cgr.dev/ORGANIZATION/kubectl
    command: ["/usr/bin/kubectl", "version"]
  imagePullSecrets:
  - name: cgsecret
EOF
```

The above provides configuration for a pod that will pull the `kubectl` Chainguard Image from your organization, then run a container with a command that outputs the current `kubectl` version.

Run the following to create the pod using the configuration file:

```sh
kubectl create -f kubectl.yaml
```

The pod should now be created. Run the following command to see information on the pod and associated container:

```sh
kubectl describe pod kube-pod
```

```
Name:             kube-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             kind-control-plane/172.19.0.2
Start Time:       Tue, 26 Nov 2024 16:30:24 -0500
Labels:           <none>
Annotations:      <none>
Status:           Running
IP:               10.244.0.4
IPs:
  IP:  10.244.0.4
Containers:
  kubectl-container:
    Container ID:  containerd://e9bc0e28ae161ff9ce84842f560478728c5986ff2dc2a41f02e90b49a3919211
    Image:         cgr.dev/ORGANIZATION/kubectl
    Image ID:      cgr.dev/ORGANIZATION/kubectl@sha256:034d5e90723d49a31e6e98ad9ad787946143e9ea7a3728bfb38645d99305dc52
    Port:          <none>
    Host Port:     <none>
    Command:
      /usr/bin/kubectl
      version
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
...
```

In the configuration file, we provided the `/usr/bin/kubectl version` command. The above output shows this command completed. We can view the output of the command:

```sh
kubectl logs kube-pod
```

```
Client Version: v1.31.3
Kustomize Version: v5.4.2
Server Version: v1.30.0
```

The `kubectl` Chainguard Image has now been loaded into the cluster and used to run a command. To access cluster information from the container, you will need to [configure a security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for the pod or container.

Once you're finished testing, you can shut down and delete the example `kind` cluster with the following command:

```sh
kind delete cluster
```

## Documentation and Resources

- [Chainguard Academy: Authenticating to Chainguard Registry with a Pull Token](https://edu.chainguard.dev/chainguard/chainguard-registry/authenticating/#authenticating-with-the-chainctl-credential-helper)
- [Kubernetes Reference: Kubectl Documentation](https://kubernetes.io/docs/reference/kubectl/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tileserver-gl-fips

# tileserver-gl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tileserver-gl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tileserver-gl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using tileserver-gl

To run the server, simply start the container - such as:

```
$ docker -p 8080:8080 run cgr.dev/chainguard/tileserver-gl-fips
Starting tileserver-gl v5.0.0
No input file found
[DEMO] Downloading sample data (zurich_switzerland.mbtiles) from https://github.com/maptiler/tileserver-gl/releases/download/v1.3.0/zurich_switzerland.mbtiles
[INFO] Automatically creating config file for zurich_switzerland.mbtiles
[INFO] Only a basic preview style will be used.
[INFO] See documentation to learn how to create config.json file.
Run with --verbose to see the config file here.
Starting server
Listening at http://[::]:8080/
Startup complete
```

This will expose the web application on port 8080.

By default, `tileserver-gl` downloads a sample vector tile, as stated in the logs.

To provide a downloaded set of tiles, simply mount them as `/data` directory - such as:

```
$ docker run -p 8080:8080 -v /path/to/downloaded-tiles-directory:/data:ro cgr.dev/chainguard/tileserver-gl-fips
```

This will allow cause `tileserver-gl` to serve the tiles provided in directory above.

### User

The image is using `nonroot` user account with UID / GID of 65532.

### Differences to maptiler/tileserver-gl image

This image is not identical to the maptiler/tileserver-gl image. In particular:

- the image runs as user `nonroot`
- The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the upstream image is based on Ubuntu

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-trtllm-backend

# tritonserver-trtllm-backend
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-trtllm-backend` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-trtllm-backend/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard tritonserver-trtllm-backend image is comparable to the [official NVIDIA Triton Inference Server image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

> [!IMPORTANT]
> The Chainguard image does **not** include NVIDIA HPC-X, which is present in the official NVIDIA image. If your workflows rely on HPC-X tools or libraries, additional configurations may be necessary. This image also does not contain any Python libraries required for building models, and only contains the libraries required for running tritonserver-trtllm-backend.

## Getting Started

The following steps serve a TensorRT-LLM model with the Triton TensorRT-LLM Backend using the GPT model from the TensorRT-LLM repository. These instructions are adapted from the [official readme](https://github.com/triton-inference-server/tensorrtllm_backend/blob/main/README.md).

Begin by cloning TrensorRT LLM Backend repository:

```shell
git clone https://github.com/triton-inference-server/tensorrtllm_backend.git
```

Navigate into the `tensortllm_backend` repository and prepare the submodule:

```shell
cd tensorrtllm_backend
git submodule update --init --recursive
git lfs install
git lfs pull
```

Next, set up the GPT-2 medium model from Hugging Face:

```shell
GPT_DIR="tensorrtllm_backend/tensorrt_llm/examples/gpt"
cd ${GPT_DIR} && git clone https://huggingface.co/gpt2-medium gpt2
cd ${GPT_DIR}/gpt2 && rm pytorch_model.bin model.safetensors
cd ${GPT_DIR}/gpt2 && wget https://huggingface.co/gpt2-medium/resolve/main/pytorch_model.bin
```

Following that, you will need to convert the model to the TensorRT Format. You can use the provided conversion script and tools to convert the model checkpoint into TensorRT format:

```shell
cd ${GPT_DIR} && \
python3.10 convert_checkpoint.py --model_dir gpt2 --dtype float16 \
    --tp_size 1 --output_dir ./c-model/gpt2/fp16/1-gpu && \
    trtllm-build --checkpoint_dir ./c-model/gpt2/fp16/1-gpu \
    --gpt_attention_plugin float16 --remove_input_padding enable \
    --paged_kv_cache enable --gemm_plugin float16 \
    --output_dir /engines/fp16/1-gpu
```

Then update the Triton model repository by copying the prebuilt inflight batcher LLM files into it:

```shell
cp -r tensorrtllm_backend/all_models/inflight_batcher_llm/* triton_model_repo/
```

Use the provided `fill_template.py` script to customize model configuration files:

```shell
python3 tensorrtllm_backend/tools/fill_template.py -i triton_model_repo/ensemble/config.pbtxt triton_max_batch_size:1
python3 tensorrtllm_backend/tools/fill_template.py -i triton_model_repo/preprocessing/config.pbtxt tokenizer_dir:tensorrtllm_backend/tensorrt_llm/examples/gpt/gpt2,triton_max_batch_size:1,preprocessing_instance_count:1
python3 tensorrtllm_backend/tools/fill_template.py -i triton_model_repo/tensorrt_llm/config.pbtxt triton_backend:tensorrtllm,triton_max_batch_size:1,decoupled_mode:false,engine_dir:engines/fp16/1-gpu,max_queue_delay_microseconds:0,batching_strategy:inflight_fused_batching,max_queue_size:0,encoder_input_features_data_type:TYPE_FP16
python3 tensorrtllm_backend/tools/fill_template.py -i triton_model_repo/postprocessing/config.pbtxt tokenizer_dir:tensorrtllm_backend/tensorrt_llm/examples/gpt/gpt2,triton_max_batch_size:1,postprocessing_instance_count:1,max_queue_size:0
python3 tensorrtllm_backend/tools/fill_template.py -i triton_model_repo/tensorrt_llm_bls/config.pbtxt triton_max_batch_size:1,decoupled_mode:false,bls_instance_count:1
```

Finally, you can run Triton Inference Server with the prepared model repository and TensorRT LLM backend:

```shell
docker run --rm -t --gpus all \
  -v "$(pwd)/triton_model_repo:/triton_model_repo" \
  -v "$(pwd)/tensorrtllm_backend:/tensorrtllm_backend" \
  -v "$(pwd)/engines:/engines" \
  -p 8001:8001 \
  cgr.dev/chainguard-eng/user/tritonserver-trtllm-backend:latest \
  --model-repository=/triton_model_repo \
  --grpc-port=8001
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### unbound

# unbound
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/unbound` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/unbound/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Unbound is a validating, recursive, and caching DNS resolver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes 

Chainguard's `unbound` container image is a minimal, secure, and regularly updated image designed to run [Unbound](https://github.com/NLnetLabs/unbound). It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

To get started with the `unbound` image, you should first create a configuration file. You can find details on the configuration options [in the official Unbound documentation](https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html).

Run the `unbound` container with the following command:

```bash
docker run -d --name unbound \
  -v $(pwd)/unbound.conf:/etc/unbound/unbound.conf \
  -p 5454:5454 \
  cgr.dev/ORGANIZATION/unbound:latest
```

This command will open the port `5454` and bind it to the host machine. Now you can test the Unbound server with the following command:

```bash
dig +tcp @127.0.0.1 -p 5454 chainguard.dev
dig +udp @127.0.0.1 -p 5454 chainguard.dev
```

The first command will use TCP and the second one will use UDP. Both of these commands will return a response from the Unbound server.

## Documentation and Resources

* [Unbound Documentation](https://unbound.docs.nlnetlabs.nl/en/latest/index.html)
* [Unbound Configuration Options](https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html)
* [Unbound GitHub Repository](https://github.com/NLnetLabs/unbound)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kuberay-operator

# kuberay-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kuberay-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kuberay-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A toolkit to run Ray applications on Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The KubeRay Helm charts can be found in the [ray-project/kuberay-helm](https://github.com/ray-project/kuberay-helm) repository. For instructions on deploying the operator, refer to the [kuberay-operator](https://github.com/ray-project/kuberay/blob/master/helm-chart/kuberay-operator/README.md) guide. To deploy a customizable Ray cluster, check the [ray-cluster](https://github.com/ray-project/kuberay/blob/master/helm-chart/ray-cluster/README.md) documentation.

You need to add the Ray Helm repository to your Helm installation:

```bash
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
```

Then, you can install the KubeRay operator using the following command:

```bash
helm install kuberay-operator kuberay/kuberay-operator \
     --create-namespace \
    --namespace kuberay-system \
    --set image.repository=cgr.dev/chainguard-private/kuberay-operator \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8ssandra-operator

# k8ssandra-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8ssandra-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8ssandra-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Kubernetes operator for K8ssandra

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-notation-aws-fips

# kyverno-notation-aws-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-notation-aws-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-notation-aws-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kyverno extension service for Notation and the AWS signer

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the upstream Kyerno Notation AWS image from [Nirmata](https://github.com/nirmata/kyverno-notation-aws). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

There is an installation guide available to deploy Kyverno Notation AWS project in the [kyverno-notation-aws GitHub repository](https://github.com/nirmata/kyverno-notation-aws).

To run the Chainguard image, you can use the following command:

First, clone the project, as the Helm chart is not published outside of the repository:  

```bash
$ git clone https://github.com/nirmata/kyverno-notation-aws
$ cd charts/kyverno-notation-aws
```

Then, let's prepare the values:

```bash
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/kyverno-notation-aws-fips
  tag: latest
EOF
```

Let's install the Helm chart:

```bash
helm install kyverno-notation-aws . -f values.yaml
```

## Documentation and Resources

* [Kyverno Notation AWS GitHub Repository](https://github.com/nirmata/kyverno-notation-aws)
* (Blog) [Announcing Container Image Signing with AWS Signer and Amazon EKS](https://aws.amazon.com/blogs/containers/announcing-container-image-signing-with-aws-signer-and-amazon-eks/)
* (Video) [Verify Container Images with Kyverno on Amazon EKS](https://www.youtube.com/watch?v=36ORCUw8nic)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### regclient-fips

# regclient
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/regclient` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/regclient/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

regclient is a client interface to OCI conformant registries and content shipped with the OCI Image Layout

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

These images are built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's images maintain functional parity with the upstream images:

- [`regctl`](https://hub.docker.com/r/regclient/regctl): A command-line tool for interacting with OCI registries.
- [`regbot`](https://hub.docker.com/r/regclient/regbot): A tool for automating interactions with OCI registries.
- [`regsync`](https://hub.docker.com/r/regclient/regsync): A tool for synchronizing content between OCI registries.

### FIPS Support

These Chainguard Containers ship with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### `regctl` - Registry Client CLI

The `regctl` command provides a CLI interface for interacting with OCI registries. Common usage patterns:

```shell
# View help and available commands
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl-fips --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl-fips version

# Configure registry with disabled TLS (for testing)
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl-fips registry set localhost:5000 --tls disabled --skip-check

# Pull and inspect image configurations
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl-fips image config registry.example.com/image:tag
```

### `regbot` - Registry Automation Bot

The `regbot` tool automates registry interactions and can run as a server daemon. Usage examples:

```shell
# View help
docker run --rm cgr.dev/ORGANIZATION/regclient-regbot-fips --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regbot-fips version

# Run server with configuration file (requires config volume mount)
docker run -d \
  -v /path/to/config.json:/config.json \
  -p 5000:5000 \
  cgr.dev/ORGANIZATION/regclient-regbot-fips server -v=trace -c /config.json
```

The server typically listens on port 5000 and requires a configuration file specifying registry credentials and automation rules.

### `regsync` - Registry Synchronization

The `regsync` tool synchronizes content between OCI registries, supporting both one-time sync and continuous monitoring:

```shell
# View help
docker run --rm cgr.dev/ORGANIZATION/regclient-regsync-fips --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regsync-fips version

# Run one-time sync with configuration
docker run --rm \
  -v /path/to/sync-config.json:/config.json \
  cgr.dev/ORGANIZATION/regclient-regsync-fips once -v=trace -c /config.json

# Run continuous sync server
docker run -d \
  -v /path/to/sync-config.json:/config.json \
  cgr.dev/ORGANIZATION/regclient-regsync-fips server -v=trace -c /config.json
```

Example sync configuration file:
```json
{
  "version": 1,
  "creds": [{
    "registry": "target-registry:5000",
    "tls": "disabled"
  }],
  "sync": [{
    "type": "image",
    "source": "source-registry.com/image:latest",
    "target": "target-registry:5000/image:latest"
  }]
}
```

## Network Configuration

When running these tools in containerized environments, ensure proper network connectivity:

```shell
# Create a custom network for multi-container setups
docker network create regtest

# Run containers with network access
docker run --network regtest --rm cgr.dev/ORGANIZATION/regclient-regsync-fips [commands]
```

## Documentation and Resources
- [Documentation](https://regclient.org)
- [Usage Guide](https://regclient.org/usage/)
- [Configuration Examples](https://github.com/regclient/regclient/tree/main/config/testdata)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gcp-compute-persistent-disk-csi-driver-fips

# gcp-compute-persistent-disk-csi-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gcp-compute-persistent-disk-csi-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gcp-compute-persistent-disk-csi-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Google Compute Engine Persistent Disk (GCE PD) Container Storage Interface (CSI) Storage Plugin.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-postgres-exporter

# prometheus-postgres-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-postgres-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-postgres-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A PostgreSQL metric exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus Prometheus Exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-postgres-exporter prometheus-community/prometheus-postgres-exporter \
 --set image.repository=cgr.dev/chainguard/prometheus-postgres-exporter --set image.tag=latest
```

For more detail, please refer to the [Postgres Exporter documentation](https://github.com/prometheus-community/postgres_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### headlamp-plugin-flux

# headlamp-plugin-flux
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/headlamp-plugin-flux` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/headlamp-plugin-flux/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Headlamp plugin to visualize and manage Flux GitOps resources in Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `headlamp-plugin-flux` container image is a drop-in replacement for the upstream [headlamp-k8s/headlamp-plugin-flux](https://github.com/headlamp-k8s/plugins/pkgs/container/headlamp-plugin-flux) image. The Flux plugin provides a way to visualize Flux in Headlamp. Like the upstream image, when installed, the plugin adds a new item (**Flux**) to the Headlamp sidebar, enabling users to visualize and manage Flux GitOps resources such as GitRepositories and Kustomizations directly through the Headlamp UI. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.  

## Getting Started

You can deploy this image using the [Headlamp Helm chart](https://github.com/headlamp-k8s/headlamp/tree/main/charts/headlamp). To enable the Flux plugin, override the chart values to add an `initContainer` that copies the plugin into Headlamp’s plugin directory. 

Be sure to override the image by setting the following values in a `values.yaml` file:

```bash
initContainers:
  - name: flux-plugin
    image: cgr.dev/ORGANIZATION/headlamp-plugin-flux:latest
    imagePullPolicy: Always
    command: ["/bin/sh", "-c"]
    args:
      - "mkdir -p /headlamp/plugins && cp -r /plugins/* /headlamp/plugins/ && chown -R 100:101 /headlamp/plugins"
    securityContext:
      runAsNonRoot: false
      privileged: false
      runAsUser: 0
      runAsGroup: 0
    volumeMounts:
      - mountPath: /headlamp/plugins
        name: headlamp-plugins

volumes:
  - name: headlamp-plugins
    emptyDir: {}

volumeMounts:
  - mountPath: /headlamp/plugins
    name: headlamp-plugins
```

Be sure to replace the ORGANIZATION placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, install Headlamp with these values
```bash
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
helm repo update
helm install headlamp headlamp/headlamp --namespace headlamp --create-namespace --values values.yaml --wait
```

## Documentation and Resources
- [Headlamp Plugins Github Repository](https://github.com/headlamp-k8s/plugins/tree/main/flux)
- [Headlamp Github Repository](https://github.com/kubernetes-sigs/headlamp)
- [Headlamp Helm Charts](https://headlamp.dev/docs/latest/installation/in-cluster/#using-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-gateway-controller-fips

# aws-gateway-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-gateway-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-gateway-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

AWS Application Networking is an implementation of the Kubernetes Gateway API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started
For initial setup and deployment of the AWS Gateway Controller, refer to the [official installation documentation](https://www.gateway-api-controller.eks.aws.dev/dev/guides/deploy/).

You can install the controller by either using a helm chart or using `kubectl`.
If you plan to use helm for installing, use the following flags to use the Chainguard's `aws-gateway-controller-fips` image:
```
--set=image.repository= cgr.dev/ORGANIZATION/aws-gateway-controller-fips \
--set=image.tag=latest
```

If you plan to apply the manifest using `kubectl`, ensure you replace the image reference `public.ecr.aws/aws-application-networking-k8s/aws-gateway-controller-fips` with `cgr.dev/ORGANIZATION/aws-gateway-controller-fips`.

Please refer to the [official installation guide](https://www.gateway-api-controller.eks.aws.dev/dev/guides/deploy/#install-the-controller) for the installation commands.

## Documentation and Resources
* [Official AWS Gateway API Controller documentation ](https://www.gateway-api-controller.eks.aws.dev/latest/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6130

# request-6130
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6130` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6130/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with JuiceFS. JuiceFS is a high-performance POSIX file system, particularly designed for the cloud-native environment.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [juicedata/mount](https://hub.docker.com/r/juicedata/mount) image. Switching to Chainguard's `juicefs-mount` image should not require any changes to your existing setup. However, there are two key differences:
1. **Community Edition Tags Only**
We have bundled only community edition (`ce-*`) tags. The Chainguard's `juicefs-mount` Image tags are comparable to the upstream image as:
`juicedata/mount:ce-v1.3.0` is equivalent to `cgr.dev/ORGANIZATION/request-6130:1.3.0`

2. **Excluded Plugins**
The Chainguard `juicefs-mount` image does not include plugins for `FoundationDB`, `GlusterFS`, or `Ceph`, which are present only in the upstream `amd64` variant of `juicedata/mount` image.

## Getting Started
### Docker
You can use the JuiceFS file system in Docker by running the client directly in the container or using a volume plugin.

Create a volume​:
```
docker run --rm \
  cgr.dev/ORGANIZATION/request-6130:latest \
  juicefs format \
  --storage s3 \
  --bucket https://xxx.xxx.xxx \
  --access-key=ACCESSKEY \
  --secret-key=SECRETKEY \
  ...
  ...
  redis://127.0.0.1/1 myjfs
```
Mount a volume:
```
docker run --name myjfs -d \
  cgr.dev/ORGANIZATION/request-6130:latest \
  juicefs mount \
  ...
  ...
  redis://127.0.0.1/1 myjfs /mnt
```

### Helm (Use case for JuiceFS-CSI-Driver)
This image can be used as the Community Edition(CE) Mount image in [JuiceFS CSI Driver Helm chart](https://juicedata.github.io/charts) :

Add the helm repository:
```bash
helm repo add juicefs https://juicedata.github.io/charts/
helm repo update
```
Create a `values.yaml`, specifying the Chainguard image:
```bash
# values.yaml
globalConfig:
  mountPodPatch:
    - ceMountImage = "cgr.dev/ORGANIZATION/request-6130:latest"
```
Install the chart using our customized values:
```
helm install juicefs-csi-driver juicefs/juicefs-csi-driver -n kube-system -f values.yaml
```

## Documentation and Resources
- [JuiceFS Commands Reference](https://juicefs.com/docs/community/command_reference/)
- [JuiceFS as a persistent volume for Docker and Podman](https://juicefs.com/docs/community/juicefs_on_docker/)
- [How to Use JuiceFS in JuiceFS CSI Driver](https://juicefs.com/docs/csi/guide/custom-image/)
- [How to use JuiceFS in docker compose](https://juicefs.com/docs/community/juicefs_on_docker/#using-plugin-in-docker-compose)
- [Use JuiceFS on Kubernetes](https://juicefs.com/docs/community/how_to_use_on_kubernetes/)
- [Advanced Topics for JuiceFS](https://github.com/juicedata/juicefs/tree/main?tab=readme-ov-file#advanced-topics)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### busybox-fips

# busybox-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/busybox-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/busybox-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

One can execute any busybox applets like so:

```shell
docker run -it cgr.dev/chainguard-private/busybox-fips:latest echo hello world!
```

Also, note that you can open an interactive shell with command like the following:

```shell
docker run -it cgr.dev/chainguard-private/busybox-fips:latest sh
```

This image is particularly useful to execute shell commands together
with GO FIPS binaries, for example as part of Tekton Pipelines
Controller FIPS deployment set shell-image to
cgr.dev/chainguard/busybox-fips.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-ebs-csi-driver-fips

# aws-ebs-csi-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-ebs-csi-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-ebs-csi-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Testing

Since this application requires AWS credentials to be set up, we should create the required permissions before deploying it.

To do that, you can follow up on the official documentation [here](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions).

But for the sake of simplicity, we can create the Kubernetes secret resource called `aws-secret` with the proper options `key_id` and `access_key`:

```shell
kubectl create secret generic aws-secret \
    --namespace kube-system \
    --from-literal "key_id=${AWS_ACCESS_KEY_ID}" \
    --from-literal "access_key=${AWS_SECRET_ACCESS_KEY}"
```

There are several methods to deploy the driver, but we will use the `helm` method.

We should add the `aws-ebs-csi-driver` Helm repository to our repositories list:

```shell
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update
```

Next, we can install the driver with the following command:

```shell
helm upgrade --install aws-ebs-csi-driver \
    --namespace kube-system \
    --set image.repository=cgr.dev/ORGANIZATION/aws-ebs-csi-driver-fips \
    --set image.tag=latest \
    aws-ebs-csi-driver/aws-ebs-csi-driver
```

Once the driver has been deployed, verify the pods are running:

```shell
kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-ebs-csi-driver
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### adoptium-jdk-fips

# adoptium-jdk-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/adoptium-jdk-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/adoptium-jdk-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based Java JDK image using Adoptium OpenJDK. Used for compiling Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's Adoptium JDK fips image is built directly from the [Adoptium sources](https://github.com/adoptium/jdk21u/). The Chainguard Adoptium JDK fips image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The JDK is the standard development system for a Java application. It is used for compiling and packaging Java applications, which are then run on a JRE.

### Compiling a Minimal Java Application Example

This section outlines how you can build a Java application with the Chainguard Adoptium JDK fips Image.

Start by creating a sample Java class named `HelloWolfi`:

```sh
cat >HelloWolfi.java <<EOL
class HelloWolfi
{
    public static void main(String args[])
    {
        System.out.println("Hello Wolfi users!");
    }
}
EOL
```

Then create a multistage Dockerfile, adding the Java class you just created:

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/chainguard/adoptium-jdk-fips

COPY HelloWolfi.java /home/build/
RUN javac HelloWolfi.java

FROM cgr.dev/chainguard/jre

COPY --from=0 /home/build/HelloWolfi.class /app/
CMD ["HelloWolfi"]
EOL
```

Following that, you can build the image:

```sh
docker build -t my-java-app .
```

Note that this example tags the image with `my-java-app`. You can now run the image by referencing this tag, as in the following command:

```sh
docker run my-java-app
```
```
Hello Wolfi users!
```

### Using the Chainguard Adoptium JDK fips image in a Jenkins Pipeline

Using a Chainguard container image as part of a CI/CD system like Jenkins might also be a useful option. With the Jenkins Docker agent, you can define multiple steps that use different Chainguard Containers. The following is an example using the Chainguard Adoptium JDK fips image as part of a Jenkins pipeline:

```
pipeline {
    agent {
        docker { image 'cgr.dev/chainguard/adoptium-jdk-fips' }
    }
    stages {
        stage('Test') {
            steps {
                # Use javac, jdeps, jlink, ...
                sh 'javac -version'
            }
        }
    }
}
```

For a full reference on using various images in a Jenkins pipeline, please refer to the [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/docker/).

### Using the Chainguard Adoptium JDK fips to create a custom JRE

A less common, but powerful, use case for the Chainguard Adoptium JDK fips image is creating an optimized custom JRE for your Java application. This involves using `jdeps` to produce the information about the Java modules being used and subsequently using `jlink` to analyze your application to eliminate all module code not being used by your application. This can create a drastically smaller JRE for a particular application.

Keep in mind that a JRE produced this way is a fit-for-purpose JRE, and is not broadly usable.

For reference, here are two additional articles describing the use of `jlink` to create optimized application images:

- [Creating your own runtime using jlink](https://adoptium.net/en-GB/blog/2021/10/jlink-to-produce-own-runtime/)
- [Creating a Custom JRE for your Java Applications](https://adriankodja.com/creating-a-custom-jre-for-your-java-applications)

## Documentation and Resources

- (Video) [How to Migrate a Java Application to Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
- (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
- (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
- (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mattermost-fips

# mattermost-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mattermost-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mattermost-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy Mattermost on Kubernetes, you can follow the [official documentation](https://docs.mattermost.com/install/install-kubernetes.html).

You can also jump to [official Helm Chart](https://github.com/mattermost/mattermost-helm/tree/master/charts/mattermost-team-edition) if you want to deploy Mattermost using Helm.

You can also check [TESTING.md](./TESTING.md) for how we test and deploy the `Mattermost` image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gradle

# gradle
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gradle` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gradle/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Image with [Gradle](https://gradle.org/), an open source build system for Java, Android, and Kotlin.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Gradle image is comparable to the [official Gradle image on Docker Hub](https://hub.docker.com/_/gradle). Like most other Chainguard images, the Gradle image has few-to-zero CVEs and does not run as the root user. Additionally, the Chainguard Gradle image's default entrypoint is `/usr/bin/gradle`. 

## Getting Started

Chainguard Gradle images come with different versions of OpenJDK; ensure you choose the correct image tag for your application needs.

> [!NOTE]
> If you are running Docker on Mac M1 you may experience intermittent container high CPU and container / JVM crashes.  There have been [reports](https://github.com/metanorma/metanorma-docker/issues/126) of this behavior, which is known to also affect non-Chainguard images. It is expected that using ARM based images, which are in development for Chainguard images, will address the problem.  When running the examples below you might experience Gradle builds hanging.  If you do, you can `docker ps` and `docker kill $PID` and retry.

To use the Chainguard Gradle image with Docker, run commands that follow this syntax:

```shell
docker run cgr.dev/chainguard/gradle:latest-dev <gradle-task>
```

For example, to run an existing project you have on your local machine, you could run a command like the following:

```shell
docker run -v "${PWD}":/home/build/project -w /home/build/project cgr.dev/chainguard/gradle:latest run
```

To show the Gradle image building and running a sample application, we will use the `latest-dev` variant of the image, which includes a shell.

First, run the image with the `-it` and `entrypoint=/bin/sh` arguments to access the shell:

```shell
docker run -it --entrypoint=/bin/sh cgr.dev/chainguard/gradle:latest-dev
```

From within the container, run the `init` task to build a `Hello World!` example application:

```
gradle init --type java-application --use-defaults
```

This example specifies that the `init` task should build a Java application with the default settings.

```
. . .

BUILD SUCCESSFUL in 3s
```

Then, use the `run` task to run the newly built application:

```
gradle run
```
```
. . .

> Task :app:run
Hello World!
```

## Documentation and Resources

* [Gradle User Manual](https://docs.gradle.org/current/userguide/userguide.html)
* [Gradle Build Tool GitHub Repository](https://github.com/gradle/gradle)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-path-provisioner

# local-path-provisioner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-path-provisioner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-path-provisioner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Local Path Provisioner provides a way for the Kubernetes users to utilize the local storage in each node.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

You can deploy the `local-path-provisioner` using the Kustomization:

```bash
$ cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/rancher/local-path-provisioner/deploy?ref=master
images:
  - name: rancher/local-path-provisioner:master-head
    newName: cgr.dev/chainguard/local-path-provisioner
    newTag: latest
namespace: local-path-provisioner
EOF
$ kubectl apply -k .
```

> [!TIP]
> Please jump to official [USAGE](https://github.com/rancher/local-path-provisioner/tree/master?tab=readme-ov-file#usage) documentation for more details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab

# gitlab
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GitLab is a complete DevOps platform that provides source code management, CI/CD automation, and collaboration tools in a single application for the entire software development lifecycle.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab` images are based on the [upstream GitLab](https://gitlab.com/gitlab-org/gitlab) components and are compatible with the [official GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab). These images provide all the GitLab components in minimal, secure container images built on Wolfi.

This image group includes the following components:

* `gitaly` - Git repository storage service
* `gitlab-agent` - GitLab Kubernetes Agent
* `gitlab-base` - Base image with common GitLab functionality
* `gitlab-certificates` - Certificate management for GitLab
* `gitlab-container-registry` - GitLab's container registry
* `gitlab-exporter` - Prometheus metrics exporter
* `gitlab-kas` - GitLab Agent Server 
* `gitlab-pages` - GitLab Pages static site hosting
* `gitlab-runner` - GitLab CI/CD runner
* `gitlab-runner-helper` - Helper image for GitLab Runner
* `gitlab-shell` - SSH access to Git repositories
* `gitlab-sidekiq-ce` - Background job processing (Community Edition)
* `gitlab-toolbox-ce` - Administrative toolbox (Community Edition)
* `gitlab-webservice-ce` - Main GitLab web application (Community Edition)
* `gitlab-workhorse-ce` - HTTP reverse proxy for GitLab (Community Edition)

These images maintain compatibility with the upstream GitLab components while providing enhanced security through minimal design and regular updates.

## Getting Started

The `gitlab` images are designed to work together as a complete GitLab deployment using the official GitLab Helm chart. Here's how to configure your GitLab installation to use Chainguard Images:

```sh
cat > gitlab-values.yaml <<EOF
# Chainguard Images configuration for GitLab
global:
  gitlabBase:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-base
      tag: latest
  certificates:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-certificates  
      tag: latest
gitlab:
  gitlab-exporter:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-exporter
      tag: latest
  gitlab-shell:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-shell
      tag: latest
  gitaly:
    image:
      repository: cgr.dev/ORGANIZATION/gitaly
      tag: latest
  gitlab-pages:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-pages
      tag: latest
  kas:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-kas
      tag: latest
  sidekiq:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-sidekiq-ce
      tag: latest
  toolbox:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-toolbox-ce
      tag: latest
  webservice:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-webservice-ce
      tag: latest
  workhorse:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-workhorse-ce
      tag: latest
registry:
  image:
    repository: cgr.dev/ORGANIZATION/gitlab-container-registry
    tag: latest
gitlab-runner:
  runners:
    config: |
      [[runners]]
        [runners.kubernetes]
          helper_image = "cgr.dev/ORGANIZATION/gitlab-runner-helper:latest"
  image:
    registry: cgr.dev
    image: ORGANIZATION/gitlab-runner
    tag: latest
EOF
```

Install GitLab using the Helm chart with your values:

```sh
helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm upgrade --install gitlab gitlab/gitlab \
  --namespace gitlab-system \
  --create-namespace \
  --values gitlab-values.yaml
```

> [!NOTE]
> Replace `ORGANIZATION` with your actual organization name in the Chainguard registry. The values above provide the minimal configuration for using Chainguard Images and should be combined with your additional GitLab configuration requirements.

For a development or testing environment, you can combine the above with these minimal settings:

```yaml
# Additional minimal configuration for development
global:
  ingress:
    configureCertmanager: false
    tls:
      enabled: false
  gitlab:
    gitlab-shell:
      minReplicas: 1
      maxReplicas: 1
    webservice:
      minReplicas: 1
      maxReplicas: 1
    gitlab-pages:
      resources:
        requests:
          memory: 250M
          cpu: 50m
certmanager:
  install: false
registry:
  hpa:
    minReplicas: 1
    maxReplicas: 1
nginx-ingress:
  controller:
    replicaCount: 1
    minAvailable: 0
prometheus:
  install: false
minio:
  resources:
    requests:
      cpu: 100m
redis:
  resources:
    requests:
      cpu: 100m
```

> [!WARNING]
> The minimal configuration above is not recommended for production environments. Please refer to the [GitLab Helm chart documentation](https://docs.gitlab.com/charts/) for production-ready configurations.

## Configuration

GitLab components can be configured through the Helm chart values or environment variables. Here are some common configuration scenarios:

### SSH Configuration

For the `gitlab-shell` component, you can configure SSH ciphers and algorithms:

```yaml
gitlab:
  gitlab-shell:
    config:
      ciphers: ["aes128-ctr", "aes192-ctr", "aes256-ctr"]
      kexAlgorithms: ["ecdh-sha2-nistp384", "ecdh-sha2-nistp521"] 
      macs: ["hmac-sha2-256", "hmac-sha2-512"]
      publicKeyAlgorithms: ["ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521"]
```

### GitLab Runner Configuration

Configure GitLab Runner with specific helper images:

```yaml
gitlab-runner:
  runners:
    config: |
      [[runners]]
        name = "chainguard-runner"
        [runners.kubernetes]
          helper_image = "cgr.dev/ORGANIZATION/gitlab-runner-helper:latest"
          privileged = false
```

### Resource Limits

Set appropriate resource limits for production environments:

```yaml
gitlab:
  webservice:
    resources:
      requests:
        memory: "2Gi"
        cpu: "1000m"
      limits:
        memory: "4Gi"
        cpu: "2000m"
```

For complete configuration options, refer to the [GitLab Helm chart values documentation](https://docs.gitlab.com/charts/charts/gitlab/).

## Documentation and Resources

For more information about working with GitLab and Chainguard Images:

* [GitLab Helm Chart Documentation](https://docs.gitlab.com/charts/)
* [GitLab Configuration Guide](https://docs.gitlab.com/ee/administration/)
* [GitLab Runner Documentation](https://docs.gitlab.com/runner/)
* [GitLab Agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pushprox-fips

# pushprox-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pushprox-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pushprox-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS compliant image with [PushProx](https://github.com/prometheus-community/PushProx), a proxy to allow Prometheus to scrape through NAT etc.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `pushprox-fips` Chainguard image is meant to serve as a drop-in replacement for the [PushProx image on DockerHub](https://hub.docker.com/r/prometheuscommunity/pushprox). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

## Prerequisites

* `prometheus`
* `prometheus-node-exporter` (component to scrape)

## Getting started

To begin, start the PushProx container with a command like the following:

```shell
# pushprox-proxy
docker run --rm cgr.dev/ORGANIZATION/pushprox-fips --help

# pushprox-client
docker run --rm --entrypoint="/app/pushprox-client" cgr.dev/ORGANIZATION/pushprox-fips --help
```

> [!NOTE]
> This will return pushprox-proxy and pushprox-client Command-line's usage instructions.

The PushProx client performs scrapes in a network environment that's not directly accessible by Prometheus. The PushProx proxy is accessible by both the Clients and Prometheus. Each client is identified by its fqdn.

Create isolated docker networks and deploy the target service (node_exporter) and the PushProx client on one network. Then deploy PushProx proxy and Prometheus will be deployed on the other.

Prometheus will scrape the target via the proxy. The client will then poll the proxy for scrape requests. The proxy routes the scrape to the client. This scrape request is executed by the client and the response containing metrics is posted to the proxy.

#### Create isolated networks
```shell
docker network create external-net
docker network create internal-net --internal
```

#### Deploy node_exporter
```shell
docker run -d --name target \
--network internal-net \
cgr.dev/ORGANIZATION/prometheus-node-exporter-fips:latest
```

#### Deploy PushProx proxy
```shell
docker run -d --name pushprox-proxy \
--network external-net \
-p 8080:8080 \
cgr.dev/ORGANIZATION/pushprox-fips:latest
```

#### Deploy PushProx client
```shell
docker run -d --name pushprox-client \
--network internal-net \
--entrypoint="/app/pushprox-client" \
cgr.dev/ORGANIZATION/pushprox-fips:latest \
--proxy-url="http://pushprox-proxy:8080" \
--fqdn="target"
```

#### Connect client to external network
```shell
docker network connect external-net pushprox-client
```

#### Deploy prometheus

1. Create prometheus scrape config
```shell
cat << EOF > prometheus.yml
global:
  scrape_interval: 30s

scrape_configs:
  - job_name: pushprox
    proxy_url: http://pushprox-proxy:8080
    static_configs:
    - targets: ['target:9100']
EOF
```

2. Deploy prometheus
```shell
docker run -d --name $prometheus_container \
--network external-net \
-p 9090:9090 \
-v ./prometheus.yml:/etc/prometheus/prometheus.yml \
cgr.dev/ORGANIZATION/prometheus-fips:latest \
--config.file=/etc/prometheus/prometheus.yml
```

#### Validate target is up and being scraped
```shell
curl http://localhost:9090/api/v1/targets | jq -r '.data.activeTargets'
```

expected response:
```json
[
  {
    "discoveredLabels": {
      "__address__": "target:9100",
      "__metrics_path__": "/metrics",
      "__scheme__": "http",
      "__scrape_interval__": "5s",
      "__scrape_timeout__": "5s",
      "job": "pushprox"
    },
    "labels": {
      "instance": "target:9100",
      "job": "pushprox"
    },
    "scrapePool": "pushprox",
    "scrapeUrl": "http://target:9100/metrics",
    "globalUrl": "http://target:9100/metrics",
    "lastError": "",
    "lastScrape": "2025-07-16T19:59:32.623643339Z",
    "lastScrapeDuration": 0.02758125,
    "health": "up",
    "scrapeInterval": "30s",
    "scrapeTimeout": "30s"
  }
]
```

## Documentation and Resources
- [PushProx Repo](https://github.com/prometheus-community/PushProx)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### php-fpm_exporter

# php-fpm_exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/php-fpm_exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/php-fpm_exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal php-fpm_exporter Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. 

Run docker manually:

```shell
docker pull cgr.dev/chainguard/php-fpm_exporter:latest
docker run -it --rm -e PHP_FPM_SCRAPE_URI="tcp://127.0.0.1:9000/status,tcp://127.0.0.1:9001/status" cgr.dev/chainguard/php-fpm_exporter:latest
``````

If you want to get more details about the php-fpm_exporter, please refer to the [official documentation](https://github.com/hipages/php-fpm_exporter#usage).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### drupal

# drupal
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/drupal` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/drupal/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Drupal is an open source content management platform supporting a variety of websites ranging from personal weblogs to large community-driven websites.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Running with SQLite (Development)

For quick testing and development, you can run Drupal with the built-in SQLite database:

```bash
docker run -d -p 8080:80 cgr.dev/ORGANIZATION/drupal:latest
```

Then visit `http://localhost:8080/core/install.php` to complete the installation.

### Running with MySQL (Recommended for Production)

For production deployments, MySQL is recommended as it has the best support and widest adoption in the Drupal community.

#### Docker Compose

First, generate secure passwords:

```bash
export MYSQL_PASSWORD=$(openssl rand -base64 32)
export MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
echo "MYSQL_PASSWORD: $MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD"
```

Create a `docker-compose.yml` file:

```yaml
version: '3.8'
services:
  drupal:
    image: cgr.dev/ORGANIZATION/drupal:latest
    ports:
      - "8080:80"
    depends_on:
      - mysql

  mysql:
    image: cgr.dev/ORGANIZATION/mysql:latest
    environment:
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
```

Start the services:

```bash
docker-compose up -d
```

Visit `http://localhost:8080/core/install.php` and configure the database connection:
- Database type: MySQL, MariaDB, Percona Server, or equivalent
- Database name: `drupal`
- Database username: `drupal`
- Database password: Use the value of `$MYSQL_PASSWORD` generated above
- Host: `mysql`

#### Kubernetes with Helm

First, generate secure passwords:

```bash
export MYSQL_PASSWORD=$(openssl rand -base64 32)
export MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
echo "MYSQL_PASSWORD: $MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD"
```

Deploy MySQL using the Chainguard MySQL Helm chart:

```bash
helm install mysql oci://cgr.dev/chainguard/mysql-helm \
  --set auth.database=drupal \
  --set auth.username=drupal \
  --set auth.password="$MYSQL_PASSWORD" \
  --set auth.rootPassword="$MYSQL_ROOT_PASSWORD"
```

Then deploy Drupal:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: drupal
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drupal
  template:
    metadata:
      labels:
        app: drupal
    spec:
      containers:
        - name: drupal
          image: cgr.dev/ORGANIZATION/drupal:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: drupal
spec:
  selector:
    app: drupal
  ports:
    - port: 80
      targetPort: 80
  type: ClusterIP
```

During installation, configure the database connection:
- Host: `mysql.default.svc.cluster.local`
- Port: `3306`
- Database: `drupal`
- Username: `drupal`
- Password: Use the value of `$MYSQL_PASSWORD` generated above

### Running with PostgreSQL

PostgreSQL can also be used as the database backend for production deployments.

#### Docker Compose

First, generate a secure password:

```bash
export POSTGRES_PASSWORD=$(openssl rand -base64 32)
echo "POSTGRES_PASSWORD: $POSTGRES_PASSWORD"
```

Create a `docker-compose.yml` file:

```yaml
version: '3.8'
services:
  drupal:
    image: cgr.dev/ORGANIZATION/drupal:latest
    ports:
      - "8080:80"
    depends_on:
      - postgres

  postgres:
    image: cgr.dev/ORGANIZATION/postgres:latest
    environment:
      POSTGRES_DB: drupal
      POSTGRES_USER: drupal
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
```

Start the services:

```bash
docker-compose up -d
```

Visit `http://localhost:8080/core/install.php` and configure the database connection:
- Database type: PostgreSQL
- Database name: `drupal`
- Database username: `drupal`
- Database password: Use the value of `$POSTGRES_PASSWORD` generated above
- Host: `postgres`

#### Kubernetes with Helm

First, generate a secure password:

```bash
export POSTGRES_PASSWORD=$(openssl rand -base64 32)
echo "POSTGRES_PASSWORD: $POSTGRES_PASSWORD"
```

Deploy PostgreSQL using the Chainguard PostgreSQL Helm chart:

```bash
helm install postgresql oci://cgr.dev/chainguard/postgresql-helm \
  --set auth.database=drupal \
  --set auth.username=drupal \
  --set auth.password="$POSTGRES_PASSWORD"
```

Then deploy Drupal:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: drupal
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drupal
  template:
    metadata:
      labels:
        app: drupal
    spec:
      containers:
        - name: drupal
          image: cgr.dev/ORGANIZATION/drupal:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: drupal
spec:
  selector:
    app: drupal
  ports:
    - port: 80
      targetPort: 80
  type: ClusterIP
```

During installation, configure the database connection:
- Host: `postgresql.default.svc.cluster.local`
- Port: `5432`
- Database: `drupal`
- Username: `drupal`
- Password: Use the value of `$POSTGRES_PASSWORD` generated above

### Persistent Storage

For production, mount a persistent volume to `/var/www/html/sites` to preserve uploaded files and site configuration:

```bash
docker run -d -p 8080:80 \
  -v drupal_sites:/var/www/html/sites \
  cgr.dev/ORGANIZATION/drupal:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### emqx-exporter-fips

# images/emqx-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/emqx-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/emqx-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The emqx-exporter is designed to expose partial metrics that are not included in the EMQX Prometheus API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is based on the upstream [emqx-exporter](https://hub.docker.com/r/emqx/emqx-exporter) image, with the following differences:

* Like all other Chainguard Containers, `emqx-exporter-fips` features a stripped down, minimal design container image
* It has few-to-zero CVEs
* **FIPS Compliance**: Ships with validated redistribution of OpenSSL's FIPS provider module for environments requiring FIPS 140-3 compliance

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

These changes are intended to optimize app performance while maintaining FIPS compliance and keeping the image aligned with the latest platform capabilities.

Chainguard's EMQX Exporter FIPS image is smaller in size compared to the original image and has few-to-zero CVEs.

## Getting Started
EMQX Exporter can be deployed either as a standalone container or inside a Kubernetes cluster. This section provides minimal examples to help you start the service using the supported deployment methods.

### Running with Docker
```bash
git clone https://github.com/emqx/emqx-exporter
cd emqx-exporter/examples/docker-compose

# Replace the emqx-exporter image with the Wolfi variant:
IMAGE="cgr.dev/ORGANIZATION/emqx-exporter-fips:latest" yq -i '.services."emqx-exporter".image = env(IMAGE)' docker-compose.yml

# Start the deployment
docker-compose up -d
```

You should now see the exported metrics in prometheus&grafana. You can also query them via promtool:

```bash
# Check the exposed metrics
curl http://localhost:8085/metrics
# Query the metrics
promtool query instant http://localhost:9090 emqx_cluster_status
```

### Running with Kubernetes
```bash
git clone https://github.com/emqx/emqx-exporter
cd emqx-exporter

# Replace the emqx-exporter image with the Wolfi variant:
IMAGE="cgr.dev/ORGANIZATION/emqx-exporter-fips:latest"  yq -i '
(. | select(.kind == "Deployment" and .metadata.name == "emqx-exporter")
    | .spec.template.spec.containers[]
    | select(.name == "exporter")
    | .image) = env(IMAGE)
' examples/kubernetes/resources/emqx-exporter.yaml

# Install EMQX-Operator
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true
helm repo add emqx https://repos.emqx.io/charts
helm repo update
helm upgrade --install emqx-operator emqx/emqx-operator \
  --namespace emqx-operator-system \
  --create-namespace
kubectl wait --for=condition=Ready pods -l "control-plane=controller-manager" -n emqx-operator-system

# Install CRDs for prometheus stack
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
kubectl apply --server-side -f manifests/setup
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring

# Install EMQX & EMQX Exporter
cd ..
kubectl apply -k examples/kubernetes --server-side
```

You should now see the exported metrics in prometheus&grafana. You can also query them via promtool:

```bash
# Expose the emqx-exporter service 
kubectl port-forward svc/emqx-exporter-service 8085:8085

# Check the exposed metrics
curl http://localhost:8085/metrics

# Expose the prometheus service
kubectl -n monitoring port-forward svc/prometheus-k8s 9090:9090

# Query the metrics
promtool query instant http://localhost:9090 emqx_cluster_status
```

## Documentation and Resources

For more information about Emqx-Exporter in container images, please refer to the [emqx website](https://docs.emqx.com/en/emqx-operator/latest/tasks/configure-emqx-prometheus.html#monitor-emqx-cluster-by-prometheus-and-grafana) or to the [official repository](https://github.com/emqx/emqx-exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-issuer

# step-issuer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-issuer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-issuer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image of [step-issuer](https://smallstep.com/docs/platform/), a certificate issuer for cert-manager using step certificates CA

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `step-issuer` image is a minimal drop-in replacement for the upstream [smallstep/step-issuer](https://hub.docker.com/r/smallstep/step-issuer/tags). It is fully compatible with the [cert-manager](https://cert-manager.io/) framework and the official [Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer), enabling the issuance of X.509 certificates using a [step-ca](https://smallstep.com/docs/step-ca/) instance as the backend Certificate Authority. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [step-issuer Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/step-issuer
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `step-issuer` helm chart.

```shell
helm repo add smallstep https://smallstep.github.io/helm-charts
helm repo update
helm install step-issuer smallstep/step-issuer --namespace step-system --create-namespace --values values.yaml --wait
```

### Using the StepIssuer

Once installed, `step-issuer` allows cert-manager to request certificates from a `step-ca` instance.

Here is an example of how to configure a StepClusterIssuer and request a certificate:

1. Create a `StepIssuer`

```yaml
apiVersion: cert-manager.step.sm/v1beta1
kind: StepIssuer
metadata:
  name: step-issuer
spec:
  provisioner:
    name: admin
    passwordRef:
      name: step-ca-provisioner-password
      key: password
  caBundle: |
    -----BEGIN CERTIFICATE-----
    MIIB...
    -----END CERTIFICATE-----
  url: https://step-ca.step-system.svc.cluster.local
```

Note: The `caBundle` should contain the PEM-encoded root certificate from your step-ca.
You can extract it using:
```bash
kubectl get configmap step-ca-step-certificates-certs -n step-system -o jsonpath="{.data['root_ca.crt']}"
```

The `StepIssuer` is a custom resource provided by step-issuer that integrates with cert-manager. It defines how cert-manager should connect to your step-ca Certificate Authority to request and renew certificates.

2. Request a Certificate using cert-manager

```yaml
apiVersion: cert-manager.io/v1
kind: CertificateRequest
metadata:
  name: test-cert
  namespace: step-system
spec:
  request: <BASE64_ENCODED_CSR>
  duration: 24h
  issuerRef:
    name: step-issuer
    kind: StepIssuer
    group: cert-manager.step.sm
```

Note: The `request` field must be a base64-encoded CSR in DER format. You can generate a CSR using OpenSSL or step CLI, then base64-encode it before pasting.

The above resource will submits the CSR to the `step-issuer`, which will request a signed certificate from the step-ca. Once approved, the signed certificate will be returned in the `status.certificate` field of the CertificateRequest resource.

## Documentation and Resources
- [Step-issuer Github Repository](https://github.com/smallstep/step-issuer)
- [Step-issuer Helm Chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-corretto-jre

# amazon-corretto-jre
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-corretto-jre` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-corretto-jre/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Amazon Corretto is a no-cost, multi-platform, production-ready distribution of corresponding version of OpenJDK

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard version of [Amazon Corretto JRE](https://aws.amazon.com/corretto/) is a minimal, secure, and regularly updated container image designed to run Java applications. It leverages the security features of Chainguard Containers, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

To test the Chainguard version of Amazon Corretto JRE, you can use the following examples:

### Running a Simple Java Application

Create a Java application, such as this `HelloWorld.java` example:

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

Compile the application:

```shell
javac HelloWorld.java
```

Create a Dockerfile to build the image:

```Dockerfile
FROM cgr.dev/chainguard/amazon-corretto-jre:latest
COPY HelloWorld.class /app/
WORKDIR /app
CMD ["java", "HelloWorld"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the application output:

```
Hello, World!
```

### Running a Java Application with Dependencies

If your Java application has dependencies, you can use a build tool like Maven. Create a `pom.xml` file for your project and a Java application:

```xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</project>
```

```java
import org.apache.commons.lang3.StringUtils;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(StringUtils.capitalize("hello, world!"));
    }
}
```

Create a Dockerfile to build the image:

```Dockerfile
FROM maven:3.8.4-openjdk-11 AS build
COPY pom.xml /app/
COPY src /app/src
WORKDIR /app
RUN mvn package

FROM cgr.dev/chainguard/amazon-corretto-jre:latest
COPY --from=build /app/target/hello-world-1.0-SNAPSHOT.jar /app/hello-world.jar
WORKDIR /app
CMD ["java", "-jar", "hello-world.jar"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the output returned by the application:

```
Hello, world!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spiffe-helper-fips

# spiffe-helper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spiffe-helper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spiffe-helper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A secure, minimal container image for the SPIFFE Helper utility that automates X.509 SVID certificate rotation for services that can't natively fetch X.509-SVIDs.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream SPIFFE Helper utility, which automates X.509 SVID certificate rotation for services that can't natively fetch X.509-SVIDs. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Additionally, Chainguard's SPIFFE Helper Fips image maintains compatibility with standard SPIFFE workload API socket locations, and is fully compatible with existing spiffe-helper configuration files.

## FIPS Support

The `spiffe-helper-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

The `spiffe-helper-fips` is designed to automate X.509-SVID certificate rotation for services. This guide demonstrates how to use the Chainguard SPIFFE-helper fips image with MySQL and SPIRE for secure TLS certificate management.

Start by cloning the Repository:

```shell
git clone https://github.com/spiffe/helm-charts-hardened.git
cd helm-charts-hardened/examples/mysql-using-spire
```

Then install SPIRE and its CRDs:

```shell
helm upgrade --install -n spire-server spire-crds spire-crds \
  --repo https://spiffe.github.io/helm-charts-hardened/ \
  --create-namespace --version 0.3.0

helm upgrade --install -n spire-server spire spire \
  --repo https://spiffe.github.io/helm-charts-hardened/ \
  --version 0.17.1 -f spire-values.yaml
```

Next, deploy the MySQL client:

```shell
kubectl apply -f mysqlclient-configmap.yaml
kubectl apply -f mysqlclient-statefulset.yaml
```

Wait for the client to be ready
```shell
kubectl wait pod mysqlclient-0 --for=condition=ready --timeout=60s
```

Retrieve the client's certificate `x500UniqueIdentifier` identifier:

```shell
# Run, and get the x500UniqueIdentifier value:
kubectl exec -it mysqlclient-0 -c main -- bash -c 'openssl x509 -in /certs/tls.crt -noout -text | grep Subject:'
```

Additionally, update the `x500UniqueIdentifier` in `custom-mysql-values.yaml` and replace the default `ghcr.io/spiffe/spiffe-helper` image with the Chainguard FIPS image:

```shell
cat > custom-mysql-values.yaml <<EOF
initdbScripts:
  usertls.sql: |
    CREATE USER 'mysqlclient'@'%' REQUIRE SUBJECT '/C=US/O=SPIRE/CN=mysqlclient.default.svc.cluster.local/x500UniqueIdentifier=a753b06724b81d4a2f14f615d40550ed';
    GRANT ALL PRIVILEGES ON *.* TO 'mysqlclient'@'%' WITH GRANT OPTION;

primary:
  extraFlags: "--ssl-ca=/certs/ca.pem --ssl-cert=/certs/tls.crt --ssl-key=/certs/tls.key --require-secure-transport=ON"

  initContainers: |
    - name: setup-helper-volume-p1
      image: busybox:1.36.1-uclibc
      imagePullPolicy: IfNotPresent
      command:
      - sh
      - -c
      - 'cp -a /bin/busybox /helper'
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-helper
        mountPath: /helper
    - name: setup-helper-volume-p2
      image: cgr.dev/chainguard/spiffe-helper-fips:latest
      imagePullPolicy: IfNotPresent
      command:
      - /helper/busybox
      - sh
      - -c
      - '/helper/busybox cp -a /spiffe-helper /helper && /helper/busybox rm -f /helper/busybox'
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-helper
        mountPath: /helper
    - name: init-tls
      image: cgr.dev/chainguard/spiffe-helper-fips:latest
      imagePullPolicy: Always
      command:
      - /spiffe-helper
      - -config
      - /etc/spiffe-helper.conf
      - -daemon-mode=false
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-workload-api
        mountPath: /spiffe-workload-api
        readOnly: true
      - name: spiffe-helper-configmap
        mountPath: /etc/spiffe-helper.conf
        subPath: spiffe-helper.conf
        readOnly: true
      - name: certdir
        mountPath: /certs

  sidecars: |
    - name: refresh-tls
      image: {{  include "mysql.image" . }}
      imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
      command:
      - /helper/spiffe-helper
      - -config
      - /etc/spiffe-helper.conf
      env:
      - name: MYSQL_PWD
        valueFrom:
          secretKeyRef:
            name: {{ template "mysql.secretName" . }}
            key: mysql-root-password
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-workload-api
        mountPath: /spiffe-workload-api
        readOnly: true
      - name: spiffe-helper-configmap
        mountPath: /etc/spiffe-helper.conf
        subPath: spiffe-helper.conf
        readOnly: true
      - name: certdir
        mountPath: /certs
      - name: spiffe-helper
        mountPath: /helper
      - name: mysql-sockdir
        mountPath: /opt/bitnami/mysql/tmp

  extraVolumeMounts:
  - name: certdir
    mountPath: /certs
  - name: mysql-sockdir
    mountPath: /opt/bitnami/mysql/tmp

  extraVolumes: |
    - name: certdir
      emptyDir: {}
    - name: spiffe-helper
      emptyDir: {}
    - name: mysql-sockdir
      emptyDir: {}
    - name: spiffe-helper-configmap
      configMap:
        name: {{ include "mysql.primary.fullname" . }}-spiffe-helper
    - name: spiffe-workload-api
      csi:
        driver: "csi.spiffe.io"
        readOnly: true
EOF
```

Following that, deploy MySQL with the above configuration:

```shell
helm upgrade --install mysql mysql \
  --version 9.15.0 \
  --repo https://charts.bitnami.com/bitnami \
  -f custom-mysql-values.yaml
```

Wait for MySQL to be ready

```shell
kubectl wait pod mysql-0 --for=condition=ready --timeout=60s
```

Now that it's running, you can test the connection:

```shell
kubectl exec -it mysqlclient-0 -- bash -c \
  'mysql -u mysqlclient --protocol tcp \
   --ssl-key /certs/tls.key \
   --ssl-cert /certs/tls.crt \
   --ssl-ca /certs/ca.pem \
   -h mysql.default.svc.cluster.local'
```

If everything is working as expected, the `mysql>` prompt will appear in your terminal:

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

## Documentation and Resources:

 - [SPIFFE helper Github Repository](https://github.com/spiffe/spiffe-helper)
 - [Official SPIFFE Documentation](https://spiffe.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-receive-controller

# thanos-receive-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-receive-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-receive-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller to automatically configure Thanos receive hashrings

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `thanos-receive-controller` container image is comparable to the [observatorium/thanos-receive-controller](https://quay.io/repository/observatorium/thanos-receive-controller?tab=tags&tag=latest) image on quay.io, with the following differences:

* Like all other Chainguard Containers, `thanos-receive-controller` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

First you need to create a ConfigMap that contains the initial hashring configuration. For example, create a file named `hashrings.json` with the following content:

```json
{
  "hashrings": [
    {
      "hashring": "hashring0",
      "tenants": ["foo", "bar"]
    },
    {
      "hashring": "hashring1",
      "tenants": ["baz"]
    }
  ]
}
```

Then, create the ConfigMap in your Kubernetes cluster:

```bash
kubectl create configmap thanos-receive --from-file=hashrings.json
```

then create the Deployment:

`deployment.yaml`:

```yaml
cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: thanos-receive-controller
  labels:
    app.kubernetes.io/name: thanos-receive-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: thanos-receive-controller
  template:
    metadata:
      labels:
        app.kubernetes.io/name: thanos-receive-controller
    spec:
      containers:
      - args:
        - --configmap-name=thanos-receive
        - --configmap-generated-name=thanos-receive-generated
        - --file-name=hashrings.json
        image: cgr.dev/ORGANIZATION/thanos-receive-controller:latest
        name: thanos-receive-controller
EOF
```

Make sure to replace `ORGANIZATION` with your organization's name.

After deploying, you can check if the ConfigMap was created successfully:

```bash
kubectl get configmap thanos-receive-generated -o yaml
```

You should see the `thanos-receive-generated` ConfigMap with the same data as the original `thanos-receive` ConfigMap.

Next, deploy StatefulSets of Thanos receivers labeled with `controller.receive.thanos.io=thanos-receive-controller`. The controller lists all of the StatefulSets with that label and matches the value of their `controller.receive.thanos.io/hashring` labels to the hashring names in the configuration file. The endpoints for each hashring will be populated automatically by the controller and the complete configuration file will be placed in a ConfigMap named `thanos-receive-generated`. This configuration should be consumed as a ConfigMap volume by the Thanos receivers.

## Documentation and Resources

- **[Hashring management and autoscaling in Kubernetes](https://thanos.io/tip/components/receive.md/#hashring-management-and-autoscaling-in-kubernetes)**
- **[GitHub Repository](https://github.com/observatorium/thanos-receive-controller)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### psqlodbc

# psqlodbc
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/psqlodbc` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/psqlodbc/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains psqlodbc drivers for use with unixODBC.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image contains the ANSI and Unicode `psqlodbc` drivers for use with unixODBC.

It also contains the `unixodbc` package and associated utilities.

## Getting Started

To use this image, ensure the `psqlodbc` drivers are registered in an `odbcinst.ini` file like the following:

```
[PostgreSQL Unicode]
Description=PostgreSQL ODBC Driver
Driver=/usr/lib/psqlodbcw.so
[PostgreSQL ANSI]
Description=PostgreSQL ODBC Driver
Driver=/usr/lib/psqlodbca.so
```

Next, configure an `odbc.ini` file with the drivers by adding their respective names on a `Driver = <name>` line like this:

```
[PostgreSQL-Unicode-DB]
Driver = PostgreSQL Unicode
Servername = ...
Database = ...
Username = ...
Password = ...
. . .
[PostgreSQL-ANSI-DB]
Driver = PostgreSQL ANSI
Servername = ...
Database = ...
Username = ...
Password = ...
. . .
```

To test that the drivers are working as intended, configure the rest of `odbc.ini` with the appropriate settings and credentials and then try connecting with `isql`:

```
isql -v PostgreSQL-TestDB-ANSI <schemaname>
```

If the connection is successful, you will receive output like the following:

```
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+
```

## Documentation and Resources

* For more information about `psqlodbc` visit the [ODBC project page on PostgreSQL's site](https://odbc.postgresql.org/)
* To learn more about `unixODBC` visit [https://www.unixodbc.org/](https://www.unixodbc.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-restore-helper

# velero-restore-helper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-restore-helper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-restore-helper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Backup and migrate Kubernetes applications and their persistent volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Velero uses a helper init container when performing a filesystem restore (FSB in Velero's terminology). To use this image as the helper follow the [File System Backup](https://velero.io/docs/main/file-system-backup/#customize-restore-helper-container) documentation, and edit the provided `ConfigMap` to use `cgr.dev/chainguard/velero-restore-helper`.

## Installation and Usage

```bash
docker run cgr.dev/chainguard/velero-restore-helper:latest help
```

For more information, refer to the velero documentation:
- [Velero GitHub](https://github.com/vmware-tanzu/velero)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spamcheck-fips

# spamcheck-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spamcheck-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spamcheck-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Spamcheck is a gRPC-based spam classification service for GitLab

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `spamcheck-fips` container image is a drop-in replacement for the upstream [Gitlab Spamcheck image](https://gitlab.com/gitlab-org/gl-security/security-engineering/security-automation/spam/spamcheck). It offers the same functionality as the upstream for gRPC spam detection. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image may require minor adjustments to your existing deployment configuration.

> [!IMPORTANT]
> The Chainguard spamcheck image does **not** include the proprietary `spam_classifiers` component used for machine learning-based detection. This closed-source component must be obtained from GitLab and provided to the container at runtime.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started

### Quick Start with Docker

> [!NOTE] 
> This example requires you to have `spam_classifiers` component available locally.

```bash
docker run -d \
  -p 8001:8001 \
  -v /path/to/spam_classifiers:/spam_classifiers:ro \
  -e PYTHONPATH="/spam_classifiers:/usr/lib/python3.10/site-packages" \
  -e GRPC_ADDR="0.0.0.0:8001" \
  -e LOG_LEVEL="info" \
  cgr.dev/ORGANIZATION/spamcheck-fips:latest
```

### Quick Start with Kubernetes

For production use, spamcheck is typically deployed to Kubernetes with an init container that downloads the `spam_classifiers` component and its dependencies. Below is a complete example:

#### Create Namespace and ConfigMap

```bash
kubectl create namespace spamcheck
```

Create a ConfigMap with a script to download spam_classifiers:

```bash
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: spamcheck-download-script
  namespace: spamcheck
data:
  download-classifiers.sh: |
    #!/bin/sh
    set -e
    echo "Downloading spam_classifiers dependencies..."
    python3.10 -m pip install --target=/shared/site-packages \
      --only-binary=:all: \
      'numpy<2' \
      'scikit-learn==1.5.2' \
      'scipy' \
      'joblib' \
      'threadpoolctl'

    # Download spam_classifiers from GitLab GCS bucket
    SPAM_CLASSIFIERS_URL="\${SPAM_CLASSIFIERS_URL:-https://storage.googleapis.com/glsec-spamcheck-ml-artifacts/spam-classifier/pip/4.2.1/spam_classifiers-4.2.1.tar.gz}"

    cd /tmp
    wget -O spam_classifiers.tar.gz "\${SPAM_CLASSIFIERS_URL}"

    echo "Extracting spam_classifiers..."
    tar -xzf spam_classifiers.tar.gz
    cd spam_classifiers-4.2.1
    python3.10 -m pip install --no-deps --target=/shared/site-packages .
EOF
```

#### Deploy Spamcheck

```bash
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spamcheck
  namespace: spamcheck
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spamcheck
  template:
    metadata:
      labels:
        app: spamcheck
    spec:
      initContainers:
      - name: download-spam-classifiers
        image: cgr.dev/ORGANIZATION/python:3.10-dev
        command: ["/bin/sh", "/scripts/download-classifiers.sh"]
        env:
        - name: SPAM_CLASSIFIERS_URL
          value: "https://storage.googleapis.com/glsec-spamcheck-ml-artifacts/spam-classifier/pip/4.2.1/spam_classifiers-4.2.1.tar.gz"
        volumeMounts:
        - name: shared-packages
          mountPath: /shared/site-packages
        - name: download-script
          mountPath: /scripts
      containers:
      - name: spamcheck
        image: cgr.dev/ORGANIZATION/spamcheck-fips:latest
        ports:
        - containerPort: 8001
          name: grpc
          protocol: TCP
        env:
        - name: GRPC_ADDR
          value: "0.0.0.0:8001"
        - name: LOG_LEVEL
          value: "info"
        - name: PYTHONPATH
          value: "/shared/site-packages:/usr/lib/python3.10/site-packages"
        - name: LANG
          value: "C.UTF-8"
        - name: LC_ALL
          value: "C.UTF-8"
        - name: PYTHONDONTWRITEBYTECODE
          value: "1"
        - name: PYTHONFAULTHANDLER
          value: "1"
        - name: TF_CPP_MIN_LOG_LEVEL
          value: "2"
        volumeMounts:
        - name: shared-packages
          mountPath: /shared/site-packages
      volumes:
      - name: shared-packages
        emptyDir: {}
      - name: download-script
        configMap:
          name: spamcheck-download-script
          defaultMode: 0755
---
apiVersion: v1
kind: Service
metadata:
  name: spamcheck
  namespace: spamcheck
spec:
  selector:
    app: spamcheck
  ports:
  - port: 8001
    targetPort: 8001
    protocol: TCP
    name: grpc
  type: ClusterIP
EOF
```

#### Verify Deployment

Wait for the deployment to become ready:

```bash
kubectl wait --for=condition=Available -n spamcheck deployment/spamcheck --timeout=30s
```

Check the logs:

```bash
kubectl logs -n spamcheck -l app=spamcheck
```

## Documentation and Resources

- **[GitLab Repo](https://gitlab.com/gitlab-org/gl-security/security-engineering/security-automation/spam/spamcheck)**
- **[GitLab Akismet Anti-Spam Documentation](https://docs.gitlab.com/ee/integration/akismet.html)**
- **[GitLab's Spamcheck documentation](https://docs.gitlab.com/administration/reporting/spamcheck/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### eks-distro-fips

# eks-distro-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/eks-distro-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/eks-distro-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An open-source distribution of Kubernetes from AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
Amazon EKS Distro (EKS-D) is a Kubernetes distribution based on and used by Amazon Elastic Kubernetes Service (EKS) to create reliable and secure Kubernetes clusters. For more [Information](https://distro.eks.amazonaws.com/)

### Components
This deployment includes the following critical components:
- CoreDNS: A DNS server that integrates with Kubernetes.
- EBS CSI Driver: A Container Storage Interface (CSI) driver for managing AWS Elastic Block Store volumes.
- Kubernetes CSI drivers: External provisioners, resizers, and snapshot controllers to manage storage resources effectively.

## Installation
For installation instructions, visit the [EBS CSI Driver Install Guide](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#deploy-driver).

### 1. Using Helm Chart

To deploy using Helm charts, you can use the following command. This command overrides the default image to use the Chainguard image
```bash
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.35"

helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update

helm upgrade --install aws-ebs-csi-driver \
   --namespace kube-system \
   aws-ebs-csi-driver/aws-ebs-csi-driver \
   --set sidecars.provisioner.image.repository=cgr.dev/chainguard/eks-distro-kubernetes-csi-external-provisioner-fips \
   --set sidecars.provisioner.image.tag=latest \
   --set sidecars.attacher.image.repository=cgr.dev/chainguard/eks-distro-kubernetes-csi-external-attacher-fips \
   --set sidecars.attacher.image.tag=latest \
   --set sidecars.resizer.image.repository=cgr.dev/chainguard/eks-distro-kubernetes-csi-external-resizer-fips \
   --set sidecars.resizer.image.tag=latest \
   --set sidecars.livenessProbe.image.repository=cgr.dev/chainguard/eks-distro-kubernetes-csi-livenessprobe-fips \
   --set sidecars.livenessProbe.image.tag=latest
```

Refer to the [values.yaml](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/charts/aws-ebs-csi-driver/values.yaml) file for more configuration options.

### 2. Using Amazon EKS/KOPS Clusters

To test the EBS CSI driver functionality and verify its deployment, we need to create and deploy an EKS cluster. Similarly, for testing kube-components, we can create and deploy a KOPS cluster and update the manifests accordingly.

## Additional Resources
- [EKS-Distro GitHub Repository](https://github.com/aws/eks-distro)
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
- [AWS EKS Documentation](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openssh-server-fips

# openssh-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openssh-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openssh-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenSSH Server FIPS is a secure shell (SSH) server implementation that provides encrypted communication between clients and servers, with FIPS compliance.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This is a minimal FIPS-compliant OpenSSH server image that contains only the essential components needed to run an SSH daemon with FIPS validated cryptographic modules. The image is designed to be used with external volume mounts for all configuration and runtime data.

Unlike traditional SSH container images, this image:

- Includes no pre-generated moduli
- Requires external volume mounts for all SSH-related files, such as authorized_keys
- Does not include a package manager
- Enforces FIPS-compliant cryptographic algorithms only
- Rejects connections using non-FIPS approved algorithms

### FIPS Support

The `openssh-server-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. 

For more on FIPS support in Chainguard Containers, consult the guide on [FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Prerequisites

Since this is a minimal image, you must provide all necessary SSH server components through volume mounts:

- **Host keys**: Mount your SSH host keys to `/etc/ssh/`
- **Authorized keys**: Mount user authorized keys (typically to `/home/nonroot/.ssh/authorized_keys` or similar)

Before running the container, ensure you have:

1. **Generated host keys**:
   ```bash
   ssh-keygen -t rsa -b 3072 -f /host/ssh/keys/ssh_host_rsa_key -N ""
   ssh-keygen -t ecdsa -b 384 -f /host/ssh/keys/ssh_host_ecdsa_key -N ""
   ssh-keygen -t ed25519 -f /host/ssh/keys/ssh_host_ed25519_key -N ""
   ```

2. **Set up user authentication**: Either through authorized keys or other supported authentication methods

## Getting Started

```bash
docker run -d \
  -p 2222:22 \
  -v /host/ssh/keys:/etc/ssh:ro \
  cgr.dev/ORGANIZATION/openssh-server-fips:latest
```

## Additional Resources
[Openssh Server Documentation](https://www.openssh.com/manual.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-terraform

# crossplane-provider-terraform
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-terraform` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-terraform/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane Terraform Provider enables provisioning and managing infrastructure using Terraform within a Crossplane control plane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-provider-terraform` container image is a drop-in replacement for the upstream [docker pull ghcr.io/crossplane-contrib/provider-terraform](https://github.com/crossplane-contrib/provider-terraform/pkgs/container/provider-terraform) image. It offers the same functionality as the upstream for provisioning and managing infrastructure using Terraform modules via the Crossplane control plane. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started Guide

### Install the Terraform provider
Install the provider into the Kubernetes cluster with a Kubernetes configuration file.

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-terraform
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-terraform:latest
  skipDependencyResolution: true
```

Apply this configuration with `kubectl apply -f`. After installing the provider, verify the install with `kubectl get providers`.

```bash
$ kubectl get providers
NAME                 INSTALLED   HEALTHY   PACKAGE                                                     AGE
provider-terraform   True        True      cgr.dev/ORGANIZATION/crossplane-provider-terraform:latest   60s
```
It may take up to 5 minutes to report `HEALTHY`.

## Documentation and Resources:
- [Crossplane Provider Terraform GitHub Repository](https://github.com/crossplane-contrib/provider-terraform)
- [Crossplane Provider Terraform Quickstart Guide](https://marketplace.upbound.io/providers/upbound/provider-terraform/v1.0.0)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-messaging-topology-operator-iamguarded

# rabbitmq-messaging-topology-operator-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-messaging-topology-operator-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-messaging-topology-operator-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ messaging topology operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

RabbitMQ Messaging Topology Operator IAMGuarded is a security-enhanced component of the RabbitMQ Cluster Operator deployment. This image is designed to be deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, providing declarative management of RabbitMQ messaging topology (exchanges, queues, bindings, users, etc.) with additional security benefits.

## Helm Chart Installation

The RabbitMQ Messaging Topology Operator IAMGuarded image is deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION" \
  --set "msgTopologyOperator.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization. Note that the Messaging Topology Operator is enabled by default.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator (this image)
msgTopologyOperator:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "msgTopologyOperator.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ Messaging Topology Operator IAMGuarded installation by checking the operator pod status and creating sample RabbitMQ topology resources. The operator should be able to successfully manage exchanges, queues, bindings, users, and other RabbitMQ resources through custom resource definitions.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Messaging Topology Operator IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. This component ensures secure management of RabbitMQ messaging topology. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### conda-fips

# conda-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/conda-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/conda-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kong

# kong
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kong` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kong/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kong is a Cloud-Native API Gateway and AI Gateway

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s Kong image is a lean, Wolfi-based container image. It mirrors the [Docker image from the Kong project](https://docs.konghq.com/gateway/latest/install/docker/) in functionality but has fewer dependencies, minimizing the attack surface.

## Getting Started

The following is an simple example of running the Chainguard Kong image in [**DB-less**](https://docs.konghq.com/gateway/3.9.x/production/deployment-topologies/db-less-and-declarative-config/) mode using Docker:

```shell
docker run -d --name kong \
  -p 8000:8000 \
  -p 8443:8443 \
  -e KONG_DATABASE=off \
  -e KONG_DECLARATIVE_CONFIG=/etc/kong/kong.yml \
  cgr.dev/ORGANIZATION/kong:latest
```

Once the container is running, you can test Kong’s gateway functionality by sending requests to http://localhost:8000.

### Using Kong With a Database

If you prefer to run Kong using a database (PostgreSQL or Cassandra), you can do so by setting the appropriate environment variables.

First, create a custom Docker network to allow the containers to discover and communicate with each other:

```shell
docker network create kong-net
```

Then start a database container. To illustrate, we will use a PostgreSQL container:

```shell
docker run -d --name kong-database \
 --network=kong-net \
 -p 5432:5432 \
 -e "POSTGRES_USER=kong" \
 -e "POSTGRES_DB=kong" \
 -e "POSTGRES_PASSWORD=kongpass" \
 postgres:13
```

Next, prepare the Kong database:

```bash
docker run --rm --network=kong-net \
 -e "KONG_DATABASE=postgres" \
 -e "KONG_PG_HOST=kong-database" \
 -e "KONG_PG_PASSWORD=kongpass" \
 -e "KONG_PASSWORD=test" \
  cgr.dev/ORGANIZATION/kong:latest kong migrations bootstrap
```

Run the following command to start a container with Kong Gateway:

```bash
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 127.0.0.1:8001:8001 \
-p 127.0.0.1:8002:8002 \
-p 127.0.0.1:8444:8444 \
cgr.dev/ORGANIZATION/kong:latest
```

## Documentation and Resources

Please refer to Kong’s [official documentation](https://docs.konghq.com/) for details on configuring your database and other advanced features.

You can explore the following resources to learn more about Kong:
* [Kong Official Documentation](https://docs.konghq.com/)
* [Kong Developer Guide](https://github.com/Kong/kong/blob/master/DEVELOPER.md)
* [Kong Source Code on GitHub](https://github.com/Kong/kong)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### couchdb

# couchdb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/couchdb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/couchdb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache CouchDB is an open-source, document-oriented NoSQL database implemented in Erlang.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard couchdb image is intended to to be a drop-in replacement for the [official CouchDB image](https://hub.docker.com/_/couchdb) and is meant to be run with the [couchdb Helm chart](https://artifacthub.io/packages/helm/couchdb/couchdb).

Chainguard's CouchDB image stores its data in `/usr/share/couchdb`, with a symbolic link to `/opt/couchdb` to provide compatibility with the external image.

The uid/gid for the `couchdb` user is `65532`.

## Getting Started

The default entrypoint starts the CouchDB server. It needs the username and password to be provided via environment variables.

For example:

```shell
docker run \
  COUCHDB_USER=user -e COUCHDB_PASSWORD=s3cret \
  cgr.dev/ORGANIZATION/couchdb
[info] 2024-12-16T15:07:55.285349Z nonode@nohost <0.249.0> -------- Preflight check: Checking For Monsters
[info] 2024-12-16T15:07:55.287213Z nonode@nohost <0.249.0> -------- Preflight check: Asserting Admin Account
[info] 2024-12-16T15:07:55.291284Z nonode@nohost <0.249.0> -------- Apache CouchDB 3.3.3 is starting.
[info] 2024-12-16T15:07:55.291404Z nonode@nohost <0.250.0> -------- Starting couch_sup
[notice] 2024-12-16T15:07:55.306213Z nonode@nohost <0.104.0> -------- config: [admins] user set to '****' for reason nil
[info] 2024-12-16T15:07:55.368549Z nonode@nohost <0.249.0> -------- Apache CouchDB has started. Time to relax.
```

To add a volume to persist the data, mount it as `/opt/couchdb/data`, like this:

```shell
docker run \
  -v /path/to/couchdbstorage:/opt/couchdb/data \
  COUCHDB_USER=user -e COUCHDB_PASSWORD=s3cret \
  cgr.dev/ORGANIZATION/couchdb
```

The entrypoint script will provide permissions for the data so that the `couchdb` user can read and write to it.

### Helm Chart Usage

The Chainguard CouchDB image can be used with the [CouchDB Helm chart](https://artifacthub.io/packages/helm/couchdb/couchdb). To use the Chainguard image with the chart, provide the following values to it:

```yaml
# provide UUID for the cluster, as required by the Helm chart
# NOTE: replace decafbaddecafbaddecafbaddecafbad with a valid UUID
couchdbConfig:
  couchdb:
    uuid=decafbaddecafbaddecafbaddecafbad
# use the Chainguard image with latest tag
image:
  repository: cgr.dev/ORGANIZATION/couchdb
  tag: latest
```

Assuming these values are saved as `cgr_values.yaml`, you will be able to run the following to install CouchDB:

```shell
helm repo add couchdb https://apache.github.io/couchdb-helm
helm install couchdb couchdb/couchdb --values cgr_values.yaml
```

### User

By default the image starts as `root` user to perform changing of permissions of storage data and initializing configuration. The `couchdb` server is then run as `couchdb` user.

It is also possible to run the image (and Helm chart) as `couchdb` user. To do it, simply pass `-u 65532` flag to docker to specify the userid for `couchdb` - such as:

```shell
docker run \
  -u 65532 \
  COUCHDB_USER=user -e COUCHDB_PASSWORD=s3cret \
  cgr.dev/ORGANIZATION/couchdb
```

To set the user, group and default filesystem group to `couchdb` in the Helm chart, add the following to the values file:

```yaml
containerSecurityContext:
  runAsUser: 65532
  runAsGroup: 65532
  fsGroup: 65532
```

> [!NOTE]
> When running the container as non-root, the volume permissions need to be set to the appropriate user and, in some cases, to the appropriate group, especially when using non-root approach with volumes containing existing data.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### percona-server-mongodb-operator-fips

# percona-server-mongodb-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/percona-server-mongodb-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/percona-server-mongodb-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS compliant Kubernetes Operator image which deploys and manages Percona Server for MongoDB on Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `percona-server-mongodb-operator-fips` (psmdb-operator-fips), Chainguard image is meant to serve as a drop-in replacement for the [PSMDB Operator image on Docker Hub](https://hub.docker.com/r/percona/percona-server-mongodb-operator). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

## Getting Started
To deploy the `percona-server-mongodb-operator-fips`, you can follow the steps below:

#### Prerequisites

* `helm`
* `certmanager`

> [!NOTE]
> The cert-manager operator needs to be deployed prior to the `percona-server-mongodb-operator`, otherwise it will fail to deploy.
> > The [cert-manager operator](https://cert-manager.io/) was deployed by following their [Helm install guide](https://cert-manager.io/docs/installation/helm/)
> All example resources are deployed into the `default` namespace.
> For more detail about the configurations options you can refer to the official [Percona Server for MongoDB Helm Chart documentation](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-db) and the [Percona Operator for  MongoDB Operator documentation](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-operator).

#### Deploy the Percona-Server-MongoDB-Operator

1. Add Percona's Helm chart repo and update Helm client
```shell
helm repo add percona https://percona.github.io/percona-helm-charts/
helm repo update
```

2. Create your values.yaml file
```shell
cat <<EOF > /tmp/values.yaml
replicaCount: 1
image:
  repository: cgr.dev/ORGANIZATION/percona-server-mongodb-operator-fips
  tag: latest
EOF
```

3. Install the `percona-server-mongodb-operator-fips`
```shell
helm install psmdb-operator-fips percona/psmdb-operator -f /tmp/values.yaml
```

## Documentation and Resources
- [PSMDB Operator docs - Helm install quickstart](https://docs.percona.com/percona-operator-for-mongodb/helm.html)
- [PSMDB Operator docs - Kubectl install quickstart](https://docs.percona.com/percona-operator-for-mongodb/kubectl.html)
- [PSMDB Operator docs - Connect to Percona Server for MongoDB](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/deploy-configure.md)
- [PSMDB Operator docs - Insert sample data](https://docs.percona.com/percona-operator-for-mongodb/data-insert.html)
- [PSMDB Operator helm chart config options](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-operator)
- [PSMDB helm chart config options](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-db)
- [Cert-Manager Operator docs - helm quickstart](https://cert-manager.io/docs/installation/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trino

# trino
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trino` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trino/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Fast distributed SQL query engine for big data analytics that helps you explore your data universe.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Trino container image is comparable to [the official Trino image](https://hub.docker.com/r/trinodb/trino) maintained by the Trino Software Foundation. Chainguard Containers are designed for minimalism and security, and only contain the dependencies needed to function. Unlike most of Chainguard's other container images, the Trino image ships with a shell.

## Getting Started

Use the [Trino Helm Chart](https://github.com/trinodb/charts) to deploy Trino on Kubernetes.

Use the following commands to deploy Trino on Kubernetes:

```
helm repo add trino https://trinodb.github.io/charts
helm repo update
helm install trino trino/trino \
      --set image.repository=cgr.dev/ORGANIZATION/trino
```

Following that, you have Trino running on a Kubernetes cluster.

For further customization use a values YAML and specify the `image.repository` and any additional desired configuration.

## Documentation and Resources

Refer to the [Trino documentation](https://trino.io/docs/) and the [Trino Helm chart documentation](https://trinodb.github.io/charts/) for further information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### melange

# melange
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/melange` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/melange/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for running [melange](https://github.com/chainguard-dev/melange) workflows to build APK packages.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

To build the melange workflow in [examples](https://github.com/chainguard-images/images/blob/main/images/melange/tests/minimal.yaml):

```
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build /work/tests/minimal.yaml
```

Output will be in the `packages` directory.

To build the melange package for the host architecture:

```
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build --empty-workspace --arch $(uname -m) /work/tests/minimal.yaml
```

To get a shell, you can use the `-dev` variant, and change the entrypoint:

```
docker run --privileged -v "$PWD":/work -it --entrypoint /bin/sh cgr.dev/chainguard/melange:latest-dev

/ # melange version
...
```
Note that melange uses bubblewrap internally, which requires various Linux capabilities, hence the
use of `--privileged`. Because of this requirement, we recommend this image is used only for local
development and testing.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-hardened-kubernetes-compat-fips

# rancher-hardened-kubernetes-compat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-hardened-kubernetes-compat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-hardened-kubernetes-compat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Kubernetes components compatible with Rancher's RKE2

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `rancher-hardened-kubernetes-compat-fips` container image is a drop-in replacement for the official [rancher/hardened-kubernetes](https://hub.docker.com/r/rancher/hardened-kubernetes) image.

This image contains FIPS-compliant Kubernetes control plane components:
- `kube-apiserver`
- `kube-controller-manager`
- `kube-scheduler`
- `kube-proxy`
- `kubelet`
- `kubectl`

All components are built with FIPS 140-2 validated cryptographic modules and are fully compatible with RKE2.

> [!NOTE]
> This image is designed to work with Chainguard's `rke2-runtime` images. When using preloaded images with RKE2, both the runtime and Kubernetes components must be tagged with the RKE2-compatible format: `vX.Y.Z-rke2r<N>`

## FIPS Compliance

All Kubernetes components in this image are:
- Built with FIPS 140-2 validated cryptographic modules
- Compiled with FIPS-compliant OpenSSL (openssl-provider-fips)
- Configured to use FIPS mode by default

## Getting Started

### Using with RKE2 in Air-Gapped Environments

To deploy Chainguard's FIPS Kubernetes components with RKE2, you'll need to preload both the runtime and Kubernetes images.

> [!NOTE]
> RKE2 expects preloaded images to have reference tags in the following format: `vX.Y.Z-rke2r1`
> Example Tags:
> - Runtime: `rke2-runtime:v1.33.5-rke2r1`
> - Kubernetes: `rancher/hardened-kubernetes:v1.33.5-rke2r1-build20250910`

#### Step 1: Pull and Prepare Runtime Image

```shell
# Pull the runtime image
docker pull cgr.dev/ORGANIZATION/rke2-runtime:v1.33.5-rke2r1

# Tag it for RKE2
docker tag cgr.dev/ORGANIZATION/rke2-runtime:v1.33.5-rke2r1 rancher/rke2-runtime:v1.33.5-rke2r1

# Save it as a tar
docker save --output /tmp/rke2-runtime.tar rancher/rke2-runtime:v1.33.5-rke2r1
```

#### Step 2: Pull and Prepare Kubernetes Components Image

```shell
# Pull our FIPS K8s components image
docker pull cgr.dev/ORGANIZATION/rancher-hardened-kubernetes-compat-fips:v1.33.5-rke2r1

# Tag it with the upstream format RKE2 expects
docker tag cgr.dev/ORGANIZATION/rancher-hardened-kubernetes-compat-fips:v1.33.5-rke2r1 \
  rancher/hardened-kubernetes:v1.33.5-rke2r1-build20250910

# Save it as a tar
docker save --output /tmp/hardened-kubernetes.tar \
  rancher/hardened-kubernetes:v1.33.5-rke2r1-build20250910
```

#### Step 3: Deploy RKE2 with Preloaded Images

Place both tar files in the RKE2 agent images directory:

```shell
mkdir -p /var/lib/rancher/rke2/agent/images
cp /tmp/rke2-runtime.tar /var/lib/rancher/rke2/agent/images/
cp /tmp/hardened-kubernetes.tar /var/lib/rancher/rke2/agent/images/
```

Start RKE2:

```shell
docker run --rm --privileged \
  --network=host \
  --cgroupns=host \
  -v /var/lib/rancher/rke2:/var/lib/rancher/rke2 \
  cgr.dev/ORGANIZATION/rke2-runtime-airgap:latest server \
  --token=test \
  --runtime-image="rancher/rke2-runtime:v1.33.5-rke2r1"
```

RKE2 will automatically import and use your FIPS-compliant Kubernetes components.

### Docker Testing

For quick validation, you can test individual Kubernetes binaries:

```shell
# Test kube-apiserver
docker run --rm cgr.dev/ORGANIZATION/rancher-hardened-kubernetes-compat-fips:latest \
  kube-apiserver --help
```

## Documentation and Resources

For more information on working with RKE2 and Kubernetes components, please refer to:
- [RKE2 Official Documentation](https://docs.rke2.io/)
- [Rancher Hardened Kubernetes GitHub](https://github.com/rancher/image-build-kubernetes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-bench-fips

# kube-bench-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-bench-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-bench-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### strimzi-kafka

# strimzi-kafka
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/strimzi-kafka` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/strimzi-kafka/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Strimzi provides a way to run an Apache Kafka® cluster on Kubernetes or OpenShift in various deployment configurations.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy [strimzi-kafka](https://strimzi.io) on Kubernetes, follow the [Quick Start](https://strimzi.io/quickstarts/) guide or, for more advanced configuration, the [Deploying and Upgrading](https://strimzi.io/docs/operators/latest/deploying) guide.

For additional configuration of the operator see the [official Helm chart](https://artifacthub.io/packages/helm/strimzi/strimzi-kafka-operator).

First, deploy the Strimzi Kafka Operator using the Helm chart:

```shell
helm install strimzi-cluster-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator
```

> [NOTE]
> You can update the `kafka`, `kafkaConnect`, `kafkaMirrorMaker`, `kafkaExporter`, `kafkaMirrorMaker2`, and `cruiseControl` in the _values_ to use the Chainguard's `strimzi-kafka` image. Please see the Helm _values_ for more information.

> [!IMPORTANT]
> You may need to export additional environment variables for the operator to use Chainguard's image. For more information, see the [Strimzi documentation](https://github.com/strimzi/strimzi-kafka-operator/blob/0.43.0/documentation/modules/con-common-configuration-properties.adoc#image).

After operator is ready, deploy the Kafka cluster using the `Kafka` custom resource (CR):

```shell
cat <<YAML | kubectl apply -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: dual-role
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 1
  roles:
    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 1Gi
        deleteClaim: false
        kraftMetadata: shared
---

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  annotations:
    strimzi.io/node-pools: enabled
    strimzi.io/kraft: enabled
spec:
  kafka:
    version: 3.8.0
    image: cgr.dev/chainguard/strimzi-kafka:latest
    metadataVersion: 3.8-IV0
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      default.replication.factor: 1
      min.insync.replicas: 1
  entityOperator:
    topicOperator: {}
    userOperator: {}
```

Strimzi Kafka should now be up and running!

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-driver-nfs

# kubernetes-csi-driver-nfs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-driver-nfs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-driver-nfs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access an NFS server running on a Linux node.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's kubernetes-csi-driver-nfs Image is comparable to the official `nfsplugin` Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

## Getting started

### Set up an NFS server

If you already have an [NFS server setup](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-server-using-block-storage), you can skip this step. 

If you don't have an existing NFS server setup, you can use the following YAML to get a minimal nfs-server setup up and running. Note that this is **not** a production setup, and is just meant to test the Chainguard image:

```
apiVersion: v1
kind: Service
metadata:
  name: nfs-server
  namespace: default
spec:
  ports:
    - name: nfs
      port: 2049
      protocol: TCP
    - name: rpcbind-tcp
      port: 111
      protocol: TCP
    - name: rpcbind-udp
      port: 111
      protocol: UDP
    - name: mountd-tcp
      port: 20048
      protocol: TCP
    - name: mountd-udp
      port: 20048
      protocol: UDP
  selector:
    app: nfs-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-server
  template:
    metadata:
      labels:
        app: nfs-server
    spec:
      containers:
        - name: nfs-server
          image: itsthenetwork/nfs-server-alpine:latest
          securityContext:
            privileged: true
          ports:
            - name: nfs
              containerPort: 2049
            - name: rpcbind
              containerPort: 111
            - name: mountd
              containerPort: 20048
          env:
            - name: SHARED_DIRECTORY
              value: "/exports"
          volumeMounts:
            - name: nfs-data
              mountPath: "/exports"
      volumes:
        - name: nfs-data
          hostPath:
            path: /mnt/nfs-share
            type: DirectoryOrCreate
```

This YAML will set up a server to expose the other server and deployment that run the server pod. 

### Install csi-driver-nfs with Helm

In this section you will use the Helm chart available from the [NFS CSI driver for Kubernetes GitHub repository](https://github.com/kubernetes-csi/csi-driver-nfs/tree/master/charts). This will enable Kubernetes to handle NFS volumes:

```
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system \
--set image.nfs.repository=cgr.dev/ORGANIZATION/kubernetes-csi-driver-nfs \
--set image.nfs.tag=latest
```

### Usage

Say you want to tell Kubernetes how to provision storage using NFS. To do this, you'll first need to retrieve the NFS server's `clusterIP`: 

```
NFS_SERVER_IP=$(kubectl get svc nfs-server -o jsonpath='{.spec.clusterIP}')
```

Next, you would create a storage class that tells Kubernetes to use the NFS server for storage:

```
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: $NFS_SERVER_IP
  share: /
mountOptions:
  - nolock
  - vers=4
reclaimPolicy: Retain
volumeBindingMode: Immediate
```

Following that, create a [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) (PVC) that will request storage from the storage class:

```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-csi
```

To test that this setup will work, create a pod that uses the PVC:

```
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pvc-test
  namespace: default
spec:
  containers:
    - name: nfs-test
      image: cgr.dev/chainguard/wolfi-base:latest
      command: ["sh", "-c", "sleep infinity"]
      volumeMounts:
        - mountPath: "/mnt/nfs"
          name: nfs-storage
  volumes:
    - name: nfs-storage
      persistentVolumeClaim:
        claimName: nfs-pvc
```

Finally, check whether the pod was created and in a `Ready` state:

```
kubectl wait --for=condition=Ready pod/nfs-pvc-test --timeout=120s
```

This will confirm the csi-driver was able to provision a persistent volume for the pod and that the csi-driver is working as expected.

## Documentation and Resources

- [Upstream Helm charts](https://github.com/kubernetes-csi/csi-driver-nfs/tree/master/charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k6-operator

# k6-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k6-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k6-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes operator for running distributed k6 performance tests

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `k6-operator` image is designed to be a drop-in replacement for the upstream [`grafana/k6-operator`](https://github.com/grafana/k6-operator) image, with the following characteristics:

* This image uses three components available via tags:
  * `latest` or `controller-v*` - The k6-operator controller
  * `latest-starter` or `starter-v*` - The test initializer/starter pod
  * `latest-runner` or `runner-v*` - The k6 test runner pod
* All components are minimal, distroless images with low-to-zero CVEs
* For FIPS-compliant environments, see [`k6-operator-fips`](https://images.chainguard.dev/directory/image/k6-operator-fips/overview).

## Getting Started

### Helm Installation

Add the Grafana Helm repository and install the k6 Operator:

```sh
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install k6-operator grafana/k6-operator \
  --set image.repository=cgr.dev/ORGANIZATION/k6-operator \
  --set image.tag=latest
```

Be sure to replace `ORGANIZATION` with your organization's name in the Chainguard Registry.

Then create a `TestRun` resource using the Chainguard runner and starter images:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
  name: k6-sample
spec:
  parallelism: 2
  script:
    configMap:
      name: k6-test
      file: test-script.js
  runner:
    image: cgr.dev/ORGANIZATION/k6-operator:latest-runner
  starter:
    image: cgr.dev/ORGANIZATION/k6-operator:latest-starter
EOF
```

## Configuration

You can configure default runner and starter images at the Helm chart level to avoid specifying them in every TestRun:

```sh
helm install k6-operator grafana/k6-operator \
  --set image.repository=cgr.dev/ORGANIZATION/k6-operator \
  --set image.tag=latest \
  --set customImages.runner=cgr.dev/ORGANIZATION/k6-operator:latest-runner \
  --set customImages.starter=cgr.dev/ORGANIZATION/k6-operator:latest-starter
```

This configuration ensures all TestRuns use Chainguard images by default unless explicitly overridden in the TestRun specification.

For advanced configuration options including resource limits, parallelism settings, and test execution parameters, refer to the [official k6 Operator documentation](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/install-k6-operator/).

## Documentation and Resources

- [Run k6 scripts with TestRun CRD](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/)
- [Running k6](https://grafana.com/docs/k6/latest/get-started/running-k6/)
- [Using k6](https://grafana.com/docs/k6/latest/using-k6/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgbouncer-fips

# pgbouncer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgbouncer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgbouncer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tofu-controller

# tofu-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tofu-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tofu-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A GitOps OpenTofu and Terraform controller for Flux

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`tofu-controller` is composed of multiple images:
- `cgr.dev/ORGANIZATION/tofu-controller:latest`
- `cgr.dev/ORGANIZATION/tofu-controller-runner:latest`

The container images are comparable to the official `v16.0.0-rc.x` ***pre-release*** version of [tofu-controller](https://github.com/flux-iac/tofu-controller/pkgs/container/tofu-controller/338509733?tag=latest) and [tf-runner](https://github.com/flux-iac/tf-runner-images/pkgs/container/tf-runner/338515834?tag=latest) images.

## Getting Started
To deploy `tofu-controller`, you can follow the steps below:

#### Prerequisites

* `helm`
* `flux v2.0+`

> [!NOTE]
> Before using `tofu-controller`, you have to install `Flux v2.0+`
> > Flux and it's related CRDs were deployed via `kubectl` through the official install manifests: [Flux Releases](https://github.com/fluxcd/flux2/releases)
> All example resources are deployed into the `flux-system` namespace.
> For more detail about the configurations options you can refer to the official [Flux configuration documentation](https://fluxcd.io/flux/installation/configuration/).

#### Install Flux
1. Install flux operator and related CRDs via kubectl
```shell
kubectl apply -f https://github.com/fluxcd/flux2/releases/latest/download/install.yaml
```

2. Verify CRDs have been established
```shell
kubectl wait --for=condition=Established crd --all -n flux-system --timeout=60s
```

3. Verify all flux related pods are ready
```shell
kubectl wait --for=condition=ready -n flux-system pod -l app=helm-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=image-automation-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=image-reflector-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=kustomize-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=notification-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=source-controller --timeout=30s
```

### Install tofu-controller via Helm using `values.yaml`
1. Create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
# -- Controller-specific configurations
image:
  # -- Controller image repository
  repository: cgr.dev/ORGANIZATION/tofu-controller
  # -- Controller image pull policy
  pullPolicy: IfNotPresent
  # -- Controller image tag
  tag: "latest"

# -- Runner-specific configurations
runner:
  image:
    # -- Runner image repository
    repository: cgr.dev/ORGANIZATION/tofu-controller-runner
    # -- Controller image pull policy
    pullPolicy: IfNotPresent
    # -- Runner image tag
    tag: "latest"
EOF
```

2. Install the Helm chart for Rancher Fleet using the following command:

```shell
helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet  --values values.yaml
```

3. Verify that the tofu-controller pod is up and running
```shell
kubectl wait --for=condition=ready -n flux-system pod -l app.kubernetes.io/name=tofu-controller --timeout=60s
```

You should now have Chainguard `tofu-controller` with a Chainguard `tf-runner` running in your cluster.

## Documentation and Resources

- [Tofu-Controller Docs](https://flux-iac.github.io/tofu-controller/)
- [Tofu-Controller Helm Chart Docs](https://github.com/flux-iac/tofu-controller/tree/main/charts/tofu-controller)
- [Flux Docs](https://fluxcd.io/flux/get-started/)
- [Flux Operator Docs](https://fluxcd.control-plane.io/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argo-rollouts

# argo-rollouts
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argo-rollouts` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argo-rollouts/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Argo Rollouts is a Kubernetes controller and set of CRDs which provide advanced deployment capabilities such as blue-green, canary, canary analysis, experimentation, and progressive delivery features to Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

You can deploy the `argo-rollouts` container image using Helm:

```
helm repo add argo https://argoproj.github.io/argo-helm
helm install --create-namespace --namespace argo-rollouts argo-rollouts argo/argo-rollouts \
    --set controller.image.registry=cgr.dev \
    --set controller.image.repository="ORGANIZATION/argo-rollouts" \
    --set controller.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-alertmanager-iamguarded-fips

# prometheus-alertmanager-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-alertmanager-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-alertmanager-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Alertmanager handles alerts sent by client applications such as the Prometheus server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-alertmanager-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus Alertmanager IAMGuarded is a security-enhanced variant of Alertmanager designed to be deployed using the Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Alertmanager deployments and is integrated as part of the complete Prometheus monitoring solution.

## Helm Chart Installation

The Alertmanager IAMGuarded image is deployed as part of the Prometheus IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Prometheus server image
server:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Thanos image for long-term storage (when enabled)
server:
  thanos:
    image:
      registry: myregistry.example.com
      repository: mirrored/thanos-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag

# Alertmanager image for alert management
alertmanager:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-alertmanager-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/prometheus:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Alertmanager IAMGuarded installation using standard Alertmanager verification methods. The deployment functions as a standard Alertmanager instance, so all typical Alertmanager validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Prometheus IAMGuarded chart (which includes Alertmanager) provides security-minded defaults while acknowledging the cluster-specific nature of both Prometheus, Alertmanager, and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Alertmanager Configuration

When using the Kube-Prometheus chart, you can override the Alertmanager image under the `alertmanager` section in your `values.yaml`:

```yaml
alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-aws-fips

# velero-plugin-for-aws-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-aws-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-aws-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apm-server

# apm-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apm-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apm-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elastic APM is an application performance monitoring system built on the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/elastic/apm-server). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To start the Chainguard `apm-server` image, simply start the container - such as:

```shell
docker run --rm cgr.dev/ORGANIZATION/apm-server:latest version
apm-server version 8.17.1 (linux/amd64) [cff9e464471f4e641164cb38215a18e899784b37 2025-01-10 16:05:01 +0000 UTC (modified)]
```

APM server requires configuration to be able to communicate with other services, such as Elasticsearch and Kibana.
These can be passed via command line, as well as via configuration file.

For example to pass details via command line:

```
docker run -p 8200:8200 cgr.dev/ORGANIZATION/apm-server:latest \
  -E output.elasticsearch.hosts=elasticsearch:9200 \
  -E output.elasticsearch.username=$ELASTIC_USER \
  -E output.elasticsearch.password=$ELASTIC_PASSWORD \
  -E apm-server.host=:8200 \
  -E apm-server.kibana.host="kibana:5601" \
```

After which is should be possible to communicate with `apm-server` and check its status by checking `http://localhost:8200` URL.

A sample answer for a working APM server should be:

```
{
  "build_date": "2025-01-30T22:07:00Z",
  "build_sha": "cff9e464471f4e641164cb38215a18e899784b37",
  "publish_ready": true,
  "version": "8.17.1"
}
```

## Run Chainguard image with Elastic Cloud on Kubernetes (ECK)

This image can be run as part of Elastic Cloud on Kubernetes (ECK) deployments of Elasticsearch and Kibana.

To get started, add the Helm repository - such as:

```shell
helm repo add elastic https://helm.elastic.co
helm repo update
```

Next, install the `eck-operator` - such as:

```shell
helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace
```

Then create an instance of Elasticsearch and Kibana 

```shell
kubectl apply -f - <<EOF
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: VERSION
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: VERSION
  count: 1
  elasticsearchRef:
    name: quickstart
EOF
```

You will need to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry. Addiitionally, be sure to replace the `VERSION` placeholder with the version of Elasticsearch and Kibana - such as `8.17.1`.

Next, deploy APM server, specifying the image in its `spec` - such as:

```shell
kubectl apply -f - <<EOF
apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
  name: apm-server-quickstart
  namespace: default
spec:
  version: VERSION
  count: 1
  image: cgr.dev/ORGANIZATION/apm-server:latest
  elasticsearchRef:
    name: quickstart
  kibanaRef:
    name: quickstart
```

The ECK operator will set up the APM server and configure it to communicate with Elasticsearch and Kibana.

## Documentation and Resources
Refer to upstream [Get started with APM documentation](https://www.elastic.co/guide/en/observability/current/apm-getting-started-apm-server.html) to learn more about usage of APM Server and this image.

Please refer to [Elastic Cloud on Kubernetes (ECK) documentation](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html) for more details on how to set up and operate it.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-corretto-jdk-fips

# amazon-corretto-jdk-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-corretto-jdk-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-corretto-jdk-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Amazon Corretto is a no-cost, multi-platform, production-ready distribution of corresponding version of OpenJDK

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `amazon-corretto-jdk-fips` image is a production-ready distribution of OpenJDK provided by Amazon Corretto. This image is part of the Chainguard Containers collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production. `amazon-corretto-jdk-fips` is comparable to the upstream [corretto](https://hub.docker.com/_/amazoncorretto) image, with the following differences:

* Like all other Chainguard Containers, `amazon-corretto-jdk-fips` features a stripped down, minimal design
* This base image comes with apk and BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs
* It does not run as the root user

Most importantly, the `amazon-corretto-jdk-fips` image contains the OpenSSL FIPS Provider Module. For more information, refer to our [FIPS image documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/)

### About FIPS Container Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

To test the `amazon-corretto-jdk-fips` image, start by pulling down the image:

```shell
docker pull cgr.dev/ORGANIZATION/amazon-corretto-jdk-fips:latest
```

Be sure to replace `ORGANIZATION` with your organization's name.

Next, run a container using the image:

```sh
docker run -it --rm cgr.dev/ORGANIZATION/amazon-corretto-jdk-fips:latest java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Finally, run a Java Application, such as this `HelloWorld.java` example:

```java
    public class HelloWorld {
         public static void main(String[] args) {
              System.out.println("Hello, World!");
         }
    }
```

Compile and run the application inside the container:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/amazon-corretto-jdk-fips:latest javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/amazon-corretto-jdk-fips:latest java HelloWorld
```

You will receive the output `Hello, World!`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### socat

# socat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/socat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/socat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's socat image is comparable to the [upstream socat image](https://hub.docker.com/r/alpine/socat). Switching to the Chainguard image should not require any changes to your existing setup. 

## Usage

### TCP Port Forwarding

Forward traffic to an nginx container:

```bash
docker network create socat-test

docker run --net=socat-test -d --name nginx cgr.dev/chainguard/nginx:latest

docker run --net=socat-test -d --name forwarder \
  cgr.dev/ORGANIZATION/socat:latest \
  TCP-LISTEN:8080,fork TCP-CONNECT:nginx:8080

docker run --net=socat-test --rm cgr.dev/chainguard/curl:latest http://forwarder:8080
```

### Echo Server

Create a simple TCP echo server:

```bash
docker run --rm -p 1234:1234 cgr.dev/ORGANIZATION/socat:latest \
  TCP-LISTEN:1234,fork EXEC:cat
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-node-driver-registrar-fips

# kubernetes-csi-node-driver-registrar-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-node-driver-registrar-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-node-driver-registrar-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### debezium-connect

# debezium-connect
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/debezium-connect` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/debezium-connect/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kafka Connect image with all Debezium connectors, and part of the Debezium platform

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Debezium Connect Image is comparable to the [official debezium/connect container image](https://quay.io/repository/debezium/connect). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager. Unlike many other Chainguard images, though, the Debezium Connect image does include a shell, allowing you to manage databases interactively.

## Getting Started

To deploy Chainguard's Debezium Connect Image with Docker, start by setting up ZooKeeper using the `debezium/zookeeper` image:

```shell
docker container run --name zookeeper \
  -d \
  -p 2181:2181 \
  -p 2888:2888 \
  -p 3888:3888 \
  debezium/zookeeper:3.0.0.Final
```

Next, run Kafka using the `debezium/kafka` image:

```shell
docker container run --name kafka \
  -d \
  -p 9092:9092 \
  -e ADVERTISED_HOST_NAME=$(docker-machine ip) \
  --link zookeeper:zookeeper \
  debezium/kafka:3.0.0.Final
```

Following that, deploy Chainguard's Debezium Connect image:

```shell
docker container run -it --name connect \
  -p 8083:8083 \
  -e GROUP_ID=1 \
  -e CONFIG_STORAGE_TOPIC=my-connect-configs \
  -e OFFSET_STORAGE_TOPIC=my-connect-offsets \
  -e ADVERTISED_HOST_NAME=$(docker-machine ip) \
  --link zookeeper:zookeeper \
  --link kafka:kafka \
  cgr.dev/ORGANIZATION/debezium-connect:latest
```

## Documentation and Resources

- [Official Tutorials](https://debezium.io/documentation/reference/3.0/tutorial.html)
- [Official Examples](https://github.com/debezium/debezium-examples/tree/main/tutorial#debezium-tutorial)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6338

# request-6338
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6338` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6338/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard's `static` image, without `glibc-locale-posix`

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### blob-csi

# blob-csi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/blob-csi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/blob-csi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access Azure Storage via azure-storage-fuse & NFSv3.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is fully comparable to the official [blob-csi](https://oci.dag.dev/?image=mcr.microsoft.com%2Foss%2Fkubernetes-csi%2Fblob-csi%3Av1.26.2) image available from the Microsoft Artifact Registry.

## Getting Started
### Install via Helm
You can deploy the blob-csi-driver using the [official blob-csi-driver Helm chart](https://github.com/kubernetes-sigs/blob-csi-driver/tree/master/charts#readme).

First, create a `values.yaml` file to configure the image repository:

```yaml
image:
  blob:
    repository: cgr.dev/ORGANIZATION/blob-csi
    tag: latest
```

Add the `blob-csi-driver` chart:

```bash
helm repo add blob-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/blob-csi-driver/master/charts
helm install blob-csi-driver blob-csi-driver/blob-csi-driver  --values values.yaml
NAME: blob-csi-driver
LAST DEPLOYED: <DATE>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Azure Blob Storage CSI driver is getting deployed to your cluster.

To check Azure Blob Storage CSI driver pods status, please run:

  kubectl --namespace=default get pods --selector="app.kubernetes.io/name=blob-csi-driver" --watch
```

## Documentation and Resources
* [blob-csi GitHub repository](https://github.com/kubernetes-sigs/blob-csi-driver).
* [Azure Documentation: Use Azure Blob Storage CSI Driver](https://learn.microsoft.com/en-us/azure/aks/azure-blob-csi?tabs=NFS)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### powershell

# powershell
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/powershell` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/powershell/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi image with Powershell

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### harbor-exporter-fips

# harbor-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/harbor-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/harbor-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolf-based image for Harbor Exporter - application for monitoring harbor deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running harbor exporter. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's harbor-exporter image maintains functional parity with the [upstream image](https://hub.docker.com/r/goharbor/harbor-exporter/tags).

### FIPS Support

The `harbor-exporter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Kubernetes

To deploy harbor exporter on Kubernetes, you can use the Helm chart provided by goharbor. Add Helm repository:

```shell
helm repo add harbor https://helm.goharbor.io
helm repo update
```

Override the default image repository and tag in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
exporter:
  image:
    repository: cgr.dev/ORGANIZATION/harbor-exporter-fips
    tag: latest
EOF
```

Then, install the charts with the following command:

```shell
helm install harbor harbor -f values.yaml --wait
```

## Documentation and Resources

- [Harbor Helm Chart](https://github.com/goharbor/harbor-helm/tree/main)
- [Harbor documentation](https://goharbor.io/docs/2.2.0/administration/metrics/)
- [Harbor GitHub](https://github.com/goharbor/harbor/tree/main)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### haproxy

# haproxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/haproxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/haproxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal [haproxy](https://www.haproxy.org/) base image rebuilt every night from source.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s HAProxy container image is a minimal image that comes in three variants:
- a `-slim` version that only contains the `haproxy` binary,
- a regular version that contains a `docker-entrypoint.sh` script that is compatible with the external `docker-library/haproxy` image for use with Helm charts or established Docker based deployments. The version comes with extended capability which allows it to listen on system ports (<1024).
- there is also another version `-nocaps`, which is same as regular version, but is without extended capability.

## Getting Started

Similar to the `docker-library/haproxy` container image, this image does not come with any default configuration.

Let say you have a `haproxy.cfg` config file in the current working directory. To test that configuration file, you can run the following command:

```shell
docker run -it --rm -v "$(pwd):/etc/haproxy" --name haproxy-syntax-check cgr.dev/ORGANIZATION/haproxy haproxy -c -f /etc/haproxy/haproxy.cfg
```

In order for the container to work, you need to mount your custom `haproxy.cfg` file in the container. The following example runs HAProxy with a custom configuration file:

```
docker run -it --rm -v "$(pwd):/etc/haproxy" cgr.dev/ORGANIZATION/haproxy haproxy -f /etc/haproxy/haproxy.cfg
```

### Helm install

Helm charts with `securityContexts` that drops `[ "ALL" ]` capabilities should use `-nocaps` image.
The regular version of the image needs extended capability, and needs below modifications in `securityContexts`, to add `NET_ADMIN` capabilities.

For example, in the `ha-redis` chart used by `argocd`, the `values.yaml` becomes:

```yaml
# values.yaml
haproxy:
  enabled: true
  containerSecurityContext:
    capabilities:
      add:
        - NET_BIND_SERVICE
```

### Note on adding users

By default, the Chainguard HAProxy container image runs as the `haproxy` user and group, with a UID and GID of `65532`. You could represent this in an `haproxy.cfg` file as follows:

```
global
  user  haproxy
  group haproxy
```

In the Kubernetes security context, this information might look like this:

```
securityContext:
  runAsUser: 65532
  runAsGroup: 65532
```

If you add a user, make sure that you use the correct matching user in your `haproxy.cfg` file. If the user listed in your `haproxy.cfg` file doesn't match what's in the Kubernetes security context, it will result in errors. 

## Documentation and Resources

Please refer to [the HAProxy documentation](https://docs.haproxy.org/) for more information on configuring HAProxy for your needs.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-prometheus-exporter-iamguarded

# nginx-prometheus-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-prometheus-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-prometheus-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nginx prometheus exporter

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

NGINX Prometheus Exporter IAMGuarded is a security-enhanced variant of NGINX Prometheus Exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard NGINX Prometheus Exporter deployments.

## Helm Chart Installation

The NGINX Prometheus Exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-prometheus-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-prometheus-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-prometheus-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main NGINX Prometheus Exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/nginx-prometheus-exporter-iamguarded
  digest: sha256:... # Use specific digest instead of tag

```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx-exporter:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your NGINX Prometheus Exporter IAMGuarded installation using standard NGINX Prometheus Exporter verification methods. The deployment functions as a standard NGINX Prometheus Exporter instance, so all typical NGINX Prometheus Exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### datadog-operator-fips

# datadog-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/datadog-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/datadog-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for Datadog Resources

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `datadog-operator-fips` image is meant to serve as a drop-in replacement for the [official datadog-operator image](https://gcr.io/datadoghq/operator). Switching to Chainguard `datadog-operator-fips` image should not require any changes to your existing setup. 

The image is completely compatible with [official Helm chart for datadog-operator](https://artifacthub.io/packages/helm/datadog/datadog-operator)

### FIPS Support
The `datadog-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
Deploy using helm by overriding with Chainguard `datadog-operator-fips` image:

Use the following `values.yaml` file to configure the Helm chart.
```yaml
image:
  repository: cgr.dev/ORGANIZATION/datadog-operator-fips
  tag: latest
```

Deploy the Helm chart:
```shell
helm repo add datadog https://helm.datadoghq.com
helm install my-datadog-operator datadog/datadog-operator \
  --values values.yaml
```

For the next steps, refer to the [official getting started documentation](https://docs.datadoghq.com/getting_started/containers/datadog_operator).

## Documentation and Resources
- [Official Documentation](https://docs.datadoghq.com/containers/datadog_operator)
- [Getting Started with the Datadog Operator](https://docs.datadoghq.com/getting_started/containers/datadog_operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-logstash-exporter

# prometheus-logstash-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-logstash-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-logstash-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for Logstash written in Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trust-manager-fips

# trust-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trust-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trust-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redpanda

# redpanda
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redpanda` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redpanda/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Redpanda is a Kafka-compatible streaming data platform with no JVM dependencies.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running redpanda. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's redpanda image maintains functional parity with the [upstream image](https://hub.docker.com/r/redpandadata/redpanda/tags).

## Getting Started

### Docker

Simply run the image with the following command:

```shell
docker container run --pull always --rm cgr.dev/ORGANIZATION/redpanda:latest
```
This deploys a single node redpanda cluster that can be mapped to a port to interact with the new cluster either using the API or the CLI tool `rpk`
### Kubernetes

To deploy Redpanda on Kubernetes, you can use the Helm chart provided by Redpanda-data. To setup both monitoring and TLS certificate management, the prometheus-operator and cert-manager helm charts are also needed. Add Helm repository:

```shell
helm repo add redpanda https://charts.redpanda.com
helm repo add jetstack https://charts.jetstack.io
helm repo add prometheus https://prometheus-community.github.io/helm-charts
helm repo update
```

Override the default image repository and tag in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/redpanda
  tag: latest
EOF
```

Then, install the charts with the following command:

```shell
helm install prometheus kube-prometheus-stack --wait
helm install cert-manager cert-manager --wait
helm install redpanda redpanda/redapanda -f values.yaml --wait
```

## Documentation and Resources
- [Redpanda Helm Chart](https://github.com/redpanda-data/helm-charts)
- [Redpanda documentation](https://docs.redpanda.com/)
- [Redpanda GitHub](https://github.com/redpanda-data/redpanda)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-node-termination-handler

# aws-node-termination-handler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-node-termination-handler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-node-termination-handler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Gracefully handle EC2 instance shutdown within Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the official [aws-node-termination-handler](https://gallery.ecr.aws/aws-ec2/aws-node-termination-handler) image. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install Chainguard's aws-node-termination-handler image on your Kubernetes cluster, you can use the official image's [Helm chart](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler).

> **NOTE**:  AWS Node Termination Handler Helm chart is now deprecated under https://aws.github.io/eks-charts. 

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/aws-node-termination-handler
  tag: latest
```

You can also invoke the following command to install aws-node-termination-handler in your cluster.

```shell
git clone https://github.com/aws/aws-node-termination-handler
cd aws-node-termination-handler
helm install aws-node-termination-handler \
    --wait --timeout=5m \
    --namespace kube-system \
    -f values.yaml \
    ./config/helm/aws-node-termination-handler
```

## Documentation and Resources
- [Official GitHub repository](https://github.com/aws/aws-node-termination-handler/)
- (Blog) [Automate deployment of Node Termination Handler in Amazon EKS by using a CI/CD pipeline](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### static

# static
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/static` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/static/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Base images with the minimum contents needed to run static binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Chainguard's static Image is meant to be used as a base image only and not intended to be run directly.

It can be used to host completely static binaries, such as those generated by `gcc`, `rust`, or `go`.

If you need images with the C standard library included, check out Chainguard's [glibc-dynamic](https://github.com/chainguard-images/images/tree/main/images/glibc-dynamic) Image.

This Image has a single user `nonroot` with uid `65532`, belonging to gid `65532`.

### Versioning

The static image is not versioned, since there's hardly any software in it that has a useful version. Most updates to the image are due to routine rebuilds of the packages included in the image, and don't constitute any functional change.

In general it should be safe to rely on the `:latest` or `:latest-glibc` tag, but you may also want to pin the image reference by digest and use a tool like [digestabot](https://github.com/chainguard-dev/digestabot) to automate image digest updates.

### Rust Dockerfile Example

This section outlines how to build a Rust static binary with Chainguard's static Image. First, create a Dockerfile named `Dockerfile.rust` with your preferred text editor.

```shell
nano Dockerfile.rust
```

Then add the following instructions to the file, which build a Rust static binary and put it into the static Image:

```Dockerfile
FROM cgr.dev/chainguard/rust as build

RUN echo 'fn main() { println!("Hello Rust users!"); }' > hello.rs
RUN rustc -C target-feature=+crt-static hello.rs

FROM cgr.dev/chainguard/static:latest

COPY --from=build /work/hello /hello
CMD ["/hello"]
```

Save and close the file. To build the binary, run the following command:

```shell
docker build -t rusty-cgr --file Dockerfile.rust .
```

This command tags the binary with `rusty-cgr`. You can run this newly-built Image with the following command:

```shell
docker run rusty-cgr
```
```
Hello Rust users!
```

If you inspect this image, you'll find that it has a relatively small size:

```shell
docker images rusty-cgr
```
```
REPOSITORY   TAG   	IMAGE ID   	CREATED      	SIZE
rusty-cgr	latest	dd789eb1c964   35 seconds ago   3.98MB
```

### C Dockerfile Example

This section is similar to the previous one, but instead outlines how to build a C static binary. This time, create a Dockerfile named `Dockerfile.c` with your preferred text editor:

```shell
nano Dockerfile.c
```

Add the following instructions to the file:

```Dockerfile
# syntax=docker/dockerfile:1.4
FROM cgr.dev/chainguard/gcc-glibc as build

COPY <<EOF /hello.c
#include <stdio.h>
int main() { printf("Hello C users!"); }
EOF
RUN cc -static /hello.c -o /hello

FROM cgr.dev/chainguard/static:latest

COPY --from=build /hello /hello
CMD ["/hello"]
```

After saving and closing the Dockerfile, you can build the binary:

```shell
docker build -t c-cgr -f Dockerfile.c .
```

Then run it by referencing the tag `c-cgr`:

```shell
docker run c-cgr
```
```
Hello C users!
```

Inspect this newly-built image as well.

```shell
docker images c-cgr
```
```
REPOSITORY   TAG   	IMAGE ID   	CREATED      	SIZE
c-cgr    	latest	fc18c6e71f95   33 seconds ago   3.36MB
```

This C static binary is even smaller than the Rust one built in the previous section.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-provider-gcp

# secrets-store-csi-driver-provider-gcp
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-provider-gcp` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-provider-gcp/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the Kubernetes Secrets Store CSI Driver GCP Plugin.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Secrets Store CSI Driver GCP Plugin

The Chainguard Secrets Store CSI Driver GCP Plugin image contains the `secrets-store-csi-driver-provider-gcp` binary and required utilities.

```shell
$ docker run cgr.dev/chainguard/secrets-store-csi-driver-provider-gcp
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### oauth2-proxy

# oauth2-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/oauth2-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/oauth2-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/) is a reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

This section provides a brief overview of how you can use Chainguard's `oauth2-proxy` Image to set up a proxy that can intercept a call to a specified endpoint. A complete end-to-end test would require a GitHub account (or an account with another OIDC Auth provider), a trusted domain, and an OAuth application; this example will be useful to test that the image works but it will not be able to verify authentication or properly redirect users.

Run the following command.

```shell
docker run --detach --name oidc-test -p 8080:8080 cgr.dev/chainguard/oauth2-proxy:latest \
  --cookie-secure=false \
  --cookie-secret=RYC2VBUYWQ6aenOkoN6jELQsrjtmwb23a7NdtrLI0ao= \
  --upstream=file:///dev/null \
  --http-address=0.0.0.0:8080 \
  --redirect-url=http://localhost:8080/oauth2/callback \
  --client-id=sample-id \
  --client-secret=sample-secret \
  --email-domain="*" \
  --provider=github \
  --scope=user:email
```

This `docker` command runs the `oauth2-proxy` Image while passing a number of configuration options to it. Most of these are sample values intended to get a working example proxy up and running. One particularly important option you should be aware of is the `--redirect-url`, which points to the OAuth application's callback URL. In order to set up an example locally, this example uses `http://localhost:8080` here.

Note that you can alternatively define these options in a configuration file or through environment variables. You can check out the [OAuth2 Proxy Overview](https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview) for more details on these options.

After running this command, navigate to [`http://localhost:8080`](http://localhost:8080) in your web browser. There, you'll be presented with the OAuth2 Proxy sign-in screen.

Please refer to [the official documentation](https://oauth2-proxy.github.io/oauth2-proxy/) for more information on how to work with OAuth2 Proxy.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached

# memcached
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Memcached](https://memcached.org/) is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `memcached` container image is comparable to the [memcached image](https://hub.docker.com/_/memcached) with these differences:

- Runs as user `memcached` (uid `65532`) instead of `memcache` (uid `11211`)

## Getting Started

The default memcached port is `11211`. To run with Docker using default configuration:

```sh
docker run -p 11211:11211 --rm cgr.dev/ORGANIZATION/memcached:latest
```

Test the connection:

```sh
echo -e 'stats\nquit' | nc localhost 11211
```

## Documentation and Resources

- [Memcached Documentation](https://memcached.org/)
- [Memcached GitHub Repository](https://github.com/memcached/memcached)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### adoptium-jdk

# adoptium-jdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/adoptium-jdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/adoptium-jdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based Adoptium Java JDK image using [Adoptium OpenJDK](https://adoptium.net).  Used for compiling Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's Adoptium JDK image is built directly from the [Adoptium Project](https://adoptium.net/). The Chainguard JDK image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The JDK is the standard development system for a Java application. It is used for compiling and packaging Java applications, which are then run on a JRE.

### Compiling a Minimal Java Application Example

This section outlines how you can build a Java application with the Chainguard Adoptium JDK Image.

Start by creating a sample Java class named `HelloWolfi`:

```sh
cat >HelloWolfi.java <<EOL
class HelloWolfi
{
    public static void main(String args[])
    {
        System.out.println("Hello Wolfi users!");
    }
}
EOL
```

Then create a multistage Dockerfile, adding the Java class you just created:

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/chainguard/jdk
COPY HelloWolfi.java /home/build/
RUN javac HelloWolfi.java
FROM cgr.dev/chainguard/jre
COPY --from=0 /home/build/HelloWolfi.class /app/
CMD ["HelloWolfi"]
EOL
```

Following that, you can build the image:

```sh
docker build -t my-java-app .
```

Note that this example tags the image with `my-java-app`. You can now run the image by referencing this tag, as in the following command:

```sh
docker run my-java-app
```

```
Hello Wolfi users!
```

### Using the Chainguard Adoptium JDK image in a Jenkins Pipeline

Using a Chainguard container image as part of a CI/CD system like Jenkins might also be a useful option. With the Jenkins Docker agent, you can define multiple steps that use different Chainguard Containers. The following is an example using the Chainguard JDK image as part of a Jenkins pipeline:

```
pipeline {
    agent {
        docker { image 'cgr.dev/chainguard/adoptium-jdk' }
    }
    stages {
        stage('Test') {
            steps {
                # Use javac, jdeps, jlink, ...
                sh 'javac -version'
            }
        }
    }
}
```

For a full reference on using various images in a Jenkins pipeline, please refer to the [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/docker/).

### Using the Chainguard Adoptium JDK to create a custom JRE

A less common, but powerful, use case for the Adoptium JDK image is creating an optimized custom JRE for your Java application. This involves using `jdeps` to produce the information about the Java modules being used and subsequently using `jlink` to analyze your application to eliminate all module code not being used by your application. This can create a drastically smaller JRE for a particular application.

Keep in mind that a JRE produced this way is a fit-for-purpose JRE, and is not broadly usable.

For reference, here are two additional articles describing the use of `jlink` to create optimized application images:

* [Creating your own runtime using jlink](https://adoptium.net/en-GB/blog/2021/10/jlink-to-produce-own-runtime/)
* [Creating a Custom JRE for your Java Applications](https://adriankodja.com/creating-a-custom-jre-for-your-java-applications)

## Documentation and Resources

* (Video) [How to Migrate a Java Application to Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
* (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
* (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
* (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s_gateway

# k8s_gateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s_gateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s_gateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A CoreDNS plugin to resolve all types of external Kubernetes resources

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `k8s_gateway` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream k8s_gateway image](https://github.com/k8s-gateway/k8s_gateway/pkgs/container/k8s_gateway/461346086?tag=latest) while maintaining minimal dependencies and enhanced security.

## Getting Started

You can deploy `k8s_gateway` using a Helm chart that installs the necessary Kubernetes resources:

First, add the k8s_gateway Helm repository:

```shell
helm repo add k8s_gateway https://k8s-gateway.github.io/k8s_gateway/
```

Next, create a `values.yaml` file so you can install Chainguard's `k8s_gateway` container image:

```shell
cat > values.yaml << EOF
image:
  registry: cgr.dev
  repository: ORGANIZATION/k8s_gateway
  tag: latest
EOF
```

Then install the k8s_gateway using the `values.yaml` file:

```shell
helm install exdns k8s_gateway/k8s-gateway \
    --namespace default \
    -f values.yaml
```

## Documentation and Resources

* [k8s_gateway GitHub Project](https://github.com/k8s-gateway/k8s_gateway/)
* [k8s_gateway Documentation](https://coredns.io/explugins/k8s_gateway/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vela-core

# vela-core
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vela-core` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vela-core/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

KubeVela is a modern software delivery platform that makes deploying and operating applications across today's hybrid, multi-cloud environments easier, faster and more reliable.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [vela-core](https://hub.docker.com/r/oamdev/vela-core) image. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

You can use this image by setting the image provider on [`kubevela`'s official helm chart](https://kubevela.io/docs/installation/kubernetes/) to this image.

First, create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
image:
  repository: "cgr.dev/ORGANIZATION/vela-core"
  tag: "latest"
EOF
```

Initialize `vela-core` via the helm chart:

```shell
helm repo add kubevela https://kubevela.github.io/charts
helm repo update
helm install --create-namespace -n vela-system kubevela kubevela/vela-core --wait -f values.yaml
```

Then interact with `vela-core` as you would normally with `vela-cli`, as specified on the [kubevela documentation](https://kubevela.io/docs/)

```shell
# https://kubevela.io/docs/cli/vela_install/#go-back-to-cli-commands-homepage
vela install

# https://kubevela.io/docs/reference/addons/velaux/#install
vela addon enable velaux

# https://kubevela.io/docs/quick-start/
vela env init prod --namespace prod
vela up -f https://kubevela.net/example/applications/first-app.yaml
```

## Documentation and Resources

* [Official Documentation](https://kubevela.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-k8s-events-forwarder

# newrelic-k8s-events-forwarder
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-k8s-events-forwarder` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-k8s-events-forwarder/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-k8s-events-forwarder](https://github.com/newrelic/nri-kubernetes) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `newrelic-k8s-events-forwarder` container image is comparable to [the newrelic k8s-events-forwarder image maintained by Newrelic](https://hub.docker.com/r/newrelic/k8s-events-forwarder). Like most other Chainguard container images, the newrelic-k8s-events-forwarder image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The `newrelic-k8s-events-forwarder` image is drop-in replacement for the upstream `newrelic` `k8s-events-forwarder` image which is a part of `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) chart.

### Helm Installation

Add the New Relic Helm repository and install the nri-bundle with Chainguard images:

```shell
helm repo add newrelic https://helm-charts.newrelic.com
helm repo update
```

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:
> Note that `latest` is used below for brevity. In long term deployments, this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    forwarder:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest      
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## Documentation and Resources

- [New Relic Kubernetes events Documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/understand-use-data/kubernetes-events-integration/)
- [nri-bundle Helm Chart](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle)
- [nri kube-events Helm Chart](https://github.com/newrelic/nri-kube-events/tree/main/charts/nri-kube-events)
- [newrelic infrastructure Helm Chart](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure)
- [GitHub Repository](https://github.com/newrelic/infrastructure-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### op-geth

# op-geth
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/op-geth` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/op-geth/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

op-geth is an Ethereum execution client optimized for the Optimism Layer 2 scaling solution

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running an Optimism Geth node. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's op-geth image maintains functional parity with [the upstream image](https://us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth).

## Getting Started

Start by pulling the image from your registry:

```shell
docker pull cgr.dev/ORGANIZATION/op-geth:latest
```

Then, run an Optimism Geth node with full synchronization and HTTP RPC enabled:

```shell
docker run -it --rm cgr.dev/chainguard/op-geth:latest geth --syncmode full --http --http.addr 0.0.0.0 --http.api eth,net,web3 
```
This will start a Geth node with full synchronization and enable HTTP RPC access.

To view available commands and options, run the following:

```shell
docker run --rm -it cgr.dev/chainguard/op-geth:latest geth --help
```

## Documentation and Resources

Please refer to the official [Getting Started](https://geth.ethereum.org/docs/getting-started) guide for more information. You may also find these resources to be useful:

 - [op-geth Github Repository](https://github.com/ethereum-optimism/op-geth/)
 - [go-ethereum Documentation](https://geth.ethereum.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-iamguarded-fips

# flux-helm-controller-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-helm-controller-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-helm-controller-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

minimal zero CVE flux images

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Flux IAMGuarded is a security-enhanced variant of Flux designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Flux deployments.

## Helm Chart Installation

The Flux IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/flux
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install flux oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
# Helm Controller image
helmController:
  image:
    repository: $ORGANIZATION/flux-helm-controller-iamguarded-fips

# Kustomize Controller image
kustomizeController:
  image:
    repository: $ORGANIZATION/flux-kustomize-controller-iamguarded-fips

# Notification Controller image
notificationController:
  image:
    repository: $ORGANIZATION/flux-notification-controller-iamguarded-fips

# Source Controller image
sourceController:
  image:
    repository: $ORGANIZATION/flux-source-controller-iamguarded-fips

# Image Automation Controller image
imageAutomationController:
  image:
    repository: $ORGANIZATION/flux-image-automation-controller-iamguarded-fips

# Image Reflector Controller image
imageReflectorController:
  image:
    repository: $ORGANIZATION/flux-image-reflector-controller-iamguarded-fips

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    repository: $ORGANIZATION/os-shell-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Helm Controller image
helmController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-helm-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Kustomize Controller image
kustomizeController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-kustomize-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Notification Controller image
notificationController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-notification-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Source Controller image
sourceController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-source-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Image Automation Controller image
imageAutomationController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-image-automation-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Image Reflector Controller image
imageReflectorController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-image-reflector-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install flux oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/flux:2.1.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Flux IAMGuarded installation:

```bash
kubectl get po -n flux-system
```

You should see Flux controller pods running:

```bash
NAME                                           READY   STATUS     RESTARTS    AGE
flux-automation-controller-7f68666bff-j6447    1/1     Running    0           70s
flux-helm-controller-f5f499667-2gz95           1/1     Running    0           70s
flux-kustomize-controller-79dfd8fd4d-gkd2x     1/1     Running    0           70s
flux-notification-controller-b6857989f-psgvg   1/1     Running    0           70s
flux-reflector-controller-fbb74dcc8-dlzpd      1/1     Running    0           70s
flux-source-controller-68cf5d8fdb-fsfps        1/1     Running    0           70s
```

For more information on Flux, including follow-on steps on how to validate the installation, please refer to [Getting started with Flux](https://fluxcd.io/flux/get-started/).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gpu-operator-fips

# gpu-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gpu-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gpu-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The NVIDIA GPU Operator bootstraps, configures, and manages GPUs in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `gpu-operator-fips` Container is comparable to the [gpu-operator image maintained by NVIDIA](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/gpu-operator). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Support
The `gpu-operator-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting started
You can install this image with Helm. First, create a [values file](https://helm.sh/docs/chart_template_guide/values_files/):
```yaml
operator:
    repository: cgr.dev/ORGANIZATION
    image: gpu-operator-fips
    version: latest
```

Then use this file to install the `gpu-operator-fips` container image:

```bash
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm upgrade --install gpu-operator \
    nvidia/gpu-operator \
    -f values.yaml
```

> [!WARNING]
> You'll want to make sure the `gpu-operator` chart is up-to-date and use the latest operator tag that's within the compatibility matrix. Additionally, you need GPU nodes to run the operator as it will schedule Deployments and DaemonSets on nodes with GPUs.

## Documentation and Resources
- [Upstream Documentation](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/index.html)
- [GPU Operator helm chart](https://github.com/NVIDIA/gpu-operator/tree/main/deployments/gpu-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### eks-distro

# eks-distro
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/eks-distro` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/eks-distro/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An open-source distribution of Kubernetes from AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
Amazon EKS Distro (EKS-D) is a Kubernetes distribution based on and used by Amazon Elastic Kubernetes Service (EKS) to create reliable and secure Kubernetes clusters. For more [Information](https://distro.eks.amazonaws.com/)

### Components
This deployment includes the following critical components:
- CoreDNS: A DNS server that integrates with Kubernetes.
- EBS CSI Driver: A Container Storage Interface (CSI) driver for managing AWS Elastic Block Store volumes.
- Kubernetes CSI drivers: External provisioners, resizers, and snapshot controllers to manage storage resources effectively.

## Installation
For installation instructions, visit the [EBS CSI Driver Install Guide](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#deploy-driver).

### 1. Using Helm Chart

To deploy with Helm, you can use the following command. This command overrides default values to use your latest Chainguard images:
```bash
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update

helm upgrade --install aws-ebs-csi-driver \
   --namespace kube-system \
   aws-ebs-csi-driver/aws-ebs-csi-driver \
   --set sidecars.provisioner.image.repository=cgr.dev/ORGANIZATION/kubernetes-csi-external-provisioner \
   --set sidecars.provisioner.image.tag=latest \
   --set sidecars.attacher.image.repository=cgr.dev/ORGANIZATION/kubernetes-csi-external-attacher \
   --set sidecars.attacher.image.tag=latest \
   --set sidecars.resizer.image.repository=cgr.dev/ORGANIZATION/kubernetes-csi-external-resizer \
   --set sidecars.resizer.image.tag=latest \
   --set sidecars.livenessProbe.image.repository=cgr.dev/ORGANIZATION/kubernetes-csi-livenessprobe \
   --set sidecars.livenessProbe.image.tag=latest
```

Refer to the [values.yaml](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/charts/aws-ebs-csi-driver/values.yaml) file for more configuration options.

### 2. Using Amazon EKS/KOPS Clusters

To test the EBS CSI driver functionality and verify its deployment, we need to create and deploy an EKS cluster. Similarly, for testing kube-components, we can create and deploy a KOPS cluster and update the manifests accordingly.

## Using EKS Distro Pause Image with EKS Distro
Using the Chainguard Pause image requires changing the containerd configuration on the EKS nodes. If you've SSH access to the underlying nodes of the cluster, then you can edit the containerd configuration file directly.
If you don't have access to the nodes then you can use a plugin called [kubectl-node-shell](https://github.com/kvaps/kubectl-node-shell)

In containerd configuration, the default `sandbox_image` needs to be replaced with the Chainguard pause image. Use the editor of your choice to replace the default pause image with the Chainguard pause image which is `cgr.dev/ORGANIZATION/eks-distro-kubernetes-pause:latest`.
To replace the default pause image with the Chainguard pause image, you need to edit the containerd config file on the node.
```toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "cgr.dev/ORGANIZATION/eks-distro-kubernetes-pause:latest"
```

After this, restart the containerd service:
```bash
$ sudo systemctl restart containerd
```
Checking the list of containers using the `ctr` command will show the pause container with the Chainguard pause image.
```bash
$ ctr -n k8s.io containers list
```

## Additional Resources
- [EKS-Distro GitHub Repository](https://github.com/aws/eks-distro)
- [Kubernetes Documentation](https://kubernetes.io/docs/home/)
- [AWS EKS Documentation](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### contour-fips

# contour-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/contour-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/contour-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Contour is an ingress controller for Kubernetes that works by deploying the Envoy proxy as a reverse proxy and load balancer. Contour supports dynamic configuration updates out of the box while maintaining a lightweight profile.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `contour-fips` container image is comparable to the [official Contour image](https://github.com/projectcontour/contour/pkgs/container/contour). The Chainguard image runs as a non-root user (65532) and includes only the essential tools and dependencies needed to function, omitting extras like a package manager or shell.

### Envoy dependency
Contour is a Kubernetes ingress controller that deploys Envoy as a reverse proxy and load balancer. The Kubernetes manifest provided in the [Contour quick start guide](https://www.conjur.org/get-started/quick-start/oss-environment) deploys both Contour and Envoy.

If you also require a Chainguard image for Envoy, you can find this in [our image catalog](https://images.chainguard.dev/directory/image/envoy).

### FIPS support

The `contour-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Please refer to the [Contour getting started documentation](https://projectcontour.io/getting-started), for installation steps, which include a Kubernetes manifest.

You'll need to either create your own modified copy of the manifest or, alternatively, use a tool such as Kustomize to replace the images.

Example using Kustomize:

```bash
cat <<EOF >kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- https://projectcontour.io/quickstart/contour.yaml

images:
- name: ghcr.io/projectcontour/contour
  newName: cgr.dev/ORGANIZATION/contour-fips
  newTag: latest
- name: docker.io/envoyproxy/envoy
  newName: cgr.dev/ORGANIZATION/envoy-fips
  newTag: latest
EOF

kubectl apply -k .
```

If you are testing Contour in a local Kubernetes environment, such as`k3d` or `kind`, you may run into port conflict issues. To work around this, you'll need to set alternative hostPorts for envoy.

Here is another example using kustomize:

```bash
cat <<EOF >kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- https://projectcontour.io/quickstart/contour.yaml

images:
- name: ghcr.io/projectcontour/contour
  newName: cgr.dev/ORGANIZATION/contour-fips
  newTag: latest
- name: docker.io/envoyproxy/envoy
  newName: cgr.dev/ORGANIZATION/envoy-fips
  newTag: latest

patches:
- patch: |
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: envoy
      namespace: projectcontour
    spec:
      template:
        spec:
          containers:
          - name: envoy
            ports:
            - containerPort: 8080
              hostPort: 8082
              name: http
              protocol: TCP
            - containerPort: 8443
              hostPort: 8445
              name: https
              protocol: TCP
EOF

kubectl apply -k .
```

Following successful deployment, you should see Contour and Envoy running in the cluster:

```shell
kubectl get po -n projectcontour
```
```
NAME                            READY   STATUS      RESTARTS   AGE
contour-69c98d9c8-v8fl7         1/1     Running     0          8m42s
contour-69c98d9c8-x5s48         1/1     Running     0          8m42s
contour-certgen-v1-30-2-z7lzk   0/1     Completed   0          8m42s
envoy-ql79l                     2/2     Running     0          8m42s
```

## Documentation and Resources

For more information on Contour, including some follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm-chartmuseum-fips

# helm-chartmuseum-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm-chartmuseum-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm-chartmuseum-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4635

# request-4635
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4635` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4635/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Airflow offers a platform to author, schedule, and monitor workflows programmatically. This image is a minimal, slimmed-down version of the official Apache Airflow with only core components. This image comes with pip out of the box for extending the image, but does not guarantee the image will still be FIPS compliant after installing additional components.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's airflow-core image provides minimal set of dependencies and core components of Airflow, intended for use as a base image for other images. Scripts for installing databases have been excluded as they depend on aptitude. Databases provided in Wolfi can still be installed via apk on -dev tagged images by use of a Dockerfile. 

We provide pip out of the box for extending the image, but do not guarantee the image will still be FIPS compliant after installing additional components.

## Getting Started

This image is optimized for size and only contains the core Airflow components. It provides a minimal set of dependencies and is intended for use as a base image for other images.

There are a few [known issues](https://github.com/apache/airflow/discussions/38425#discussioncomment-11754087) using Airflow core as a drop-in replacement within the Airflow Helm chart.

While the official documentation does not provide a clear way to deploy the image, here's an example using a Kubernetes manifest:

```shell
cat <<EOF > airflow-deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: airflow
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: airflow-dags-pv
  namespace: airflow
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "./dags"  # Ensure this path exists on your host
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: airflow-dags-pvc
  namespace: airflow
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: airflow-webserver
  namespace: airflow
spec:
  replicas: 1
  selector:
    matchLabels:
      component: webserver
  template:
    metadata:
      labels:
        component: webserver
    spec:
      volumes:
        - name: airflow-dags
          persistentVolumeClaim:
            claimName: airflow-dags-pvc
        - name: airflow-db
          emptyDir: {}
      initContainers:
        - name: init-db
          image: cgr.dev/ORGANIZATION/request-4635:latest
          command: ["bash", "-c", "airflow db init || airflow upgradedb"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-db
              mountPath: /airflow-db
      containers:
        - name: webserver
          image: cgr.dev/ORGANIZATION/request-4635:latest
          args: ["webserver"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: airflow-dags
              mountPath: /opt/airflow/dags
            - name: airflow-db
              mountPath: /airflow-db
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: airflow-scheduler
  namespace: airflow
spec:
  replicas: 1
  selector:
    matchLabels:
      component: scheduler
  template:
    metadata:
      labels:
        component: scheduler
    spec:
      volumes:
        - name: airflow-dags
          persistentVolumeClaim:
            claimName: airflow-dags-pvc
        - name: airflow-db
          emptyDir: {}
      initContainers:
        - name: init-db
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          command: ["bash", "-c", "airflow db init || airflow upgradedb"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-db
              mountPath: /airflow-db
      containers:
        - name: scheduler
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          args: ["scheduler"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-dags
              mountPath: /opt/airflow/dags
            - name: airflow-db
              mountPath: /airflow-db
---
apiVersion: v1
kind: Service
metadata:
  name: airflow-webserver
  namespace: airflow
spec:
  selector:
    component: webserver
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
EOF
```

After deploying the image, we can experiment with it further by creating DAG files and copying them to Airflow Webserver/Worker Pods.

## Documentation and Resources
You can learn more about Airflow via the [official documentation](https://airflow.apache.org/docs/docker-stack/index.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metaflow-metadata-service

# metaflow-metadata-service
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metaflow-metadata-service` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metaflow-metadata-service/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, wolfi-based image for Metaflow Metadata Service. Metaflow Metadata Service is a backend service for tracking and managing ML workflow metadata.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `metaflow-metadata-service` image is designed as a drop-in replacement for the upstream [netflixoss/metaflow_metadata_service](https://hub.docker.com/r/netflixoss/metaflow_metadata_service) image.

Key differences from the upstream image:

* Virtual environment located at `/usr/share/metaflow-service/venv`
* Services directory at `/usr/share/metaflow-service/services`
* The `goose` database migration tool is included

## Getting Started

### Prerequisites

Metaflow Metadata Service requires a PostgreSQL database. Set up your database and note the connection details.

### Docker

Run the metadata service with environment variables for database configuration:

```bash
docker run -d --name metaflow-metadata \
  -p 8080:8080 \
  -e MF_METADATA_DB_HOST='your-postgres-host' \
  -e MF_METADATA_DB_PORT=5432 \
  -e MF_METADATA_DB_USER='postgres' \
  -e MF_METADATA_DB_PSWD='your-password' \
  -e MF_METADATA_DB_NAME='metaflow' \
  cgr.dev/ORGANIZATION/metaflow-metadata-service:latest
```

Verify the service is running:

```bash
curl http://localhost:8080/ping
# Expected response: pong
```

### Database Migrations

Run database migrations using the included `goose` tool:

```bash
docker run --rm \
  -e MF_METADATA_DB_HOST='your-postgres-host' \
  -e MF_METADATA_DB_PORT=5432 \
  -e MF_METADATA_DB_USER='postgres' \
  -e MF_METADATA_DB_PSWD='your-password' \
  -e MF_METADATA_DB_NAME='metaflow' \
  --entrypoint /usr/share/metaflow-service/venv/bin/python3 \
  cgr.dev/ORGANIZATION/metaflow-metadata-service:latest \
  /usr/share/metaflow-service/run_goose.py --upgrade
```

### Running Different Services

The image includes three services:

**Metadata Service** (default, port 8080):
```bash
docker run -p 8080:8080 cgr.dev/ORGANIZATION/metaflow-metadata-service:latest
```

**Migration Service** (port 8082):
```bash
docker run -p 8082:8082 \
  --entrypoint /usr/share/metaflow-service/venv/bin/migration_service \
  cgr.dev/ORGANIZATION/metaflow-metadata-service:latest
```

**UI Backend Service** (port 8083):
```bash
docker run -p 8083:8083 \
  --entrypoint /usr/share/metaflow-service/venv/bin/ui_backend_service \
  cgr.dev/ORGANIZATION/metaflow-metadata-service:latest
```

## Configuration

### Environment Variables

| Variable | Description | Default |
|----------|-------------|---------|
| `MF_METADATA_DB_HOST` | PostgreSQL host | `localhost` |
| `MF_METADATA_DB_PORT` | PostgreSQL port | `5432` |
| `MF_METADATA_DB_USER` | PostgreSQL user | `postgres` |
| `MF_METADATA_DB_PSWD` | PostgreSQL password | (empty) |
| `MF_METADATA_DB_NAME` | PostgreSQL database name | `metaflow` |

### Configuring Metaflow Client

Point your Metaflow client to use this service:

```bash
export METAFLOW_SERVICE_URL=http://localhost:8080
export METAFLOW_DEFAULT_METADATA=service
python3 your_flow.py run
```

Or configure via `~/.metaflowconfig/config.json`:

```json
{
  "METAFLOW_SERVICE_URL": "http://your-service-host:8080",
  "METAFLOW_DEFAULT_METADATA": "service"
}
```

## Documentation and Resources

- [Metaflow Service GitHub](https://github.com/Netflix/metaflow-service)
- [Metaflow Documentation](https://docs.metaflow.org/)
- [Metaflow GitHub](https://github.com/Netflix/metaflow)
- [Configuring Metaflow](https://docs.outerbounds.com/engineering/operations/configure-metaflow/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-agent

# metrics-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

metrics-agent collects Kubernetes allocation and utilization data

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `metrics-agent` container image is designed to be a drop-in replacement for the upstream [metrics-agent image](https://github.com/cloudability/metrics-agent).

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  name: cgr.dev/ORGANIZATION/metrics-agent
  tag: latest
clusterName: "default"
apiKey: "fake_key"
EOF
```

Add the Helm repository and install:

```shell
helm repo add metrics-agent https://cloudability.github.io/metrics-agent
helm repo update
helm install metrics-agent metrics-agent/metrics-agent -f values.yaml
```

## Documentation and Resources
- [metrics-agenet](https://github.com/cloudability/metrics-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ztunnel

# ztunnel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ztunnel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ztunnel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The ztunnel component of ambient mesh

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the distroless version of the upstream image. This is the image that gets deployed by default when you run `helm install ztunnel istio/ztunnel -n istio-system`.
The upstream project releases two container images, one with a shell and package manager and one without. This image is based on the distroless version of the upstream image.
If you want to use the image with a shell and package manager, you can use the `-dev` variant of this image.

## Getting Started
For getting started, we can use helm to deploy istio in ambient mesh mode.
The details to install istio in ambient mode can be found on [official documentation](https://istio.io/latest/docs/ambient/install/helm/)

When deploying the `ztunnel` helm chart, we need to override the

```bash
helm install ztunnel istio/ztunnel -n istio-system --set hub=cgr.dev/chainguard --set image=ztunnel --set tag=latest
```
If you're using `values.yaml` file, you can add the following lines to override the image:
```yaml
hub: cgr.dev/chainguard
image: ztunnel
tag: latest
```
Before installation, this can also be verified by running the following command:
```bash
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
helm template ztunnel istio/ztunnel -n istio-system -f values.yaml
```

## Documentation and Resources
After installation, we can follow the starting guide of an application which can be found [here](https://istio.io/latest/docs/ambient/getting-started/deploy-sample-app/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### octo-sts

# octo-sts
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/octo-sts` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/octo-sts/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A GitHub App that acts like a Security Token Service (STS) for the Github API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

See the terraform modules in https://github.com/octo-sts/app for more details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argo

# argo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Argo is a collection of tools for Kubernetes that help users to run workflows and manage clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Argo image group is composed of multiple container images:

```
docker pull cgr.dev/ORGANIZATION/argo-exec
docker pull cgr.dev/ORGANIZATION/argo-cli
docker pull cgr.dev/ORGANIZATION/argo-workflowcontroller
docker pull cgr.dev/ORGANIZATION/argo-events
```

These images are comparable to the images used for various Argo components, including [Argo CD](https://argoproj.github.io/cd/), [Argo Workflows](https://argoproj.github.io/workflows/), and [Argo Events](https://argoproj.github.io/argo-events/).

## Getting Started

Argo provides two upstream methods for installing: Helm and raw manifests. The Chainguard container images for Argo are designed to be a drop-in replacement for either method. To use them, replace the appropriate `image:` path with the Chainguard Argo image. 

Chainguard's Argo images can be deployed separately, but are typically deployed together leveraging the [Argo Helm charts](https://github.com/argoproj/argo-helm).

The following is an example [values file](https://helm.sh/docs/chart_template_guide/values_files/) for deploying these images with Helm:

```yaml
images:
  tag: "latest"
controller:
  image:
    # -- Registry to use for the controller
    registry: cgr.dev
    # -- Registry to use for the controller
    repository: ORGANIZATION/argo-workflowcontroller
executor:
  image:
    # -- Registry to use for the Workflow Executors
    registry: cgr.dev
    # -- Repository to use for the Workflow Executors
    repository: ORGANIZATION/argo-exec
server:
  # -- Deploy the Argo Server
  image:
    # -- Registry to use for the server
    registry: cgr.dev
    # -- Repository to use for the server
    repository: ORGANIZATION/argo-cli
```

Assuming this values file is named `argo.yaml`, you could execute the following `helm` commands to install Argo Workflows:

```shell
helm repo add argo https://argoproj.github.io/argo-helm

helm install argo-workflows argo/argo-workflows \
	--namespace argo-workflows \
	--create-namespace \
  -f argo.yaml
```

The following values file will only deploy the Argo Events image:

```yaml
images:
  tag: "latest"
global:
  image:
    # -- Registry to use for the events
    repository: cgr.dev/ORGANIZATION/argo-events
    tag: "latest"
```

Assuming this values file is named `events.yaml`, you could run the following Helm commands to deploy the Argo Events image:

```shell
helm repo add argo https://argoproj.github.io/argo-helm

helm install argo-workflows argo/argo-events \
	--namespace argo-events \
	--create-namespace \
	-f events.yaml
```

> [!NOTE]
> Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### linkerd-extension-init

# linkerd-extension-init
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/linkerd-extension-init` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/linkerd-extension-init/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A utility for initializing Linkerd extension namespaces after installation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard linkerd-extension-init Image is comparable to the `linkerd-extension-init` image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager.

## Getting Started

To get started with Chainguard's linkerd-extension-init Image, you need to [deploy](https://linkerd.io/2-edge/tasks/install/) `linkerd`:

```shell
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/latest/download/standard-install.yaml
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
linkerd check
```

## Deploy with Helm Chart

There are 2 different linkerd Helm Charts that consumes this image:

* [`linkerd-viz`](https://github.com/linkerd/linkerd2/tree/main/viz/charts/linkerd-viz)
* [`linkerd-multicluster`](https://github.com/linkerd/linkerd2/tree/main/multicluster/charts/linkerd-multicluster)

Override `namespaceMetadata` field in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
namespaceMetadata:
  image:
    registry: "cgr.dev/ORGANIZATION"
    name: linkerd-extension-init
    tag: latest
EOF
```

Add the Linkerd Edge Helm repository:

```shell
helm repo add linkerd-edge https://helm.linkerd.io/edge
helm repo update
```

Install the CRDs:

```shell
helm install linkerd-crds linkerd-edge/linkerd-crds \
  -n linkerd \
  --create-namespace
```

Install the one of the Helm Charts:

```shell
helm search repo linkerd
# Let's install the linkerd-viz for example
helm install linkerd-viz linkerd-edge/linkerd-viz \
  -n linkerd-viz \
  --create-namespace \
  -f values.yaml
```

Now ensure that the Pod is `completed` successfully and namespace is labeled with `linkerd.io/extension: viz`:

```shell
kubectl get ns linkerd-viz -L linkerd.io/extension
```

## Documentation and Resources

For more information, please refer to the [`linkered-extension-init` GitHub repository](https://github.com/linkerd/linkerd-extension-init). To install Linkerd with Helm, please refer to the [Installing Linkerd with Helm](https://linkerd.io/2-edge/tasks/install-helm/) documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metallb

# metallb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metallb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metallb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MetalLB](https://metallb.org) provides network load balancers for bare-metal Kubernetes clusters

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Configuring MetalLB for your Kubernetes environment is beyond the scope of this document. It has multiple configuration options depending on the mode that it is configured to use (Layer 2 or BGP). Refer to the [MetalLB Concepts](https://metallb.universe.tf/concepts/) documentation for details on how each mode works.

Their [installation guide](https://metallb.universe.tf/installation/) is a good reference that has numerous examples using Kubernetes manifests, Kustomize manifests, and Helm charts.

Finally, visit the [configuration reference pages](https://metallb.universe.tf/configuration/) for details on how to use MetalLb in each mode with different CNI providers.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pixi

# pixi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pixi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pixi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cross-platform, multi-language package manager and workflow tool built on the foundation of the conda ecosystem.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Pixi Image is comparable to the [Pixi Image from GHCR](https://github.com/prefix-dev/pixi-docker/pkgs/container/pixi). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting started

The quickest way of getting started with this image is by using `docker`:

```shell
docker run --rm -it cgr.dev/ORGANIZATION/pixi:latest
```

You can then run the `pixi` CLI via docker by running `docker run`:
```shell
docker run --rm -it cgr.dev/ORGANIZATION/pixi:latest pixi search numpy
```
```
Using channels: conda-forge

numpy-2.3.2-py314h488ef0c_2 (+ 15 builds)
-----------------------------------------

Name                numpy
Version             2.3.2
Build               py314h488ef0c_2
Size                7776504
License             BSD-3-Clause
Subdir              linux-aarch64
File Name           numpy-2.3.2-py314h488ef0c_2.conda
# ...
```

## Example: HTTP server using external library

The following build demonstrates how a standard HTTP server could be implemented using Chainguard's Pixi development image.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/pixi-http-server && cd $_
```

Next, write a file defining your HTTP server (`main.py`):

```python
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
```

Write a `Dockerfile` to define our image build:
```Dockerfile
FROM localhost:5005/pixi:latest-dev

WORKDIR /srv/http

COPY ./main.py /srv/http/main.py

RUN pixi init
RUN pixi add python flask

CMD [ ".pixi/envs/default/bin/flask", "--app", "main", "run", "--host", "0.0.0.0" ]
```

Build the image, tagging it `pixi-http-server`:

```shell
docker build -t "localhost/pixi-http-server:latest" .
```

Run the image exposing the port defined in the application code:

```sh
docker run -p 5000:5000 localhost/pixi-http-server:latest
```

You should see output similar to the following on the container logs:

```
 * Serving Flask app 'main'
 * Debug mode: off
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.3:5000
Press CTRL+C to quit
```

When fetching the contents of `127.0.0.1:8080` via a tool like `curl`, you will see the following:

```
curl 127.0.0.1:5000
```
```
<p>Hello, World!</p>
```

## Documentation References

- [Pixi Documentation](https://pixi.sh/latest/)
- [Python documentation](https://www.python.org/doc/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ceph

# ceph
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ceph` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ceph/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ceph is a distributed object, block, and file storage platform

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
*The Chainguard Ceph image doesn't support the `mgr-dashboard` at this time due to this upstream issue in PyO3 https://github.com/PyO3/pyo3/issues/576*
Chainguard's Ceph image is mostly comparable to Ceph's [Ceph Image](https://quay.io/repository/ceph/ceph?tab=tags&tag=latest). Chainguard's image contains only the minimum set of dependencies needed to run Ceph.

## Getting Started
To run the docker image, use the following command
`docker run --rm -it cgr.dev/ORGANIZATION/ceph:latest`
To spin a minimal ceph cluster, a manual approach or with `cephadm`. The manual approach involves creating a config file as shown
```
cat <<EOF > /etc/ceph/ceph.conf
[global]
fsid = ${UUID}
mon_initial_members = ${HOSTNAME}
mon_host = 127.0.0.1
public network = 127.0.0.0/8
auth_cluster required = cephx
auth_service required = cephx
auth_client required = cephx
osd_pool_default_size = 1
osd_pool_default_min_size = 1
mon warn on insecure global id reclaim allowed = false
mon warn on insecure global id reclaim = false
mon warn on pool no redundancy = false
EOF
```
The guide [here](https://docs.ceph.com/en/latest/install/manual-deployment/) gives detailed instruction on manual deployment of a ceph cluster

## Documentation and Resources
* Ceph Github - https://github.com/ceph/ceph
* Ceph Docs - https://docs.ceph.com/en/reef

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falcoctl

# falcoctl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falcoctl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falcoctl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for `falcoctl`.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

`falcoctl` is a command-line tool for managing the runtime security tool Falco,
assisting with configuration, rule management, and integration in Kubernetes
environments. falcoctl runs as part of falco by default, but can also be ran
as an external service.

## Usage

`falcoctl` is the entrypoint for the container image. Run with `help` to view
list of supported commands and options:

```bash
docker run cgr.dev/chainguard/falcoctl:latest help
```

For more information, refer to the falco documentation:
- [Install and operate falco](https://falco.org/docs/install-operate/running/)
- [Falco GitHub](https://github.com/falcosecurity/falco)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rails

# rails
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rails` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rails/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ruby on Rails (often just called "Rails") is a web-application framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [Ruby image available from Docker Hub](https://hub.docker.com/_/ruby/) with the `rails` gems installed. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker

You can run the following command to test Chainguard's Rails image:

```shell
docker run --rm cgr.dev/ORGANIZATION/rails:latest rails --version
```

The following is a minimal example of a Dockerfile that uses a single-stage build to run a Rails application:

```Dockerfile
FROM cgr.dev/ORGANIZATION/rails:latest

WORKDIR /rails

# This assumes your Dockerfile is in the root directory of your Rails project
COPY . .

RUN bundle install

CMD [ "rails", "server", "-b", "0.0.0.0" ]
```

This image can be built with:

```shell
docker build -t my-new-tag .
```

You can then run the Rails app with the following command:

```shell
$ docker run --rm my-new-tag
=> Booting Puma
=> Rails 8.0.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.5.0 ("Sky's Version")
* Ruby version: ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +YJIT +PRISM [aarch64-linux-gnu]
*  Min threads: 3
*  Max threads: 3
*  Environment: development
*          PID: 1
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
```

## Documentation and Resources

* [Official Ruby on Rails Documentation](https://rubyonrails.org/docs).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-state-metrics-fips

# kube-state-metrics-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-state-metrics-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-state-metrics-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm
Add the `prometheus-community` Helm repository:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
```

Next, we can install the kube-state-metrics with the following command:

```sh
helm upgrade --install kube-state-metrics \
    prometheus-community/kube-state-metrics \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/kube-state-metrics-fips \
    --set image.tag=latest
```

Once the kube-state-metrics has been deployed, verify the pods are running:

```shell
kubectl get pods -l app.kubernetes.io/name=kube-state-metrics
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd

# argocd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Argo CD](https://argo-cd.readthedocs.io/en/stable/) is a declarative continuous deployment tool for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are two recommended methods for installing Argo CD: using `helm` and raw manifests. Chainguard's Argo CD Image is designed to be a drop-in replacement for either method.

To use this Image, replace the appropriate `image:` value with the Chainguard Argo CD Image. The following is an example how such a value might appear within a Helm chart:

```yaml
global:
  image:
    repository: cgr.dev/ORGANIZATION/argocd
```

Based on these values, you would install Argo CD using the following `helm` commands. First, add the Argo Helm repository:

```bash
helm repo add argo https://argoproj.github.io/argo-helm
```

Then you can install Argo CD:

```bash
helm install argocd argo/argo-cd \
	--namespace argocd \
	--create-namespace \
	--set global.image.repository="cgr.dev/ORGANIZATION/argocd" \
	--set global.image.tag="latest" \
	--set repoServer.image.repository="cgr.dev/ORGANIZATION/argocd" \
	--set repoServer.image.tag="latest"
```

> NOTE: Setting the tag to `latest` is not recommended, and only shown for illustrative purposes.

Optionally, you can use other Chainguard Images to replace Argo CD dependencies:

```yaml
redis:
  image:
    repository: cgr.dev/ORGANIZATION/redis
    tag: latest

dex:
  image:
    repository: cgr.dev/ORGANIZATION/dex
    tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-eks-pod-identity-agent

# aws-eks-pod-identity-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-eks-pod-identity-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-eks-pod-identity-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

EKS Pod Identity is a feature of Amazon EKS that simplifies the process for cluster administrators to configure Kubernetes applications with AWS IAM permissions

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Amazon EKS Pod Identity associations provide the ability to manage credentials for your applications, similar to the way that Amazon EC2 instance profiles provide credentials to Amazon EC2 instances.

Amazon EKS Pod Identity provides credentials to your workloads with an additional EKS Auth API and an agent pod that runs on each node.

You can take a look at the official documentation [here](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html).

AWS provides a Helm chart that simplifies the deployment of the Pod Identity Agent. The Helm chart is available in the official repository [here](https://github.com/aws/eks-pod-identity-agent/tree/main/charts/eks-pod-identity-agent).

To deploy the Pod Identity Agent, run the following commands:

```bash
git clone https://github.com/aws/eks-pod-identity-agent.git
cd eks-pod-identity-agent/
helm install eks-pod-identity-agent \
      --namespace kube-system \
      ./charts/eks-pod-identity-agent \
      --set image.override=cgr.dev/chainguard/aws-eks-pod-identity-agent:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-iamguarded

# nginx-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based nginx HTTP, reverse proxy, mail proxy, and a generic TCP/UDP proxy server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

NGINX IAMGuarded is a security-enhanced variant of NGINX designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard NGINX deployments.

## Helm Chart Installation

The NGINX IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-iamguarded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main NGINX image
image:
  registry: myregistry.example.com
  repository: mirrored/nginx-iamguarded
  digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-prometheus-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag
cloneStaticSiteFromGit:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/git-iamguarded
    digest: sha256:... # Use specific digest instead of tag
  repository: github.com/org/repo-to-serve
  branch: main
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-iamguarded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your NGINX IAMGuarded installation using standard NGINX verification methods. The deployment functions as a standard NGINX instance, so all typical NGINX validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-iamguarded-fips

# cert-manager-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[cert-manager](https://cert-manager.io) is a tool for provisioning and managing TLS certificates in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

cert-manager IAMGuarded FIPS is a FIPS-compliant, security-enhanced variant of cert-manager designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard cert-manager deployments, with FIPS 140-2 validated cryptographic modules.

## Helm Chart Installation

The cert-manager IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install cert-manager oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# cert-manager controller image
controller:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-controller-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
  acmesolver:
    image:
      registry: myregistry.example.com
      repository: mirrored/cert-manager-acmesolver-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag

# cert-manager webhook image
webhook:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-webhook-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# cert-manager cainjector image
cainjector:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-cainjector-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install cert-manager oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/cert-manager:1.15.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your cert-manager IAMGuarded FIPS installation using standard cert-manager verification methods. The deployment functions as a standard cert-manager instance, so all typical cert-manager validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The cert-manager IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both cert-manager and Kubernetes environments. This FIPS variant includes FIPS 140-2 validated cryptographic modules for enhanced security compliance. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### go

# go
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/go` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/go/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Go applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Where possible, the Go Chainguard Image is built for compatibility with the [Docker official image for Golang](https://hub.docker.com/_/golang/). 

Unlike most other Chainguard images, the Go image contains a shell; namely, Bash. The reason for this is that this image is meant to be used as a build image, not a runtime image. The Go binary itself isn't very useful, so the Go Chainguard image contains Bash, along with tools like `make` and `gcc`, to allow users to build binaries.

The Go Chainguard Image uses the `glibc` implementation of the C standard library, while the Alpine version of the Golang official Docker Image uses `musl`. See our [article on glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/) on Chainguard Academy for an overview of the differences between these implementations.

When using the Chainguard Go image, we advise to use shared linking and the `glibc-dynamic runtime` image as static linking of C/C++ code can often create [dark matter](https://www.chainguard.dev/unchained/software-dark-matter-is-the-enemy-of-software-transparency) and evade scanners. As an alternative, we recommend using the `static` image as the runtime image, as it still provides CA certs for TLS. If using `go-msft-fips`, we recommend using `glibc-openssl-fips`.

The examples in this README recommend executing Go binaries from one of our runtime Chainguard Images, such as the `glibc-dynamic` or `static` Chainguard Images. If using the `static` Chainguard Image, make sure to build your Go binary with static linking. In most cases, this requires running `CGO_ENABLED=0 go build` when building the binary. If dynamic linking is needed, use the `glibc-dynamic` Chainguard Image or the Go Chainguard Image to run your application. 

In Go 1.20, we default to using the new `GODEBUG` settings of `tarinsecurepath=0` and `zipinsecurepath=0`. These can be disabled by clearing the `GODEBUG` environment variable, or by setting them to `1`.

Learn more about these settings in the [Go release notes](https://tip.golang.org/doc/go1.20).

## Getting Started

### Example: CLI Application Using Multi-Stage Build

The following build demonstrates a command line application with support for flags and positional arguments. The application prints a modifiable greeting message and provides usage information if the wrong number of arguments are passed by a user or the user passes an unrecognized flag.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/go-greeter && cd $_
```

Next, ,write a file defining our Go CLI application (`main.go`:

```sh
cat << 'EOF' > main.go
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
)

func usage() {
	fmt.Fprintf(os.Stderr, "usage: hello [options] [name]\n")
	flag.PrintDefaults()
	os.Exit(2)
}

var (
	greeting = flag.String("g", "Hello", "Greet with `greeting`")
)

func main() {
	// Configure logging
	log.SetFlags(0)
	log.SetPrefix("hello: ")

	// Parse flags.
	flag.Usage = usage
	flag.Parse()

	// Parse and validate arguments.
	name := "Linky 🐙"
	args := flag.Args()
	if len(args) >= 2 {
		usage()
	}
	if len(args) >= 1 {
		name = args[0]
	}
	if name == "" { // hello '' is an error
		log.Fatalf("invalid name %q", name)
	}

	fmt.Printf("%s, %s!\n", *greeting, name)
}
EOF
```

Create a go.mod` file to list dependencies:

```sh
cat << 'EOF' > go.mod
module chainguard.dev/greet

go 1.19
EOF
```

Write a `Dockerfile` to define our image build:

```sh
cat << 'EOF' > Dockerfile
FROM cgr.dev/chainguard/go AS builder
COPY . /app
RUN cd /app && go build -o go-greeter .

FROM cgr.dev/chainguard/static
COPY --from=builder /app/go-greeter /usr/bin/
ENTRYPOINT ["/usr/bin/go-greeter"]
EOF
```

The `Dockerfile` uses a multi-stage build approach, compiling the application using the `go` Chainguard Image, then copying the binary to the `static` Chainguard Image for execution. Note that the `static` image requires that the Go binary be statically linked—if your application requires dynamic linking, consider using the `glibc-dynamic` Chainguard Image for your runtime (see the second example in this README).

Build the image, tagging it `go-greeter`:

```sh
docker build . -t go-greeter
```

Run the image:

```sh
docker run go-greeter
```

You should see output similar to the following:

```
Hello, Linky 🐙!
```

You can also pass in arguments that will be parsed by the Go CLI application: 

```sh
docker run go-greeter -g Greetings "Chainguard user"
```

This will produce the following output:

```
Greetings, Chainguard user!
```

The application will also share usage instructions when prompted with the `--help` flag or when invalid flags are passed.

Because we used the `static` Chainguard Image as our runtime, the final image only requires a few megabytes on disk:

```sh
docker inspect go-greeter | jq -c 'first' | jq .Size | numfmt --to iec --format "%8.4f"
```

The final size, `3.5055M`, is orders of magnitude smaller than it would be running the application using a Go image. However, if your application is dynamically linked to shared objects, consider using the `glibc-dynamic` Chainguard Image for your runtime or take extra steps to build your Go binary statically.

### Example: Web Application

The following build demonstrates an application that's accessible by HTTP server. The application renders a simple message that changes based on the URI.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/greet-server && cd $_
```

Next, write a `main.go` file defining our web application:

```sh
cat << 'EOF' > main.go
package main

import (
	"flag"
	"fmt"
	"html"
	"log"
	"net/http"
	"os"
	"runtime/debug"
	"strings"
)

func usage() {
	fmt.Fprintf(os.Stderr, "usage: helloserver [options]\n")
	flag.PrintDefaults()
	os.Exit(2)
}

var (
	greeting = flag.String("g", "Hello", "Greet with `greeting`")
	addr     = flag.String("addr", "0.0.0.0:8080", "address to serve")
)

func main() {
	// Parse flags.
	flag.Usage = usage
	flag.Parse()

	// Parse and validate arguments (none).
	args := flag.Args()
	if len(args) != 0 {
		usage()
	}

	// Register handlers. for greeting and version
	http.HandleFunc("/", greet)
	http.HandleFunc("/version", version)

	log.Printf("serving http://%s\n", *addr)
	log.Fatal(http.ListenAndServe(*addr, nil))
}

func version(w http.ResponseWriter, r *http.Request) {
	info, ok := debug.ReadBuildInfo()
	if !ok {
		http.Error(w, "no build information available", 500)
		return
	}

	fmt.Fprintf(w, "<!DOCTYPE html>\n<pre>\n")
	fmt.Fprintf(w, "%s\n", html.EscapeString(info.String()))
}

func greet(w http.ResponseWriter, r *http.Request) {
	name := strings.Trim(r.URL.Path, "/")
	if name == "" {
		name = "Linky 🐙"
	}

	fmt.Fprintf(w, "<!DOCTYPE html>\n")
	fmt.Fprintf(w, "%s, %s!\n", *greeting, html.EscapeString(name))
}
EOF
```

Next, write a `go.mod` file listing dependencies:

```sh
cat << 'EOF' > go.mod
module chainguard.dev/greet-server

go 1.19
EOF
```

Write a `Dockerfile` to define our image build:

```sh
cat << 'EOF' > Dockerfile
FROM cgr.dev/chainguard/go AS builder
COPY . /app
RUN cd /app && go build

FROM cgr.dev/chainguard/glibc-dynamic
COPY --from=builder /app/greet-server /usr/bin/

EXPOSE 8080

ENTRYPOINT ["/usr/bin/greet-server"]
EOF
```

The `Dockerfile` uses a multi-stage build approach, compiling the application using the `go` Chainguard Image, then copying the binary to the `glibc-dynamic` Chainguard Image to serve.

Build the image, tagging it `greet-server`:

```sh
docker build . -t greet-server
```

Run the image:

```sh
docker run -p 8080:8080 greet-server
```

Visit [http://0.0.0.0:8080/](http://0.0.0.0:8080/) using a web browser on your host machine. You should see the following:

```
Hello, Linky 🐙!
```

Changes to the URI will be routed to the application. Try visiting [http://0.0.0.0:8080/Chainguard%20Customer](http://0.0.0.0:8080/Chainguard%20Customer). You should see the following output:

```
Hello, Chainguard Customer!
```

The application will also share version information at [http://0.0.0.0:8080/version](http://0.0.0.0:8080/version).

If you're building a web application with Go, consider the [nginx](https://images.chainguard.dev/directory/image/nginx/overview) Chainguard Image for use as a reverse proxy.

## Documentation and Resources

- [Chainguard Academy: Getting Started with the Go Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/go/)
- [Video: Migrating a Dockerfile for a Go application to use Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migration-guides/migrating_go/)
- [Blog Post: Statically Linking Go in 2022](https://mt165.co.uk/blog/static-link-go/)
- [Blog Post: Building minimal and low CVE images for compiled languages](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-compiled-languages)
- [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tailscale

# tailscale
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tailscale` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tailscale/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Tailscale](https://github.com/tailscale/tailscale) is a WireGuard-based mesh VPN

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The Tailscale image allows for containers to join an existing Tailnet.

### Prerequisites

* Create a Tailscale account
* Create a Tailnet
* Create an [auth key](https://tailscale.com/kb/1085/auth-keys) or [OAuth client](https://tailscale.com/kb/1215/oauth-clients#setting-up-an-oauth-client)
    * If deploying the Kubernetes operator, an OAuth client must be used as the operator utilizes the OAuth client to mint auth keys for itself

### Example Usage

**Docker**:
```bash
docker run \
 --name tailscale \
 -e TS_AUTHKEY=tskey-client-EXAMPLE_KEY_REPLACED \
 -e TS_EXTRA_ARGS=--advertise-tags=tag:container \
 cgr.dev/ORGANIZATION/tailscale:latest
```

**Helm command**:
```bash
helm upgrade \
  --install \
  tailscale-operator \
  tailscale/tailscale-operator \
  --namespace=tailscale \
  --create-namespace \
  --set-string operatorConfig.image.repo="cgr.dev/ORGANIZATION/tailscale"
  --set-string operatorConfig.image.tag="latest"
  --set-string oauth.clientId="<OAauth client ID>" \
  --set-string oauth.clientSecret="<OAuth client secret>" \
  --wait
```

**Helm values**:
```yaml
operatorConfig:
  image:
    repository: cgr.dev/ORGANIZATION/tailscale
    tag: "latest"
    pullPolicy: Always
```

For more information, refer to the Tailscale documentation for [Docker](https://tailscale.com/kb/1282/docker) or [Kubernetes](https://tailscale.com/kb/1185/kubernetes).

### Troubleshooting

The `TS_USERSPACE` environment variable is `True` by default which utilizes userspace networking rather than kernel networking.

For more information, refer to the [userspace networking](https://tailscale.com/kb/1112/userspace-networking) documentation or the [kernel vs. netstack](https://tailscale.com/kb/1177/kernel-vs-userspace-routers) comparison.

If `TS_USERSPACE` is `False`, then additional capabilities will need to be specified for the container to avoid running the pod in privileged mode.

For Docker: `--cap-add NET_ADMIN`
For Kubernetes:
```yaml
securityContext:
  capabilities:
      add:
      - NET_ADMIN
```

## Documentation and Resources

Documentation for installing and using Tailscale can be found on the Tailscale project website:
- [Install](https://tailscale.com/kb/1017/install)
- [Guides](https://tailscale.com/kb/1415/quick-guides)
  - [Kubernetes](https://tailscale.com/learn/managing-access-to-kubernetes-with-tailscale)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aspnet-runtime

# aspnet-runtime
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aspnet-runtime` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aspnet-runtime/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image with the latest ASP.NET runtime.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's aspnet-runtime image is comparable to the [.NET core tools found on GitHub](https://github.com/dotnet/core).

The aspnet-runtime image contains both the ASP.NET runtime and the .NET core runtime, allowing you to run ASP.NET applications. Note that if your use case depends on running `aspnet-runtime` with a package manager or shell, you can use the `:latest-dev` variant.

## Documentation and Resources

For more information, please refer to the official [ASP.NET documentation](https://learn.microsoft.com/en-us/aspnet/core/?view=aspnetcore-8.0).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### istio-base-fips

# istio-base-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/istio-base-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/istio-base-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Istio base image with network debugging utilities

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `REPO_NAME` image is a drop-in replacement for the upstream [istio/base](https://hub.docker.com/r/istio/base) image. It provides the same network debugging utilities required by Istio's sidecar proxies and network configuration, with FIPS-validated cryptographic modules.

### User

The Chainguard image runs as a non-root user (`istio-proxy`, UID 1337) by default, matching Istio's expected user configuration. The upstream image does not set a default user. This aligns with Istio's security model where the sidecar proxy runs as UID 1337.

### Entrypoint

The Chainguard FIPS image uses `/bin/bash` as the entrypoint rather than the default command. This is functionally equivalent for most use cases.

### Environment variables

The Chainguard image does not include the `DEBIAN_FRONTEND` environment variable present in the upstream image, as this is specific to Debian package management and not required at runtime.

## FIPS Support

This image includes FIPS-validated cryptographic modules through the `openssl-config-fipshardened` package. OpenSSL is configured to operate in FIPS mode by default, ensuring all TLS connections and cryptographic operations use FIPS 140-2/140-3 validated algorithms.

For organizations subject to FedRAMP, FISMA, or other compliance frameworks requiring FIPS validation, this image provides a compliant foundation for Istio deployments.

## Prerequisites

To use the `REPO_NAME` image, you need:

- Docker installed and running, or a Kubernetes cluster with Istio
- Access to the Chainguard Registry
- An environment that requires FIPS 140-2/140-3 validated cryptographic modules

## Getting Started

The `REPO_NAME` image is primarily used as a base image for Istio's sidecar proxy containers in environments requiring FIPS compliance. It includes essential network debugging utilities for troubleshooting service mesh connectivity.

### Verifying network tools

You can verify the included network debugging utilities:

```shell
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "curl --version"
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "ip -Version"
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "dig -v"
```

### Using with Istio

To use this image with Istio in a FIPS-compliant environment, configure the Istio Helm chart to use the Chainguard FIPS base image. Create a values file:

### Available utilities

The image includes the following network debugging tools:

- `curl` - HTTP client for testing connectivity
- `iptables` and `nft` - Firewall rule management
- `ip` - Network interface configuration
- `ping` - ICMP connectivity testing
- `tcpdump` - Packet capture and analysis
- `conntrack` - Connection tracking
- `netstat` - Network statistics
- `lsof` - List open files and sockets
- `nc` (netcat) - Network utility for reading/writing connections
- `dig` - DNS lookup utility
- `sudo` - Privilege escalation for debugging

## Configuration

### User and group

The image uses the `istio-proxy` user and group (UID/GID 1337), which is the standard user for Istio sidecar containers.

### Shell

The default entrypoint is `/bin/bash`, providing a shell environment for debugging and executing commands.

### FIPS mode

The image includes the `openssl-config-fipshardened` package, which configures OpenSSL to operate in FIPS mode by default. All cryptographic operations use FIPS-validated modules.

## Documentation and Resources

- [Istio Official Documentation](https://istio.io/latest/docs/)
- [Istio GitHub Repository](https://github.com/istio/istio)
- [Istio Architecture Overview](https://istio.io/latest/docs/ops/deployment/architecture/)
- [Chainguard FIPS Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-fips

# envoy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zabbix-agent2

# zabbix-agent2
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zabbix-agent2` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zabbix-agent2/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Zabbix Agent 2 for monitoring hosts and sending metrics to Zabbix Server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `zabbix-agent2` image is comparable to the [Zabbix Agent 2 image](https://hub.docker.com/r/zabbix/zabbix-agent2) available on Docker Hub. The Chainguard image runs as a non-root user (`zabbix` with UID 1997, GID 1995) and is built on Wolfi for a minimal attack surface.

### SMART Disk Monitoring

This image includes `smartmontools` for disk health monitoring but does **not** ship `sudo`. The upstream image uses sudo to allow the zabbix user to run `smartctl` with root privileges, but this increases the attack surface.

To enable SMART disk monitoring, use Linux capabilities instead of sudo:

**Docker:**
```shell
docker run -d \
  --name zabbix-agent2 \
  --cap-add SYS_RAWIO \
  -e ZBX_HOSTNAME="my-host" \
  -e ZBX_SERVER_HOST="zabbix-server" \
  cgr.dev/ORGANIZATION/zabbix-agent2:latest
```

**Kubernetes:**
```yaml
securityContext:
  capabilities:
    add: ["SYS_RAWIO"]
```

This approach is more secure than sudo because it grants only the specific capability needed for `smartctl` without exposing the full sudo attack surface.

## Getting Started

### Docker

Run the Zabbix Agent 2 container with basic configuration:

```shell
docker run -d \
  --name zabbix-agent2 \
  -e ZBX_HOSTNAME="my-host" \
  -e ZBX_SERVER_HOST="zabbix-server" \
  -e ZBX_SERVER_PORT="10051" \
  -p 10050:10050 \
  cgr.dev/ORGANIZATION/zabbix-agent2:latest
```

With custom configuration file:

```shell
docker run -d \
  --name zabbix-agent2 \
  -v /path/to/zabbix_agent2.conf:/etc/zabbix/zabbix_agent2.conf:ro \
  -p 10050:10050 \
  cgr.dev/ORGANIZATION/zabbix-agent2:latest \
  --foreground -c /etc/zabbix/zabbix_agent2.conf
```

### Kubernetes with Helm

Deploy using the [zabbix-community Helm chart](https://github.com/zabbix-community/helm-zabbix):

```shell
helm repo add zabbix-community https://zabbix-community.github.io/helm-zabbix/
helm repo update

helm install zabbix zabbix-community/zabbix -f values.yaml
```

Create a `values.yaml` file:

```yaml
zabbixAgent:
  enabled: true
  runAsDaemonSet: true
  image:
    repository: cgr.dev/ORGANIZATION/zabbix-agent2
    tag: latest
zabbixServer:
  enabled: false
zabbixProxy:
  enabled: false
zabbixWeb:
  enabled: false
postgresql:
  enabled: false
```

## Documentation and Resources

- [Zabbix Agent 2 Documentation](https://www.zabbix.com/documentation/current/en/manual/concepts/agent2)
- [Zabbix Docker GitHub Repository](https://github.com/zabbix/zabbix-docker)
- [Zabbix Community Helm Chart](https://github.com/zabbix-community/helm-zabbix)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vector-fips

# vector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS compliant image with [Vector](https://vector.dev/), an end-to-end data observability pipeline

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `vector-fips` Chainguard image is meant to serve as a drop-in replacement for the [Vector image on DockerHub](https://hub.docker.com/r/timberio/vector). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

Note: The FIPS version of this image does not support the `[sources.secure_http.tls]` configuration options. The internal key/certificate parser relies on the [PKCS12KDF algorithm](https://docs.openssl.org/3.3/man7/EVP_KDF-PKCS12KDF/), which is not approved for use in FIPS environments.

## Getting Started

### Basic Usage

To begin, start the `vector-fips` container with a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/vector-fips
```

> [!NOTE]
> This will start `vector-fips` with the [demo_logs source](https://vector.dev/docs/reference/configuration/sources/demo_logs/) configuration.
> Sample log data will be generated and printed to stdout.
> You can drop in your own configuration by mounting the file to `/etc/vector/vector.yaml` inside the container.

### Vector with kubernetes

Vector can be [installed](https://vector.dev/docs/setup/installation/platforms/kubernetes/) or managed on kubernetes via [helm](https://vector.dev/docs/setup/installation/package-managers/helm/).

> [!NOTE]
> This example assumes that you have a PostgreSQL database pod and Elasticsearch pod configured and running on a [local Kubernetes cluster setup](https://kind.sigs.k8s.io/).
> The [CloundNative PG Operator](https://github.com/cloudnative-pg/cloudnative-pg) was used to deploy PostgreSQL by following their [CNPG quickstart guide](https://cloudnative-pg.io/documentation/1.25/quickstart/) and [example manifests](https://github.com/cloudnative-pg/cloudnative-pg/blob/main/docs/src/samples/cluster-example-secret.yaml).
> The [ECK Operator](https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/install-using-helm-chart) was used to deploy Elasticsearch by following the [Elasticsearch quickstart guide](https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/elasticsearch-deployment-quickstart)
> All example resources are deployed into the `default` namespace.

#### Prerequisites

* `k3d` cluster
* `helm`
* `docker`
* `curl`

#### PostgreSQL setup

1. install the cnpg operator
```shell
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm upgrade --install cnpg \
--set config.clusterWide=false \
cnpg/cloudnative-pg
```

2. deploy postgresql
```shell
cat <<EOF | kubectl apply -f -
apiVersion: v1
data:
  password: c3VwZXJzZWN1cmU=
  username: YXBw
kind: Secret
metadata:
  name: cluster-example-app-user
type: kubernetes.io/basic-auth
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-example
spec:
  instances: 1
  imageName: ghcr.io/cloudnative-pg/postgresql:16
  bootstrap:
    initdb:
      database: app
      owner: app
      secret:
        name: cluster-example-app-user
  storage:
    size: 1Gi
EOF
```
> [!NOTE]
> When deploying the PostgreSQL instance ensure `v16` is used. Otherwise vector will not emit any metrics other than up, and instead emit errors related to the checkpoints_timed column being missing.
> The likely cause is that the `checkpoints_timed` column, along with other metrics in `pg_stat_bgwriter`, was renamed and moved to the `pg_stat_checkpointer` table in PostgreSQL 17
> Ref: https://github.com/vectordotdev/vector/issues/22094

#### Elasticsearch setup

1. install the eck operator
```shell
helm repo add elastic https://helm.elastic.co
helm repo update

helm install elastic-operator elastic/eck-operator
```

2. deploy elasticsearch
```shell
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF
```

### Vector setup
> [!NOTE]
> Vector will be configured with a [postgresql_metrics source](https://vector.dev/docs/reference/configuration/sources/postgresql_metrics/) and [elasticsearch sink](https://vector.dev/docs/reference/configuration/sinks/elasticsearch/).

1. Grab the elasticsearch user credentials
```shell
export ELASTIC_PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)
```

2. create the `vector-fips` values for the `vector-fips` helm chart
```shell
cat <<EOF > /tmp/values.yaml
role: "Aggregator"
image:
  repository: k3d-k3d.localhost:5005/vector-fips
  tag: "latest-dev"
replicas: 1
service:
  enabled: true
  type: "ClusterIP"
  ports: 
    - name: datadog-agent
      port: 8282
      protocol: TCP
      targetPort: 8282
    - name: fluent
      port: 24224
      protocol: TCP
      targetPort: 24224
    - name: logstash
      port: 5044
      protocol: TCP
      targetPort: 5044
    - name: splunk-hec
      port: 8080
      protocol: TCP
      targetPort: 8080
    - name: statsd
      port: 8125
      protocol: TCP
      targetPort: 8125
    - name: syslog
      port: 9000
      protocol: TCP
      targetPort: 9000
    - name: vector
      port: 6000
      protocol: TCP
      targetPort: 6000
    - name: prom-exporter
      port: 9090
      protocol: TCP
      targetPort: 9090
customConfig:
  data_dir: "/var/lib/vector"
  sources:
    postgres:
      type: postgresql_metrics
      endpoints:
        - postgresql://app:supersecure@cluster-example-rw.default.svc.cluster.local:5432/app
      namespace: default
  sinks:
    elastic:
      type: elasticsearch
      inputs:
        - postgres
      api_version: auto
      doc_type: _doc
      mode: bulk
      bulk:
        action: "create"
        index: "vector-demo"
        template_fallback_index: "test-index"
      endpoints:
        - https://quickstart-es-http.default.svc.cluster.local:9200
      auth:
        strategy: "basic"
        user: "elastic"
        password: "$ELASTIC_PASSWORD"
      tls:
        verify_certificate: false
EOF
```
> [!NOTE]
> The index that this vector configuration will create in elasticsearch will be called: `vector-demo`
> This index will be used to query elasticsearch for metric data.

3. deploy `vector-fips`
```shell
helm install vector-fips vector/vector -f /tmp/values.yaml
```

expected output:
```
kubectl logs vector-fips-0

2025-05-05T22:18:39.858586Z  INFO vector::app: Log level is enabled. level="info"
2025-05-05T22:18:39.859439Z  INFO vector::app: Loading configs. paths=["/etc/vector"]
2025-05-05T22:18:39.870296Z  WARN sink{component_kind="sink" component_id=elastic component_type=elasticsearch}: vector_core::tls::settings: The `verify_certificate` option is DISABLED, this may lead to security vulnerabilities.
2025-05-05T22:18:39.949237Z  INFO vector::topology::running: Running healthchecks.
2025-05-05T22:18:39.949295Z  INFO vector: Vector has started. debug="false" version="0.46.1" arch="aarch64" revision=""
2025-05-05T22:18:39.949303Z  INFO vector::app: API is disabled, enable by setting `api.enabled` to `true` and use commands like `vector top`.
2025-05-05T22:18:39.955193Z  INFO vector::topology::builder: Healthcheck passed.
```

#### Verify metric logs

1. port forward the elasticsearch service
```shell
kubectl port-forward service/quickstart-es-http 9200

Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200
```

2. query elasticsearch for metric data
```shell
export ELASTIC_PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)

curl -k -X GET --user elastic:$ELASTIC_PASSWORD 'https://localhost:9200/vector-demo/_search?pretty=true&size=100'
```

expected metrics:
```
name: pg_stat_database_datid
name: pg_stat_database_numbackends
name: pg_stat_database_xact_commit_total
name: pg_stat_database_xact_rollback_total
name: pg_stat_database_blks_read_total
name: pg_stat_database_blks_hit_total
name: pg_stat_database_tup_returned_total
name: pg_stat_database_tup_fetched_total
name: pg_stat_database_tup_inserted_total
name: pg_stat_database_tup_updated_total
name: pg_stat_database_tup_deleted_total
name: pg_stat_database_conflicts_total
name: pg_stat_database_temp_files_total
name: pg_stat_database_temp_bytes_total
name: pg_stat_database_deadlocks_total
name: pg_stat_database_checksum_failures_total
name: pg_stat_database_checksum_last_failure
name: pg_stat_database_blk_read_time_seconds_total
name: pg_stat_database_blk_write_time_seconds_total
name: pg_stat_database_stats_reset
```

expected response:
```json
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1540,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "vector-demo",
        "_id" : "N4mHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "gauge" : {
            "value" : 1.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_active",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950988925Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OImHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 2.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_accepted_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989466Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OYmHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 2.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_handled_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989675Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OomHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 3.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "http_requests_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989925Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "O4mHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "gauge" : {
            "value" : 0.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_reading",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950990300Z"
        }
      }
    ]
  }
}
```

## Documentation and Resources
- [Vector Docs - Getting Started](https://vector.dev/guides/getting-started/getting-started/)
- [Vector Docs - Configuration](https://vector.dev/docs/reference/configuration/)
- [Vector Docs - Sources](https://vector.dev/docs/reference/configuration/sources/)
- [Vector Docs - Sinks](https://vector.dev/docs/reference/configuration/sinks/)
- [Vector Docs - CLI](https://vector.dev/docs/reference/cli/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rqlite

# rqlite
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rqlite` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rqlite/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with rqlite.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Vault

The Chainguard Vault image contains the `rqlite` and `rqlited` server binaries.
The default entrypoint uses the `docker-entrypoint.sh` script from the `rqlite` project.

To run the `rqlite` program:

```shell
% docker run cgr.dev/chainguard/rqlite rqlite
[rqlited] 2023/03/26 21:53:22 rqlited starting, version 7, SQLite 3.39.4, commit unknown, branch unknown, compiler gc
[rqlited] 2023/03/26 21:53:22 go1.20.2, target architecture is arm64, operating system target is linux
[rqlited] 2023/03/26 21:53:22 launch command: /usr/bin/rqlited -node-id d3d5c2306506 -http-addr 0.0.0.0:4001 -http-adv-addr d3d5c2306506:4001 -raft-addr 0.0.0.0:4002 -raft-adv-addr d3d5c2306506:4002 /rqlite/file/data

            _ _ _
           | (_) |
  _ __ __ _| |_| |_ ___
 | '__/ _  | | | __/ _ \   The lightweight, distributed
 | | | (_| | | | ||  __/   relational database.
 |_|  \__, |_|_|\__\___|
         | |               www.rqlite.io
         |_|

[rqlited] 2023/03/26 21:53:22 Raft TCP mux Listener registered with byte header 1
[rqlited] 2023/03/26 21:53:22 no preexisting node state detected in /rqlite/file/data, node may be bootstrapping
[cluster] 2023/03/26 21:53:22 service listening on d3d5c2306506:4002
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tomcat

# tomcat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tomcat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tomcat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Tomcat](https://tomcat.apache.org/) is a free and open-source implementation of the Jakarta Servlet, Jakarta Expression Language, and WebSocket technologies.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Apache Tomcat image is meant to serve as a drop-in replacement for the official Tomcat image.

Like most of Chainguard's images, this image does not operate as the root user and includes only the minimum packages needed to function.

## Getting Started

To start up the `tomcat` server:

```shell
docker run cgr.dev/chainguard/tomcat:latest
```

This shows you the Apache Tomcat log output as the server boots, so you can check for any errors and confirm that Tomcat is running.

If you are running this container on your local machine for testing, you can modify the original `docker run` by forwarding requests to a port on your host machine to one of the container's ports. This enables you to connect to the Tomcat server using your host computer's browser:

```shell
docker run -p 8080:8080 cgr.dev/chainguard/tomcat:latest
```

This again shows the Apache Tomcat log output as the server boots.

Now browse to `http://localhost:8080` to see an Apache Tomcat 404 error page. Tomcat will return a 404 error because, by default, Tomcat ships with an empty `webapps` directory. Regardless, what you will see is a confirmation that the Tomcat server is running.

## Documentation and Resources

You can find the official Tomcat documentation on [the Apache Tomcat website](https://tomcat.apache.org/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### objectstorage

# objectstorage
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/objectstorage` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/objectstorage/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container Object Storage Interface (COSI) controller and sidecar

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

These images are built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's images maintain functional parity with the upstream images:

- `controller`: The main COSI controller that manages object storage resources.
- `sidecar`: A sidecar container that provides additional functionality for object storage operations.

## Getting Started

### `controller`

The `objectstorage-controller` image is not meant to be run directly with Docker. Instead, deploy with the `kubectl` and replace the image as upstream recommended:

```shell
kubectl create -k 'https://github.com/kubernetes-sigs/container-object-storage-interface//?ref=v<VERSION>'
kubectl set image -n container-object-storage-system deployment/container-object-storage-controller objectstorage-controller=cgr.dev/ORGANIZATION/objectstorage-controller:latest
```

Then you can deploy the [`cosi-driver-sample`](https://github.com/kubernetes-sigs/cosi-driver-sample) to test the controller.

### `sidecar`

After you deployed your COSI driver, you can use the Chainguard's `objectstorage-sidecar` image as a sidecar container in your Kubernetes deployments with a simple replacement of the image:

```shell
kubectl set image deploy/<COSI_DEPLOYMENT> objectstorage-provisioner-sidecar=cgr.dev/ORGANIZATION/objectstorage-sidecar:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [README](https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/README.md)
* [Documentations](https://github.com/kubernetes-sigs/container-object-storage-interface/tree/main/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-metrics-adapter-fips

# kube-metrics-adapter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-metrics-adapter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-metrics-adapter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Adapter to expose custom metrics to Kubernetes HPA via Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kube-metrics-adapter-fips` image is a minimal drop-in replacement for the upstream [zalando-incubator/kube-metrics-adapter](https://github.com/zalando-incubator/kube-metrics-adapter). It is fully compatible with the official [Helm chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm) and supports collecting external metrics from Prometheus to drive Horizontal Pod Autoscalers (HPA) via the Kubernetes `external.metrics.k8s.io` API. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [kube-metrics-adapter Helm chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
registry:
  image: cgr.dev/ORGANIZATION/kube-metrics-adapter-fips
  imageTag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kube-metrics-adapter` helm chart.

```shell
helm install kube-metrics-adapter . --namespace kube-system --create-namespace --values values.yaml --wait
```

## Documentation
- [kube-metrics-adapter Github Repository](https://github.com/zalando-incubator/kube-metrics-adapter/)
- [kube-metrics-adapter Helm Chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zitadel

# zitadel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zitadel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zitadel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ZITADEL is an open-source identity and access management (IAM) system that simplifies user authentication and authorization for applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `zitadel` container image is a drop-in replacement for the upstream [zitadel](https://github.com/zitadel/zitadel/pkgs/container/zitadel) image. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

The `zitadel` image can swapped out to replace the official zitadel image with Helm, docker compose, or other deployment methods.

### Helm

To deploy with helm, update your helm values.yaml file and point the image to the Chainguard image. For example, here is a portion of values.yaml with updated image repository and tag:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/zitadel
  tag: "latest"
```

For more information on configuring the Helm values for Zitadel, refer to the official Helm chart's repository [here](https://github.com/zitadel/zitadel-charts).

### Docker Compose

If deploying with Docker Compose following the official instructions [here](https://zitadel.com/docs/self-hosting/deploy/compose), replace the upstream image with the Chainguard image in docker-compose.yaml, like so:

```yaml
  image: cgr.dev/ORGANIZATION/zitadel:latest
```

## Documentation and Resources
- [Zitadel Documentation](https://zitadel.com/docs/guides/overview)
- [Zitadel Helm Chart](https://github.com/zitadel/zitadel-charts)
- [Zitadel Github Repository](https://github.com/zitadel/zitadel)
- [Docker Compose Instructions](https://zitadel.com/docs/self-hosting/deploy/compose)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dbgate-fips

# dbgate-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dbgate-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dbgate-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-hardened version of DbGate, a database administration tool for SQL Server, MySQL, PostgreSQL, MongoDB, Redis and SQLite with FIPS 140-2 compliant cryptographic operations.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `dbgate-fips` images are FIPS-hardened versions of the [DbGate database administration tool](https://github.com/dbgate/dbgate). This image provides a web-based database administration interface for multiple database types including PostgreSQL, MySQL, SQL Server, MongoDB, Redis, and SQLite with FIPS 140-2 compliant cryptographic operations.

### FIPS 140-2 Compliance

The `dbgate-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module, ensuring all cryptographic operations used for database connections and data handling meet FIPS 140-2 standards. This includes:

## Getting Started

To start DbGate FIPS with default settings:

```sh
docker run -d -p 3000:3000 cgr.dev/ORGANIZATION/dbgate-fips
```

## Documentation and Resources

* [DbGate Official Documentation](https://github.com/dbgate/dbgate/wiki)
* [DbGate GitHub Repository](https://github.com/dbgate/dbgate)
* [Chainguard FIPS Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-terraform-fips

# crossplane-provider-terraform-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-terraform-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-terraform-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Fips image of Crossplane Terraform Provider enables provisioning and managing infrastructure using Terraform within a Crossplane control plane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-provider-terraform-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-terraform](https://github.com/crossplane-contrib/provider-terraform/pkgs/container/provider-terraform) image. It offers the same functionality as the upstream for provisioning and managing infrastructure using Terraform modules via the Crossplane control plane. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS Support

The `crossplane-provider-terraform-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started Guide

### Install the Terraform provider
Install the provider into the Kubernetes cluster with a Kubernetes configuration file.

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-terraform
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-terraform-fips:latest
  skipDependencyResolution: true
```

Apply this configuration with `kubectl apply -f`. After installing the provider, verify the install with `kubectl get providers`.

```bash
$ kubectl get providers
NAME                 INSTALLED   HEALTHY   PACKAGE                                                     AGE
provider-terraform   True        True      cgr.dev/ORGANIZATION/crossplane-provider-terraform-fips:latest   60s
```
It may take up to 5 minutes to report `HEALTHY`.

## Documentation and Resources:
- [Crossplane Provider Terraform GitHub Repository](https://github.com/crossplane-contrib/provider-terraform)
- [Crossplane Provider Terraform Quickstart Guide](https://marketplace.upbound.io/providers/upbound/provider-terraform/v1.0.0)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-s3-gateway-fips

# nginx-s3-gateway-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-s3-gateway-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-s3-gateway-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NGINX S3 Gateway

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the [upstream NGINX S3 Gateway image](https://github.com/nginx/nginx-s3-gateway). Switching to Chainguard's image should not require any changes to your existing configuration.

By default, this image runs as a non-root user and listens on port 8080. For environments that require root privileges, root variants are available with the `-root` suffix (e.g., `latest-root`, `latest-root-dev`).

### FIPS Support

The `nginx-s3-gateway-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Docker

First, set up MinIO as an S3-compatible storage backend using Chainguard's MinIO image:

```bash
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=minioadmin \
  cgr.dev/ORGANIZATION/minio server /data --console-address ":9001"
```

Create a bucket in MinIO:
```bash
docker exec minio mc alias set local http://localhost:9000 minioadmin minioadmin
docker exec minio mc mb local/mybucket
```

Now run NGINX S3 Gateway to proxy requests to MinIO:

```bash
docker run -d \
  --name nginx-s3-gateway-fips \
  -p 8080:8080 \
  -e S3_BUCKET_NAME=mybucket \
  -e S3_SERVER=host.docker.internal \
  -e S3_SERVER_PORT=9000 \
  -e S3_SERVER_PROTO=http \
  -e S3_STYLE=path \
  -e S3_REGION=us-east-1 \
  -e AWS_ACCESS_KEY_ID=minioadmin \
  -e AWS_SECRET_ACCESS_KEY=minioadmin \
  -e ALLOW_DIRECTORY_LIST=true \
  -e AWS_SIGS_VERSION=4 \
  cgr.dev/ORGANIZATION/nginx-s3-gateway-fips:latest
```

Test the gateway:
```bash
# Configure AWS CLI for MinIO
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin

# Create and upload a file to MinIO
echo "Hello World" > test.txt
aws s3 cp test.txt s3://mybucket/ --endpoint-url http://localhost:9000

# Access the file through NGINX S3 Gateway
curl http://localhost:8080/test.txt

# List files through NGINX S3 Gateway
curl http://localhost:8080/
```

### Kubernetes

For Kubernetes deployments, please refer to the [upstream getting started guide](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md#running-inside-kubernetes) which includes examples for various scenarios including EKS with IAM roles.

## Documentation and Resources

- [NGINX S3 Gateway Official Repository](https://github.com/nginx/nginx-s3-gateway)
- [Getting Started Guide](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md)
- [Environment Variables Reference](https://github.com/nginx/nginx-s3-gateway#configuration)
- [Advanced Configuration](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md#advanced-configuration)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2-fips

# pgpool2-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Middleware that works between PostgreSQL servers and a PostgreSQL database client.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Steampipe Image is meant to provide the [pgpool2 package](https://github.com/pgpool/pgpool2) in a container. It currently does not have an external counterpart image which is actively maintained. However, the image is similar to the discontinued upstream image for [pgpool-II](https://hub.docker.com/r/pgpool/pgpool).
Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

**Note:** `Pgpool2` provides `md5` password encryption support via its built-in `pg_md5` utility, and does not use system OpenSSL for this purpose.

## Getting Started
### Pgpool-II on Kubernetes
**Prerequisites:** Kubernetes Cluster, `kubectl`, PostgreSQL Operator and a PostgreSQL Cluster

**Configuration:** There are two ways you can configure Pgpool-II.
- Using environment variables
- Using a ConfigMap

**Pgpool-II deployment example:**
```
# Download the Pgpool-II deployment manifest
curl -O https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml

# Update the deployment to use Chainguard's pgpool2-fips image
sed -i 's|image: pgpool/pgpool2$|image: cgr.dev/ORGANIZATION/pgpool2-fips:latest|' pgpool-deploy-metrics.yaml

# Edit parameters like POSTGRES* and PGPOOL* variables according to your configuration

# Apply the modified deployment
kubectl apply -f pgpool-deploy-metrics.yaml

```
Verify Deployment:
```
kubectl get pods -l app=pgpool
```
**Connect via Pgpool-II:**
Update your application to connect through the Pgpool-II service endpoint instead of directly to PostgreSQL.

## Documentation and Resources
For more information, please refer to [the official documentation for pgpool2 project](https://www.pgpool.net/mediawiki/index.php/Main_Page). In case you're looking for sample deployment instructions, please refer to [Pgpool-II on Kubernetes](https://www.pgpool.net/docs/pgpool-II-4.2.3/en/html/example-kubernetes.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rekor

# rekor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rekor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rekor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Rekor is one of the core components of the sigstore stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Sigstore Rekor

Rekor is one of the core components of the sigstore stack.  For more information
on this see [`sigstore-scaffolding`](../sigstore-scaffolding/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatus-fips

# gatus-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatus-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatus-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Gatus is a dev-oriented health dashboard that gives you the ability to monitor your services using HTTP, ICMP, TCP and DNS queries

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Gatus FIPS image is a lean, Wolfi-based container image. It mirrors the [Docker image from the Gatus project](https://hub.docker.com/r/twinproduction/gatus) in functionality and has minimal dependencies like the upstream project.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started

To run Gatus locally with Docker:

```bash
docker run -p 8080:8080 --name gatus cgr.dev/ORGANIZATION/gatus-fips:latest
```

To run Gatus locally with one of your own config files:

```bash
docker run -p 8080:8080 --name gatus \
--mount type=bind,source="$(pwd)"/config.yaml,target=/config/config.yaml \
cgr.dev/ORGANIZATION/gatus-fips:latest
```

## Helm Installation

To deploy Gatus with a Helm chart:

```bash
helm repo add twin https://twin.github.io/helm-charts
helm repo update
helm install gatus twin/gatus --set image.repository=cgr.dev/ORGANIZATION --set image.tag=latest
```

Please find the documentation on how to monitor TCP endpoints, UDP endpoints and other options in [project documentation](https://github.com/TwiN/gatus/blob/master/README.md#monitoring-a-tcp-endpoint).

Additional examples of Gatus Deployment can be referenced in [Gatus Repo](https://github.com/TwiN/gatus/tree/master/.examples).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-exporter

# memcached-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A memcached exporter for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Memcached

By default the memcached-exporter serves on port 0.0.0.0:9150 at /metrics:

```sh
docker run -p 9150:9150 cgr.dev/chainguard/memcached-exporter:latest
```

```sh
$ docker run -p 9150:9150 cgr.dev/chainguard/memcached-exporter:latest
ts=2023-04-26T17:47:53.477Z caller=main.go:58 level=info msg="Starting memcached_exporter" version="(version=0.11.2, branch=HEAD, revision=48795923bbe6c23eb044c522283e0d865bffbc77)"
ts=2023-04-26T17:47:53.478Z caller=main.go:59 level=info msg="Build context" context="(go=go1.20.3, platform=linux/amd64, user=@fv-az251-622, date=19700101-00:00:00, tags=netgo)"
ts=2023-04-26T17:47:53.478Z caller=tls_config.go:232 level=info msg="Listening on" address=[::]:9150
ts=2023-04-26T17:47:53.478Z caller=tls_config.go:235 level=info msg="TLS is disabled." http2=false address=[::]:9150
```

## Users and Directories

By default this image runs as a non-root user named `nonroot` with a uid of 65532.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nfpm

# nfpm
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nfpm` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nfpm/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

nFPM is Not FPM - a simple deb, rpm, apk, ipk, and arch linux packager written in Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `nfpm` container image is a drop-in replacement for the upstream [nFPM image](https://github.com/goreleaser/nfpm). It provides the same functionality and configuration options as the upstream image, with improved security and minimal CVEs.

## Getting Started

nFPM (Not FPM) is a simple and fast packager for creating `.deb`, `.rpm`, `.apk`, and `.archlinux` packages without external dependencies.

To get started with the nfpm Chainguard Container, you can initialize a new nFPM configuration file:

```shell
docker run --rm -v $(pwd):/work -w /work cgr.dev/ORGANIZATION/nfpm:latest init
```

This will create an `nfpm.yaml` configuration file in your current directory. Edit this file to specify your package details, then build your package:

```shell
# Build a Debian package
docker run --rm -v $(pwd):/work -w /work cgr.dev/ORGANIZATION/nfpm:latest pkg --packager deb --target my-package.deb

# Build an RPM package
docker run --rm -v $(pwd):/work -w /work cgr.dev/ORGANIZATION/nfpm:latest pkg --packager rpm --target my-package.rpm

# Build an APK package
docker run --rm -v $(pwd):/work -w /work cgr.dev/ORGANIZATION/nfpm:latest pkg --packager apk --target my-package.apk
```

You can also generate shell completion scripts:

```shell
# Generate bash completion
docker run --rm cgr.dev/ORGANIZATION/nfpm:latest completion bash > nfpm-completion.bash

# Generate zsh completion
docker run --rm cgr.dev/ORGANIZATION/nfpm:latest completion zsh > _nfpm

# Generate fish completion
docker run --rm cgr.dev/ORGANIZATION/nfpm:latest completion fish > nfpm.fish
```

## Documentation and Resources

- [nFPM Documentation](https://nfpm.goreleaser.com/)
- [nFPM GitHub Repository](https://github.com/goreleaser/nfpm)
- [Configuration Reference](https://nfpm.goreleaser.com/docs/configuration/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault-csi-provider

# vault-csi-provider
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault-csi-provider` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault-csi-provider/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

HashiCorp Vault Provider for Secret Store CSI Driver

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility notes 

This image is compatible with the [HashiCorp Vault CSI Provider image](https://github.com/hashicorp/vault-csi-provider). Switching to Chainguard's image should not require any changes to your existing configuration.
By default, this image runs as a non-root user, with temporary root privileges enabled for specific needs like communicating with a privileged socket.

### Differences to hashicorp/vault-csi-provider image
This image is not completely identical to the `hashicorp/vault-csi-provider` image. In particular:
 - The `vault-csi-provider` binary is stored in `/usr/bin`, with symlink to the binary placed in `/bin` for compatibility
 - The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the Hashicorp image uses Alpine (which is musl based)

## Getting started 
# Using Vault CSI Provider

The image is not meant to be run as standalone and has to be run inside a Kubernetes cluster.
Vault CSI Provider image is meant to be used as part of [Hashicorp Vault](https://developer.hashicorp.com/vault) deployment, using the [hashicorp/vault](https://github.com/hashicorp/vault-helm) Helm chart.

To use the Chainguard image, configure the [hashicorp/vault](https://github.com/hashicorp/vault-helm) Helm chart to enable the specify the image in the values. Such as:

```yaml
# disable vault-agent injection
injector:
  enabled: false
csi:
  enabled: true
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault-csi-provider"
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
# other values for Vault
# ...
```

It is recommended to also use Chainguard images for `vault` and `vault-k8s` images - for example:

```yaml
# disable vault-agent injection
injector:
  enabled: false
csi:
  enabled: true
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault-csi-provider"
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
server:
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault"
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
# other values for Vault
# ...
```
**NOTE**: [Secrets Store CSI Driver](https://secrets-store-csi-driver.sigs.k8s.io/) first needs to be installed in the cluster before adding the Vault CSI Provider.

## Documentation and resources
The [Vault CSI Provider Installation](https://developer.hashicorp.com/vault/docs/platform/k8s/csi/installation) document provides a step-by-step instruction for installing the Vault CSI Provider and configuring Vault to allow Kubernetes-based authentication.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-corretto-jdk

# amazon-corretto-jdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-corretto-jdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-corretto-jdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Amazon Corretto is a no-cost, multi-platform, production-ready distribution of corresponding version of OpenJDK

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `amazon-corretto-jdk` image is a production-ready distribution of [OpenJDK provided by Amazon Corretto](https://aws.amazon.com/corretto/). This image is part of the Chainguard Containers collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production.

## Getting Started

To test the `amazon-corretto-jdk` image, start by pulling the image:

```sh
docker pull cgr.dev/ORGANIZATION/amazon-corretto-jdk:latest
```

Replace `ORGANIZATION` with your organization's name.

Next, run a container using the image you just downloaded:

```sh
docker run -it --rm cgr.dev/ORGANIZATION/amazon-corretto-jdk:latest java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Create a simple Java application, for example, `HelloWorld.java`:

```java
    public class HelloWorld {
         public static void main(String[] args) {
              System.out.println("Hello, World!");
         }
    }
```

Then compile and run the application inside the container:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/amazon-corretto-jdk:latest javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/amazon-corretto-jdk:latest java HelloWorld
```
You should see the output `Hello, World!`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### loki

# loki
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/loki` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/loki/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `loki` application for log aggregation. `loki` can be used to stream, aggregate, and query logs from apps and infrastructure.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Loki is comprised of 2 images:

cgr.dev/ORGANIZATION/loki
cgr.dev/ORGANIZATION/loki-canary

The Chainguard images usually do not run as the root user and contain only the minimum set of tools and dependencies needed to function. This means they do not include utilities such as a shell or a package manager.
## Getting Started
We can use helm charts for testing dapr images. We can create a values.yaml that'll override upstream images with Chainguard images.

```yaml
loki:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/loki
    tag: latest

lokiCanary:
    image:
        registry: cgr.dev
        repository: ORGANIZATION/loki-canary
        tag: latest
```

After that we can do the following to install the chart in our cluster.
```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki -f values.yaml --wait
```

We can then validate if the `loki` and `loki-canary` pods are up using the following command:

```
kubectl get pods -n loki-system
```

You should see the `loki` and `loki-canary` pods up and running:
```
/ # kubectl get pods -n loki-system

NAME                            READY   STATUS    RESTARTS   AGE
loki-0                          2/2     Running   0          45h
loki-canary-5crfb               1/1     Running   0          45h
loki-gateway-6c9dc9b78c-2tqmq   1/1     Running   0          45h
loki-results-cache-0            2/2     Running   0          45h
```

## Documentation and Resources

* [Upstream Installation Guide](https://grafana.com/docs/loki/latest/setup/install/helm/)
* [Upstream Documentation](https://grafana.com/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitea

# gitea
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitea` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitea/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy Gitea

To deploy Gitea with Chainguard's images, add the Helm repo:

```bash
helm repo add gitea https://dl.gitea.com/charts/
```

Update Helm chart info from your repositories:

```bash
helm repo update
```

Create a namespace for Gitea:

```bash
kubectl create ns gitea-system
```

Finally, install the chart:

```bash
helm install gitea gitea/gitea --namespace gitea-system \
  --set image.fullOverride=cgr.dev/chainguard-private/gitea:latest \
  --set redis-cluster.enabled=false --set redis.enabled=true \
  --set postgresql.enabled=true --set postgresql-ha.enabled=false \
  --set persistence.enabled=true
```

See [here](https://gitea.com/gitea/helm-chart) for all configuration options.

Note: the use of either `image.fullOverride` or `image.digest` is needed
or else the Helm chart will automatically append a "-rootless" suffix to the image tag.

> **AN IMPORTANT NOTE**: We have identified an issue affecting the deployment of the Gitea Helm chart version v11.0.1. Customers attempting to deploy this specific version may experience failures. This issue is currently being tracked on the official repository (Issue [#847](https://gitea.com/gitea/helm-gitea/issues/847)). As an interim solution, we recommend customers to clone the Helm chart repository locally and execute the installation directly from the cloned repository using: `helm install <your-release-name> /path/to/helm-gitea`. 
> Please use this workaround until a new stable release that resolves this issue becomes available.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-csi-driver

# cert-manager-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes CSI driver that automatically mounts signed certificates to Pods using ephemeral volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cert-manager-csi-driver image is comparable to the [quay.io/jetstack/cert-manager-csi-driver](https://quay.io/repository/jetstack/cert-manager-csi-driver?tab=tags&tag=latest) image. As with many of Chainguard's other container images, this image contains only the minimum number of dependencies it needs to function. It doesn't include things like a shell or package manager.

## Getting Started

### Pre-requisites
* A Kubernetes cluster with [cert-manager](https://cert-manager.io/docs/installation/) installed

### Deployment

Create a `values.yaml` file with the following content:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cert-manager-csi-driver
  tag: latest
```

To install csi-driver, use Helm:

```shell
helm repo add jetstack https://charts.jetstack.io --force-update

helm upgrade cert-manager-csi-driver jetstack/cert-manager-csi-driver \
  --install \
  --namespace cert-manager \
  -f values.yaml \
  --wait
```

## Documentation and Resources
* [Official Documentation](https://cert-manager.io/docs/usage/csi-driver/)
* [Helm Chart](https://github.com/cert-manager/csi-driver/tree/main/deploy/charts/csi-driver)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3807

# request-3807
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3807` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3807/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus

# prometheus
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for Prometheus, a systems and service monitoring system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Prometheus image is meant to serve as a drop-in replacement for the [`prom/prometheus` image](https://hub.docker.com/r/prom/prometheus). Like most other Chainguard container images, the production variant of the Prometheus image comes with only the minimum dependencies needed to function and does not include things like a shell or package manager. 

## Getting Started

Chainguard's Prometheus image requires a Prometheus configuration file in order to run. It comes with an example configuration file, which is found within the container at `/etc/prometheus/prometheus.yml`. The values from this example can be found in the [Prometheus source tree](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus.yml).

You can test out the image using the example configuration file with the following command:

```shell
docker run -p 9090:9090 cgr.dev/ORGANIZATION/prometheus:latest --config.file=/etc/prometheus/prometheus.yml
```

Note that you will need to change `ORGANIZATION` to align with the name of your organization's private repository within the Chainguard registry.

```
. . .
time=2024-12-13T01:10:13.001Z level=INFO source=main.go:1224 msg="Server is ready to receive web requests."
time=2024-12-13T01:10:13.001Z level=INFO source=manager.go:168 msg="Starting rule manager..." component="rule manager"
```

The default port that Prometheus listens on is `9090`. By including `-p 9090:9090` in the previous command, the application will be exposed on the host at port `9090`. You can use your web browser to check whether the Prometheus application is indeed running by navigating to [`localhost:9090`](http://localhost:9090/). 

Alternatively, you can use a Prometheus configuration file stored locally by mounting a volume, like this:

```shell
docker run -p 9090:9090 -v /path/to/local/prometheus.yml:/prometheus.yml cgr.dev/ORGANIZATION/prometheus:latest
```

## Documentation and Resources

* [Official Prometheus Documentation](https://prometheus.io/docs/introduction/overview/)
* [Prometheus GitHub Repository](https://github.com/prometheus/prometheus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-otel-fips

# nginx-otel-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-otel-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-otel-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based nginx HTTP server with OpenTelemetry observability integration and FIPS 140-2 hardened cryptography

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `nginx-otel-fips` container image extends the standard nginx functionality with OpenTelemetry instrumentation for distributed tracing and FIPS 140-2 hardened cryptography. It maintains all the compatibility features of the standard nginx Chainguard Container.

### FIPS Support

The `nginx-otel-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

### Users

Like the standard nginx Chainguard Container, this image runs as a non-root `nonroot` user (UID/GID 65532) and does not require privilege escalation.

### Default port

The default port for the `nginx-otel-fips` Chainguard Container is `8080`, rather than `80`.

### IPv6 Support

By default, the container only listens on IPv4. You can add IPv6 support by mounting a configuration file with IPv6 listeners:

```nginx
server {
    listen       8080;
    listen  [::]:8080;
    ...
}
```

### OpenTelemetry Integration

This image includes the nginx OpenTelemetry module (`ngx_otel_module`) which enables distributed tracing with FIPS-compliant cryptographic operations. The module is available as an opt-in configuration and supports:

- OTLP (OpenTelemetry Protocol) trace export with FIPS-compliant TLS
- Configurable service names and endpoints
- Per-location tracing controls
- Integration with observability platforms like Jaeger, Zipkin, and others

### Available nginx Modules

This image includes all nginx modules from the upstream `nginx:otel` image for feature parity:

- **Core modules**: HTTP
- **Additional modules**: GeoIP, Image Filter, XSLT Filter, JavaScript (njs)
- **OpenTelemetry module**: Distributed tracing and observability

### Variants

Two variants are available following nginx's release strategy:

- **stable**: Based on nginx stable releases (even version numbers)
- **mainline**: Based on nginx mainline releases (odd version numbers) - tagged as `latest`

### User Directive Warning

Starting the container gives the following warning:

```shell
 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
```

This warning indicates the container is already running as the `nonroot` user, so the directive has no effect. The directive is included for compatibility with configurations that may run the container as root.

### Entrypoint

The entrypoint for the `nginx-otel-fips` Chainguard Container is `/docker-entrypoint.sh`. Commands run as part of `docker run` will be passed as arguments to nginx.

## Getting Started

The `nginx-otel-fips` Chainguard Container provides nginx with OpenTelemetry capabilities and FIPS-compliant cryptography. To try out the basic image:

```shell
docker run -p 8080:8080 cgr.dev/ORGANIZATION/nginx-otel-fips:latest
```

After starting the container, navigate to `localhost:8080` in your web browser to see the default nginx welcome page.

## OpenTelemetry Configuration

To enable OpenTelemetry tracing with FIPS-compliant cryptography, you need to include the module and configure the tracing endpoint. Here's a basic example:

```nginx
# Include the OpenTelemetry module (opt-in)
include /etc/nginx/modules/10_otel.conf;

events {
    worker_connections 1024;
}

http {
    # Configure OpenTelemetry
    otel_exporter { endpoint jaeger:4317; }
    otel_trace on;
    otel_service_name nginx-test;

    server {
        listen 8080;
        location / { return 200 'OpenTelemetry enabled nginx response'; }
        location /health { return 200 'OK'; }
    }
}
```

## Example with Jaeger

Here's a complete example running nginx-otel-fips with Jaeger for trace collection:

First, start Jaeger:

```shell
docker run -d --name jaeger \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 16686:16686 \
  cgr.dev/ORGANIZATION/jaeger-all-in-one:latest
```

Create an nginx configuration file:

```shell
mkdir -p nginx-conf
cat > nginx-conf/nginx.conf <<EOF
include /etc/nginx/modules/10_otel.conf;

worker_processes  auto;

error_log  /var/log/nginx/error.log notice;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    otel_exporter { endpoint jaeger:4317; }
    otel_trace on;
    otel_service_name nginx-test;
    server {
        listen 8080;
        location / { return 200 'OpenTelemetry enabled nginx response'; }
        location /health { return 200 'OK'; }
    }
}

EOF
```

Run nginx-otel-fips with the test configuration:

```shell
docker run -p 8080:8080 \
  --link jaeger \
  -v $(pwd)/nginx-conf/nginx.conf:/etc/nginx/nginx.conf \
  cgr.dev/ORGANIZATION/nginx-otel-fips:latest
```

Generate some traffic:

```shell
curl -sf localhost:8080

OpenTelemetry enabled nginx response
```

Check that your `nginx-test` service has been registered with Jaeger at `http://localhost:16686/api/services`

View traces at `http://localhost:16686/api/traces/service=nginx-test`

## Run in a read-only File System

Like the standard nginx container, you can run nginx-otel-fips with a read-only filesystem:

```shell
docker run \
 --read-only \
 --tmpfs /var/lib/nginx/tmp/ --tmpfs /var/run/ \
 --cap-drop=ALL \
 -p 8080:8080 \
 cgr.dev/ORGANIZATION/nginx-otel-fips:latest
```

## Documentation and Resources

* [Official nginx Documentation](https://nginx.org/en/docs/)
* [nginx OpenTelemetry Module](https://github.com/nginxinc/nginx-otel)
* [OpenTelemetry Documentation](https://opentelemetry.io/docs/)
* [Jaeger Documentation](https://www.jaegertracing.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### generic-device-plugin

# generic-device-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/generic-device-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/generic-device-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes device plugin to schedule generic Linux devices

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's generic-device-plugin image is meant to serve as a drop-in replacement for the [`squat/generic-device-plugin` image](https://hub.docker.com/r/squat/generic-device-plugin). Like most other Chainguard container images, the production variant comes with only the minimum dependencies needed to function.

## Usage

You can deploy using the upstream manifest and update the image:

```bash
kubectl apply -f https://raw.githubusercontent.com/squat/generic-device-plugin/main/manifests/generic-device-plugin.yaml
kubectl set image -n kube-system daemonset/generic-device-plugin generic-device-plugin=cgr.dev/ORGANIZATION/generic-device-plugin:latest
```

Or deploy as a DaemonSet with a custom configuration:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: generic-device-plugin
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: generic-device-plugin
  template:
    metadata:
      labels:
        app: generic-device-plugin
    spec:
      priorityClassName: system-node-critical
      containers:
      - name: generic-device-plugin
        image: cgr.dev/ORGANIZATION/generic-device-plugin:latest
        args:
        - --device
        - '{"name": "fuse", "groups": [{"count": 10, "paths": [{"path": "/dev/fuse"}]}]}'
        securityContext:
          privileged: true
        volumeMounts:
        - name: device-plugin
          mountPath: /var/lib/kubelet/device-plugins
        - name: dev
          mountPath: /dev
      volumes:
      - name: device-plugin
        hostPath:
          path: /var/lib/kubelet/device-plugins
      - name: dev
        hostPath:
          path: /dev
```

For more configuration options, see the [upstream documentation](https://github.com/squat/generic-device-plugin).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-extension-installer-fips

# argocd-extension-installer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-extension-installer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-extension-installer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-resizer

# kubernetes-csi-external-resizer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-resizer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-resizer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [kubernetes-csi/external-resizer](https://github.com/kubernetes-csi/external-resizer).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-resizer` container image is comparable to the [official csi-resizer image](https://gcr.io/k8s-staging-sig-storage/csi-resizer:canary). Chainguard Containers are designed with minimalism and security in mind, and thus the Jenkins image has the following differences from the upstream image:

* Chainguard's `kubernetes-csi-external-resizer` image does not sets any `WorkingDir` whereas the upstream sets it to: `/`.
* Chainguard's `kubernetes-csi-external-resizer` image sets the entrypoint to `/usr/bin/csi-resizer` whereas the upstream sets it to: `/csi-resizer`.

## Getting Started

You can deploy this image using the following [manifest](https://raw.githubusercontent.com/kubernetes-csi/external-resizer/master/deploy/kubernetes/deployment.yaml). Once you apply this manifest, make sure to run the below command to replace the image with Chainguard's `kubernetes-csi-external-resizer`

```
  kubectl set image deployment/csi-resizer csi-resizer="cgr.dev/ORGANIZATION/kubernetes-csi-external-resizer"
```

You'll additionally need to create a new service account and give it enough privileges to run the `external-resizer`. Please follow the [official
instructions](https://github.com/kubernetes-csi/external-resizer/blob/master/README.md#usage) for more.

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-resizer/blob/master/README.md#usage)

## Using external-resizer

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promitor-agent-scraper

# promitor-agent-scraper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promitor-agent-scraper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promitor-agent-scraper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Promitor is an Azure Monitor scraper which makes the metrics available through a scraping endpoint for Prometheus or push to a StatsD server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy Promitor Agent Scraper on Kubernetes, you can follow the [official documentation](https://docs.promitor.io/v2.11/deployment/scraper/kubernetes/) to install the [Helm Chart](https://github.com/promitor/charts/tree/main/promitor-agent-scraper).

```bash
helm upgrade --install promitor-agent-scraper promitor/promitor-agent-scraper \
  --create-namespace \
  --namespace promitor \
  --set image.repository=cgr.dev/ORGANIZATION/promitor-agent-scraper \
  --set image.tag=latest \
  --set azureMetadata.tenantId="<AZURE_TENANT_ID>" \
  --set azureMetadata.subscriptionId="<AZURE_SUBSCRIPTION_ID>" \
  --set azureAuthentication.appId="<AZURE_APP_ID>" \
  --set azureAuthentication.appKey="<AZURE_APP_KEY>"
```

Note: For quick test, you can use the [upstream default values](https://github.com/tomkerkhove/promitor/blob/1f21f61fe8a9069d9c3a3d89e70ca2e6805ae59d/config/promitor/scraper/metrics.yaml#L3-L4) for `azureMetadata` and use arbitrary values for the `azureAuthentication` settings.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### squid-proxy-fips

# squid-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/squid-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/squid-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2

# pgpool2
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Middleware that works between PostgreSQL servers and a PostgreSQL database client.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Steampipe Image is meant to provide the [pgpool2 package](https://github.com/pgpool/pgpool2) in a container. It currently does not have an external counterpart image which is actively maintained. However, the image is similar to the discontinued upstream image for [pgpool-II](https://hub.docker.com/r/pgpool/pgpool).
Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

**Note:** `Pgpool2` provides `md5` password encryption support via its built-in `pg_md5` utility, and does not use system OpenSSL for this purpose.

## Getting Started
### Pgpool-II on Kubernetes
**Prerequisites:** Kubernetes Cluster, `kubectl`, PostgreSQL Operator and a PostgreSQL Cluster

**Configuration:** There are two ways you can configure Pgpool-II.
- Using environment variables
- Using a ConfigMap

**Pgpool-II deployment example:**
```
# Download the Pgpool-II deployment manifest
curl -O https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml

# Update the deployment to use Chainguard's pgpool2 image
sed -i 's|image: pgpool/pgpool2$|image: cgr.dev/ORGANIZATION/pgpool2:latest|' pgpool-deploy-metrics.yaml

# Edit parameters like POSTGRES* and PGPOOL* variables according to your configuration

# Apply the modified deployment
kubectl apply -f pgpool-deploy-metrics.yaml

```
Verify Deployment:
```
kubectl get pods -l app=pgpool
```
**Connect via Pgpool-II:**
Update your application to connect through the Pgpool-II service endpoint instead of directly to PostgreSQL.

## Documentation and Resources
For more information, please refer to [the official documentation for pgpool2 project](https://www.pgpool.net/mediawiki/index.php/Main_Page). In case you're looking for sample deployment instructions, please refer to [Pgpool-II on Kubernetes](https://www.pgpool.net/docs/pgpool-II-4.2.3/en/html/example-kubernetes.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-s3-gateway

# nginx-s3-gateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-s3-gateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-s3-gateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NGINX S3 Gateway

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the [upstream NGINX S3 Gateway image](https://github.com/nginx/nginx-s3-gateway). Switching to Chainguard's image should not require any changes to your existing configuration.

By default, this image runs as a non-root user and listens on port 8080. For environments that require root privileges, root variants are available with the `-root` suffix (e.g., `latest-root`, `latest-root-dev`).

## Getting Started

### Docker

First, set up MinIO as an S3-compatible storage backend using Chainguard's MinIO image:

```bash
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=minioadmin \
  cgr.dev/ORGANIZATION/minio server /data --console-address ":9001"
```

Create a bucket in MinIO:
```bash
docker exec minio mc alias set local http://localhost:9000 minioadmin minioadmin
docker exec minio mc mb local/mybucket
```

Now run NGINX S3 Gateway to proxy requests to MinIO:

```bash
docker run -d \
  --name nginx-s3-gateway \
  -p 8080:8080 \
  -e S3_BUCKET_NAME=mybucket \
  -e S3_SERVER=host.docker.internal \
  -e S3_SERVER_PORT=9000 \
  -e S3_SERVER_PROTO=http \
  -e S3_STYLE=path \
  -e S3_REGION=us-east-1 \
  -e AWS_ACCESS_KEY_ID=minioadmin \
  -e AWS_SECRET_ACCESS_KEY=minioadmin \
  -e ALLOW_DIRECTORY_LIST=true \
  -e AWS_SIGS_VERSION=4 \
  cgr.dev/ORGANIZATION/nginx-s3-gateway:latest
```

Test the gateway:
```bash
# Configure AWS CLI for MinIO
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin

# Create and upload a file to MinIO
echo "Hello World" > test.txt
aws s3 cp test.txt s3://mybucket/ --endpoint-url http://localhost:9000

# Access the file through NGINX S3 Gateway
curl http://localhost:8080/test.txt

# List files through NGINX S3 Gateway
curl http://localhost:8080/
```

### Kubernetes

For Kubernetes deployments, please refer to the [upstream getting started guide](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md#running-inside-kubernetes) which includes examples for various scenarios including EKS with IAM roles.

## Documentation and Resources

- [NGINX S3 Gateway Official Repository](https://github.com/nginx/nginx-s3-gateway)
- [Getting Started Guide](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md)
- [Environment Variables Reference](https://github.com/nginx/nginx-s3-gateway#configuration)
- [Advanced Configuration](https://github.com/nginx/nginx-s3-gateway/blob/main/docs/getting_started.md#advanced-configuration)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### strongswan

# strongswan
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/strongswan` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/strongswan/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

strongSwan is an OpenSource IPsec-based VPN solution

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Since there isn't  an official upstream image, we have built our own. It closely references the [strongX509/docker](https://github.com/strongX509/docker) community project, which also contains helpful configuration files if you would like to review strongSwan's functionalities

## Getting Started

The following script demonstrates how to set up a VPN server and client using the StrongSwan image:

```bash
#!/bin/bash

# Clone the StrongSwan Docker repository
git clone https://github.com/strongX509/docker.git
cd docker

# Create networks
docker network create --subnet=192.168.0.0/24 internet
docker network create --subnet=10.1.0.0/16 intranet

# Run VPN server container
docker run --privileged --rm -d \
  --name vpn-server --net internet --ip 192.168.0.2 \
  --net intranet --ip 10.1.0.2 \
  --cap-add=NET_ADMIN --cap-add=SYS_ADMIN --cap-add=SYS_MODULE \
  -v $(pwd)/strongswan/server:/etc/swanctl \
  -v $(pwd)/strongswan/strongswan.conf:/etc/strongswan.conf \
  "cgr.dev/chainguard/strongswan:latest"

# Connect VPN server to intranet network
docker network connect --ip 10.1.0.2 intranet vpn-server

# Start StrongSwan Charon daemon in the VPN server container
docker exec -d vpn-server /usr/lib/strongswan/charon

# Run VPN client container
docker run --privileged --rm -d \
  --name vpn-client --net internet --ip 192.168.0.3 \
  --cap-add=NET_ADMIN --cap-add=SYS_ADMIN --cap-add=SYS_MODULE \
  -v $(pwd)/strongswan/client:/etc/swanctl \
  -v $(pwd)/strongswan/strongswan.conf:/etc/strongswan.conf \
  "cgr.dev/chainguard/strongswan:latest"

# List connections from the VPN client
docker exec -it vpn-client swanctl --list-conns
```

### Documentation and Resources

To better understand the available configuration options and features, you can explore the [strongSwan documentation](https://docs.strongswan.org/docs/latest/index.html). It provides comprehensive details about IPsec protocols, configuration guides, and deployment scenarios for secure VPN setups.

You may also find the following resources to be helpful:

- [StrongSwan Official Website](https://www.strongswan.org/)
- [strongX509/docker](https://github.com/strongX509/docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1466

# request-1466
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1466` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1466/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-fleet

# rancher-fleet
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-fleet` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-fleet/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Deploy workloads from Git to large fleets of Kubernetes clusters

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`rancher-fleet` is composed of multiple images:
- `cgr.dev/ORGANIZATION/rancher-fleet:latest`
- `cgr.dev/ORGANIZATION/rancher-fleet-agent:latest`

Chainguard's `rancher-fleet` container images are comparable to the official [rancher/fleet](https://hub.docker.com/r/rancher/fleet) and [rancher/fleet-agent](https://hub.docker.com/r/rancher/fleet-agent) images.

## Installation with Helm Using `values.yaml`

There is an official documentation available in the Rancher Fleet website, you can find it [here](https://fleet.rancher.io/quickstart).

Create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/rancher-fleet
  tag: latest

agentImage:
  repository: cgr.dev/ORGANIZATION/rancher-fleet-agent
  tag: latest
EOF
```

Install the Helm chart for Rancher Fleet using the following command:

```shell
helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet  --values values.yaml
```

Following that, you can use `kubectl` to check whether the puds are running:

```shell
kubectl get pods -n cattle-fleet-system
```
```
NAME                               READY   STATUS    RESTARTS   AGE
fleet-agent-0                       2/2     Running   0          86s
fleet-controller-57689f8757-8d4cn   3/3     Running   0          102s
gitjob-59d66b6b8-jv2f8             1/1     Running   0          102s
```

You should now have Rancher Fleet with the Chainguard Rancher Fleet Agent running in your cluster.

## Documentation and Resources

For more information on working with Rancher Fleet, please refer to [the official documentation](https://fleet.rancher.io/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-fips

# mongodb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MongoDB](https://www.mongodb.com/) is a document-oriented database management system. MongoDB is a popular example of a NoSQL database, and stores data in JSON-like documents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's mongodb-fips container image is comparable to [the official `mongo` image](https://hub.docker.com/_/mongo) available on Docker Hub. 

Like most of Chainguard's images, the mongodb-fips image does not operate as the root user and includes only the minimum packages needed to function. This means it doesn't include things like a shell or package manager.

### FIPS Support
The mongodb-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on [FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started

Here's one example of how Chainguard's mongodb-fips container image can be run:

```shell
docker run -d --rm -it -p 27017:27017 cgr.dev/ORGANIZATION/mongodb-fips --bind_ip_all --noauth
```

This example includes Docker's `-d` argument, which will cause the container to run in the background, as well as the `-p` argument, which publishes the container's port `27017` to the host machine's port `27017`. It also includes MongoDB's `--bind_ip_all` and `--noauth` arguments. These bind the `mongod` process to all IP addresses and instruct it to run without security, respectively. 

> [!WARNING]
> These selections are not recommended for production environments, but they are useful for testing that the MongoDB image is working properly.

Following that, connect to the MongoDB deployment with `mongosh`, the MongoDB shell:

```shell
mongosh --port 27017
```

Once connected, you can interact with the running MongoDB instance. For example, you can insert a new document:

```
test> db.products.insertOne( { item: "card", qty: 15 } )
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('662141e9a1519b8bd2ac3fc4') }
}
```

You can also run `mongosh` methods and commands to interact with the MongoDB deployment. For example, `show collections` will list the collection you just created with the previous `insertOne` method:

```
test> show collections
products
```

## Documentation and Resources
* [MongoDB Documentation](https://www.mongodb.com/docs/)
* [Upstream `mongo` image](https://hub.docker.com/_/mongo)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mattermost

# mattermost
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mattermost` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mattermost/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Community edition of Mattermost, a self-hostable chat service with file sharing, search, and integrations. It is designed as an internal chat for organisations and companies, and mostly markets itself as an open-source alternative to Slack and Microsoft Teams.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy Mattermost on Kubernetes, you can follow the [official documentation](https://docs.mattermost.com/install/install-kubernetes.html).

You can also jump to [official Helm Chart](https://github.com/mattermost/mattermost-helm/tree/master/charts/mattermost-team-edition) if you want to deploy Mattermost using Helm.

You can also check [TESTING.md](./TESTING.md) for how we test and deploy the `Mattermost` image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gotenberg

# gotenberg
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gotenberg` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gotenberg/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A developer-friendly API for converting numerous document formats into PDF files, and more!

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Gotenberg image is comparable to the ['gotenberg/gotenberg' image on Docker Hub](https://hub.docker.com/r/gotenberg/gotenberg/). Unlike the Gotenberg image on Docker Hub, Chainguard's image uses a UID/GID of 65532 instead of 1001 and runs as the user `nonroot` instead of `gotenberg`. Chainguard's image contains only the minimum set of dependencies and tools needed to function.

## Getting Started

### Docker

Getting started with Gotenberg is as easy as running Chainguard's image with Docker:

```bash
docker run --rm -p 3000:3000 cgr.dev/ORGANIZATION/gotenberg:latest
```

The Gotenberg API should now be available over [localhost:3000](http://localhost:3000).

By default, Chromium is configured to use angle with the swiftshader backend in Chainguard's Gotenberg image. Alternative options can be passed to Chromium passing CHROMIUM_USER_FLAGS:

```bash
docker run -e CHROMIUM_USER_FLAGS="<FLAGS>" cgr.dev/ORGANIZATION/gotenberg:latest 
```

### Helm

Alternatively, an unofficial Helm chart for Gotenberg is actively maintained [here](https://github.com/MaikuMori/helm-charts).

To deploy Gotenberg with Helm, add the repository:

```bash
helm repo add maikumori https://maikumori.github.io/helm-charts
helm repo update
```

Create a values manifest:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/gotenberg
  tag: latest
securityContext:
  readOnlyRootFilesystem: false
  allowPrivilegeEscalation: false
  privileged: false
  runAsUser: 65532
```

Then install the chart: 
                        
```bash                 
helm install gotenberg --namespace gotenberg maikumori/gotenberg --values ./values.yaml
```

Optionally port forward the API:

```bash
kubectl port-forward svc/gotenberg 3000:80 &
```

The Gotenberg API should now be available over [localhost:3000](http://localhost:3000).

You should now be up and running with Gotenberg! For additional information on getting started with Gotenberg, consult the official [Getting Started guide](https://gotenberg.dev/docs/getting-started/introduction).

## Resources and Documentation

- [Configuring Gotenberg](https://gotenberg.dev/docs/configuration)
- [Gotenberg API routes](https://gotenberg.dev/docs/routes)
- [Gotenberg troubleshooting](https://gotenberg.dev/docs/troubleshooting)
- [Unofficial Gotenberg Helm chart](https://github.com/MaikuMori/helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### superset-iamguarded

# superset-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/superset-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/superset-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Superset IAMGuarded is a security-enhanced variant of Superset designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Superset deployments.

## Helm Chart Installation

The Superset IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/superset
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install superset oci://cgr.dev/$ORGANIZATION/iamguarded-charts/superset \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Superset image
image:
  registry: myregistry.example.com
  repository: mirrored/superset-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus statsd exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-statsd-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Redis dependent chart images
redis:
  # Redis server image
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-server-iamguarded
    digest: sha256:... # Use specific digest instead of tag

  # Redis Sentinel image for high availability
  sentinel:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/redis-sentinel-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for volume permissions
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for sysctl
  sysctl:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # Prometheus Redis exporter for metrics
  metrics:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/prometheus-redis-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # kubectl image for management operations
  kubectl:
    image:
      registry: myregistry.example.com
      repository: mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# PostgreSQL dependent chart images
postgresql:
  # PostgreSQL image
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-iamguarded
    digest: sha256:... # Use specific digest instead of tag

  # Prometheus Exporter
  metrics:
    image:
      registry: myregistry.example.com
      repository: mirrored/prometheus-postgres-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for volume permissions
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install superset oci://cgr.dev/$ORGANIZATION/iamguarded-charts/superset@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/superset
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/superset:3.0.4
   Digest: sha256:083c999b293bd86aa63204e7a41325efa2c2ac4bca21cbd890b5eb5897d243ec
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Superset IAMGuarded installation using standard Superset verification methods. The deployment functions as a standard Superset instance, so all typical Superset validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Superset IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Superset and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grype-fips

# grype-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grype-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grype-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A vulnerability scanner for container images and filesystems. This image is built and tested for FIPS compliance to meet strict security standards in regulated environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `grype-fips` image is comparable to the [official grype Image](https://hub.docker.com/r/anchore/grype) but with the following changes:
* We use a different entrypoint `/usr/bin/grype` as compared to the upstream's endpoint `/grype`.
* We use a different `CMD` which is `help` whereas the upstream leaves it unset.
* We don't define any WorkingDir whereas the upstream sets it to `/tmp`.

This image is the FIPS version of our already existing `grype` image. It is built built and tested for FIPS compliance to meet strict security standards in regulated environments.

## Getting Started

The following command will scan an image for vulnerabilities using the `grype-fips` image. It analyzes the target image against known vulnerability databases and outputs a report with detected issues including vulnerability IDs, severities, and affected packages:

```
docker run --rm cgr.dev/ORGANIZATION/grype-fips:latest cgr.dev/chainguard/static:latest
```

When you run this command, you will receive output similar to the following, since Chainguard images are designed to have few-to-zero vulnerabilities.

```
No vulnerabilities found
```

However, if you try to run the scan on a regular image, you might see an output like this:

```
docker run --rm cgr.dev/ORGANIZATION/grype:latest golang

NAME                        INSTALLED              FIXED-IN     TYPE  VULNERABILITY     SEVERITY   
wget                        1.21.3-1+b1            (won't fix)  deb   CVE-2024-38428    Critical    
wget                        1.21.3-1+b1            (won't fix)  deb   CVE-2021-31879    Medium      
wget                        1.21.3-1+b1            (won't fix)  deb   CVE-2024-10524    Medium 
```

## Documentation and Resources

* [Grype's Official Getting Started](https://github.com/anchore/grype?tab=readme-ov-file#getting-started)
* [Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/reference/grype)
* [Provenance Information](https://edu.chainguard.dev/chainguard/chainguard-images/staying-secure/working-with-scanners/grype-tutorial/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-keeper-fips

# clickhouse-keeper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-keeper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-keeper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ClickHouse Keeper is a distributed coordination service that provides a ZooKeeper-compatible API for managing ClickHouse clusters. It handles distributed consensus, configuration management, and leader election using the Raft algorithm.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's ClickHouse Keeper FIPS container image is comparable to the [official ClickHouse Keeper image](https://hub.docker.com/r/clickhouse/clickhouse-keeper), built with FIPS-validated cryptographic modules. Like most other Chainguard container images, the ClickHouse Keeper image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

ClickHouse Keeper provides a ZooKeeper-compatible API and uses the Raft consensus algorithm for distributed coordination. It's designed as a modern replacement for ZooKeeper in ClickHouse clusters.

**Important:** ClickHouse Keeper is bundled into the main ClickHouse server binary. When deploying with [ClickStack](https://github.com/hyperdxio/helm-charts/tree/main/charts/clickstack) (the recommended upstream Helm chart), ClickHouse Keeper is deployed using the bundled binary from the main ClickHouse image, so this separate ClickHouse Keeper FIPS image is not needed.

This separate ClickHouse Keeper FIPS image is only needed if you are using the [Altinity ClickHouse Helm chart](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse), which deploys ClickHouse Keeper as a separate component with its own dedicated image.

## Getting Started

### Docker Usage

ClickHouse Keeper is typically deployed as a cluster of 3 or more nodes for high availability. For testing purposes, you can run a single node:

```bash
docker run -d --rm --name clickhouse-keeper \
  -p 9181:9181 \
  cgr.dev/ORGANIZATION/clickhouse-keeper-fips:latest
```

The default ports for ClickHouse Keeper are:
- `9181`: Client connections (ZooKeeper-compatible API)
- `9444`: Raft protocol communication between keeper nodes

### Kubernetes Deployment

Deploy using the [Altinity ClickHouse Helm chart](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse):

```bash
helm repo add clickhouse https://helm.altinity.com
helm repo update
```

Create a `values.yaml` file to use the Chainguard ClickHouse Keeper FIPS image:

```yaml
keeper:
  enabled: true
  replicaCount: 3
  image:
    repository: cgr.dev/ORGANIZATION/clickhouse-keeper-fips
    tag: latest
```

Deploy the ClickHouse cluster with Keeper:

```bash
helm install clickhouse clickhouse/clickhouse -f values.yaml
```

For more details on ClickHouse Keeper configuration with the Altinity Helm chart, see the [chart documentation](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse).

### Verifying ClickHouse Keeper

You can verify the Keeper cluster is functioning by using the `clickhouse-keeper-client` tool:

```bash
kubectl exec -it <keeper-pod-name> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "ls /"
```

To test data replication across the cluster:

```bash
# Write data on one node
kubectl exec -it <keeper-pod-0> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "create /test-data 'test-value'"

# Read data from another node
kubectl exec -it <keeper-pod-1> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "get /test-data"
```

When using the `clickhouse-keeper-client` tool with this image, note that the history file feature requires a writable directory. Use the `--history-file` flag to specify a location or disable it:

```bash
clickhouse-keeper-client --history-file=/dev/null --host 127.0.0.1 --port 2181 --query "ls /"
```

## FIPS Support

This image is built with FIPS 140-3 compliant cryptographic modules and follows FIPS compliance requirements. The image includes:

- OpenSSL configured in FIPS mode
- ClickHouse Keeper built with FIPS-compliant cryptographic libraries
- Removal of non-FIPS compliant ciphers and algorithms

## Documentation and Resources

- [ClickHouse Keeper Official Documentation](https://clickhouse.com/docs/en/guides/sre/keeper/clickhouse-keeper)
- [Altinity ClickHouse Operator Documentation](https://github.com/Altinity/clickhouse-operator/tree/master/docs)
- [ClickHouse Keeper Configuration Reference](https://clickhouse.com/docs/en/operations/clickhouse-keeper)
- [Disaster Recovery Guide](https://clickhouse.com/docs/guides/sre/keeper/clickhouse-keeper#recovering-after-losing-quorum)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-iamguarded-fips

# prometheus-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus is a monitoring system and time series database

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus IAMGuarded is a security-enhanced variant of Prometheus designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Prometheus deployments.

## Helm Chart Installation

The Prometheus IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Prometheus server image
server:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Thanos image for long-term storage (when enabled)
server:
  thanos:
    image:
      registry: myregistry.example.com
      repository: mirrored/thanos-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag

# Alertmanager image for alert management
alertmanager:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-alertmanager-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/prometheus:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Prometheus IAMGuarded installation using standard Prometheus verification methods. The deployment functions as a standard Prometheus instance, so all typical Prometheus validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Prometheus IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Prometheus and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Prometheus Server Configuration

When using the Kube-Prometheus chart, you can override the Prometheus server image under the `prometheus` section in your `values.yaml`:

```yaml
prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### yunikorn-web

# yunikorn-web
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/yunikorn-web` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/yunikorn-web/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache YuniKorn Web UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

There is a Getting Started guide for the YuniKorn Web UI available in the official repository [here](https://yunikorn.apache.org/docs/) where you can learn more about deploying and using Yunikorn Web UI but the most common way to deploy it is by using the following Helm command:

```shell
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
kubectl create namespace yunikorn
helm install yunikorn yunikorn/yunikorn \
   --namespace yunikorn \
   --set web.image.repository=cgr.dev/chainguard/yunikorn-web \
   --set web.image.tag=latest
```

Then you should be able to see access the Web UI by running the following command:

```shell
kubectl port-forward svc/yunikorn-service 9889:9889 -n yunikorn
open http://localhost:9889
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats-fips

# nats-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NATS is a flexible messaging system providing pub/sub, streaming, storage etc.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [nats-server](https://hub.docker.com/_/nats) image. Switching to Chainguard nats-fips image should not require any changes to your existing setup.

## Getting Started

The default Chainguard NATS images includes only the `nats-server` binary. The `dev` variant also includes the `nats` cli, and the `nsc` tool.

### Docker

To run the nats-fips image with Docker, youc an run the following command:

```shell
docker run cgr.dev/ORGANIZATION/nats-fips
```

This will return output similar to the following:

```
[1] 2025/02/04 10:45:10.308497 [INF] Starting nats-server
[1] 2025/02/04 10:45:10.308805 [INF]   Version:  2.10.25
[1] 2025/02/04 10:45:10.308807 [INF]   Git:      [006039e]
[1] 2025/02/04 10:45:10.308808 [INF]   Cluster:  YJ1Z1L9CEyGsslv6PsRcKl
[1] 2025/02/04 10:45:10.308810 [INF]   Name:     NALSHWZLTUXUUGNO3OY5Y7L67ZCTFUF4FBDS4J5Q6HUGOCXAQNH7OBNA
[1] 2025/02/04 10:45:10.308811 [INF]   ID:       NALSHWZLTUXUUGNO3OY5Y7L67ZCTFUF4FBDS4J5Q6HUGOCXAQNH7OBNA
[1] 2025/02/04 10:45:10.308821 [INF] Using configuration file: /etc/nats/nats-server.conf
[1] 2025/02/04 10:45:10.309523 [INF] Starting http monitor on 0.0.0.0:8222
[1] 2025/02/04 10:45:10.309702 [INF] Listening for client connections on 0.0.0.0:4222
[1] 2025/02/04 10:45:10.309889 [INF] Server is ready
[1] 2025/02/04 10:45:10.309965 [INF] Cluster name is YJ1Z1L9CEyGsslv6PsRcKl
[1] 2025/02/04 10:45:10.309979 [WRN] Cluster name was dynamically generated, consider setting one
[1] 2025/02/04 10:45:10.310015 [INF] Listening for route connections on 0.0.0.0:6222
```

### Helm

To install Chainguard's nats image on your Kubernetes cluster, you can use the upstream image's [Helm chart](https://artifacthub.io/packages/helm/nats/nats).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
container:
  image:
    repository: ORGANIZATION/nats-fips
    tag: latest
    registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for nats project](https://docs.nats.io/) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ruby-fips

# ruby-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ruby-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ruby-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `ruby-fips` image is based on the [ruby image](https://hub.docker.com/_/ruby). Like other Chainguard Containers, `ruby-fips` was built with minimalism and security in mind, and has the following differences from the [ruby image](https://hub.docker.com/_/ruby):

- Does not run as the root user 
- Contains only the minimum packages needed to operate
- Bundler typically installs to `/home/nonroot` instead of `/usr/lib/bundle`
- Environment variables, especially gem paths, sometimes differ from the official Ruby image
- Does not default to using UTF-8 encoding (you will need to specify this yourself)
- Ruby applications requiring third-party dependencies through Rubygems may need multi-stage builds using `-dev` variants

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Create a Ruby script:

```ruby
cat > hello.rb <<EOF
require 'openssl'

puts "Ruby version: #{RUBY_VERSION}"
puts "FIPS mode: #{OpenSSL.fips_mode}"
puts "Hello from Ruby!"
EOF
```

Run the script:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace \
  cgr.dev/ORGANIZATION/ruby-fips:latest hello.rb
```

To verify FIPS mode is enabled:

```shell
docker run --rm cgr.dev/ORGANIZATION/ruby-fips:latest ruby -r 'openssl' -e 'puts "FIPS mode: #{OpenSSL.fips_mode}"'
```

## Documentation and Resources

- [Ruby Documentation](https://ruby-doc.org/)
- [Getting Started with the Ruby Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/ruby/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-reports-server

# kyverno-reports-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-reports-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-reports-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Reports server provides a scalable solution for storing policy reports and cluster policy reports. It moves reports out of etcd and stores them in a PostgreSQL database instance.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is based on the upstream [reports-server](ghcr.io/kyverno/reports-server:latest) image, with the following differences:

* Like all other Chainguard Containers, `kyverno-reports-server` features a stripped down, minimal design container image
* It has few-to-zero CVEs

The kyverno/reports-server Helm chart v0.1.5 uses an outdated PostgreSQL image reference due to an upstream change. The issue has been [resolved](https://github.com/kyverno/reports-server/commit/08783580a71d177a2ff54d37bd48f17471dcc0d7) in main and it should fixed in later versions.

## Getting Started

Deploying Reports Server with Chainguard's images is straightforward using the official Kyverno Helm charts.

First, add the Kyverno reports-server Helm repository:

```bash
helm repo add reports-server https://kyverno.github.io/reports-server
helm repo update
```
Deploy the reports-server chart.

```bash
helm upgrade --install reports-server reports-server/reports-server \
    --set image.registry=cgr.dev \
    --set image.repository=chainguard/kyverno-reports-server \
    --set image.tag=latest
```

In order to use reports-server, you need a policy engine. We will use Kyverno for the purposes of this demo. Deploy kyverno using helm:

```bash
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

helm upgrade --install kyverno kyverno/kyverno \
    --namespace kyverno \
    --create-namespace \
    --set crds.reportsServer.enabled=true
```
For detailed instructions on deploying Reports Server via Helm, consult the official Reports Server Helm chart documentation.

Usage
With Reports Server & Kyverno running, you can now create policies (or cluster policies) and check if they are migrated to the postgres database:
```bash
cat > "policy.yaml" <<'EOF'
apiVersion: kyverno.io/v1
kind: Policy
metadata:
  name: ns-require-app-label
  namespace: default
spec:
  validationFailureAction: Audit
  rules:
    - name: require-app-label
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "app label is required (ns policy)"
        pattern:
          metadata:
            labels:
              app: "?*"
EOF

cat > "good-pod.yaml" <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: good-pod
  namespace: default
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: nginx:1.25
EOF

kubectl apply -f policy.yaml
kubectl apply -f good-pod.yaml

# Now wait until the policy reports show up in kubernetes, then check if they exist in postgres
kubectl get policyreports

# The default postgres password set by the helm chart is "reports"
kubectl exec reports-server-postgresql-0 -- \
    sh -c "PGPASSWORD=reports psql -U postgres -d reportsdb -c 'SELECT * FROM policyreports;'"

# You should now see your policy reports here
```

## Documentation and Resources

For more information about Reports-Server in container images, please refer to the [kyverno website](https://kyverno.io/docs/policy-reports/) or to the [official repository](https://github.com/kyverno/reports-server).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-gitlab-fips

# crossplane-provider-gitlab-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-gitlab-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-gitlab-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the Crossplane GitLab provider, which allows you to manage GitLab resources using Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-provider-gitlab-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-gitlab](https://github.com/crossplane-contrib/provider-gitlab/pkgs/container/provider-gitlab) image.

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gitlab
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-gitlab-fips:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the provider is healthy:
```bash
kubectl get providers
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-gitlab).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dex-k8s-authenticator

# dex-k8s-authenticator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dex-k8s-authenticator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dex-k8s-authenticator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### git-iamguarded-fips

# git-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/git-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/git-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Git image for use with Iamguarded charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Chainguard's Git Iamguarded Image allows you to run ordinary Git commands in CI/CD pipelines and also locally via Docker, and is compatible with Iamguarded charts.

### Docker Setup

To make sure you have the latest version of the Image available, start by running a `docker pull` command:

```shell
docker pull cgr.dev/ORGANIZATION/git-iamguarded-fips
```

Then, run the Image with the `--version` flag to make sure the Image is functional:

```shell
docker run -it --rm cgr.dev/ORGANIZATION/git-iamguarded-fips --version
```

You will receive output similar to this:

```
git version 2.43.0
```

### Cloning a Repository Locally

Because your local system user's unique identifier might differ from that of the container, you'll need to set up special permissions for the target directory if you want to use this Image to clone repositories locally. Once you've configured these permissions, you'll be able to set up a volume and have the contents of the cloned repository replicated on your host machine.

First, create a target directory somewhere in your home folder and set the required permissions:

```shell
mkdir ~/workspace
chmod go+wrx ~/workspace
```

Now you can use `docker run` to execute the `git clone` command, using the directory you just set up as a volume shared between your local machine and the container Image:

```shell
docker run -it -v ~/workspace:/home/git --rm cgr.dev/ORGANIZATION/git-iamguarded-fips clone https://github.com/chainguard-images/.github.git
```

Here, the volume is mounted to the `/home/git` directory in the container.

This will return output like the following:

```
Cloning into '.github'...
remote: Enumerating objects: 251, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 251 (delta 15), reused 22 (delta 10), pack-reused 218
Receiving objects: 100% (251/251), 216.59 KiB | 1.04 MiB/s, done.
Resolving deltas: 100% (88/88), done.
```

You can now check the contents of your `workspace` directory, where you will find the cloned repository:

```shell
ls -a ~/workspace/
```
```
.  ..  .github
```

If you do not want to make the destination directory world-writable, you can run the git executable inside the container with your UID, thus giving it access to the directory:

```shell
docker run -it -v ~/workspace:/home/git -u $(id -u) --rm cgr.dev/ORGANIZATION/git-iamguarded-fips clone https://github.com/chainguard-images/.github.git
```
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-controller-iamguarded-fips

# sealed-secrets-controller-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-controller-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-controller-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes controller and tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Sealed Secrets is used to safely manage encrypted Kubernetes Secrets and is designed to run as a native Kubernetes controller. Sealed Secrets IAmGuarded FIPS is a FIPS 140-2 compliant,security-enhanced variant of Sealed Secrets designed to be deployed using its companion IAMGuarded Helm chart. This image provides the Sealed Secrets Controller component with FIPS-validated cryptography in addition to the security benefits of IAMGuarded deployments.

## FIPS Compliance
This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Helm Chart Installation

The Sealed Secrets IAMGuarded FIPS Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/sealed-secrets
```

### Basic Installation

To deploy sealed secrets with the Chainguard image, create a `values.yaml` file with the image information - such as:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/sealed-secrets-controller-iamguarded-fips
  tag: latest
```

Then install the controller using Helm:

```shell
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets \
  --namespace kube-system \
  --create-namespace \
  -f values.yaml
```

This deploys the Sealed Secrets controller in the `kube-system` namespace using the specified image. This is the default namespace that `kubeseal` tool for encrypting secrets is expected, so changing the namespace will also require providing `--controller-namespace` argument to `kubeseal` whenever encrypting a secret.

## Encrypting Secrets
To encrypt a secret, use the `kubectl` to create a Kubernetes Secret YAML file (unless you already have it) and then use `kubeseal` CLI tool to encrypt it. Such as:

```shell
kubectl create secret generic \
  --namespace default mysecret \
  --dry-run=client \
  --from-literal=password=supersecret \
  -o yaml >secret.yaml

kubeseal <secret.yaml -o yaml >sealedsecret.yaml
```

This generates a `SealedSecret` that can be safely committed to version control.

### Applying Sealed Secrets
Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f mysealedsecret.yaml
```

The controller will decrypt it and create the actual Kubernetes Secret.

### Authentication
For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:
[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices
1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install sealed oci://cgr.dev/$ORGANIZATION/iamguarded-charts/sealed-secrets@sha256:DIGEST \
     --namespace sealed-secrets \
     --create-namespace \
     --set "global.org=$ORGANIZATION" \
     --set "global.image.repository=sealed-secrets-controller-iamguarded-fips"
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

4. **FIPS Validation**: Verify FIPS mode is active by checking container logs for successful FIPS initialization messages.

## Validation

After deployment, validate your Sealed Secrets IAMGuarded FIPS installation using standard Sealed Secrets verification methods. The deployment functions as a standard Sealed Secrets instance, so all typical Sealed Secrets validation procedures apply. Additionally, verify FIPS mode is active in container logs.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Sealed Secrets IAMGuarded FIPS chart provides FIPS-compliant, security-minded defaults while acknowledging the cluster-specific nature of both Sealed Secrets and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### eck-operator-fips

# eck-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/eck-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/eck-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-auth

# kubernetes-dashboard-auth
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-auth` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-auth/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Go module handling authentication to the Kubernetes API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-auth` component handles the authentication processes for the Kubernetes API, ensuring secure access and integration with the Dashboard. It manages user tokens and sessions for seamless communication between the dashboard UI and the API server.

## Usage
To deploy the `kubernetes-dashboard-auth` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set auth.image.repository = cgr.dev/chainguard/kubernetes-dashboard-auth \
--set auth.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components, refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pdns-auth-fips

# pdns-auth-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pdns-auth-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pdns-auth-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PowerDNS Authoritative Server - High-performance DNS server with flexible backend support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `pdns-auth-fips` image is comparable to the [PowerDNS Authoritative Server Docker image](https://hub.docker.com/r/powerdns/pdns-auth-master). Like all Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager in the production variant, while maintaining full compatibility with PowerDNS functionality.

### FIPS Support

The `pdns-auth-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module, ensuring cryptographic operations meet Federal Information Processing Standards requirements. This makes it suitable for government and regulated environments requiring FIPS-validated cryptography.

**Exclusions**: The FIPS variant does not include the following due to their dependency on libsodium, which cannot be used in FIPS mode:
- `zeromq` - ZeroMQ messaging library
- `sdig` - PowerDNS sdig diagnostic tool

For more information on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

PowerDNS Authoritative Server is a high-performance DNS server with support for multiple backends, DNSSEC, and a comprehensive API for management and monitoring. The FIPS variant ensures all cryptographic operations comply with FIPS 140-3 standards.

### Docker

Run PowerDNS Authoritative Server with FIPS-validated cryptography using Docker:

```sh
docker run --rm --sysctl net.ipv4.ip_unprivileged_port_start=0 \
  -p 53:53/udp -p 53:53/tcp -p 8081:8081 \
  -v $(pwd)/pdns.conf:/etc/pdns.conf:ro \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

This example assumes you have a `pdns.conf` file in your current directory. See the Configuration section below for examples.

**Note**: The `--sysctl net.ipv4.ip_unprivileged_port_start=0` parameter allows binding to privileged ports (ports < 1024, such as port 53) as a non-root user. This is safer than using `--cap-add=NET_BIND_SERVICE` and is a [safe sysctl option](https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/). Alternatively, configure PowerDNS to use a non-privileged port (e.g., 5353) which requires no special permissions.

### Kubernetes

Deploy PowerDNS Authoritative Server in Kubernetes with ConfigMaps for configuration and zone files:

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: pdns-config
data:
  pdns.conf: |
    launch=bind
    bind-config=/etc/pdns/named.conf

    local-address=0.0.0.0
    local-port=53

    socket-dir=/tmp

    api=yes
    api-key=your-secure-api-key
    webserver=yes
    webserver-address=0.0.0.0
    webserver-port=8081

    log-dns-queries=yes
    loglevel=5
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: pdns-zones
data:
  named.conf: |
    zone "example.com" {
      type master;
      file "/etc/pdns/zones/example.com.zone";
    };
  example.com.zone: |
    $TTL 3600
    $ORIGIN example.com.
    @       IN      SOA     ns1.example.com. admin.example.com. (
                            2024010101      ; Serial
                            3600            ; Refresh
                            1800            ; Retry
                            604800          ; Expire
                            86400 )         ; Minimum TTL
    @       IN      NS      ns1.example.com.
    ns1     IN      A       192.168.1.10
    www     IN      A       192.168.1.20
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pdns-auth-fips
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pdns-auth-fips
  template:
    metadata:
      labels:
        app: pdns-auth-fips
    spec:
      securityContext:
        sysctls:
        - name: "net.ipv4.ip_unprivileged_port_start"
          value: "0"
      containers:
      - name: pdns-auth
        image: cgr.dev/ORGANIZATION/REPO_NAME:latest
        ports:
        - name: dns-udp
          containerPort: 53
          protocol: UDP
        - name: dns-tcp
          containerPort: 53
          protocol: TCP
        - name: api
          containerPort: 8081
          protocol: TCP
        volumeMounts:
        - name: config
          mountPath: /etc/pdns.conf
          subPath: pdns.conf
        - name: zones
          mountPath: /etc/pdns/named.conf
          subPath: named.conf
        - name: zones
          mountPath: /etc/pdns/zones/example.com.zone
          subPath: example.com.zone
        livenessProbe:
          httpGet:
            path: /api/v1/servers/localhost
            port: 8081
            httpHeaders:
            - name: X-API-Key
              value: your-secure-api-key
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/v1/servers/localhost
            port: 8081
            httpHeaders:
            - name: X-API-Key
              value: your-secure-api-key
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: pdns-config
      - name: zones
        configMap:
          name: pdns-zones
```

Apply the configuration:

```sh
kubectl apply -f pdns-deployment.yaml
```

Verify the deployment is running:

```sh
kubectl get pods -l app=pdns-auth-fips
```

Test DNS queries:

```sh
kubectl exec -it <pod-name> -- pdnsutil list-zones
```

## Configuration

### Basic Configuration Example

Here's a basic `pdns.conf` file for the BIND backend with API enabled:

```conf
# Backend Configuration
launch=bind
bind-config=/etc/pdns/named.conf

# Network Settings
local-address=0.0.0.0
local-port=53

# API Configuration
api=yes
api-key=your-secure-api-key-here
webserver=yes
webserver-address=0.0.0.0
webserver-port=8081
webserver-allow-from=0.0.0.0/0

# Logging
log-dns-queries=yes
loglevel=5
```

### Zone File Example

Create a `named.conf` file to define your zones:

```conf
zone "example.com" {
  type master;
  file "/etc/pdns/zones/example.com.zone";
};
```

And a corresponding zone file (`example.com.zone`):

```zone
$TTL 3600
$ORIGIN example.com.
@       IN      SOA     ns1.example.com. admin.example.com. (
                        2024010101      ; Serial
                        3600            ; Refresh
                        1800            ; Retry
                        604800          ; Expire
                        86400 )         ; Minimum TTL
@       IN      NS      ns1.example.com.
ns1     IN      A       192.168.1.10
www     IN      A       192.168.1.20
```

### Other Backend Options

PowerDNS supports various backends including:

* **PostgreSQL**: High-performance SQL backend with encryption support
* **MySQL/MariaDB**: Popular SQL backend option with TLS connections
* **SQLite**: Lightweight embedded database
* **LDAP**: Directory service integration
* **GeoIP**: Geographic load balancing

Consult the [PowerDNS documentation](https://doc.powerdns.com/authoritative/) for backend-specific configuration.

## Documentation and Resources

* [PowerDNS Authoritative Server Documentation](https://doc.powerdns.com/authoritative/)
* [PowerDNS API Reference](https://doc.powerdns.com/authoritative/http-api/index.html)
* [Getting Started with PowerDNS](https://doc.powerdns.com/authoritative/index.html#getting-started)
* [Backend Configuration Guide](https://doc.powerdns.com/authoritative/backends/index.html)
* [Chainguard FIPS Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
* [Chainguard Images Overview](https://edu.chainguard.dev/chainguard/chainguard-images/overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ffmpeg

# ffmpeg
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ffmpeg` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ffmpeg/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that contains ffmpeg

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage

Example: convert a .mov file to .mp4

```
docker run --rm \
    -v "${PWD}":/work \
    -w /work \
    cgr.dev/chainguard/ffmpeg:latest
    -i tests/sample.mov \
    tests/sample.mp4
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vllm-openai-fips

# vllm-openai-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vllm-openai-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vllm-openai-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

vLLM is a high-throughput and memory-efficient inference engine for Large Language Models (LLMs). This FIPS-validated variant provides OpenSSL FIPS 140-3 compliance for secure, production LLM deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Support

This image ships with a validated redistribution of the OpenSSL FIPS provider module. For more information on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Compatibility Notes

Chainguard's vLLM FIPS image is comparable to the [vllm/vllm-openai](https://hub.docker.com/r/vllm/vllm-openai) image, with several key differences:

### Version Updates

vLLM is a rapidly evolving project where even minor version bumps can introduce significant changes, including breaking changes to APIs, dependencies, or kernel requirements. Due to this, Chainguard's vLLM image updates may take additional time to ensure stability and compatibility. We recommend testing new versions in a non-production environment before upgrading.

### Package Differences

The following packages have been modified or removed compared to upstream:

* **CuPy**: Removed entirely. CuPy's vendor backends require cuDNN 8, which conflicts with cuDNN 9 shipped in this image. CuPy is optional for vLLM and primarily used by Ray
* **torch-c-dlpack-ext**: Not pre-installed. You may see a warning about `EnvTensorAllocator` not being enabled during startup. This is an optional TVM optimization and does not affect vLLM functionality
* **LMCache**: Not pre-installed. For distributed KV cache sharing across multiple vLLM instances, install via `pip install lmcache` at runtime. See [vLLM LMCache Examples](https://docs.vllm.ai/en/latest/examples/others/lmcache/) for configuration

### Expert Parallel (EP) Kernels for MoE Models

For [Expert Parallel deployment](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html) with Mixture-of-Experts (MoE) models like DeepSeek-V2/V3, the EP kernels are **not pre-installed** in this image. Unlike upstream which ships pre-built EP kernels, Chainguard provides a build script due to upstream's specific version pinning requirements and custom patches for components like NVSHMEM, pplx-kernels, and DeepEP.

#### Building EP Kernels

The image includes `/vllm-workspace/install_python_libraries.sh` to build the required components. Before running, ensure you have:

1. A GPU with the appropriate CUDA architecture
2. Set `TORCH_CUDA_ARCH_LIST` for your GPU (e.g., `"8.0;9.0"` for A100/H100)

```bash
# Start an interactive container with persistent storage for the build
docker run --rm -it --gpus all \
  --shm-size 8g \
  -v ep_kernels_cache:/vllm-workspace/ep_kernels_workspace \
  -e TORCH_CUDA_ARCH_LIST="8.0;9.0" \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  bash

# Inside the container, run the build script
/vllm-workspace/install_python_libraries.sh /vllm-workspace/ep_kernels_workspace
```

The script builds:
- **NVSHMEM** (with DeepSeek patches) - NVIDIA shared memory library
- **pplx-kernels** - Perplexity AI's optimized MoE kernels
- **DeepEP** - DeepSeek's Expert Parallel kernels

Build time is approximately 10-20 minutes depending on hardware. The built kernels persist in the mounted volume for reuse.

#### Using Pre-built EP Kernels

After building once, mount the volume when running vLLM:

```bash
docker run --rm -it --gpus all \
  --shm-size 8g \
  -v ep_kernels_cache:/vllm-workspace/ep_kernels_workspace \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model deepseek-ai/DeepSeek-V2-Lite \
  --tensor-parallel-size 2 \
  --host 0.0.0.0
```

See the [Expert Parallel Deployment Guide](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html) for detailed configuration options.

## Running vLLM

### Prerequisites

* NVIDIA GPU with CUDA support
* [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) installed
* Docker with GPU support enabled

### Basic Usage

Set the following environment variable to the name of your organization:

```bash
ORGANIZATION=my-organization
```

Start the vLLM OpenAI-compatible server with a model:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 1g \
  -p 8000:8000 \
  -v /path/to/cache:/root/.cache \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model facebook/opt-125m \
  --host 0.0.0.0 \
  --port 8000
```

The server exposes OpenAI-compatible endpoints at `http://localhost:8000`.

### Testing the API

Once the server is running, test it with curl:

```bash
# Check health
curl http://localhost:8000/health

# List models
curl http://localhost:8000/v1/models

# Generate completions
curl http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "facebook/opt-125m",
    "prompt": "Deep learning is",
    "max_tokens": 50
  }'
```

### GPU Memory and Shared Memory

For optimal performance, configure shared memory size with `--shm-size`:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 8g \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model meta-llama/Llama-2-7b-hf \
  --host 0.0.0.0
```

### Audio Transcription with Whisper

Audio dependencies are not pre-installed (same as upstream) due to [licensing concerns](https://github.com/vllm-project/vllm/issues/8030). To use Whisper models for speech-to-text, first install the audio dependencies:

```bash
docker exec <container_name> pip install vllm[audio]
docker restart <container_name>
```

Then start the server with a Whisper model:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 1g \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model openai/whisper-large-v3 \
  --host 0.0.0.0
```

Test audio transcription:

```bash
curl -X POST http://localhost:8000/v1/audio/transcriptions \
  -F "file=@/path/to/audio.wav" \
  -F "model=openai/whisper-large-v3"
```

### CUDA Compatibility

If you're running an older CUDA driver, you may encounter errors like:

```
CUDA error: the provided PTX was compiled with an unsupported toolchain
```

To resolve this, use CUDA forward compatibility by setting the `LD_LIBRARY_PATH` environment variable:

```bash
docker run --rm -it \
  --gpus all \
  -e LD_LIBRARY_PATH="/usr/local/cuda-12.9/compat" \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model facebook/opt-125m \
  --host 0.0.0.0
```

The `/usr/local/cuda-12.9/compat` directory contains NVIDIA's forward compatibility libraries that allow applications built with newer CUDA versions to run on older drivers.

Refer to [NVIDIA's CUDA Compatibility documentation](https://docs.nvidia.com/deploy/cuda-compatibility/index.html) for more details on driver requirements and compatibility.

## Documentation and Resources

* [vLLM Documentation](https://docs.vllm.ai/)
* [vLLM Docker Quickstart](https://docs.vllm.ai/en/latest/getting_started/quickstart.html#openai-compatible-server)
* [OpenAI API Reference](https://platform.openai.com/docs/api-reference)
* [Expert Parallel Deployment Guide](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### glibc-openssl-fips

# glibc-openssl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/glibc-openssl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/glibc-openssl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The GNU C Library (glibc) is a C standard library implementation maintained by the GNU Project. This container image also contains OpenSSL, a software library for applications providing secure communications over a network.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is generally meant to be used only as a base image. It does, however, contain the `openssl` program which you can run.

You must bring your own artifacts to use this image, e.g. with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

### FIPS support

The glibc-openssl-fips Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To illustrate how you can use Chainguard's `glibc-openssl-fips` container image, start by creating the following Go program:

```shell
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```

This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require `glibc`.

Next, create a Dockerfile that uses the `glibc-openssl-fips` container image as a base image:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/ORGANIZATION/glibc-openssl-fips
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Note that this example Dockerfile uses the public Chainguard `go` image and a private glibc image. You will need to change `ORGANIZATION` to reflect your organization's private repository within the Chainguard registry.

Using this Dockerfile, build an image:

```shell
docker build -t glibc-openssl .
```

Then run the newly-built image:

```shell
docker run --rm glibc-openssl
```

This will return the following output, indicating the program was run successfully and the glibc base image worked as expected:

```
Hello, world!
```

### Testing OpenSSL 

As mentioned previously, the `glibc-openssl-fips` image comes with OpenSSL. To test this out, first create a sample file:

```shell
echo "sample text" > sample.txt
```

Then mount this file to the `glibc-openssl-fips` container and use the `sha512` digest function to output the digest of the sample file:

```shell
docker run -v $(pwd):/tmp cgr.dev/chainguard-private/glibc-openssl-fips openssl sha512 /tmp/sample.txt
```
```
SHA2-512(stdin)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)
* [OpenSSL Documentation](https://docs.openssl.org/master/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-gcp-controller-fips

# cluster-api-gcp-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-gcp-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-gcp-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API provider for Google Cloud Platform infrastructure management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `cluster-api-gcp-controller-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Compatibility Notes

Chainguard's cluster-api-gcp-controller-fips image is compatible with the upstream [Cluster API Provider GCP](https://github.com/kubernetes-sigs/cluster-api-provider-gcp). This image contains only the minimum set of dependencies needed to run the GCP infrastructure provider components.

## Getting Started

The Cluster API Provider for GCP enables you to create and manage Kubernetes clusters on Google Cloud Platform using Cluster API. It provides declarative APIs for provisioning and managing GCP infrastructure resources including Compute Engine instances, VPCs, and load balancers.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Google Cloud Platform account with appropriate permissions
- GCP service account credentials configured

### Installation

Initialize the GCP infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure gcp
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: gcp
  namespace: capg-system
spec:
  version: v1.10.0
  configSecret:
    name: capg-manager-bootstrap-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-gcp-controller-fips:latest
EOF
```

### Usage Example

Create a GCP cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPCluster
metadata:
  name: my-gcp-cluster
  namespace: default
spec:
  project: my-gcp-project-id
  region: us-central1
  network:
    name: my-cluster-network
    autoCreateSubnetworks: true
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPMachineTemplate
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      instanceType: e2-standard-2
      image: projects/k8s-staging-cluster-api-gcp/global/images/cluster-api-ubuntu-2004-v1-29-0
      diskSizeGb: 50
      publicIP: true
```

### Configuration

The controller requires a GCP service account with the following IAM roles:
- Compute Admin
- Service Account User
- Project IAM Admin (if using workload identity)

Create and configure the credentials secret:

```bash
kubectl create secret generic capg-manager-bootstrap-credentials \
  --from-file=credentials.json=/path/to/service-account.json \
  --namespace capg-system
```

## Documentation and Resources

* [Cluster API Provider GCP GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-gcp)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Google Cloud Platform Documentation](https://cloud.google.com/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kibana-iamguarded

# kibana-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kibana-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kibana-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Your window into the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Kibana IAMGuarded is a security-enhanced variant of Kibana designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Kibana deployments.

## Helm Chart Installation

The Kibana IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kibana
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kibana oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Kibana image
image:
  registry: myregistry.example.com
  repository: mirrored/kibana-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kibana oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kibana:12.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kibana IAMGuarded installation using standard Kibana verification methods. The deployment functions as a standard Kibana instance, so all typical Kibana validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kibana IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Kibana and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-provider-azure-fips

# secrets-store-csi-driver-provider-azure-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-provider-azure-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-provider-azure-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure Key Vault provider for Secret Store CSI driver allows you to get secret contents stored in Azure Key Vault instance and use the Secret Store CSI driver interface to mount them into Kubernetes pods.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `secrets-store-csi-driver-provider-azure` container image is comparable to Microsoft's [Azure CSI driver](https://github.com/Azure/secrets-store-csi-driver-provider-azure). Chainguard's image contains only the minimum set of dependencies needed to run the driver.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started

The [official documentation](https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver) outlines how to set up the Azure provider for Secrets Store CSI Driver.
To get started with Chainguard's `secrets-store-csi-drive-provider-azure` image, create a custom `values.yaml` file for the Helm release:

```shell
cat <<EOF > values.yaml
linux:
  image:
    repository: "cgr.dev/ORGANIZATION/secrets-store-csi-driver-provider-azure-fips"
    tag: "latest"
EOF
```

Add the Helm chart and install the `csi-secrets-store-provider-azure` release: 

```bash
helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
helm install csi-secrets-provider csi-secrets-store-provider-azure/csi-secrets-store-provider-azure -f values.yaml
```

This can now be tested by creating a Secrets Provider Class Object. The following is an example manifest:

```shell
kubectl apply -f - <<EOF
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-secrets
  namespace: kube-system
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"              
    keyvaultName: <KEY VAULT NAME>
    cloudName: ""
    objects:  |
      array:
        - |
          objectName: <SECRET NAME>
          objectType: secret # object types: secret, key or cert
          objectVersion: ""                    
    tenantId: "<TENANT ID>"
EOF
```

The secret is consumed by a Kubernetes Pod. In this example, the Azure secret from a Key Vault Secret is mounted to `/mnt/secret-store`:

```shell
kubectl apply -f - <<EOF
kind: Pod
apiVersion: v1
metadata:
  name: demo-pod
  namespace: kube-system
spec:
  containers:
    - name: nginx
      image: cgr.dev/ORGANIZATION/busybox:latest
      command: ["/bin/sh", "-c", "sleep 864000"]
      volumeMounts:
      - name: secrets-store01-inline
        mountPath: "/mnt/secrets-store"
        readOnly: true
  volumes:
    - name: secrets-store01-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: <KEY VAULT NAME>
        nodePublishSecretRef:
          name: "sscdp-azure-settings"
EOF
```

## Documentation and Resources
- [Configuring Azure secrets provider](https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver)
- [Azure Driver Helm Charts](https://github.com/Azure/secrets-store-csi-driver-provider-azure/tree/master/charts/csi-secrets-store-provider-azure)
- [Azure Driver Github](https://github.com/Azure/secrets-store-csi-driver-provider-azure)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nova-fips

# nova-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nova-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nova-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant version of Nova. Scans your Kubernetes cluster for outdated Helm charts, then suggests updates.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Nova image is meant to serve as a drop-in replacement for [the official Nova image from Quay.io](https://quay.io/repository/fairwinds/nova). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting started
For those with access, this container image is available on `cgr.dev`:

Run the `nova-fips` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/nova-fips:latest nova find
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [Nova Documentation](https://nova.docs.fairwinds.com/)
* [Nova GitHub Repository](https://github.com/FairwindsOps/nova)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chainguard-source

# chainguard-source
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chainguard-source` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chainguard-source/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Fetches all sources referenced by a Chainguard Package or Image SBOM.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting started
The `chainguard-source` container fetches the upstream sources for a
Chainguard package, image, or SBOM. This is useful for verifying source
provenance or complying with licensing requirements.

### Fetch sources for a package
To fetch the sources for a known package:

```bash
docker run --rm \
  -v $(pwd)/sources:/workdir/sources \
  cgr.dev/ORGANIZATION/chainguard-source:latest \
  --yes --package curl
```

This will create a `./sources` directory in your current working directory
containing the fetched source code.

### Fetch sources for an image
To fetch sources for a container image:

```bash
docker run --rm \
  -v $(pwd)/sources:/workdir/sources \
  cgr.dev/ORGANIZATION/chainguard-source:latest \
  --yes --image cgr.dev/chainguard/curl:latest
```

### Fetch sources from a local SBOM
If you already have an SPDX-formatted SBOM JSON file:

```bash
docker run --rm \
  -v $(pwd):/workdir \
  cgr.dev/ORGANIZATION/chainguard-source:latest \
  -y --sbom /tmp/my-local.sbom.spdx.json
```

### Fetch sources in privileged mode (requires SSH access)
Some packages or images reference private source repositories
(e.g., GitHub over SSH). To fetch these sources, run in privileged mode and
mount your SSH credentials:

```bash
docker run --rm \
  -v $(pwd)/sources:/workdir/sources \
  -v $HOME/.ssh:/root/.ssh:ro \
  cgr.dev/ORGANIZATION/chainguard-source:latest \
  -y --privileged --package curl
```

This mounts your local ~/.ssh keys into the container and sets GIT_SSH_COMMAND
to skip host key verification. You can also use ssh-agent forwarding if your
environment supports it.

### Optional arguments
chainguard-source supports additional functionality via optional
command-line arguments. To see all the available options:

```bash
docker run --rm cgr.dev/ORGANIZATION/chainguard-source:latest --help
```

## Documentation and Resources
- [https://github.com/chainguard-dev/chainguard-source](https://github.com/chainguard-dev/chainguard-source)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-kubernetes

# crossplane-provider-kubernetes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-kubernetes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-kubernetes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the Crossplane Kubernetes provider, which allows you to manage Kubernetes resources using Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-provider-kubernetes` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-kubernetes](https://github.com/crossplane-contrib/provider-kubernetes/pkgs/container/provider-kubernetes) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-kubernetes
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-kubernetes:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the function is healthy:
```bash
kubectl get providers
```

## Documentation and Resources
- [Crossplane Getting Started Guide](https://docs.crossplane.io/latest/get-started/get-started-with-managed-resources/)
- [Crossplane Kubernetes Provider Documentation](https://github.com/crossplane-contrib/provider-kubernetes))
- [Crossplane Kubernetes Provider Examples](https://github.com/crossplane-contrib/provider-kubernetes/tree/main/examples)
For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-kubernetes).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### adoptium-jre

# adoptium-jre
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/adoptium-jre` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/adoptium-jre/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Java JRE image using [Adoptium](https://adoptium.net/). Used for running Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's Adoptium JRE image is built directly from the [Adoptium project](https://adoptium.net). The Chainguard Adoptium JRE image has few-to-zero CVEs and does not run as the root user.

## Getting Started

A JRE is the standard runtime for a Java application and is used for running an already developed and packaged Java application. Generally, you will combine your application with the Chainguard Adoptium JRE image and Docker or a build tool like [Maven](https://maven.apache.org/) or [Gradle](https://gradle.org/)

### Using Jib to build a JRE-based application image

Using Maven or Gradle, you can compile and package your application. [Jib](https://github.com/GoogleContainerTools/jib/tree/master) is a tool from Google Container Tools which builds optimized Docker and OCI images for Java applications. It's available as a plugin for both Maven and Gradle, as well as a Java library.

The Jib GitHub repository includes [a useful example application](https://github.com/GoogleContainerTools/jib/tree/master/examples/spring-boot) that works with Maven or Gradle.

### Using Helm to Deploy your Java Application

Using [Helm](https://helm.sh/) to deploy your JRE-based application image is relatively straightforward using either [this Kubernetes Service Helm Chart](https://github.com/gruntwork-io/helm-kubernetes-services/blob/main/charts/k8s-service/README.md) or [this Service Helm Chart](https://artifacthub.io/packages/helm/kvalitetsit/service) from ArtifactHub.

## Documentation and Resources

* (Video) [How to Migrate a Java Application to Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
* (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
* (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
* (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-k8s-cni

# amazon-k8s-cni
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-k8s-cni` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-k8s-cni/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

AWS VPC CNI can be deployed to manage networking in an Amazon EKS cluster, providing high-performance networking for Kubernetes workloads. 

For help with installation, please refer to the [TESTING.md](./TESTING.md) and [the official ](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jaeger-fips

# jaeger-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jaeger-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jaeger-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Components
Jaeger provides multiple components;
```
jaeger-fips-agent
jaeger-fips-all-in-one
jaeger-fips-anonymizer
jaeger-fips-collector
jaeger-fips-es-index-cleaner
jaeger-fips-ingester
jaeger-fips-query
jaeger-fips-remote-storage
jaeger-fips-tracegen
```

## Using Jaeger

Jaeger provides docker images and a helm chart for installation. It can be installed separately with all its components or
using a single image with all components bundled in. The bundled component is referred to as All-In-One

### Jaeger All In One
This image, designed as a bundle, launches the Jaeger UI, collector, query, and agent, with an in memory storage component. [jaeger-all-in-one](https://www.jaegertracing.io/docs/1.6/getting-started/#all-in-one-docker-image)

Either component can be run directly as docker containers or deployed to Kubernetes with helm. Helm chart is located here https://jaegertracing.github.io/helm-charts. To use them, simply replace the appropriate `image:` path with the Chainguard specific Jaeger image. Below is an example values file for doing this with helm:

```yaml
allInOne:
    enabled: true
    image:
    repository: cgr.dev/chainguard/jaeger-fips-all-in-one
    tag: latest
agent:
    enabled: false
collector:
    enabled: false
query:
    enabled: false
storage:
    type: "memory"
# Hotrod is a test application
hotrod:
    enabled: true

```

Using the above values, the helm commands become, to install Jaeger All In One:

```bash
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade --install jaeger jaegertracing/jaeger \
  --history-max 3 \
  --set provisionDataStore.cassandra=false \
  --set allInOne.enabled=true \
  --set storage.type=memory \
  --set agent.enabled=false \
  --set collector.enabled=false \
  --set query.enabled=false \
  --values jaeger-values.yaml
```

### Jaeger Standalone Components:

```yaml
agent:
    image:
    repository: cgr.dev/chainguard/jaeger-fips-agent
    tag: latest
collector:
    image:
    repository: cgr.dev/chainguard/jaeger-fips-collector
    tag: latest
query:
    image:
    repository: cgr.dev/chainguard/jaeger-fips-query
    tag: latest
storage:
    type: "memory"
hotrod:
    enabled: true
cassandra:
    config:
    cluster_size: 1
```

Using the above values, the helm commands become, to install Jaeger with standalone components:

```bash
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade --install jaeger jaegertracing/jaeger \
  --create-namespace \
  --namespace jaeger \
  --history-max 3 \
  --set hotrod.enabled=true \
  --set storage.type=memory  --set cassandra.config.cluster_size=1 \
  --values jaeger-values.yaml
```
For more configuration options in installing the jaeger helm chart, please refer to the [helm upstream doc](https://github.com/jaegertracing/helm-charts/tree/main/charts/jaeger)
> NOTE: Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opensearch

# opensearch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opensearch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opensearch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Opensearch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Opensearch

Chainguard Opensearch images include the `opensearch` package and helper scripts which can be used to start up or configure Opensearch.

The full list of included tools is:

```shell
$ ls /usr/share/opensearch/bin/
docker-entrypoint.sh      opensearch-cli            opensearch-env-from-file  opensearch-node           opensearch-shard
opensearch                opensearch-env            opensearch-keystore       opensearch-plugin         opensearch-upgrade
```

The default entrypoint is set to run the included `docker-entrypoint.sh` script.

To get started:

```shell
$ docker run -it cgr.dev/chainguard/opensearch
[2023-03-24T00:44:00,077][INFO ][o.o.n.Node               ] [6e57776e2bfa] version[2.6.0-SNAPSHOT], pid[1], build[docker/7203a5af21a8a009aece1474446b437a3c674db6/1970-01-01T00:00Z], OS[Linux/5.15.49-linuxkit/aarch64], JVM[wolfi/OpenJDK 64-Bit Server VM/11.0.18-internal/11.0.18-internal+0-wolfi-r1]
[2023-03-24T00:44:00,079][INFO ][o.o.n.Node               ] [6e57776e2bfa] JVM home [/usr/lib/jvm/openjdk-jre], using bundled JDK [false]
[2023-03-24T00:44:00,079][INFO ][o.o.n.Node               ] [6e57776e2bfa] JVM arguments [-Xshare:auto, -Dopensearch.networkaddress.cache.ttl=60, -Dopensearch.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dio.netty.allocator.numDirectArenas=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.locale.providers=SPI,COMPAT, -Xms1g, -Xmx1g, -XX:+UseG1GC, -XX:G1ReservePercent=25, -XX:InitiatingHeapOccupancyPercent=30, -Djava.io.tmpdir=/tmp/opensearch-3008263594678974238, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -Dopensearch.cgroups.hierarchy.override=/, -XX:MaxDirectMemorySize=536870912, -Dopensearch.path.home=/usr/share/opensearch, -Dopensearch.path.conf=/usr/share/opensearch/config, -Dopensearch.distribution.type=docker, -Dopensearch.bundled_jdk=true]
[2023-03-24T00:44:00,079][WARN ][o.o.n.Node               ] [6e57776e2bfa] version [2.6.0-SNAPSHOT] is a pre-release version of OpenSearch and is not suitable for production
[2023-03-24T00:44:00,405][INFO ][o.o.i.r.ReindexPlugin    ] [6e57776e2bfa] ReindexPlugin reloadSPI called
[2023-03-24T00:44:00,407][INFO ][o.o.i.r.ReindexPlugin    ] [6e57776e2bfa] Unable to find any implementation for RemoteReindexExtension
[2023-03-24T00:44:00,415][INFO ][o.o.p.PluginsService     ] [6e57776e2bfa] loaded module [aggs-matrix-stats]
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### seata-server

# seata-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/seata-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/seata-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Seata is a high-performance, easy-to-use distributed transaction solution designed for microservices architecture.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `seata-server` image is compatible with the upstream [Apache Seata Server](https://hub.docker.com/r/apache/seata-server) image. Like all Chainguard Containers, this image is a minimal, stripped-down design that reduces attack surface.

The image includes the Seata Server application and its runtime dependencies without unnecessary software bloat.

## Getting Started

Seata Server can be run directly using Docker:
```sh
docker run -d -p 8091:8091 -p 7091:7091 cgr.dev/ORGANIZATION/seata-server:latest
```

This command starts Seata Server and exposes:
* Port 8091 for the HTTP service
* Port 7091 for the RPC service

To verify the server is running:
```sh
docker logs <container-id>
```

### Deployment with Kubernetes

Create a basic Kubernetes deployment for Seata Server:

```
apiVersion: v1
kind: Service
metadata:
  name: seata-server
  namespace: default
  labels:
    k8s-app: seata-server
spec:
  type: NodePort
  ports:
    - port: 8091
      nodePort: 30091
      protocol: TCP
      name: http
  selector:
    k8s-app: seata-server

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server
  namespace: default
  labels:
    k8s-app: seata-server
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: seata-server
  template:
    metadata:
      labels:
        k8s-app: seata-server
    spec:
      containers:
        - name: seata-server
          image: docker.io/seataio/seata-server:latest
          imagePullPolicy: IfNotPresent
          env:
            - name: SEATA_PORT
              value: "8091"
            - name: STORE_MODE
              value: file
          ports:
            - name: http
              containerPort: 8091
              protocol: TCP
```

Apply the configuration:
```sh
kubectl apply -f seata-deployment.yaml
```

## Configuration

Seata Server can be configured through environment variables and configuration files. The most common configuration options include:

### Environment Variables

Key environment variables for configuring Seata Server:

* `SEATA_IP`: The IP address Seata Server binds to (default: 0.0.0.0)
* `SEATA_PORT`: The port for the HTTP service (default: 8091)
* `STORE_MODE`: Transaction log storage mode (file, db, redis)
* `SERVER_NODE`: Server node ID for cluster deployment

Example with custom configuration:
```sh
docker run -d \
  -p 8091:8091 \
  -p 7091:7091 \
  -e SEATA_IP=0.0.0.0 \
  -e SEATA_PORT=8091 \
  -e STORE_MODE=file \
  cgr.dev/ORGANIZATION/seata-server:latest
```

### Using Configuration Files

To provide custom configuration files, mount them as volumes:
```sh
docker run -d \
  -p 8091:8091 \
  -p 7091:7091 \
  -v $(pwd)/config:/seata-server/resources \
  cgr.dev/ORGANIZATION/seata-server:latest
```

This approach allows you to customize `application.yml` and `registry.conf` files for more advanced configurations including database connections, registry settings, and transaction modes.

## Documentation and Resources

* [Apache Seata Official Documentation](https://seata.apache.org/docs/overview/what-is-seata)
* [Seata GitHub Repository](https://github.com/apache/incubator-seata)
* [Chainguard Academy: Getting Started with Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ingress-nginx-controller-iamguarded-fips

# ingress-nginx-controller-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ingress-nginx-controller-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ingress-nginx-controller-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 Ingress-NGINX Controller for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `ingress-nginx-controller-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Ingress NGINX Controller IAMGuarded is a security-enhanced variant of Ingress NGINX Controller designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Ingress NGINX Controller deployments.

## Helm Chart Installation

The Ingress NGINX Controller IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-ingress-controller oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
image:
  repository: ORGANIZATION/ingress-nginx-controller-iamguarded-fips

volumePermissions:
  image:
    repository: ORGANIZATION/nginx-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/ingress-nginx-controller-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

defaultBackend:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```
#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-ingress-controller oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx-ingress-controller:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Ingress NGINX Controller IAMGuarded installation using standard Ingress NGINX Controller verification methods. The deployment functions as a standard Ingress NGINX Controller instance, so all typical Ingress NGINX Controller validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Ingress NGINX Controller IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Ingress NGINX Controller and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### timestamp-authority

# timestamp-authority
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/timestamp-authority` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/timestamp-authority/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

timestamp-authority is an RFC3161 Timestamp Authority, a core component of the sigstore stack

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Sigstore timestamp-authority

timestamp-authority is one of the core components of the sigstore stack.  For more information on this see [`sigstore-scaffolding`](../sigstore-scaffolding/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ceph-fips

# ceph-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ceph-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ceph-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `ceph-fips` image is compatible with the upstream [Ceph image](https://quay.io/repository/ceph/ceph). Chainguard's image contains only the minimum set of dependencies needed to run Ceph.

*The Chainguard Ceph image doesn't support the `mgr-dashboard` at this time due to this upstream issue in PyO3 https://github.com/PyO3/pyo3/issues/576*

### FIPS support

Chainguard's `ceph-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To run the docker image, use the following command:

```bash
docker run --rm -it cgr.dev/ORGANIZATION/ceph-fips:latest
```

To spin up a minimal Ceph cluster, you can use a manual approach or `cephadm`. The manual approach involves creating a config file as shown:

```bash
cat <<EOF > /etc/ceph/ceph.conf
[global]
fsid = ${UUID}
mon_initial_members = ${HOSTNAME}
mon_host = 127.0.0.1
public network = 127.0.0.0/8
auth_cluster required = cephx
auth_service required = cephx
auth_client required = cephx
osd_pool_default_size = 1
osd_pool_default_min_size = 1
mon warn on insecure global id reclaim allowed = false
mon warn on insecure global id reclaim = false
mon warn on pool no redundancy = false
EOF
```

The guide [here](https://docs.ceph.com/en/latest/install/manual-deployment/) gives detailed instructions on manual deployment of a Ceph cluster.

## Documentation and Resources

* Ceph GitHub - https://github.com/ceph/ceph
* Ceph Docs - https://docs.ceph.com/en/reef

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-workload-identity-webhook

# azure-workload-identity-webhook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-workload-identity-webhook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-workload-identity-webhook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A webhook for Kubernetes that enables Azure Active Directory based authentication from Kubernetes workloads to Azure resources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `azure-workload-identity-webhook` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream Azure Workload Identity Webhook image](https://github.com/Azure/azure-workload-identity/blob/83c6e62a604c4b06b0ba2c9d67e5a0e57a8a541e/charts/workload-identity-webhook/values.yaml#L7) while maintaining minimal dependencies and enhanced security.

## Getting Started

You can deploy `azure-workload-identity-webhook` using a Helm chart that installs the necessary Kubernetes resources, including the mutating webhook, custom resource definitions (CRDs), and RBAC configurations.

First, add the Azure Workload Identity Helm repository:

```shell
helm repo add azure-workload-identity https://azure.github.io/azure-workload-identity/charts
```

Next, create a `values.yaml` file so you can install Chainguard's `azure-workload-identity-webhook` container image:

```shell
cat > values.yaml << EOF
image:
  repository: cgr.dev/chainguard/azure-workload-identity-webhook
  tag: latest
EOF
```

Then install the webhook using the `values.yaml` file:

```shell
helm install workload-identity-webhook azure-workload-identity/workload-identity-webhook \
  --namespace azure-workload-identity-system \
  --create-namespace \
  --values values.yaml
```

> [!NOTE]
> This deployment requires proper Azure Active Directory configuration and service principal setup. The webhook will be fully functional once the necessary Azure Active Directory permissions and service account configurations are in place. Refer to the [Azure Workload Identity documentation](https://azure.github.io/azure-workload-identity/docs/installation.html#prerequisites) for detailed setup instructions.

## Documentation and Resources

The Azure Workload Identity Webhook enables Kubernetes workloads to authenticate with Azure services using Azure Active Directory workload identity federation. You can explore the following resources to learn more:

* [Azure Workload Identity GitHub Project](https://github.com/Azure/azure-workload-identity)
* [Azure Workload Identity Documentation](https://azure.github.io/azure-workload-identity/docs/)
* [Quickstart Guide](https://azure.github.io/azure-workload-identity/docs/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kapp-controller

# kapp-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kapp-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kapp-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Continuous delivery and package management for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-postgres-exporter-iamguarded

# prometheus-postgres-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-postgres-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-postgres-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A PostgreSQL metric exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PostgreSQL IAMGuarded is a security-enhanced variant of PostgreSQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main PostgreSQL image
image:
  registry: myregistry.example.com
  repository: mirrored/postgres-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/postgresql:16.7.2
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clamav

# clamav
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clamav` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clamav/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ClamAV® is an open source antivirus engine for detecting trojans, viruses, malware & other malicious threats.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [ClamAV image on Docker Hub](https://hub.docker.com/r/clamav/clamav/). Switching to Chainguard's image should not require any changes to your existing setup. This image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager.

## Getting Started

While the official documentation does not provide a clear way to deploy the image on Kubernetes, you can use the following commands to deploy ClamAV on your Kubernetes cluster with Helm.

Start by creating a `values.yaml` file:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

clamdConfigDict:
  LogFile: /var/log/clamav/clamd.log
  LogTime: yes
  PidFile: /run/clamav/clamd.pid
  FIPSCryptoHashLimits: no
  LocalSocket: /run/clamav/clamd.sock
  TCPSocket: 3310
  User: clamav

freshclamConfigDict:
  FIPSCryptoHashLimits: no
  UpdateLogFile: /var/log/clamav/freshclam.log
  PidFile: /run/clamav/freshclam.pid
  DatabaseOwner: clamav
  DatabaseMirror: database.clamav.net
  ScriptedUpdates: yes
  NotifyClamd: /etc/clamav/clamd.conf
EOF
```

Now, you can install the Helm Chart:

```shell
helm install clamav oci://ghcr.io/wiremind/wiremind-helm-charts/clamav:3.7.1 -f values.yaml
```

When the Pod(s) are running, you can use the following command to scan a file:

```shell
# Port-forward to the ClamAV service
kubectl port-forward service/clamav 3310 &
# Download a test file from EICAR
wget https://secure.eicar.org/eicar.com.txt -O eicar-com.txt
# Extract the content of the file to a variable
EICAR_CONTENT=$(cat eicar-com.txt)
# Get the Pod name to execute the scan
POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=clamav -o jsonpath='{.items[0].metadata.name}')
# Execute the test inside the ClamAV pod:
kubectl exec -it ${POD_NAME} -- sh -c "echo '${EICAR_CONTENT}' > /tmp/eicar.txt && clamscan /tmp/eicar.txt"
# Expected output will be similar to: "Eicar-Signature FOUND"
```

## Update the Database Definitions

ClamAV automatically updates its database definitions on Pod startup. But if you want to update the definitions manually, you can exec into the Pod and run the `freshclam` command, and expect the `Database test passed.` log messages. Jump to linked documentation for more information.

## Documentation and Resources

You can learn more about ClamAV via the [official documentation](https://docs.clamav.net). Additionally, you can find the [Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/clamav/clamav). To update the database definitions, you can refer to the [Updating Signature Databases](https://docs.clamav.net/manual/Usage/SignatureManagement.html#freshclam) documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-autoscaler

# cluster-autoscaler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-autoscaler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-autoscaler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Kubernetes Cluster Autoscaler Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add autoscaler https://kubernetes.github.io/autoscaler
$ helm install my-release autoscaler/cluster-autoscaler \
    --set image.repository=cgr.dev/chainguard/cluster-autoscaler \
    --set image.tag=latest
    <other configuration parameters here>
```

Note that the `cluster-autoscaler` does need cloud provider configuration to work correctly, so it won't run locally.
See the [configuration](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/charts/cluster-autoscaler) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tempo-fips

# tempo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tempo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tempo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `tempo-fips` container image is a FIPS-enabled variant of Grafana Tempo that functions identically to both the upstream [Grafana Tempo image](https://hub.docker.com/r/grafana/tempo) and the non-FIPS [Chainguard Tempo image](https://images.chainguard.dev/directory/image/tempo). Like Chainguard's other container images, `tempo-fips` was designed with security and minimalism in mind, and doesn't include things like a shell or package manager. 

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Helm Deployment

You can deploy `tempo-fips` using the official Grafana Helm chart. Start by creating a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
tempo:
  repository: cgr.dev/ORGANIZATION/tempo-fips
  tag: latest
EOF
```

Add the Grafana Helm repository and install:

```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install tempo grafana/tempo -f values.yaml
```

### Docker Example

For testing or development, you can run Tempo FIPS with a basic configuration:

```shell
docker run --rm cgr.dev/ORGANIZATION/tempo-fips:latest -version
```

This will display the Tempo version information with FIPS-enabled Go runtime, confirming the image is working correctly.

## Documentation and Resources

- [Grafana Tempo Documentation](https://grafana.com/docs/tempo/latest/)
- [Grafana Helm Charts Repository](https://github.com/grafana/helm-charts)
- [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-iamguarded-fips

# mongodb-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MongoDB](https://www.mongodb.com/) is a document-oriented database management system. MongoDB is a popular example of a NoSQL database, and stores data in JSON-like documents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `mongodb-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

MongoDB IAMGuarded is a security-enhanced variant of MongoDB designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard MongoDB deployments.

## Helm Chart Installation

The MongoDB IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MongoDB image
image:
  registry: myregistry.example.com
  repository: mirrored/mongodb-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus MongoDB exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mongodb-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# When external access to MongoDB is enabled:
externalAccess:
  # This is the image of the auto-discovery init container that
  # auto-detects LB IPs or node ports.
  autoDiscovery:
    image:
      registry: myregistry.example.com
      repository: mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag
  # Image of the init container that ensures public names can be resolved.
  dnsCheck:
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# Image of the container that enables TLS support to MongoDB.
tls:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image of the init container that sets up volume permissions.
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mongodb:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MongoDB IAMGuarded installation using standard MongoDB verification methods. The deployment functions as a standard MongoDB instance, so all typical MongoDB validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MongoDB IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MongoDB and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-aws-controller-fips

# cluster-api-aws-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-aws-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-aws-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API Provider AWS provides consistent deployment and day 2 operations of "self-managed" and EKS Kubernetes clusters on AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `cluster-api-aws-controller-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Compatibility Notes

Chainguard's cluster-api-aws-controller image is compatible with the upstream [Cluster API Provider AWS](https://github.com/kubernetes-sigs/cluster-api-provider-aws). This image contains only the minimum set of dependencies needed to run the AWS infrastructure provider components.

## Getting Started

The Cluster API Provider for AWS enables you to create and manage Kubernetes clusters on Amazon Web Services using Cluster API. It provides declarative APIs for provisioning and managing AWS infrastructure resources including EC2 instances, VPCs, load balancers, and security groups.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Amazon Web Services account with appropriate permissions
- AWS credentials configured (AWS CLI, IAM roles, or environment variables)

### Installation

Initialize the AWS infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure aws
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: aws
  namespace: aws-infrastructure-system
spec:
  version: v2.8.4
  configSecret:
    name: aws-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-aws-controller-fips:latest
EOF
```

### Usage Example

Create an AWS cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSCluster
metadata:
  name: my-aws-cluster
  namespace: default
spec:
  region: us-east-1
  network:
    vpc:
      id: ""
  controlPlaneEndpoint:
    host: "1.2.3.4"
    port: 6443
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSMachineTemplate
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      instanceType: t3.medium
      ami:
        id: ami-12345678
      publicIP: true
      rootVolume:
        size: 50
        type: gp3
```

### Configuration

The controller requires AWS credentials with the following IAM permissions:
- EC2 Full Access or equivalent granular permissions
- ELB (Elastic Load Balancer) management permissions
- VPC and networking management permissions
- IAM permissions for service-linked roles

Create and configure the credentials secret:

```bash
kubectl create secret generic aws-credentials \
  --from-literal="AWS_B64ENCODED_CREDENTIALS=$(base64 -w0 < ./aws-credentials)" \
  --namespace aws-infrastructure-system
```

Where `aws-credentials` file contains:
```
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
```

## Documentation and Resources

* [Cluster API Provider AWS GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-aws)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Amazon Web Services Documentation](https://docs.aws.amazon.com/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sigstore-policy-controller

# sigstore-policy-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sigstore-policy-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sigstore-policy-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Policy Controller image that is part of the Sigstore stack

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Minimal `sigstore/policy-controller` image

This image can be used with the upstream helm chart with the following
overrides:

```bash
IMAGE=cgr.dev/chainguard/sigstore-policy-controller

helm repo add sigstore https://sigstore.github.io/helm-charts

helm install policy-controller sigstore/policy-controller \
	--namespace policy-controller \
	--create-namespace \
	--set webhook.image.repository="${IMAGE}" \
	--set webhook.image.version="$(crane digest ${IMAGE})"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kserve

# kserve
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kserve` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kserve/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
KServe enables the scalable deployment of machine learning models in Kubernetes. It provides mechanisms for model versioning, monitoring, and autoscaling, and is built on top of Kubernetes' extensibility features, such as custom resource definitions (CRDs) and operators.

### Components
This deployment includes the following critical KServe components:
- [Agent](https://github.com/kserve/kserve): Responsible for dynamically pulling models from storage (e.g., Google Cloud Storage or S3) and loading them into the model server.
- [KServe Controller](https://github.com/kserve/modelmesh-serving): Manages the lifecycle of ML models and their associated services in Kubernetes.
- [ModelMesh Controller](https://github.com/kserve/modelmesh): Manages model serving infrastructure, including dynamic model loading and inference.
- [ModelMesh Runtime Adapter](https://github.com/kserve/kserve): Communicates between ModelMesh and models.
- [REST Proxy](https://github.com/kserve/rest-proxy): Acts as a proxy layer for model serving, supporting multiple model types.
- [Router](https://github.com/kserve/kserve): Manages routing inference requests to the appropriate model version or model instance. It handles traffic distribution, enabling versioned model serving and A/B testing.
- [Storage Initializer](https://github.com/kserve/kserve): Downloads models from storage systems and prepares them for inference.

### Installation

You can install KServe components using Helm charts. Below are instructions for deploying KServe with Chainguard images.

#### 1. Install KServe CRDs
KServe relies on Custom Resource Definitions (CRDs) to manage model serving resources.

```bash
helm install kserve-crd oci://ghcr.io/kserve/charts/kserve-crd --version v0.13.1
```

#### 2. Deploy KServe Components with Custom Images
To deploy KServe with Chainguard images, use the following Helm commands:

```bash
helm install kserve oci://ghcr.io/kserve/charts/kserve --version v0.13.1 \
  --set kserve.agent.image.repository=cgr.dev/chainguard/kserve-agent \
  --set kserve.agent.image.tag=latest
  --set kserve.router.image.repository=cgr.dev/chainguard/kserve-router \
  --set kserve.router.image.tag=latest
  --set kserve.controller.deploymentMode="RawDeployment" \
  --set kserve.controller.image.repository=cgr.dev/chainguard/kserve-controller \
  --set kserve.controller.image.tag=latest \
  --set kserve.modelmesh.enabled=true \
  --set kserve.modelmesh.controller.image.repository=cgr.dev/chainguard/kserve-modelmesh-controller \
  --set kserve.modelmesh.controller.image.tag=latest \
  --set kserve.modelmesh.config.restProxyImage=cgr.dev/chainguard/kserve-rest-proxy \
  --set kserve.modelmesh.config.restProxyImageTag=latest \
  --set kserve.storage.image.repository=cgr.dev/chainguard/kserve-storage-initializer \
  --set kserve.storage.image.tag=latest
  --set kserve.modelmesh.config.modelmeshImage=cgr.dev/chainguard/kserve-modelmesh \
  --set kserve.modelmesh.config.modelmeshImageTag=latest \
  --set kserve.modelmesh.config.modelmeshRuntimeAdapterImage=cgr.dev/chainguard/kserve-modelmesh-runtime-adapter \
  --set kserve.modelmesh.config.modelmeshRuntimeAdapterImageTag=latest \
```

For detailed installation configurations, refer to the [KServe Helm chart values.yaml](https://github.com/kserve/kserve/blob/master/charts/kserve-resources/values.yaml).

## Inference Testing

Inference tests are critical to validating KServe's model serving capabilities. After deploying KServe, you can run inference tests to confirm that the deployed models are working as expected. [For more info](https://kserve.github.io/website/docs/getting-started/predictive-first-isvc)

### 1. Apply a Sample Inference Service
The following example creates an inference service that uses the `iris-sklearn` model:

```bash
kubectl apply -f /tests/inference-service.yaml
```

This service will download the model using the storage-initializer, and KServe will expose the model for inference requests.

### 2. Test Inference Using Port Forwarding
Once the inference service is running, you can send inference requests to validate the model's predictions:

```bash
kubectl port-forward -n kserve-test svc/iris-sklearn-predictor 8080:80 &
```

Use the following command to send a test prediction request:

```bash
curl -s -X POST http://localhost:8080/v1/models/iris-sklearn:predict \
  -H "Content-Type: application/json" \
  -d '{"instances": [[5.1, 3.5, 1.4, 0.2]]}'
```

You should receive a response like this:

```json
{"predictions":[0]}
```

This confirms that the inference service is functioning correctly.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### knative-eventing-fips

# knative-eventing-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/knative-eventing-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/knative-eventing-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Event-driven application platform for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Knative Eventing Images are comparable to the official Knative Eventing Images. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Support
The Knative Eventing FIPS Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on FIPS-enabled Chainguard Images on Chainguard Academy

## Getting Started

You want to install Knative operator:
```
helm repo add knative-operator https://knative.github.io/operator
helm install knative-operator \
  --create-namespace \
  --namespace knative-operator \
  knative-operator/knative-operator \
  -f values.yaml
```
values.yaml
```
knative_operator:
  knative_operator:
    image: cgr.dev/ORGANIZATION/knative-operator
    tag: latest
  operator_webhook:
    image: cgr.dev/ORGANIZATION/knative-operator-webhook
    tag: latest
```
Once you have the operator up and running, create the KnativeEventing custom resource:
```
kubectl create ns knative-eventing
```
```
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
  name: knative-eventing
  namespace: knative-eventing
spec:
  registry:
    override:
      eventing-controller/eventing-controller: knative-eventing-controller-fips
      eventing-webhook/eventing-webhook: knative-eventing-webhook-fips
      imc-controller/controller: knative-eventing-channel-controller-fips
      imc-dispatcher/dispatcher: knative-eventing-channel-dispatcher-fips
      mt-broker-controller/mt-broker-controller: knative-eventing-mtchannel-broker-fips
      mt-broker-ingress/ingress: knative-eventing-ingress-fips
      mt-broker-filter/filter: knative-eventing-filter-fips
      job-sink/job-sink: knative-eventing-jobsink-fips
```
Once the CR is applied, verify that all components (deployments) are up and running in the knative-eventing namespace
```
kubectl get pods -n knative-eventing
```
Next, to verify functionality, you can create a broker:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: $BROKER_NAME
EOF
```
and create a sink:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: $SINK_NAME
  labels:
    app: $SINK_NAME
spec:
  containers:
    - name: $SINK_NAME
      image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display
---
apiVersion: v1
kind: Service
metadata:
  name: $SINK_NAME
spec:
  selector:
    app: $SINK_NAME
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
EOF
```
next, create trigger:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: trigger-to-sink
spec:
  broker: $BROKER_NAME
  filter:
    attributes:
      type: dev.knative.sources.ping
  subscriber:
    ref:
      apiVersion: v1
      kind: Service
      name: $SINK_NAME
EOF
```
Finally, a source:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: $PING_NAME
spec:
  schedule: "*/1 * * * *"
  contentType: "application/json"
  data: '{"message": "$EVENT_MESSAGE"}'
  sink:
    ref:
      apiVersion: eventing.knative.dev/v1
      kind: Broker
      name: $BROKER_NAME
EOF
```
Check logs in the newly created pod (from the Knative Service) to verify event delivery:
```
"message": "Hello from PingSource!"
```
This demonstrates the source to sink pattern working end-to-end.

For more eventing patterns, visit[ Knative Eventing Patterns](https://kubebyexample.com/learning-paths/developing-knative-kubernetes/introduction-knative-eventing)

## Documentation and Resources
- [Knative eventing docs](https://knative.dev/docs/eventing/)
- [Configuring the Eventing Operator custom resource](https://knative.dev/docs/install/operator/configuring-eventing-cr/)
- [Sending an event](https://knative.dev/docs/getting-started/first-source/#sending-an-event)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentofu-fips

# opentofu-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentofu-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentofu-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OpenTofu](https://opentofu.org/) is an open-source infrastructure as code tool that allows you to declaratively manage your cloud infrastructure. OpenTofu is a fork of Terraform managed by the Linux Foundation.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's opentofu-fips container image is comparable to the [OpenTofu image maintained by the Linux Foundation](https://opentofu.org/docs/intro/install/docker/). Like most of Chainguard's container images, the OpenTofu image does not operate as the root user and includes only the minimum packages needed to function. Note that this image sets `opentofu` as the entrypoint.

> [!IMPORTANT]
> As of this writing, Chainguard does not offer any hardened [providers](https://opentofu.org/docs/language/providers/) for the OpenTofu image, although we may do so in the future.

### FIPS Support

The opentofu-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

In order to use Chainguard's OpenTofu container image, you'll need an existing configuration. If you don't already have one in place, you can follow these instructions to set up an example configuration and then apply it.

First create a new directory and navigate into it:

```shell
mkdir opentofu-test && cd $_
```

Then create a `main.tf` file to hold the configuration. This example generates and outputs a string of sixteen random characters:

```shell
cat > ./main.tf <<EOF
terraform {
  required_providers {
	random = {
  	source  = "hashicorp/random"
	}
  }
}

provider "random" {}

resource "random_string" "random" {
  length = 16
}

output "random" {
  value = random_string.random.result
}
EOF
```

With the example configuration in place, run the following command to initialize the working directory:

```shell
docker run --rm \
  -v "${PWD}":/work \
  -w /work \
  cgr.dev/ORGANIZATION/opentofu-fips init
```

Finally, you can apply the configuration:

```
docker run --rm \
  -v "${PWD}":/work \
  -w /work \
  cgr.dev/ORGANIZATION/opentofu-fips apply
```
```
. . .

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

random = "E2rURfL2Wsc)kf8I"
```

## Documentation and Resources

* [OpenTofu Documentation](https://opentofu.org/docs/)
* [OpenTofu Project GitHub Repository](https://github.com/opentofu/opentofu)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-bit

# fluent-bit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-bit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-bit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Fluent Bit](https://fluentbit.io) is a lightweight and high performance log processor.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Fluent Bit image is meant to serve as a drop-in replacement for [the official Fluent Bit image from Docker Hub](https://hub.docker.com/r/fluent/fluent-bit). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

Run a Fluent Bit instance that will receive messages over TCP port 24224 through the Forward protocol, and send the messages to the STDOUT interface in JSON format every second:

```sh
docker run -p 127.0.0.1:24224:24224 cgr.dev/ORGANIZATION/fluent-bit /usr/bin/fluent-bit -i forward -o stdout -p format=json_lines -f 1
```

In a separate terminal window, start a separate container that will send a test message. This time the Docker container will use the [Fluent output protocol](https://docs.fluentbit.io/manual/pipeline/outputs/forward) as the logging driver:

```sh
docker run --log-driver=fluentd -t ubuntu echo "Testing a log message"
```

In the Fluent Bit container output in the first terminal, this second container will print a new entry to stdout at the end of the output, like this:

```sh
Fluent Bit v2.2.1
* Copyright (C) 2015-2023 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

[2024/12/03 13:16:12] [ info] [fluent bit] version=2.2.1, commit=842a48223b, pid=1
[2024/12/03 13:16:12] [ info] [storage] ver=1.5.1, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2024/12/03 13:16:12] [ info] [cmetrics] version=0.6.6
[2024/12/03 13:16:12] [ info] [ctraces ] version=0.4.0
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] initializing
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] storage_strategy='memory' (memory only)
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] listening on 0.0.0.0:24224
[2024/12/03 13:16:12] [ info] [sp] stream processor started
[2024/12/03 13:16:12] [ info] [output:stdout:stdout.0] worker #0 started
{"date":1733231822.0,"source":"stdout","log":"Testing a log message\r","container_id":"f142171cc239a9a51e9dc75f2ca603183293514e625cbef50906e9256be2f0a5","container_name":"/intelligent_gagarin"}

```

You can instead deploy Fluent Bit as a Helm chart by running the following:

```shell
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
```

Then, create a YAML values file with the following command:

```shell
cat > values.yaml <<EOF
image:
  repository: cgr.dev/chainguard/fluent-bit
  tag: latest

command:
  - /usr/bin/fluent-bit

EOF
```

Next, install it with the following command:

```shell
helm upgrade --install fluent-bit -f values.yaml fluent/fluent-bit
```

## Documentation and Resources

* [Fluent Bit official documentation](https://docs.fluentbit.io/manual)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### distribution

# distribution
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/distribution` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/distribution/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The toolkit to pack, ship, store, and deliver container content

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are various ways to run the distribution image, the simplest way of running the distribution image is to use the following command:

```bash
$ docker run -d -p 5000:5000 --restart=always --name registry cgr.dev/chainguard/distribution:latest
```

> For more information about deploying the registry, you can check the [official documentation](https://distribution.github.io/distribution/about/deploying/).

Then you should be able to access the registry on `http://localhost:5000`.

In order to push and pull images from the registry, you may want to use `crane` tool which is a tool for interacting with container registries.

In case you want to test the registry with `crane`, you can use the following commands:

```bash
crane copy alpine:latest localhost:5000/alpine:latest
```

and check for the tags for the `alpine` image:

```bash
$ crane ls localhost:5000/alpine
latest
```

In case you want to deploy it on Kubernetes, you can use the following Helm chart: https://distribution.github.io/distribution/about/deploying/

```bash
helm repo add twuni https://helm.twun.io
helm repo update
```

You can then install the chart with the following command:

```bash
helm install registry twuni/docker-registry \
   --set image.tag=latest \
   --set image.repository=cgr.dev/chainguard/distribution
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dapr

# dapr
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dapr` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dapr/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dapr is a portable, event-driven, runtime for building distributed applications across cloud and edge.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard dapr images are compatible with dapr project images. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started
We can use helm charts for testing dapr images. We can create a values.yaml that'll override upstream images with Chainguard images.

```yaml
global:
  imagePullPolicy: IfNotPresent

dapr_operator:
  image:
    name: cgr.dev/ORGANIZATION/dapr-operator

dapr_placement:
  image:
    name: cgr.dev/ORGANIZATION/dapr-placement

dapr_scheduler:
  image:
    name: cgr.dev/ORGANIZATION/dapr-scheduler

dapr_sentry:
  image:
    name: cgr.dev/ORGANIZATION/dapr-sentry

dapr_sidecar_injector:
  injectorImage:
    name: cgr.dev/ORGANIZATION/darp-injector
  image:
    name: cgr.dev/ORGANIZATION/daprd
```
After that we can do the following to install the chart in our cluster.
```bash
helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update
helm install dapr dapr/dapr --namespace dapr-system --wait -f values.yaml
```

## Documentation & Resources
Please refer to the upstream [documentation](https://docs.dapr.io/) for a [getting started](https://docs.dapr.io/getting-started/) guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### maven-fips

# maven-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/maven-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/maven-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Tags and FIPS specific notes

The tags are in the form of `<MAVEN_VERSION>-jdk<OPENJDK_VERSION>[-dev]`, such that one can track `3.9-jdk21` for Maven 3.9.x with OpenJDK 21.

The `-dev` variants contain jmods, thus suitable to use jlink.

Note, exclude bc-fips.jars `/usr/share/java/bouncycastle-fips/` module-path from jlink, as jlink is unable to link signed jars. Instead ensure that `--module-path=/usr/share/java/bouncycastle-fips` is used at runtime, with such path copied from either this image, or `jdk-fips` or `jre-fips` images.

OpenJDK 8 is not currently supported for FIPS, thus with this image, one must target at least JDK 11 during build.

Please see specification tab for the extra variables set to ensure Maven and Java are operating in FIPS mode.

## Using Maven

Chainguard Maven images come with different versions of OpenJDK, ensure you choose the correct image tag for your application needs.  In these examples we will use a Chainguard Maven image based on OpenJDK 21.

Check the maven version
```
docker run --rm --platform=linux/amd64 cgr.dev/chainguard/maven-fips:3.9-jdk21 --version
```

### Examples

#### SpringBoot

Visit https://start.spring.io

Select the following options:

1. __Project__: select `Maven Project`
2. __Spring Boot__: latest GA version, e.g. `2.7.5`
3. __Project Metadata__: populate your application details
4. __Packaging__: select your packaging. For this demo, we'll use `jar`
5. __Java__: select Java version, e.g. `21` that matches the OpenJDK image version we are building with
6. __Dependencies__: choose your dependencies, e.g. `Spring Web`
7. __Generate__: Hit that generate button!

![Spring Initializr](docs/png/spring_initializr.png)

Go to your downloaded zip file, unzip
```sh
mkdir ~/chainguard-sb
cd chainguard-sb
mv ~/Downloads/demo.zip .
unzip demo.zip
cd demo
```

You now have your generated Spring Boot application source code.  Now let's build it.

```sh
docker run --platform=linux/amd64 --rm -v ${PWD}:/home/build cgr.dev/chainguard/maven-fips:3.9-jdk21 clean install
```

Check to see your compiled `jar` file
```sh
find target -name "*.jar"
```
You should see...
```
target/demo-0.0.1-SNAPSHOT.jar
```

Let's run the application using the Chainguard OpenJDK JRE image.  _Note_ there's a few things happening here and this is just for test purposes, see section below for more real world scenarios.

Choose the Chainguard OpenJDK JRE image tag that matches your application's Java version selected when generating your Spring Boot application above.

```
docker run --platform=linux/amd64 --rm -p 8080:8080 -v ${PWD}/target:/app/ cgr.dev/chainguard/jre-fips:openjdk-21 -jar /app/demo-0.0.1-SNAPSHOT.jar
```

Now visit the Spring Boot Application in your browser using the same port mapped in the docker command above.

e.g http://localhost:8080/

![Spring Whitelabel](docs/png/spring_whitelabel.png)

Note this is the expected Spring Whitelabel error page.

#### Multistage Dockerfile

The steps above are useful to test Chainguard images however, we can now create a multistage Dockerfile that will build a smaller image to run our demo application.

First create a `.dockerignore` file so we don't copy the generated maven `./target` folder from the steps above into the multistage docker build.  This helps avoid any permission errors during the build.

```sh
cat <<EOF >>.dockerignore
target/
EOF
```

Next create the multistage `Dockerfile`

```dockerfile
cat <<EOF >>Dockerfile
FROM cgr.dev/chainguard/maven-fips:3.9-jdk21

WORKDIR /home/build

COPY . ./

RUN mvn install

FROM cgr.dev/chainguard/jre-fips:openjdk-21

COPY --from=0 /home/build/target/demo-*.jar /app/demo.jar

CMD ["-jar", "/app/demo.jar"]
EOF
```

Build your application image
```sh
docker build --platform=linux/amd64 -t my-chainguard-springboot-app .
```

Now run your application
```sh
docker run --platform=linux/amd64 --rm -p 8080:8080 my-chainguard-springboot-app
```
Again visit the Spring Boot Whitelabel page in your browser

e.g. http://localhost:8080/

![Spring Whitelabel](docs/png/spring_whitelabel.png)

### What's inside?

Now let's take a closer look at your newly built image.

Check the size of your image, as this is based on Chainguard images it will only contain the Linux packages required to run your application.  The reduces the number of packages that can be affected by CVEs.

```sh
docker images | grep my-chainguard-springboot-app
```

You can also check for vulnerabilities using your favorite scanner.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver

# secrets-store-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Kubernetes Secrets Store CSI Driver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Kubernetes Secrets Store CSI Driver

There are various ways to deploy the Secrets Store CSI Driver. The following example demonstrates how to deploy the driver using Helm.

```bash
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
--namespace kube-system \
--set linux.image.repository=cgr.dev/chainguard-private/secrets-store-csi-driver \
--set linux.image.tag=latest
```

To get more detail about how to deploy the driver, refer to the [official documentation](https://secrets-store-csi-driver.sigs.k8s.io/getting-started/installation.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-rbac-proxy

# kube-rbac-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-rbac-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-rbac-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kube-rbac-proxy` container image is comparable to the upstream [kube-rbac-proxy project](https://github.com/brancz/kube-rbac-proxy) maintained by Brancz. As with other Chainguard Containers, the `kube-rbac-proxy` image was designed with minimalism in mind, and therefore doesn't contain things like a shell or package manager.

## Getting Started

The `kube-rbac-proxy` is a small HTTP proxy for a single upstream that can perform RBAC authorization against the Kubernetes API. It's commonly used to protect metrics endpoints.

### Basic Usage

You can test the image by running it directly:

```shell
docker run --rm cgr.dev/ORGANIZATION/kube-rbac-proxy:latest
```

This will display the help text for kube-rbac-proxy.

### Kubernetes Deployment

Here's a complete example of deploying `kube-rbac-proxy` in a Kubernetes cluster to protect a metrics endpoint:

```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-rbac-proxy
rules:
  - apiGroups: ["authentication.k8s.io"]
    resources:
      - tokenreviews
    verbs: ["create"]
  - apiGroups: ["authorization.k8s.io"]
    resources:
      - subjectaccessreviews
    verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-rbac-proxy
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-rbac-proxy
subjects:
  - kind: ServiceAccount
    name: kube-rbac-proxy
    namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-rbac-proxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-rbac-proxy
  template:
    metadata:
      labels:
        app: kube-rbac-proxy
    spec:
      serviceAccountName: kube-rbac-proxy
      containers:
        - name: kube-rbac-proxy
          image: cgr.dev/ORGANIZATION/kube-rbac-proxy:latest
          args:
            - "--secure-listen-address=0.0.0.0:8443"
            - "--upstream=http://127.0.0.1:8081/"
            - "--v=10"
          ports:
            - containerPort: 8443
              name: https
        - name: prometheus-example-app
          image: quay.io/brancz/prometheus-example-app:v0.5.0
          args:
            - "--bind=127.0.0.1:8081"
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kube-rbac-proxy
  name: kube-rbac-proxy
  namespace: default
spec:
  ports:
    - name: https
      port: 8443
      targetPort: https
  selector:
    app: kube-rbac-proxy
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-rbac-proxy
  namespace: default
```

This example sets up:
- A ClusterRole with permissions for token and subject access reviews
- A deployment with kube-rbac-proxy protecting a sample Prometheus app
- The proxy listens on port `8443` and forwards to the upstream service on port `8081`

## Documentation and Resources

* [kube-rbac-proxy GitHub Repository](https://github.com/brancz/kube-rbac-proxy)
* [Kubernetes RBAC Documentation](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
* [Prometheus Operator Documentation](https://prometheus-operator.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dcgm

# dcgm
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dcgm` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dcgm/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NVIDIA Data Center GPU Manager (DCGM) is a project for gathering telemetry and measuring the health of NVIDIA GPUs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `DCGM` image comparable to [NVIDIA's DCGM image on Docker Hub](https://hub.docker.com/r/nvidia/dcgm).

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it \
  -p 5555:5555 \
  --gpus all \
  cgr.dev/ORGANIZATION/dcgm:latest
```

Then you can interact with it via the [DCGMI CLI](https://docs.nvidia.com/datacenter/dcgm/latest/user-guide/getting-started.html#dcgm-cli-tool) in order to query GPU usage and health statistics

```shell
docker run --rm -it \
  --network host \
  --entrypoint /usr/bin/dcgmi \
  cgr.dev/ORGANIZATION/dcgm:latest group -l
```
```
1 group found.
+----------------------------------------------------------------------------+
| GROUPS                                                                     |
+============+===============================================================+
| Group ID   | 1                                                             |
| Group Name | GPU_Group                                                     |
| GPU ID(s)  | None                                                          |
+------------+---------------------------------------------------------------+
```

## Documentation and Resources
- [DCGM documentation](https://docs.nvidia.com/datacenter/dcgm/latest/contents.html)
- [DCGM C API reference](https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-cloudwatch-exporter

# prometheus-cloudwatch-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-cloudwatch-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-cloudwatch-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus CloudWatch Exporter image for exporting metrics to Amazon AWS CloudWatch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus StatsD Exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-cloudwatch-exporter prometheus-community/prometheus-cloudwatch-exporter \
 --set image.repository=cgr.dev/chainguard/prometheus-cloudwatch-exporter --set image.tag=latest
```

For more detail, please refer to the [CloudWatch Exporter documentation](https://github.com/prometheus/cloudwatch_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow

# kubeflow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubeflow is a Machine Learning Toolkit for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard kubeflow images are compatible with kubeflow project images. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started
There are kustomize files available for deploying these images to a Kubernetes cluster using the official Kubeflow GitHub [repository](https://github.com/kubeflow/manifests).

For each component, follow these steps:

1. Create a `kustomization.yaml` as shown.
2. Run:
```bash
kubectl apply -k .
```

### Notebook Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/jupyter/notebook-controller/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/notebook-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-notebook-controller
    newTag: latest
namespace: kubeflow
```

### Profile Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/tree/master/applications/profiles/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/profile-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-profile-controller
    newTag: latest
namespace: kubeflow
```

### PVCViewer Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/pvcviewer-controller/upstream/base/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/pvcviewer-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-pvcviewer-controller
    newTag: latest
namespace: kubeflow
```

### Tensorboard Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/tensorboard/tensorboard-controller/upstream/base/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/kubeflow/tensorboard-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-tensorboard-controller
    newTag: latest
namespace: kubeflow
```

### Access Management
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/profiles/upstream/overlays/kubeflow/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/kubeflow/kfam
    newName: cgr.dev/ORGANIZATION/kubeflow-access-management
    newTag: latest
namespace: kubeflow
```

### Admission Webhook
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/admission-webhook/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/poddefaults-webhook
    newName: cgr.dev/ORGANIZATION/kubeflow-admission-webhook
    newTag: latest
namespace: kubeflow
```

### Jupyter Web App
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/tree/master/applications/jupyter/jupyter-web-app/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/jupyter-web-app
    newName: cgr.dev/ORGANIZATION/kubeflow-jupyter-web-app
    newTag: latest
namespace: kubeflow
```

### Volumes Web App
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/volumes-web-app/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/volumes-web-app
    newName: cgr.dev/ORGANIZATION/kubeflow-volumes-web-app
    newTag: latest
namespace: kubeflow
```

---

## Final Step

After defining the kustomization for each component:

```bash
kubectl apply -k .
```

## Documentation & Resources
Please refer to the upstream [documentation](https://www.kubeflow.org/) for a [getting started](https://www.kubeflow.org/docs/started/) guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-cli

# aws-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [aws-cli](https://github.com/aws/aws-cli) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `aws-cli` container image is comparable to the upstream [Amazon AWS CLI image](https://hub.docker.com/r/amazon/aws-cli), with improved security and few-to-zero CVEs. 

## Getting Started

Before using the aws-cli Chainguard Container, you need to configure your [AWS credentials](https://github.com/aws/aws-cli/tree/v2#getting-started). There are a number of ways you can do this, so we encourage you to review the official [AWS credentials documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#configure-precedence) to determine what method works best for you.

AWS credentials and configurations are typically stored in a directory named `.aws`. Assuming you've already set up your AWS credentials locally, you can share them from your host machine to a container by mounting this directory as a volume. The following command follows this method to pass along AWS credentials in order to retrieve a list of EKS clusters: 

```shell
docker run --rm -it -v ~/.aws:/home/nonroot/.aws:ro cgr.dev/chainguard/aws-cli:latest s3 ls
```

Note that Chainguard's aws-cli container image has a single user `nonroot` with uid `65532`, belonging to gid `65532`.; the previous command mounts the local `.aws` directory under this user's home directory. Be aware that if you follow this method you may need to adjust the permissions of your local credentials file in order for the container to be able to read it.

You can get help with any command when using the AWS Command Line Interface (AWS CLI) by following any command name with `help`. For example, the following command displays help for the general AWS CLI options and the available top-level commands:

```shell
docker run --rm cgr.dev/chainguard/aws-cli:latest help
```

The following command displays help information for the `aws ec2 run-instances` command:

```shell
docker run --rm cgr.dev/chainguard/aws-cli:latest ec2 run-instances help
```

Please refer to the official [Getting Started](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-help.html) guide for more information.

## Documentation and Resources

- [AWS CLI User Guide](https://docs.aws.amazon.com/cli/latest/userguide/)
- [AWS CLI Configuration and Credential File Settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bank-vaults

# bank-vaults
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bank-vaults` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bank-vaults/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Image for [Bank Vaults](https://bank-vaults.dev/), a CLI tool to init, unseal and configure Vault 

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add bank-vaults oci://ghcr.io/bank-vaults/helm-charts/vault-operator
$ helm install bank-vaults bank-vaults/bank-vaults \
    --set bankVaults.image.repository=cgr.dev/chainguard/bank-vaults \
    --set bankVaults.image.tag=latest
    <other configuration parameters here>
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tempo

# tempo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tempo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tempo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Grafana Tempo is a high volume, minimal dependency distributed tracing backend.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `tempo` container image is designed to be a drop-in replacement for the [Grafana Tempo image](https://hub.docker.com/r/grafana/tempo). Like Chainguard's other container images, `tempo` was designed with security and minimalism in mind, and doesn't include things like a shell or package manager. 

## Getting Started

### Helm Deployment

You can deploy Tempo using the official Grafana Helm chart. Start by creating a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
tempo:
  repository: cgr.dev/ORGANIZATION/tempo
  tag: latest
EOF
```

Add the Grafana Helm repository and install:

```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install tempo grafana/tempo -f values.yaml
```

### Docker Example

For testing or development, you can run Tempo with a basic configuration:

```shell
docker run --rm cgr.dev/ORGANIZATION/tempo:latest -version
```

This will display the Tempo version information, confirming the image is working correctly.

## Documentation and Resources

- [Grafana Tempo Documentation](https://grafana.com/docs/tempo/latest/)
- [Grafana Helm Charts Repository](https://github.com/grafana/helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mysql-fips

# mysql-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mysql-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mysql-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MySQL is a widely used open-source relational database management system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `mysql-fips` is the FIPS version of Chainguard's `mysql` image. It is comparable to the [official mysql image](https://hub.docker.com/_/mysql) from Docker Hub. Chainguard images are designed with minimalism and security in mind, and thus the `mysql-fips` image has a few key differences from the upstream image:

* Chainguard's `mysql-fips` image only has the minimum set of dependencies needed to function. This means it does not come with certain tools or utilities, such as a package manager.
    * Unlike most of Chainguard's container images, though, the `mysql-fips` image does come with a shell.
* Chainguard's `mysql-fips` image does not ship with a default configuration file (such as `/etc/my.cnf`). However, you can run the image with a custom configuration, or extend it with environment variables. Refer to the **Initializing the database using environment variables** and **Running MySQL with a custom options file** sections for more information. 

## Getting Started

The default MySQL port is `3306`. To run a quick test MySQL server container with an empty root password, use the following command:

```shell
docker run -p 3306:3306 --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 cgr.dev/ORGANIZATION/mysql-fips
```

Don't forget to replace `ORGANIZATION` with your organization's designated private repository.

```
Thu Sep 12 13:42:59 UTC 2024 [Note] [Entrypoint]: Entrypoint script for MySQL Server  started.
Thu Sep 12 13:42:59 UTC 2024 [Note] [Entrypoint]: Initializing database files
2024-09-12T13:42:59.828911Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-09-12T13:42:59.829672Z 0 [System] [MY-013169] [Server] /usr/bin/mysqld (mysqld 8.4.2) initializing of server in progress as process 41
2024-09-12T13:42:59.837924Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-12T13:43:00.401495Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-12T13:43:02.507476Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2024-09-12T13:43:05.547743Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
Thu Sep 12 13:43:05 UTC 2024 [Note] [Entrypoint]: Database files initialized
Thu Sep 12 13:43:05 UTC 2024 [Note] [Entrypoint]: Starting temporary server

(...)

2024-09-12T13:43:09.669017Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-09-12T13:43:09.876146Z 0 [System] [MY-010116] [Server] /usr/bin/mysqld (mysqld 8.4.2) starting as process 1
2024-09-12T13:43:09.889947Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-12T13:43:10.365620Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-12T13:43:10.656614Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-09-12T13:43:10.656633Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-09-12T13:43:10.665823Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/lib/mysql' in the path is accessible to all OS users. Consider choosing a different directory.
2024-09-12T13:43:10.696239Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /run/mysqld/mysqlx.sock
2024-09-12T13:43:10.696283Z 0 [System] [MY-010931] [Server] /usr/bin/mysqld: ready for connections. Version: '8.4.2'  socket: '/run/mysqld/mysqld.sock'  port: 3306  Source distribution.

```

After the server is up and running, you can connect to it using the `mysql` client. This is available for most Linux-based systems in a package called `mysql-client`, in case you don't have it installed yet. To connect to the server as `root` and without a password, use the following command:

```shell
mysql -h 127.0.0.1 -uroot
```
Please note this only works because the server was initialized with the option `MYSQL_ALLOW_EMPTY_PASSWORD`, which should never be used on production environments.

Following that, you will be able to manage the database using the MySQL prompt:

```shell
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 9.1.0 Source distribution

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

You can now create databases, users, and tables as you would with a regular MySQL server. To exit the client, run the `exit` command on the MySQL prompt. To stop the server, press `CTRL + C` in the terminal where Docker is running. The container will stop and be removed automatically.

### Importing Data From an SQL File Upon Initialization

Another feature from the MySQL initialization script allows you to import an SQL file via a volume mounted to `/docker-entrypoint-initdb.d`. For example, if you have a `my-data.sql` file in your current folder, you can run the following command to have this data automatically imported to your database:

```shell
docker run -v ${PWD}/my-data.sql:/docker-entrypoint-initdb.d/my-data.sql cgr.dev/ORGANIZATION/mysql-fips
```

### Initializing the database using environment variables

You can use environment variables to set up your database upon initialization. The following variables are available for this purpose:

- `MYSQL_ROOT_HOST`: This variable allows you to specify the host from which the root user can connect. The default value is `localhost`.
- `MYSQL_ROOT_PASSWORD`: Sets the password for MySQL's root superuser account.
- `MYSQL_RANDOM_ROOT_PASSWORD`: When this variable is set, a random password is generated for the root superuser account. This password is printed to stdout at the end of the container initialization process.
- `MYSQL_ALLOW_EMPTY_PASSWORD`: This variable allows you to run the MySQL container with an empty root password. This is insecure and should only be used for tests and local development.
- `MYSQL_DATABASE`: Creates a new database upon initialization.
- `MYSQL_USER`: Together with `MYSQL_PASSWORD`, this environment variable can be used to create a new database user and grant them full access to the database defined by `MYSQL_DATABASE`.
- `MYSQL_PASSWORD`: This should be used in conjunction with the `MYSQL_USER` environment variable to set up the database user's password.

To facilitate testing the various environment variables and options when initializing your MySQL server, you can use a Docker Compose setup like the following. Again, remember to replace `ORGANIZATION` with your organization's designated private repository.

```yaml
services:
  mysql:
    image: cgr.dev/ORGANIZATION/mysql-fips
    restart: unless-stopped
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: test
    ports:
      - 3306:3306

```

Save this file as `docker-compose.yaml`. Then, from the same directory, start the container:

```shell
docker-compose up
```

Once the server is up and running, you can connect via the `mysql` client with the following command:

```shell
mysql -h 127.0.0.1 -uuser -ppassword
```

This `docker-compose.yaml` sets up a MySQL database with a default database and user. You can add other services to create a local multi-node environment for development and tests. You can iterate on this setup to test different configurations and scenarios.

### `_FILE` variables

Chainguard's `mysql-fips` image also supports appending `_FILE` to several of the environment variables mentioned previously, allowing you to instruct the initialization script to load variable values from files. This is useful in cases where you want to avoid passing sensitive information — such as passwords — with environment variables. 

Chainguard's `mysql-fips` image currently supports this for the `MYSQL_ROOT_PASSWORD`, `MYSQL_ROOT_HOST`, `MYSQL_DATABASE`, `MYSQL_USER`, and `MYSQL_PASSWORD` variables.

### Running `mysql-fips` with a custom options file

You can also run Chainguard's `mysql-fips` image with a custom [options file](https://dev.mysql.com/doc/refman/8.4/en/option-files.html). To illustrate, create a configuration file named `my.cnf` with the following command:

```shell
cat > my.cnf <<EOF
[mysqld]
thread_cache_size=8
EOF
```

This command creates an options file with a single option (`thread_cache_size`) and changes its value to `8` from the default `9`.

Then create and run a new `mysql-fips` container with the following command, which also mounts the `my.cnf` file to the container's `/etc/` directory:

```shell
docker run --name custom-mysql -d --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -v $PWD/my.cnf:/etc/my.cnf cgr.dev/chainguard-private/mysql-fips
```

This command includes the `-d` option to detach the container and run it in the background.

Next, run a `docker exec` command to access the container's shell:

```shell
docker exec -it custom-mysql sh
```

From there, you can confirm that the `mysql-fips` server is using the custom configuration using the `mysqld` command:

```container
mysqld --verbose --help | grep thread-cache 
```
```Output
  --thread-cache-size=#
thread-cache-size                                        	8
```

As this output shows, the MySQL server is using the `thread-cache-size` option value defined in the custom options file. 

MySQL will read options files in the following order: `/etc/mysql/my.cnf`, `/etc/my.cnf`, and finally `~/.my.cnf`. Be aware that it's recommended that you don't place your custom options file in the `~/` directory, as you will then have to consider which user is going to run the `mysqld` process when you run the image.

## Documentation and Resources

* [MySQL Documentation](https://dev.mysql.com/doc/)
* [Upstream MySQL Image Overview](https://hub.docker.com/_/mysql)
* [Basic Steps for MySQL Server Deployment with Docker](https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html)
* [More Topics on Deploying MySQL Server with Docker](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/docker-mysql-more-topics.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### adoptium-jre-fips

# adoptium-jre-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/adoptium-jre-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/adoptium-jre-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Java JRE image using Adoptium OpenJDK. Used for running Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's Adoptium JRE image is built directly from the [Adoptium Source](https://github.com/adoptium/jdk21u). The Chainguard JRE image has few-to-zero CVEs and does not run as the root user.

## Getting Started

A JRE is the standard runtime for a Java application and is used for running an already developed and packaged Java application. Generally, you will combine your application with the Chainguard  Adoptium JRE image and Docker or a build tool like [Maven](https://maven.apache.org/) or [Gradle](https://gradle.org/)

### Using Jib to build a JRE-based application image

Using Maven or Gradle, you can compile and package your application. [Jib](https://github.com/GoogleContainerTools/jib/tree/master) is a tool from Google Container Tools which builds optimized Docker and OCI images for Java applications. It's available as a plugin for both Maven and Gradle, as well as a Java library. 

The Jib GitHub repository includes [a useful example application](https://github.com/GoogleContainerTools/jib/tree/master/examples/spring-boot) that works with Maven or Gradle.

### Using Helm to Deploy your Java Application

Using [Helm](https://helm.sh/) to deploy your JRE-based application image is relatively straightforward using either [this Kubernetes Service Helm Chart](https://github.com/gruntwork-io/helm-kubernetes-services/blob/main/charts/k8s-service/README.md) or [this Service Helm Chart](https://artifacthub.io/packages/helm/kvalitetsit/service) from ArtifactHub.

## Documentation and Resources

- (Video) [How to Migrate a Java Application to Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
- (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
- (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
- (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### python-fips

# python-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/python-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/python-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Description

The `python-fips` Chainguard Image provides a FIPS-enabled Python runtime suitable for workloads such as web applications, CLI utilities, interfacing with APIs, or other tasks.

## Compatibility Notes

Where possible, the `python-fips` Chainguard Image is built for compatibility with the [Docker official image for Python](https://hub.docker.com/_/python/).

 The `python-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

By default, the `python-fips` Chainguard Image runs as a non-root user. You may need to use `USER root` to perform tasks requiring elevated privileges.

The entrypoint for the `python` Chainguard Image is `/usr/bin/python`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `python`.

### Variants

We have two image variants available:

- A `python-fips:latest-dev` variant that contains the `pip` and `apk` package managers and the `bash`, `ash`, and `sh` shells.
- A minimal runtime variant that does not contain shells and package managers for additional security.

To pull the minimal runtime variant from `cgr.dev`:

```sh
docker pull cgr.dev/ORGANIZATION/python-fips:latest
```
To pull the dev variant:

```sh
docker pull cgr.dev/ORGANIZATION/python-fips:latest-dev
```

## Getting Started

### Example: Test for Unapproved FIPS Algorithm

The MD5 algorithm is commonly used to verify data integrity. According to the
FIPS framework, MD5 is not suitable for applications like SSL certificates or
digital signatures that rely on collision resistance for digital security.
Since MD5 is not approved under the FIPS framework, we can test for FIPS
compliance by attempting to use this algorithm. This should result in an error.

First, create a project folder for our test:

```sh
mkdir -p ~/fips-test && cd $_
```

Next, create a Python script that attempts to use the MD5 algorithm:

```sh
cat << 'EOF' > fips-test.py
import hashlib

hashlib.md5("test_str".encode('utf-8')).hexdigest()
EOF
```

Create a Dockerfile for our image build:

```Dockerfile
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/python-fips:3.10

WORKDIR /app

COPY fips-test.py .

USER root

CMD ["fips-test.py"]
EOF
```

Make sure to replace the value of the `ORGANIZATION` placeholder variable with the name of your organization.

Build the image:

```sh
docker build . -t fips-test
```

Finally, run the test:

```sh
docker run fips-test
```

This should produce output similar to the following:

```
Traceback (most recent call last):
  File "/app/./fips-test.py", line 3, in <module>
    print(hashlib.md5("test_str".encode('utf-8')).hexdigest())
_hashlib.UnsupportedDigestmodError: [digital envelope routines] unsupported
```

Since MD5 isn't supported for security in our FIPS-enabled container, we
receive an error when attempting to use this algorithm. If you see the above
error, the test was successful.

MD5 *is* allowed for non-security purposes, such as fingerprinting files. If
you indicate this with the `usedforsecurity=False` argument, this code will
succeed:

```py
import hashlib

hashlib.md5("test_str".encode('utf-8'), usedforsecurity=False).hexdigest()
```

### Example: Minimal CLI Application

The following provides an example of a CLI application that does not require additional Python dependencies.

First, create a project folder for the example and change the working directory
to that folder:

```sh
mkdir -p ~/python-cli && cd $_
```

Next, create the Python script:

```sh
cat << 'EOF' > app.py
from sys import argv

if len(argv) < 2:
    print("Hello, Linky! 🐙")
else:
    print(f"Hello, {argv[1]}!")
EOF
```

Create a Dockerfile for our image build:

```sh
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/python-fips:latest

WORKDIR /cli-app

COPY app.py .

ENTRYPOINT [ "python", "app.py"]
EOF
```

Make sure to replace the value of the `ORGANIZATION` placeholder with the name of your organization.

Build the image:

```sh
docker build . -t python-cli
```

Run the container with the following:

```sh
docker run python-cli
```

You should see the following output:

```sh
Hello, Linky! 🐙
```

You can also run the CLI application with an argument:

```sh
docker run python-cli "FIPS-Compliant Chainguard User"
```

### Example: Web Application with Multi-Stage Build

If you require additional packages that can be installed with the `pip` package manager, we recommend using a multistage build. This process involves installing packages in a virtual environment using the `latest-dev` variant, then copying this environment over to the minimal runtime image. The following example uses a multi-stage build to install packages necessary to run a Flask web application.

First, create a project folder for the example:

```sh
mkdir -p ~/python-web-app && cd $_
```

Next, create the script for our Flask web application:

```sh
cat << 'EOF' > app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    """Example index page."""
    octopuses = '🐙' * 10
    return f'<h1>Linky Is Best</h1><p>{octopuses}</p>'

if __name__ == "__main__":
    app.run(debug=True)
EOF
```

Next, create a `requirements.txt` file listing dependencies:

```sh
cat << 'EOF' > requirements.txt
Flask
gunicorn
EOF
```
Finally, let's create a Dockerfile for our image build:

```sh
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/python-fips:latest-dev AS dev

WORKDIR /flask-app

RUN python -m venv venv
ENV PATH="/flask-app/venv/bin":$PATH
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

FROM cgr.dev/ORGANIZATION/python-fips:latest

WORKDIR /flask-app

COPY app.py app.py
COPY --from=dev /flask-app/venv /flask-app/venv
ENV PATH="/flask-app/venv/bin:$PATH"

EXPOSE 8000

ENTRYPOINT ["python", "-m", "gunicorn", "-b", "0.0.0.0:8000", "app:app"]
EOF
```

Again, make sure to replace the value of the `ORGANIZATION` placeholder variable with the name of your organization.

Build the image:

```sh
docker build . -t python-web-app
```

Run a container to serve the web application:

```sh
docker run -p 8000:8000 python-web-app
```

The application should now be accessible at [http://localhost:8000/](http://localhost:8000/).

## Documentation and Resources

- [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [Getting Started with the Python Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/python/)
- [Migrating to Python Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migrating-python/)
- [Updating a Python Microservice for Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/#updating-the-python-microservice)
- [Debugging Distroless Images](https://edu.chainguard.dev/chainguard/chainguard-images/debugging-distroless-images/)
- [Blog Post: Securely Containerize a Python Application with Chainguard Images](https://dev.to/chainguard/securely-containerize-a-python-application-with-chainguard-images-bn8)
- [Video: How to containerize a Python application with a multi-stage build using Chainguard Images](https://www.youtube.com/watch?v=2D0JULd4E5A)
- [Learning Lab: Deploying a Flask App with Python and nginx Chainguard Images](https://www.youtube.com/watch?v=i6bDKplnp6I)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-gcp-fips

# crossplane-gcp-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-gcp-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-gcp-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Crossplane GCP Providers deliver Kubernetes-native APIs for provisioning and managing Google Cloud resources through Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's FIPS compliant Crossplane GCP providers are comparable to [upstream GCP providers](https://github.com/crossplane-contrib/provider-upjet-gcp) with the following architectural differences:

- **Upstream providers** can be deployed independently and automatically resolve their dependencies
- **Chainguard providers** require manual installation of the family provider and use `skipDependencyResolution: true` for component providers to prevent automatic upstream dependency resolution
- **Deployment pattern**: Install the Chainguard family provider first, then add individual component providers as needed
- **Functionality**: Provides equivalent GCP resource management capabilities with this modified deployment approach

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started

### Using the GCP Family Provider

For comprehensive GCP resource management, install the family provider that includes all GCP services:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-family-gcp
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-provider-family-fips:latest
```

### Using Individual Component Providers

For targeted deployments, install specific component providers alongside the family provider. Use `skipDependencyResolution: true` to prevent default upstream family provider installation:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gcp-storage
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-storage-fips:latest
  skipDependencyResolution: true
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gcp-gke
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-gke-fips:latest
  skipDependencyResolution: true
```

## Configuration

After installing your desired providers, configure GCP credentials using a ProviderConfig:

```bash
# Create service account key secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: gcp-secret
  namespace: crossplane-system
type: Opaque
stringData:
  creds: |
    $(cat /path/to/service-account-key.json)
EOF

# Create ProviderConfig
cat <<EOF | kubectl apply -f -
apiVersion: gcp.m.upbound.io/v1beta1
kind: ClusterProviderConfig
metadata:
  name: default
spec:
  projectID: <your-project-id>
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: gcp-secret
      key: creds
EOF
```

Once configured, you can create GCP resources. Example Cloud Storage bucket creation:

```yaml
apiVersion: storage.gcp.m.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-secure-bucket
spec:
  forProvider:
    location: US-CENTRAL1
    project: your-project-id
  providerConfigRef:
    name: default
```

## Available Images

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `ghcr.io/crossplane-contrib/provider-family-gcp`          | `cgr.dev/ORGANIZATION/crossplane-gcp-provider-family-fips`     |
| `ghcr.io/crossplane-contrib/provider-gcp-compute`         | `cgr.dev/ORGANIZATION/crossplane-gcp-compute-fips`             |
| `ghcr.io/crossplane-contrib/provider-gcp-cloudplatform`   | `cgr.dev/ORGANIZATION/crossplane-gcp-cloudplatform-fips`       |
| `ghcr.io/crossplane-contrib/provider-gcp-container`       | `cgr.dev/ORGANIZATION/crossplane-gcp-container-fips`           |
| `ghcr.io/crossplane-contrib/provider-gcp-dns`             | `cgr.dev/ORGANIZATION/crossplane-gcp-dns-fips`                 |
| `ghcr.io/crossplane-contrib/provider-gcp-kms`             | `cgr.dev/ORGANIZATION/crossplane-gcp-kms-fips`                 |
| `ghcr.io/crossplane-contrib/provider-gcp-pubsub`          | `cgr.dev/ORGANIZATION/crossplane-gcp-pubsub-fips`              |
| `ghcr.io/crossplane-contrib/provider-gcp-storage`         | `cgr.dev/ORGANIZATION/crossplane-gcp-storage-fips`             |

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### confluent-kafka

# confluent-kafka
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/confluent-kafka` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/confluent-kafka/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolfi-based container image for the Community Edition of Confluent Kafka (cp-kafka), which extends Apache Kafka with additional features.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started
Here's a basic example of how to launch a local instance of confluent-kafka in
KRaft mode:

```bash
docker run -it --rm \
  --name "${CONTAINER_NAME}" \
  -h kafka-kraft \
  -p "${KAFKA_PORT}":9092 \
  -e KAFKA_NODE_ID=1 \
  -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' \
  -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://kafka-kraft:29092,PLAINTEXT_HOST://localhost:9092' \
  -e KAFKA_JMX_PORT=9101 \
  -e KAFKA_JMX_HOSTNAME=localhost \
  -e KAFKA_PROCESS_ROLES='broker,controller' \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS='1@kafka-kraft:29093' \
  -e KAFKA_LISTENERS='PLAINTEXT://kafka-kraft:29092,CONTROLLER://kafka-kraft:29093,PLAINTEXT_HOST://0.0.0.0:9092' \
  -e KAFKA_INTER_BROKER_LISTENER_NAME='PLAINTEXT' \
  -e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
  -e CLUSTER_ID='MkU3OEVBNTcwNTJENDM2Qk' \
  cgr.dev/chainguard/confluent-kafka:latest
```

## Documentation and Resources
Please refer to the [upstream documentation](https://docs.confluent.io/platform/current/installation/docker/installation.html), for guidance on how to run and configure.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dnsdist-fips

# dnsdist-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dnsdist-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dnsdist-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

dnsdist is a highly DNS-, DoS- and abuse-aware loadbalancer

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard dnsdist image is comparable to the [upstream dnsdist](https://hub.docker.com/u/powerdns?page=1&search=dnsdist). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

### FIPS Support

The `dnsdist-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Running with Docker

To run dnsdist using Docker, you can use the following command:

```shell
docker run \
    -p 53:53/tcp \
    -p 53:53/udp \
    cgr.dev/ORGANIZATION/dnsdist-fips:latest --supervised
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the following below resources for further usage details.

## Resources
- [Quickstart Guide](https://www.dnsdist.org/quickstart.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### net-kourier

# net-kourier
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/net-kourier` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/net-kourier/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Knative Ingress implementation using Envoy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `net-kourier` image is a Chainguard-built image for the official [Knative net-kourier ingress controller](https://github.com/knative/net-kourier). This image maintains full compatibility with upstream Knative image.

There are no breaking changes from the upstream Knative net-kourier functionality.

### Prerequisites

To use the `net-kourier` image, you'll need:

* A Kubernetes cluster (version 1.24 or later)
* [Knative Serving](https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/) installed
* `kubectl` configured to communicate with your cluster

For detailed installation requirements, refer to the [official Knative documentation](https://knative.dev/docs/install/).

## Getting Started

The `net-kourier` image serves as the ingress controller for Knative Serving. It's typically deployed as part of the Knative networking layer rather than run directly.

### Installing with Knative Serving

First, install Knative Serving CRDs and core components:

```bash
kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-core.yaml
```
Next, install the Kourier networking layer, with Chainguard image:
```bash
wget https://github.com/knative/net-kourier/releases/latest/download/kourier.yaml
yq eval '(select(.kind == "Deployment" and .metadata.name == "net-kourier-controller") | .spec.template.spec.containers[0].image) = cgr.dev/ORGANIZATION/net-kourier:latest' -i kourier.yaml
kubectl apply -f kourier.yaml
```
Configure Knative to use Kourier as the ingress:
```bash
kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'
```

Now you can verify the installation and check that the Kourier components are running:
```bash
kubectl get pods -n knative-serving
kubectl get pods -n kourier-system
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-sql-proxy

# cloud-sql-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-sql-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-sql-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Cloud SQL Auth Proxy is a utility for ensuring secure connections to Cloud SQL instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `cgr.dev/chainguard/cloud-sql-proxy` image is a minimal build of [Google Cloud SQL Auth Proxy](https://github.com/GoogleCloudPlatform/cloud-sql-proxy). Switching to this image should not require any changes to your existing setup.

### Version Notes
Chainguard currently does not offer a v1 image for `cgr.dev/chainguard/cloud-sql-proxy`, since v1 is no longer in active feature development, and any new releases are limited to maintenance. For this reason, Google's own [artifact registry](https://console.cloud.google.com/artifacts/docker/cloud-sql-connectors/us/gcr.io/cloud-sql-proxy) no longer hosts v1 images. 

## Prerequisites

To run this `cloud-sql-proxy` image, you will need the following:
  - **Docker:** To run the container.
  - **Google Cloud SQL Instance:** The database instance you intend to connect to. Refer to the [official documentation on creating SQL instances](https://cloud.google.com/sql/docs/mysql/create-instance).
  - **Service Account Key (JSON):** A service account with the `Cloud SQL Client` IAM role is required to authenticate with your Cloud SQL instance. Refer to the [official documentation on creating a service account](https://cloud.google.com/sql/docs/mysql/connect-auth-proxy#create-service-account) for instructions on how to set this up and download the JSON key.

## Getting Started

This `cloud-sql-proxy` image's `ENTRYPOINT` is configured to run the proxy directly. The following command shows a basic setup of running the proxy as a standalone Docker container, using a service account key for authentication:

```sh
docker run \
    --publish <host-port>:<proxy-port> \
    --mount type=bind,source="$(pwd)"/sa.json,target=/config/sa.json \
    cgr.dev/chainguard/cloud-sql-proxy:latest \
    --address 0.0.0.0 \
    --port <proxy-port> \
    --credentials-file /config/sa.json <instance-connection-name>
```

In the command above:

  - `<host-port>`: The port on your host machine that your application will use to connect to the database (e.g., `3306` for MySQL, `5432` for PostgreSQL).
  - `<proxy-port>`: The port the proxy listens on inside the container.
  - `$(pwd)/sa.json`: The absolute path to your downloaded service account key file on your host machine.
  - `<instance-connection-name>`: The connection string for your Cloud SQL instance, formatted as `project_id:region:instance_name`.

After executing this command, your applications on the host machine can connect to `localhost:<host-port>` to establish a secure connection to your Cloud SQL instance through the proxy. For example, if your instance is for a `postgresql` database, you can connect using:
```sh
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres
```

## Configuration

The `cloud-sql-proxy` image supports various configurations via command-line flags.

For instance, to configure the proxy to use Private IP to connect to your Cloud SQL instance, include the --private-ip flag in your command:
```sh
docker run \
    --publish <host-port>:<proxy-port> \
    --mount type=bind,source="$(pwd)"/sa.json,target=/config/sa.json \
    cgr.dev/chainguard/cloud-sql-proxy:latest \
    --address 0.0.0.0 \
    --port <proxy-port> \
    --credentials-file /config/sa.json \
    --private-ip <instance-connection-name>
```

The proxy also provides configurations for using automatic IAM database authentication, Unix domain sockets for local connections, or enabling service account impersonation for flexible access control. Refer to the [Cloud SQL Auth Proxy docs](https://cloud.google.com/sql/docs/mysql/sql-proxy) for instructions and examples on available configurations.

## Documentation and Resources

  - [Official Cloud SQL Auth Proxy Documentation](https://cloud.google.com/sql/docs/mysql/sql-proxy)
  - [Cloud SQL Proxy GitHub Repository](https://github.com/GoogleCloudPlatform/cloud-sql-proxy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyter-base-notebook

# jupyter-base-notebook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyter-base-notebook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyter-base-notebook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Jupyter base notebook image using pip

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is **not** fully compatible with the [base-notebook image from Jupyter](https://quay.io/jupyter/base-notebook).

The following are the key differences between Chainguard's base-notbook image and the image from Jupyter:
- The Chainguard Jupyter notebook image ships uses dependencies from PyPI, and does not include conda or mamba.
- The `CMD` of the Chainguard image is set to `start-notebook.py` and passing `--ip=0.0.0.0` is required. If you want to use the image with default CMD or use a different CMD, overriding the current `CMD` is required.

```shell
docker run -d -p 8888:8888 cgr.dev/ORGANIZATION/jupyter-base-notebook:latest start-notebook.py --ip=x.y.z.a
```

## Getting Started

### Using the Docker Image Directly

To use Chainguard's Jupyter notebook image, run the following command in your project's directory:

```shell
docker run --rm --name=base-notebook -p 8888:8888 -v $(pwd):/home/jovyan cgr.dev/ORGANIZATION/jupyter-base-notebook:latest start-notebook.py --ip=0.0.0.0
```

You will need to retrieve the token from the logs of the container to access the Jupyter notebook. The logs will look like this:

```shell
docker logs base-notebook
```
```Output
. . .

[I 2025-01-02 07:12:43.241 ServerApp] Jupyter Server 2.15.0 is running at:
[I 2025-01-02 07:12:43.241 ServerApp] http://182b5e058be1:8888/lab?token=6901fcbf319446804d212326074998fcf240b34f9429012b
[I 2025-01-02 07:12:43.241 ServerApp]     http://127.0.0.1:8888/lab?token=6901fcbf319446804d212326074998fcf240b34f9429012b
```

You can then access the Jupyter notebook by visiting the given URL. For example: `http://127.0.0.1:8888/lab?token=6901fcbf319446804d212326074998fcf240b34f9429012b`.

### Using the jupyterhub Helm Chart

Chainguard's jupyter-base-notebook image is also meant to be used as part of `jupyterhub` chart from [JupyterHub's Helm chart repository](https://hub.jupyter.org/helm-chart).

To run it, override the `singleuser` image used in the chart, like so:

```shell
helm repo add jupyterhub https://hub.jupyter.org/helm-chart/
helm repo update
helm install jupyterhub jupyterhub/jupyterhub --values config.yaml
```

Where `config.yaml` contains:

```yaml
singleuser:
  image:
    name: cgr.dev/ORGANIZATION/jupyter-base-notebook
    tag: latest
```

It is also possible to use the Chainguard `jupyterhub-k8s-hub` for the `hub` image:

```yaml
hub:
  config:
    JupyterHub:
      db_url: /usr/local/etc/jupyterhub/jupyterhub.sqlite
  image:
    name: cgr.dev/ORGANIZATION/jupyterhub-k8s-hub
    tag: latest
singleuser:
  image:
    name: cgr.dev/ORGANIZATION/jupyter-base-notebook
    tag: latest
```

## Documentation and Resources
For more information, please refer to [the official documentation for using jupyter notebooks](https://docs.jupyter.org/en/latest/). You can also find more information in the [Jupyter Docker Stacks documentation](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#jupyter-base-notebook).

Lastly, for instructions on deploying `jupyterhub` chart from [JupyterHub's Helm chart repository](https://hub.jupyter.org/helm-chart), please refer to the [JupyterHub documentation](https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mesosphere-vsphere-csi-syncer

# mesosphere-vsphere-csi-syncer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mesosphere-vsphere-csi-syncer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mesosphere-vsphere-csi-syncer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

vSphere storage Container Storage Interface (CSI) plugin

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream **vSphere CSI Syncer** container (`csi-vsphere/syncer`).  

Follow the Broadcom/VMware deployment documentation for vSphere Container Storage Plug-in (vSphere CSI) 3.x, substituting the image reference for the syncer container only. All other sidecars and supporting containers (provisioner, attacher, resizer, node-driver-registrar, liveness-probe, snapshotter, etc.) should remain as documented.

> **Namespace**: The vSphere CSI stack should run in the `vmware-system-csi` namespace — do not install into `kube-system`.

> **Versioning**: Select a driver version compatible with your vSphere and Kubernetes versions using the official compatibility matrix.

## Prerequisites

- Supported vCenter Server and ESXi environment.
- Supported Kubernetes version for the driver release you choose.
- vSphere CPI (out-of-tree cloud provider) installed and configured in the cluster.
- vCenter user account with the required privileges as defined in the upstream docs.
- Network/DNS reachability from all cluster nodes to vCenter.

## Usage

## Prepare the Namespace

```bash
# Create the namespace for vSphere CSI components
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v3.0.0/manifests/vanilla/namespace.yaml
```

### Create the vSphere Config Secret

Prepare a configuration file named `csi-vsphere.conf`:

```ini
[Global]
cluster-id = "your-unique-cluster-id"
cluster-distribution = "native"

[VirtualCenter "vcenter.example.com"]
user = "administrator@vsphere.local"
password = "REDACTED"
port = "443"
datacenters = "DC1"
insecure-flag = "1"
# thumbprint = "AA:BB:CC:...:ZZ"
```

Create the Kubernetes Secret in the `vmware-system-csi` namespace:

```bash
kubectl -n vmware-system-csi create secret generic vsphere-config-secret \
  --from-file=csi-vsphere.conf
```

### Deploy the vSphere CSI Driver

Follow the upstream deployment manifests for your environment.
When editing the controller `Deployment` and node `DaemonSet`, replace the driver and/or syncer container images only.

Example - Controller Deployment snippet:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vsphere-csi-controller
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following containers
      - name: vsphere-csi-controller
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver
      - name: vsphere-syncer
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-syncer
      # other containers and rest of containers above should remain unchanged
```

Example - Node DaemonSet snippet:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: vsphere-csi-node
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following container    
      - name: vsphere-csi-node
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver
      # other containers and rest of container above should remain unchanged
```

This can be changed either in the manifests before applying them, or using `kubectl edit` to change existing deployments.

### Verify the Installation

```bash
kubectl get deployment -n vmware-system-csi vsphere-csi-controller
kubectl get daemonset -n vmware-system-csi vsphere-csi-node
```

Both should show pods in the `READY` state across control-plane and worker nodes as appropriate.

Another way to check it is to use `kubectl wait` and `kbuectl rollout status` commands to wait for Deployment and DaemonSet accordingly - such as:

```bash
kubectl wait --for=condition=Available -n vmware-system-csi deployment/vsphere-csi-controller --timeout=120s

kubectl rollout status daemonset -n vmware-system-csi vsphere-csi-node
```

### Verify

Create a `StorageClass` using the upstream example.

Create a `PersistentVolumeClaim` that uses this `StorageClass`.

Attach the PVC to a test Pod and verify provisioning works.

## Documentation and Resources

* [Upstream Mesosphere vSphere CSI Driver repository](https://github.com/mesosphere/vsphere-csi-driver)
* [Kubernetes-sigs vSphere CSI Driver repository](https://github.com/kubernetes-sigs/vsphere-csi-driver)
* [VMware vSphere Container Storage Plug-in Deployment Docs](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/container-storage-plugin/3-0/getting-started-with-vmware-vsphere-container-storage-plug-in-3-0/vsphere-container-storage-plug-in-deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-crds-fips

# secrets-store-csi-driver-crds-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-crds-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-crds-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An image to be used as a init container to create the necessary CRDs while deploying the Kubernetes Secrets Store CSI Driver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

You can use the Kubernetes Secrets Store CSI Driver official Helm chart with the following parameters to use this image:

```bash
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
--namespace kube-system \
--set linux.crds.image.repository=cgr.dev/chainguard-private/secrets-store-csi-driver-crds-fips \
--set linux.crds.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafbat-ui-fips

# kafbat-ui-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafbat-ui-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafbat-ui-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS compliant variant [Kafbat-UI](https://kafbat.io/) is an open-source Web UI for managing Apache Kafka clusters

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started with Docker

To run Kafbat UI with Docker, you'll need a Kafka cluster running in KRaft mode. This example demonstrates a complete setup with both Kafka and Kafbat UI.

### Step 1: Create a Docker Network

```bash
docker network create kafbat-net
```

### Step 2: Generate a Cluster ID for KRaft Mode

KRaft mode requires a unique cluster ID. Generate one using the Kafka storage tool:

```bash
CLUSTER_ID=$(docker run --rm --entrypoint /usr/lib/kafka/bin/kafka-storage.sh \
  cgr.dev/ORGANIZATION/confluent-kafka-fips:latest random-uuid)
echo "Generated Cluster ID: $CLUSTER_ID"
```

### Step 3: Start a Kafka Broker in KRaft Mode

```bash
docker run -d \
  --name kafka \
  --hostname kafka0 \
  --network kafbat-net \
  -p 9092:9092 \
  -e KAFKA_NODE_ID=1 \
  -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' \
  -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092' \
  -e KAFKA_LISTENERS='PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092' \
  -e KAFKA_JMX_PORT=9997 \
  -e KAFKA_JMX_HOSTNAME=localhost \
  -e KAFKA_PROCESS_ROLES='broker,controller' \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS='1@kafka0:29093' \
  -e KAFKA_INTER_BROKER_LISTENER_NAME='PLAINTEXT' \
  -e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
  -e CLUSTER_ID="$CLUSTER_ID" \
  cgr.dev/ORGANIZATION/confluent-kafka-fips:latest
```

### Step 4: Start Kafbat UI (FIPS)

```bash
docker run -d \
  --name kafbat-ui \
  --network kafbat-net \
  -p 8080:8080 \
  -e DYNAMIC_CONFIG_ENABLED="true" \
  -e KAFKA_CLUSTERS_0_NAME="local-cluster" \
  -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS="kafka:29092" \
  -e KAFKA_CLUSTERS_0_METRICS_PORT=9997 \
  -e SERVER_PORT=8080 \
  cgr.dev/ORGANIZATION/kafbat-ui-fips:latest
```

The Kafbat UI will be accessible at `http://localhost:8080`.

To verify the service is running and the cluster is online:

```bash
curl -s http://localhost:8080/actuator/health | jq '.status'
curl -s http://localhost:8080/api/clusters | jq '.[] | {name: .name, status: .status}'
```

### Step 5: Create Test Topics

Create a test topic to verify everything is working:

```bash
docker exec kafka kafka-topics \
  --create --topic test-topic \
  --partitions 3 \
  --replication-factor 1 \
  --if-not-exists \
  --bootstrap-server kafka0:29092
```

Produce some test messages:

```bash
echo "Hello Kafka" | docker exec -i kafka \
  kafka-console-producer \
  --bootstrap-server kafka0:29092 \
  --topic test-topic
```

You can now view the topic and messages in the Kafbat UI at `http://localhost:8080`.

## Getting Started with Kubernetes

Kafbat UI can be deployed to Kubernetes using the [official Helm chart](https://github.com/kafbat/helm-charts/tree/main/charts/kafka-ui). This guide demonstrates deploying Kafbat UI with a Kafka cluster in KRaft mode managed by the Confluent Operator.

### Step 1: Install Confluent Operator

The Confluent Operator simplifies deploying and managing Kafka clusters in Kubernetes.

Add the Confluent Helm repository:

```bash
helm repo add confluent https://packages.confluent.io/helm
helm repo update
```

Install the Confluent Operator:

```bash
helm install confluent-operator confluent/confluent-for-kubernetes \
  --namespace default
```

Wait for the operator to be ready:

```bash
kubectl rollout status deployment/confluent-operator --timeout=60s
kubectl wait --for=condition=ready pod \
  --selector app=confluent-operator \
  --timeout=60s
```

### Step 2: Deploy a Kafka Cluster in KRaft Mode

Create a minimal Kafka cluster with KRaft controller and demo topic:

```bash
kubectl apply -f - <<EOF
---
apiVersion: platform.confluent.io/v1beta1
kind: KRaftController
metadata:
  name: kraftcontroller
  namespace: default
spec:
  dataVolumeCapacity: 1G
  image:
    application: docker.io/confluentinc/cp-server:7.9.0
    init: confluentinc/confluent-init-container:2.11.0
  replicas: 1
---
apiVersion: platform.confluent.io/v1beta1
kind: Kafka
metadata:
  name: kafka
  namespace: default
spec:
  dependencies:
    kRaftController:
      clusterRef:
        name: kraftcontroller
  dataVolumeCapacity: 1G
  image:
    application: docker.io/confluentinc/cp-server:7.9.0
    init: confluentinc/confluent-init-container:2.11.0
  replicas: 1
---
apiVersion: platform.confluent.io/v1beta1
kind: KafkaRestClass
metadata:
  name: krc-cfk
  namespace: default
spec:
  kafkaClusterRef:
    name: kafka
  kafkaRest:
    endpoint: http://kafka.default.svc.cluster.local:8090
---
apiVersion: platform.confluent.io/v1beta1
kind: KafkaTopic
metadata:
  name: demotopic
  namespace: default
spec:
  kafkaRestClassRef:
    name: krc-cfk
  replicas: 1
  partitionCount: 4
  configs:
    cleanup.policy: "delete"
EOF
```

Wait for the Kafka cluster to be ready:

```bash
kubectl rollout status statefulset/kraftcontroller --timeout=120s
kubectl wait --for=condition=ready pod \
  --selector app=kraftcontroller \
  --timeout=120s

kubectl rollout status statefulset/kafka --timeout=120s
kubectl wait --for=condition=ready pod \
  --selector app=kafka \
  --timeout=120s
```

Verify the KafkaRestClass is connected:

```bash
kubectl get kafkarestclass krc-cfk -o jsonpath='{.status.kafkaClusterID}'
```

Wait for the topic to be created:

```bash
kubectl wait --for=jsonpath='{.status.state}'=CREATED \
  kafkatopic demotopic \
  --timeout=60s
```

Produce test messages:

```bash
kubectl exec -it kafka-0 -- bash -c \
  "seq 1 5 | sed 's/^/Message/' | kafka-console-producer \
    --topic demotopic \
    --bootstrap-server kafka.default.svc.cluster.local:9092"
```

### Step 3: Add the Kafbat Helm Repository

```bash
helm repo add kafbat https://kafbat.github.io/helm-charts
helm repo update
```

### Step 4: Create a `values.yaml` file for Kafbat UI (FIPS)

```bash
cat <<EOF > kafbat-ui-values.yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/kafbat-ui-fips
  tag: latest

replicaCount: 1

envs:
  config:
    DYNAMIC_CONFIG_ENABLED: "true"
    KAFKA_CLUSTERS_0_NAME: "confluent-kafka"
    KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"

service:
  type: ClusterIP
  port: 8080
EOF
```

### Step 5: Install Kafbat UI (FIPS)

```bash
helm install kafbat-ui kafbat/kafka-ui -f kafbat-ui-values.yaml
```

Wait for Kafbat UI to be ready:

```bash
kubectl rollout status deployment/kafbat-ui-kafka-ui --timeout=60s
kubectl wait --for=condition=ready pod \
  --selector app.kubernetes.io/name=kafka-ui \
  --timeout=60s
```

Verify the cluster is online:

```bash
curl -s http://localhost:8080/actuator/health | jq '.status'
curl -s http://localhost:8080/api/clusters | jq '.[] | {name: .name, status: .status}'
```

### Step 6: Access the Kafbat UI

Port-forward the Kafbat UI service to access it locally:

```bash
kubectl port-forward svc/kafbat-ui-kafka-ui 8080:8080
```

The UI can now be accessed at `http://localhost:8080`

## Documentation and Resources

- [Kafbat UI Documentation](https://ui.docs.kafbat.io/)
- [Kafbat UI GitHub Repository](https://github.com/kafbat/kafka-ui)
- [Kafbat UI Helm Chart Repository](https://github.com/kafbat/helm-charts)
- [Kafbat UI Quickstart](https://ui.docs.kafbat.io/configuration/helm-charts/quick-start)
- [Kafbat UI Examples](https://github.com/kafbat/kafka-ui/blob/main/documentation/compose/DOCKER_COMPOSE.md)

For advanced configuration options, refer to the [official Kafbat UI configuration documentation](https://ui.docs.kafbat.io/configuration/configuration-file).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### text-generation-inference

# text-generation-inference
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/text-generation-inference` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/text-generation-inference/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `text-generation-inference` image is based on [Hugging Face's Text Generation Inference (TGI)](https://github.com/huggingface/text-generation-inference) toolkit. This Chainguard image provides the same functionality as the upstream TGI container with the following key differences:

* Like all Chainguard Images, this image features a minimal design with only essential dependencies
* Built on Wolfi/Chainguard OS with few-to-zero CVEs
* Regular automated builds ensure the image stays up-to-date with security patches
* Includes the same high-performance features: Flash Attention, Paged Attention, tensor parallelism, and continuous batching
* Compatible with popular open-source LLMs including Llama, Falcon, StarCoder, BLOOM, GPT-NeoX, and T5
* Provides OpenAI-compatible API endpoints for easy integration

These differences provide enhanced security and maintainability while preserving full compatibility with TGI's production-ready capabilities for serving Large Language Models.

> [!NOTE] 
> This image runs as non-root by default. Official instructions from the upstream repository involve mounting `/data` from the node into `/data` on the container. This can be problematic in the case that `/data` is not writable by the user with UID 65532. 

## Prerequisites

To use this image effectively, you should have:

* Docker installed on your system (with GPU support configured if using GPU acceleration)
* Access to Hugging Face models (either public or private repositories)
* Sufficient disk space for model storage (models are downloaded on first run)
* For GPU workloads: NVIDIA GPU with appropriate drivers and NVIDIA Container Toolkit

For more information on TGI capabilities and requirements, refer to the [official Hugging Face TGI documentation](https://huggingface.co/docs/text-generation-inference/index).

## Getting Started

The `text-generation-inference` image provides a production-ready server for deploying Large Language Models. The following examples demonstrate common usage patterns.

### Basic Usage

Start by checking the available options:

```sh
docker run --rm cgr.dev/ORGANIZATION/text-generation-inference --help
```

Verify the installed version:

```sh
docker run --rm cgr.dev/ORGANIZATION/text-generation-inference --version
```

### Serving a Model

To start a TGI server with a Hugging Face model, run:

```sh
docker run -d \
  --name tgi-server \
  -p 8080:80 \
  -v $PWD/data:/data \
  cgr.dev/ORGANIZATION/text-generation-inference \
  --model-id microsoft/DialoGPT-medium \
  --num-shard 1
```

This command starts the server in the background, maps port 8080 on your host to port 80 in the container, and mounts a local data directory for model caching.

### Making API Requests

Once the server is running, you can interact with it through multiple API endpoints. TGI provides OpenAI-compatible endpoints for easy integration with existing tools:

```sh
curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "microsoft/DialoGPT-medium",
    "messages": [{"role": "user", "content": "Hello, how are you?"}],
    "stream": false
  }'
```

The server responds with a JSON object containing the generated text. For streaming responses, set `"stream": true` in the request.

### Using with Python

You can interact with the server using the Hugging Face `huggingface_hub` library:

```sh
cat > tgi_client.py <<EOF
from huggingface_hub import InferenceClient

client = InferenceClient(base_url="http://localhost:8080")

response = client.text_generation(
    prompt="What is the capital of France?",
    max_new_tokens=50
)

print(response)
EOF
```

Run the Python script:

```sh
python tgi_client.py
```

### GPU Acceleration

For production workloads requiring GPU acceleration, use the `--gpus` flag:

```sh
docker run -d \
  --gpus all \
  --name tgi-server-gpu \
  -p 8080:80 \
  -v $PWD/data:/data \
  cgr.dev/ORGANIZATION/text-generation-inference \
  --model-id meta-llama/Llama-2-7b-chat-hf \
  --num-shard 2
```

This distributes the model across multiple GPUs using tensor parallelism for improved performance with larger models.

## Configuration

The `text-generation-inference` image can be configured through command-line arguments and environment variables. This section demonstrates a common production configuration for serving a model with specific resource constraints.

### Command-Line Arguments

Key configuration options include:

* `--model-id`: Hugging Face Hub model identifier (e.g., `meta-llama/Llama-2-7b-chat-hf`)
* `--num-shard`: Number of GPU shards for tensor parallelism (default: 1)
* `--port`: Server listening port (default: 80)
* `--max-concurrent-requests`: Maximum number of concurrent requests (default: 128)
* `--max-input-length`: Maximum input token length (default: 1024)
* `--max-total-tokens`: Maximum total tokens including input and output (default: 2048)
* `--max-batch-prefill-tokens`: Maximum tokens for prefill batching (default: 4096)
* `--max-batch-total-tokens`: Maximum tokens for total batch (default: 16384)

### Production Configuration Example

For a production deployment serving a Llama 2 model with custom resource limits:

```sh
docker run -d \
  --gpus all \
  --name tgi-production \
  -p 8080:80 \
  -v $PWD/models:/data \
  cgr.dev/ORGANIZATION/text-generation-inference \
  --model-id meta-llama/Llama-2-7b-chat-hf \
  --num-shard 2 \
  --max-concurrent-requests 64 \
  --max-input-length 2048 \
  --max-total-tokens 4096 \
  --max-batch-prefill-tokens 8192 \
  --max-batch-total-tokens 32768
```

This configuration distributes the model across 2 GPUs, limits concurrent requests to 64, and sets appropriate token limits for handling longer conversations. The model cache is persisted to the local `models` directory for faster subsequent startups.

### Environment Variables

Alternatively, you can configure TGI using environment variables:

```sh
docker run -d \
  --gpus all \
  --name tgi-production \
  -p 8080:80 \
  -e MODEL_ID=meta-llama/Llama-2-7b-chat-hf \
  -e NUM_SHARD=2 \
  -e MAX_CONCURRENT_REQUESTS=64 \
  -e MAX_INPUT_LENGTH=2048 \
  -e MAX_TOTAL_TOKENS=4096 \
  -v $PWD/models:/data \
  cgr.dev/ORGANIZATION/text-generation-inference
```

This approach is useful for container orchestration platforms where environment variables are easier to manage than command-line arguments.

## Documentation and Resources

For more information on working with Text Generation Inference and Large Language Models:

* [Hugging Face TGI Documentation](https://huggingface.co/docs/text-generation-inference/index) - Official documentation for Text Generation Inference
* [Hugging Face Model Hub](https://huggingface.co/models) - Browse available models compatible with TGI
* [TGI GitHub Repository](https://github.com/huggingface/text-generation-inference) - Source code and issue tracking
* [Chainguard Academy](https://edu.chainguard.dev/) - Learn more about securing your container deployments

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### datadog-operator

# datadog-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/datadog-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/datadog-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for Datadog Resources

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `datadog-operator` image is meant to serve as a drop-in replacement for the [official datadog-operator image](https://gcr.io/datadoghq/operator). Switching to Chainguard `datadog-operator` image should not require any changes to your existing setup. 

The image is completely compatible with [official Helm chart for datadog-operator](https://artifacthub.io/packages/helm/datadog/datadog-operator)

## Getting Started
Deploy using helm by overriding with Chainguard `datadog-operator` image:

Use the following `values.yaml` file to configure the Helm chart.
```yaml
image:
  repository: cgr.dev/ORGANIZATION/datadog-operator
  tag: latest
```

Deploy the Helm chart:
```shell
helm repo add datadog https://helm.datadoghq.com
helm install my-datadog-operator datadog/datadog-operator \
  --values values.yaml
```

For the next steps, refer to the [official getting started documentation](https://docs.datadoghq.com/getting_started/containers/datadog_operator).

## Documentation and Resources
- [Official Documentation](https://docs.datadoghq.com/containers/datadog_operator)
- [Getting Started with the Datadog Operator](https://docs.datadoghq.com/getting_started/containers/datadog_operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aspnet-runtime-fips

# aspnet-runtime-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aspnet-runtime-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aspnet-runtime-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Enablement
Our `ASPNET Runtime` images have [FIPS enabled](https://edu.chainguard.dev/chainguard/chainguard-images/images-features/fips-images/) versions. However, the underlying ASPNET core runtime does not include any mechanisms to enforce FIPS compliance according to [Microsoft's official documentation](https://learn.microsoft.com/en-us/dotnet/standard/security/fips-compliance). Accordingly, it is up you and/or your developers to ensure that your application is using FIPS compliant algorithms and that the runtime environment is also properly configured to run in FIPS mode.

## Usage

The dotnet-sdk-fips image can be used directly for simple cases, or with a multi-stage build using the dotnet-sdk-fips as the builder and aspnet-runtime-fips as the final target container.

To get started, go to your current dotnet application directory (or where you house your dotnet applications) and execute the following command. This command should be able to detect the dotnet project in your directory and create a base for the docker initialization.

```docker init```

This command should create the following files.

```
Dockerfile
compose.yaml
README.Docker.md
.dockerignore
```

After the files have been created, replace the contents within the created Dockerfile with the following

```Dockerfile
FROM cgr.dev/chainguard/dotnet-sdk-fips:latest AS build

COPY --chown=nonroot:nonroot . /source

# If your project resides in a sub directory, make sure you are pointing to that directory. ex: If your project resided in a directory called 'app', you would set the destination to /source/app
WORKDIR /source

RUN dotnet publish --use-current-runtime --self-contained false -o Release

# If you are running an .NET project, you can instead pull our .NET image cgr.dev/chainguard/dotnet-runtime-fips:latest
FROM cgr.dev/chainguard/aspnet-runtime-fips:latest AS final
WORKDIR /

# Copy everything needed to run the app from the "build" stage.
COPY --from=build source .

ENTRYPOINT ["dotnet", "Release/dotnet.dll"]
```

This will build your application using the SDK image and then copy the built application over to the Runtime image which will then start.

You can run and publish a local image with the following command
```
docker compose up -d --build
```

You can also remove the container using the following
```
docker compose down
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-collector

# opentelemetry-collector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-collector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-collector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [opentelemetry-collector](https://github.com/open-telemetry/opentelemetry-collector)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using this image

Chainguard cgr.dev/chainguard/opentelemetry-collector is a drop in replacement for the upstream image, tested using the community [helm chart](https://opentelemetry.io/docs/kubernetes/helm/collector/).

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set mode=<daemonset|deployment|statefulset> \
   --set image.repository=cgr.dev/chainguard/opentelemetry-collector \
   --set image.tag=latest
```

To use custom configuration it is easier to use a `values.yaml` file:

```yaml
mode: daemonset
configMap:
  create: false
image:
  tag: latest
  repository: cgr.dev/chainguard/opentelemetry-collector
command:
  extraArgs:
    - "--config=/conf/custom-config.yaml"
extraVolumeMounts:
  - name: "custom-vm"
    mountPath: "/conf"
extraVolumes:
  - name: "custom-vm"
    configMap:
      name: "custom"

```
```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install open-telemetry opentelemetry/opentelemetry-collector --namespace open-telemetry-custom-config -f values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cypress-base

# cypress-base
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cypress-base` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cypress-base/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image for cypress/base.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### az-iamguarded-fips

# az-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/az-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/az-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure CLI (IAM Guarded, FIPS)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

IAMGuarded-compatible version of the Azure CLI image with FIPS 140-2 compliance.

## Overview

This image provides the Azure CLI in an IAMGuarded-compatible format with FIPS-hardened OpenSSL. It includes the `az` command-line tool for interacting with Microsoft Azure services in FIPS-compliant environments.

## Usage

Check the Azure CLI version:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded-fips:latest --version
```

Get help:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded-fips:latest --help
```

List Azure subscriptions:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded-fips:latest account list
```

List virtual machines in a resource group:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded-fips:latest vm list --resource-group myResourceGroup
```

## Configuration

The image runs with a non-root user named "az" (UID/GID 1001) and installs the Azure CLI at `/opt/iamguarded/azure-cli/`. It includes FIPS-hardened OpenSSL configuration for compliance with FIPS 140-2 standards.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-fsx-csi-driver

# aws-fsx-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-fsx-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-fsx-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for [aws-fsx-csi-driver](https://github.com/kubernetes-sigs/aws-fsx-csi-driver), the CSI driver for Amazon FSx for Lustre.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's AWS FSx CSI driver image is a drop-in replacement for the upstream [public.ecr.aws/fsx-csi-driver/aws-fsx-csi-driver](https://gallery.ecr.aws/fsx-csi-driver/aws-fsx-csi-driver) image.

As with many Chainguard container images, this image contains only the minimum dependencies needed to function. It does not include a shell or package manager.

## Getting Started

The FSx CSI driver enables Kubernetes pods to access Amazon FSx for Lustre file systems. It consists of two components:
- **Controller**: Handles volume provisioning and management (runs as a Deployment)
- **Node**: Handles volume mounting on nodes (runs as a DaemonSet)

### Prerequisites

Before installing the FSx CSI driver, ensure you have:
- An Amazon EKS cluster or self-managed Kubernetes cluster on AWS
- IAM permissions for the driver to interact with FSx service
- A VPC configuration that allows FSx access

Refer to the [AWS documentation on creating an IAM role](https://docs.aws.amazon.com/eks/latest/userguide/fsx-csi.html) for detailed setup instructions.

### Install with Helm

The recommended installation method is using the official Helm chart.

First, create a `values.yaml` file to configure the Helm chart with the Chainguard image:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/aws-fsx-csi-driver
  tag: latest

controller:
  serviceAccount:
    create: true
    name: fsx-csi-controller-sa
    annotations:
      eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/FSxCSIDriverRole

node:
  serviceAccount:
    create: true
    name: fsx-csi-node-sa
```

Replace `ORGANIZATION` with your Chainguard organization name and `ACCOUNT_ID` with your AWS account ID.

Add the Helm repository and install:

```shell
helm repo add aws-fsx-csi-driver https://kubernetes-sigs.github.io/aws-fsx-csi-driver/
helm repo update

helm upgrade --install aws-fsx-csi-driver \
  --namespace kube-system \
  aws-fsx-csi-driver/aws-fsx-csi-driver \
  -f values.yaml
```

### Verify Installation

After installation, verify the driver is running:

```shell
# Check controller deployment
kubectl get deployment -n kube-system fsx-csi-controller

# Check node daemonset
kubectl get daemonset -n kube-system fsx-csi-node

# Verify CSI driver registration
kubectl get csidrivers fsx.csi.aws.com
```

## Documentation and Resources

- [AWS FSx CSI Driver GitHub Repository](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)
- [Amazon FSx for Lustre Documentation](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)
- [EKS FSx CSI Driver Setup Guide](https://docs.aws.amazon.com/eks/latest/userguide/fsx-csi.html)
- [FSx CSI Driver Helm Chart](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/tree/master/charts/aws-fsx-csi-driver)
- [Dynamic Provisioning Examples](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/tree/master/examples/kubernetes/dynamic_provisioning)
- [Static Provisioning Examples](https://github.com/kubernetes-sigs/aws-fsx-csi-driver/tree/master/examples/kubernetes/static_provisioning)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kepler

# kepler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kepler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kepler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kepler (Kubernetes-based Efficient Power Level Exporter) is a Prometheus exporter that measures energy consumption metrics at the container, pod, and node levels in Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream `quay.io/sustainable_computing_io/kepler` Image. Like most other Chainguard Images, this image has few-to-zero CVEs and but runs as the `root` user since Kepler need read access for contents inside `/proc/<pid>/exe` which is not permitted as `nonroot`.
If you want to use the image with a shell and package manager, you can use the `-dev` variant of this image.

## Getting Started
For getting started with kepler, we can use helm to deploy it:
The details to install Kepler can also be found on [official documentation](https://sustainable-computing.io/kepler/installation/guide).

**Note:** https://artifacthub.io/packages/helm/kepler/kepler does not support newer releases yet since Kepler has undergone a complete ground-up rewrite starting with version `0.10.0`.

**Install from Release (Recommended):**
```shell
# Install from GitHub release (replace VERSION with desired version, e.g., 0.11.2)
# Override default kepler image with Chainguard variant
helm install kepler https://github.com/sustainable-computing-io/kepler/releases/download/v<VERSION>/kepler-helm-<VERSION>.tgz \
  --namespace kepler \
  --create-namespace \
  --set image.repository=cgr.dev/ORGANIZATION/kepler \
  --set image.tag=latest
```

**Install with custom values:**
Create a `values.yaml` file to customize the installation:
```shell
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/kepler
  tag: "latest"
  pullPolicy: IfNotPresent
resources:
  limits:
    cpu: 100m
    memory: 400Mi
  requests:
    cpu: 100m
    memory: 200Mi
tolerations:
  - operator: Exists
nodeSelector:
  kubernetes.io/os: linux
# Enable ServiceMonitor for Prometheus
serviceMonitor:
  enabled: true
  interval: 30s
```
Install Chart by passing `values.yaml`
```shell
helm install kepler manifests/helm/kepler/ \
  --namespace kepler \
  --create-namespace \
  --set namespace.create=false \
  --values values.yaml
```

**Metrics:** http://localhost:28282/metrics
**To access metrics:**
```shell
# Port forward to access metrics locally
kubectl port-forward -n kepler svc/kepler 28282:28282

# Test metrics endpoint
curl http://localhost:28282/metrics
```
## Documentation and Resources
- [Official Documentation](https://sustainable-computing.io/kepler/installation/guide/)
- [Project Repository](https://github.com/sustainable-computing-io/kepler)
- [Configuration Guide](https://github.com/sustainable-computing-io/kepler/blob/main/docs/user/configuration.md)
- [Metrics Documentation](https://github.com/sustainable-computing-io/kepler/blob/main/docs/user/metrics.md)
- [Architecture](https://github.com/sustainable-computing-io/kepler/tree/main/docs/developer/design/architecture)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-operator-fips

# prometheus-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm
To deploy using the community helm chart, please refer to the
[helm chart documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2059)

Below is an example of how to use the helm chart, overriding the image with the
Chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-operator prometheus-community/kube-prometheus-stack \
 --set prometheusOperator.image.registry=cgr.dev \
 --set prometheusOperator.image.repository=ORGANIZATION/prometheus-operator-fips \
 --set prometheusOperator.image.tag=latest
```

For full instructions on prometheus-operator, refer to the
[official documentation](https://prometheus-operator.dev).
The GitHub repository can also be [found here](https://github.com/prometheus-operator/prometheus-operator).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spegel

# spegel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spegel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spegel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Stateless cluster local OCI registry mirror.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [spegel](https://github.com/spegel-org/spegel/pkgs/container/spegel/431443929?tag=v0.3.0) image. Switching to Chainguard image should not require any changes to your existing setup so this image is a drop in replacement for the upstream [spegel image](https://github.com/spegel-org/spegel/pkgs/container/spegel/431443929?tag=v0.3.0), which means it works everywhere you would expect.

## Getting Started

To install Chainguard's spegel image on your Kubernetes cluster, you can use the official image's [Helm chart](https://spegel.dev/docs/getting-started/#cli).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/spegel
  tag: latest
```

You can also invoke the following command to install spegel in your cluster.

```shell
helm install spegel oci://ghcr.io/spegel-org/helm-charts/spegel -f values.yaml
```

## Documentation and Resources
For more information, please refer to [the official documentation for spegel](https://spegel.dev). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-ingress-defaultbackend-fips

# kubernetes-ingress-defaultbackend-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-ingress-defaultbackend-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-ingress-defaultbackend-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that acts as a drop-in replacement for the `registry.k8s.io/defaultbackend` image. Used in some ingresses like https://github.com/kubernetes/ingress-gce and https://github.com/kubernetes/ingress-nginx

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [registry.k8s.io/defaultbackend](https://github.com/kubernetes/ingress-gce/tree/master/cmd/404-server) image commonly used by many Kubernetes ingress controllers. It serves a `404` page at the root path and a `200 OK` response at `/healthz`. 

Chainguard's `kubernetes-ingress-defaultbackend-fips` container image is functionally is equivalent to the upstream image and runs as a non-root user. Switching to the Chainguard image should not require any changes to your existing setup.

### FIPS Support

The `kubernetes-ingress-defaultbackend` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy the `kubernetes-ingress-defaultbackend-fips` container image as as part of the [ingress-nginx Helm chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/kubernetes-ingress-defaultbackend-fips
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kubernetes-ingress-defaultbackend-fips` container image using Helm:

```shell
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx -f values.yaml --wait
```

## Documentation and Resources:
- [Official kubernetes ingress defaultbackend documentation](https://kubernetes.github.io/ingress-nginx/user-guide/default-backend/)
- [Kubernetes ingress defaultbackend Github Repository](https://github.com/kubernetes/registry.k8s.io)
- [Ingress nginx Helm Chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra-medusa-fips

# cassandra-medusa-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra-medusa-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra-medusa-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azurefile-csi-fips

# azurefile-csi-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azurefile-csi-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azurefile-csi-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access Azure File volume using smb and nfs protocols, csi plugin name: file.csi.azure.com.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [azurefile-csi](https://oci.dag.dev/?image=mcr.microsoft.com/oss/kubernetes-csi/azurefile-csi:v1.32.1) image available from the Microsoft Artifact Registry. Switching to the Chainguard image should not require any changes to your existing setup.

### FIPS support

Chainguard's `azurefile-csi-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Kubernetes

You can follow the [official documentation for running azurefile-csi on Kubernetes](https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/install-csi-driver-master.md) to run azurefile-csi.

Set the image on the Deployment and Daemonset:

```bash
$ kubectl set image -n kube-system deployment/csi-azurefile-controller azurefile=cgr.dev/ORGANIZATION/azurefile-csi-fips:latest
deployment.apps/csi-azurefile-controller image updated
$ kubectl set image -n kube-system daemonset/csi-azurefile-node azurefile=cgr.dev/ORGANIZATION/azurefile-csi-fips:latest
daemonset.apps/csi-azurefile-node image updated
```

### Helm

You can use the [official azurefile-csi-driver Helm chart](https://artifacthub.io/packages/helm/azurefile-csi-driver/azurefile-csi-driver) to install the `azurefile-csi-driver`, replacing the `azurefile` image in `values.yaml` with the Chainguard image.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  azurefile:
    repository: cgr.dev/ORGANIZATION/azurefile-csi-fips
    tag: latest
```

Add the `azurefile-csi-driver` chart:

```bash
$ helm repo add azurefile-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/charts
"azurefile-csi-driver" has been added to your repositories
```

Install the `azurefile-csi-driver` chart with your custom `values.yaml` file:

```bash
$ helm install azurefile-csi azurefile-csi-driver/azurefile-csi-driver --values values.yaml
NAME: my-azurefile-csi-driver
LAST DEPLOYED: <DATE>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Azure File CSI Driver is getting deployed to your cluster.

To check Azure File CSI Driver pods status, please run:

  kubectl --namespace=default get pods --selector="app.kubernetes.io/name=my-azurefile-csi-driver" --watch
```

## Documentation and Resources

* [Official azurefile-csi repository](https://github.com/kubernetes-sigs/azurefile-csi-driver).
* [Use Azure Files Container Storage Interface (CSI) driver in Azure Kubernetes Service (AKS)](https://learn.microsoft.com/en-us/azure/aks/azure-files-csi)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgbouncer

# pgbouncer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgbouncer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgbouncer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [pgbouncer](https://www.pgbouncer.org/) connection pooler for PostgreSQL. This image contains the `pgbouncer` binary and can be used directly.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

The image can be run directly and sets the `pgbouncer` tool as the entrypoint:

```
docker run cgr.dev/chainguard/pgbouncer:latest
/usr/bin/pgbouncer is a connection pooler for PostgreSQL.

Usage:
  /usr/bin/pgbouncer [OPTION]... CONFIG_FILE

Options:
  -d, --daemon         run in background (as a daemon)
  -q, --quiet          run quietly
  -R, --reboot         do an online reboot
  -u, --user=USERNAME  assume identity of USERNAME
  -v, --verbose        increase verbosity
  -V, --version        show version, then exit
  -h, --help           show this help, then exit

Report bugs to <https://github.com/pgbouncer/pgbouncer/issues>.
PgBouncer home page: <https://www.pgbouncer.org/>
```

Note that `pgbouncer` typically needs a configuration file to run.
One is not provided here in the image by default.
You can find documentation on how to configure one in the [upstream documentation](https://www.pgbouncer.org/config.html#authentication-settings)..

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-vip

# kube-vip
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-vip` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-vip/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Control Plane Virtual IP and Load-Balancer

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

## Deployment

kube-vip has [documentation](https://kube-vip.io/docs/installation) covering
deployments. They don't make any reference to helm charts, although there seems
to be one published separately (see section below).

The deploy instructions differ depending on your k8s environment. Refer to
the upstream docs](https://kube-vip.io/docs/installation) for the correct set
of instructions. Be sure to replace the image reference in any manifests to the
Chainguard image.

### Helm

kube-vip publishes a [helm chart](https://artifacthub.io/packages/helm/kube-vip/kube-vip)
for deploying the image. **However**, they have commented out 'tag' in the
[values.yaml](https://github.com/kube-vip/helm-charts/blob/5f24093899db53f7c103bd95b0e41a112bbfb72b/charts/kube-vip/values.yaml#L8):

```bash
image:
  repository: ghcr.io/kube-vip/kube-vip
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  # tag: "v0.7.0"
```

If you wish to use this helm chart, you'll need to provide a custom values.yaml
file, which is updated to use the chainguard image and latest tag:

```bash
helm repo add kube-vip https://kube-vip.github.io/helm-charts/
helm install my-kube-vip kube-vip/kube-vip -f my-custom-values.yaml
```

> [!WARNING]
> During testing with the original (non-chainguard) image, we did not have
> much success getting a successful deployment. On occasions, our local k8s
> cluster to become unresponsive. If you are referring to this chart, we would
> advise you to test out in a non-production environment first.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-capd-manager

# cluster-api-capd-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-capd-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-capd-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cluster API Provider Docker (CAPD) is a reference implementation of an infrastructure provider for the Cluster API project using Docker, not designed for production use and intended for development environments only.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-capd-manager image is compatible with the upstream [Cluster API Provider Docker](https://github.com/kubernetes-sigs/cluster-api/tree/main/test/infrastructure/docker). This image contains only the minimum set of dependencies needed to run the Docker infrastructure provider components.

The Docker provider is primarily used for testing Cluster API functionality and local development workflows.

**⚠️ Important: This image is designed for testing and development purposes only and is not meant for production use.**

## Getting Started

The Cluster API Provider for Docker (CAPD) enables you to create and manage "clusters" using Docker containers as nodes. This is particularly useful for testing Cluster API functionality, local development, and CI/CD pipelines where you need lightweight Kubernetes clusters.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Docker daemon running and accessible

### Installation

Initialize the Docker infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure docker
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: docker
  namespace: docker-infrastructure-system
spec:
  version: v1.10.4
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-capd-manager:latest
EOF
```

### Usage Example

Create a Docker-based cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DockerCluster
metadata:
  name: test-docker-cluster
  namespace: default
spec: {}
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DockerMachineTemplate
metadata:
  name: test-control-plane
  namespace: default
spec:
  template:
    spec:
      extraMounts:
      - containerPath: /var/run/docker.sock
        hostPath: /var/run/docker.sock
```

### Configuration

The controller manages Docker containers that simulate Kubernetes nodes. Key features include:

- **Container-based nodes**: Each "node" is a Docker container running systemd and kubelet
- **Load balancer simulation**: Automatic setup of load balancer containers for API server access
- **Port mapping**: Automatic port allocation for accessing services
- **Volume mounts**: Support for mounting host directories into node containers

### Testing and Development Use Cases

- **Cluster API development**: Test control plane and infrastructure provider changes
- **CI/CD pipelines**: Automated testing of Kubernetes workloads
- **Learning environment**: Practice with Cluster API concepts without cloud resources
- **Integration testing**: Validate multi-cluster scenarios locally

## Documentation and Resources

* [Cluster API Getting Started Documentation](https://cluster-api.sigs.k8s.io/developer/getting-started)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Docker Documentation](https://docs.docker.com/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wave-fips

# wave-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wave-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wave-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `wave-fips` container image is based on the [wave-k8s/wave](https://github.com/wave-k8s/wave) project. Like other Chainguard Containers, `wave-fips` was designed with security and minimalism in mind; as such, it does not include certain tools like a shell or package manager.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, refer to the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  name: cgr.dev/ORGANIZATION/wave-fips
  tag: latest
EOF
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Add the Helm repository and install:

```shell
helm repo add wave-k8s https://wave-k8s.github.io/wave/
helm repo update
helm install wave wave-k8s/wave -n wave-system --create-namespace -f values.yaml
```

To enable Wave for your Deployments, add the required annotation:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    wave.pusher.com/update-on-config-change: "true"
spec:
  # ... rest of deployment configuration
```

## Documentation and Resources

- [Wave GitHub Repository](https://github.com/wave-k8s/wave)
- [Wave Helm Charts](https://wave-k8s.github.io/wave/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-controller

# sealed-secrets-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes controller and tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Sealed Secrets Controller Chainguard image is comparable to the official Sealed Secrets Controller image from Docker Hub.

## Getting Started
Sealed Secrets is typically used alongside GitOps workflows to safely manage encrypted Kubernetes Secrets.

Sealed Secrets is designed to run as a native Kubernetes controller.

## Running on Kubernetes

To deploy sealed secrets with the Chainguard image, create a `values.yaml` file with the image information - such as:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/sealed-secrets-controller
  tag: latest
```

Then install the controller using Helm:

```shell
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets \
  --namespace kube-system \
  --create-namespace \
  -f values.yaml
```

This deploys the Sealed Secrets controller in the `kube-system` namespace using the specified image. This is the default namespace that `kubeseal` tool for encrypting secrets is expected, so changing the namespace will also require providing `--controller-namespace` argument to `kubeseal` whenever encrypting a secret.

## Encrypting Secrets
To encrypt a secret, use the `kubectl` to create a Kubernetes Secret YAML file (unless you already have it) and then use `kubeseal` CLI tool to encrypt it. Such as:

```shell
kubectl create secret generic \
  --namespace default mysecret \
  --dry-run=client \
  --from-literal=password=supersecret \
  -o yaml >secret.yaml

kubeseal <secret.yaml -o yaml >sealedsecret.yaml
```

This generates a `SealedSecret` that can be safely committed to version control.

### Applying Sealed Secrets
Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f mysealedsecret.yaml
```

The controller will decrypt it and create the actual Kubernetes Secret.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-autoscaler-addon-resizer-fips

# kubernetes-autoscaler-addon-resizer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-autoscaler-addon-resizer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-autoscaler-addon-resizer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### karpenter-fips

# karpenter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/karpenter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/karpenter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Karpenter

The Chainguard Karpenter image contains the `karpenter` controller and is a drop-in replacement for the upstream image.

To try it out, follow the [official installation
instructions](https://karpenter.sh/preview/getting-started/getting-started-with-karpenter/) but edit
the Helm command to use the Chainguard image. To do this, you'll first need to retrieve the digest
of the Chainguard image, which you can do with
[crane](https://github.com/google/go-containerregistry/tree/main/cmd/crane) or Docker:

```
$ DIGEST=$(crane digest --platform linux/amd64 cgr.dev/ORGANIZATION/karpenter-fips:latest)
$ echo $DIGEST
sha256:8a178372c9e105300104d48065d61022fe1bd268737edaba4ac83e2c10159276

$ docker manifest inspect cgr.dev/ORGANIZATION/karpenter-fips | \
  jq '.manifests[] | select(.platform.architecture == "amd64").digest'
$ echo $DIGEST
sha256:8a178372c9e105300104d48065d61022fe1bd268737edaba4ac83e2c10159276
```
Note that you need to specify the platform required to get the correct digest.

Finally, edit the `helm upgrade` command to include the following lines:

```
--set controller.image.repository=cgr.dev/ORGANIZATION/karpenter-fips \
--set controller.image.digest=$DIGEST \
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### json-mock

# json-mock
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/json-mock` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/json-mock/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for json-server to mock REST/JSON APIs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the official [json-mock](https://quay.io/repository/cilium/json-mock) image. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker

You can use the following command to run the image locally:

```shell
docker run --rm -p 8080:80 -d cgr.dev/ORGANIZATION/json-mock:latest
```

Following that, you can use `curl` to make a request to the server:

```shell
curl http://localhost:8080/public
curl http://localhost:8080/private
```

Note that you can also use a custom JSON file as follows:

```shell
docker run --rm -p 8080:80 -v $(pwd)/default.json:/default.json cgr.dev/ORGANIZATION/json-mock:latest
```

### Kubernetes

```shell
kubectl create deployment json-mock --image cgr.dev/ORGANIZATION/json-mock:latest --replicas=3
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zipkin

# zipkin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zipkin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zipkin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Zipkin is a distributed tracing system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Zipkin image is comparable to the [upstream Zipkin image](https://github.com/openzipkin/zipkin). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
You can start Zipkin using the following command:

```shell
docker run -p 9411:9411 cgr.dev/ORGANIZATION/zipkin:latest
```

Once the server is running, you can access the Zipkin UI at [http://localhost:9411/zipkin](http://localhost:9411/zipkin).

You can configure your application to send traces with [Zipkin instrumentation](https://zipkin.io/pages/tracers_instrumentation). The following is an example of using Zipkin with a Go application through OpenCensus.

Before running the application, make sure you have [Go tools](https://go.dev/doc/install) installed to build and run the sample application. 

Create a `main.go` file to with the content from this [GitHub repo](https://github.com/chrismld/opencensus-golang-tutorial/blob/zipkin/src/main.go)

Initialize a new Go module:

```shell
go mod init myproject
go mod tidy
```

Once you have the code ready and Zipkin is running, run the application with the following command:

```shell
go run main.go 
```

In the browser, open the URL http://localhost:8080/list and refresh the page as many times as you wish to generate a trace every time you hit the “/list” endpoint. You can also do it through a command line with `curl http://localhost:8080/list`

Go back to the Zipkin browser window and hit **RUN QUERY**; this will allow you to see the traces and inspect their details.

## Documentation and Resources
- [Zipkin on Docker](https://hub.docker.com/r/openzipkin/zipkin)
- [Zipkin Tutorial](https://www.sentinelone.com/blog/zipkin-tutorial-distributed-tracing/)
- [Zipkin Docker Examples](https://github.com/openzipkin/zipkin/blob/master/docker/examples/README.md)
- [Zipkin instrumentation](https://zipkin.io/pages/tracers_instrumentation)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-cli-iamguarded-fips

# aws-cli-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-cli-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-cli-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS-compliant IAMGuarded image for the [AWS CLI](https://aws.amazon.com/cli/)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

FIPS-compliant IAMGuarded version of the AWS CLI image.

## Overview

This image provides the AWS CLI in a FIPS-compliant IAMGuarded-compatible format. It includes the `aws` command-line tool for interacting with Amazon Web Services while meeting FIPS 140-2 compliance requirements.

## Usage

```bash
docker run --rm cgr.dev/chainguard-private/aws-cli-iamguarded-fips:latest --version
```

## Configuration

The image runs with a non-root user (UID/GID 1001) and installs the AWS CLI at `/opt/iamguarded/aws-cli/`. This variant uses FIPS-compliant cryptographic modules to meet federal compliance requirements.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-snapshotter

# kubernetes-csi-external-snapshotter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-snapshotter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-snapshotter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Sidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint. This container image includes the snapshotter, snapshot-controller and snapshot-validation-webhook.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-snapshotter` container image collection is a drop-in replacement for the following images:

- `k8s.gcr.io/sig-storage/csi-snapshotter`
- `k8s.gcr.io/sig-storage/snapshot-controller`
- `k8s.gcr.io/sig-storage/snapshot-validation-webhook`

Chainguard Container Images are designed with minimalism and security in mind,
and thus the `kubernetes-csi-external-snapshotter` image has the following differences from the upstream image:
* We set the entrypoints to `usr/bin/{component}`, where as the upstream sets it to `/{component}`.

## Getting Started

### Snapshotter

To deploy the snapshotter, apply the manifests found in the upstream project [here](https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/csi-snapshotter). You'll need to adjust the `image` to use `cgr.dev/chainguard/kubernetes-csi-external-snapshotter` instead. You can do this by extending the existing [kustomization file](https://github.com/kubernetes-csi/external-snapshotter/blob/master/deploy/kubernetes/csi-snapshotter/kustomization.yaml) as follows:

```yaml
# ...
images:
  - name: registry.k8s.io/sig-storage/csi-snapshotter
    newName: cgr.dev/chainguard/kubernetes-csi-external-snapshotter
    digest: <insert image digest>
```

### Snapshot Controller

To deploy the snapshotter, apply the manifests found in the upstream project [here](https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/snapshot-controller). You'll need to adjust the `image` to use `cgr.dev/chainguard/kubernetes-csi-external-snapshot-controller` instead. You can do this by extending the existing [kustomization file](https://github.com/kubernetes-csi/external-snapshotter/blob/master/deploy/kubernetes/snapshot-controller/kustomization.yaml) as follows:

```yaml
# ...
images:
  - name: registry.k8s.io/sig-storage/snapshot-controller
    newName: cgr.dev/chainguard/kubernetes-csi-external-snapshot-controller
    digest: <insert image digest>
```

### Validation Webhook

> As of Feb 2025, upstream looks to have deleted 'snapshot-validation-webhook'
> from the main branch. It still exists in the latest git release at this time:
> v8.1.11. It's likely this image will be depreciated in a future release.

To deploy the webhook, see the [documentation in the upstream project](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/deploy/kubernetes/webhook-example#how-to-deploy-the-webhook). You'll just need to replace the container spec's `image` value with `cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshot-validation-webhook-fips`.

You can verify that the webhook is working by following [these instructions](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/deploy/kubernetes/webhook-example#verify-the-webhook-works) to submit an invalid snapshot definition and see whether it gets rejected.

Once all the components are deployed, you can try to apply one valid and one invalid snapshot to check the behavior.

Apply the following invalid Snapshot, which will be rejected by the validating webhook.

```
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-demo-v1
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass-v1
  source: # Only one of the two fields should be set for a snapshot. Therefore this snapshot is invalid.
    persistentVolumeClaimName: pvc 
    volumeSnapshotContentName: vsc 
```

We can then apply the following valid Snapshot which will be allowed by the validating webhook:

```
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-demo-v1
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass-v1
  source:
    persistentVolumeClaimName: hpvc
```

## Documentation and Resources
- [Official Usage Guide](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1?tab=readme-ov-file#usage)
- [Example Configs](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/examples/kubernetes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-636

# request-636
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-636` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-636/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-web-fips

# kubernetes-dashboard-web-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-web-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-web-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-web` component is responsible for the front-end user
interface and contains both the Angular-based web application and a Go server
that handles web-specific logic like settings management. This component serves
as the main point of interaction, displaying data retrieved from the Kubernetes
API via the API module.

## Usage
To deploy `kubernetes-dashboard-web-fips` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set web.image.repository = cgr.dev/ORGANIZATION/kubernetes-dashboard-web-fips \
--set web.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary
permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to
access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components,
refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-eks-pod-identity-agent-fips

# aws-eks-pod-identity-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-eks-pod-identity-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-eks-pod-identity-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-nodejs-instrumentation

# opentelemetry-nodejs-instrumentation
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-nodejs-instrumentation` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-nodejs-instrumentation/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Auto instrumention for any Node application to capture telemetry from a number of popular libraries and frameworks.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `opentelemetry-nodejs-instrumentation` Image is comparable to the official Opentelemetry-nodejs-instrumentation Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started

This image is meant to be used as a companion to the `opentelemetry-operator` image, deployment should be done following the [documentation for the `opentelemetry` operator for kubernetes](https://opentelemetry.io/docs/platforms/kubernetes/operator/) and [autoinstrumentation documentation](https://opentelemetry.io/docs/platforms/kubernetes/operator/automatic/), but specifying the Chainguard image to be injected instead of the upstream image.

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: example
  annotations:
    instrumentation.opentelemetry.io/inject-nodejs: "true"
    instrumentation.opentelemetry.io/default-auto-instrumentation-nodejs-image: "cgr.dev/ORGANIZATION/REPO_NAME:latest"
```

Once a compatible image with autoinstrumentation is deployed, the contents of the Chainguard REPO_NAME image will be copied to the target deployments following the autoinstrumentation documentation

## Documentation and Resources

* [OpenTelemetry NodeJS instrumentation Documentation](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/)
* [OpenTelemetry Documentation](https://opentelemetry.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### image-factory-fips

# images/image-factory-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/image-factory-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/image-factory-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Image Factory is a flexible artifact-build service for Talos Linux, offering automated creation of ISOs, disks, cloud images, and installers and ensuring reproductible builds.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream [image-factory](ghcr.io/siderolabs/image-factory:latest) image with FIPS-validated cryptographic libraries.

Key differences from the standard image-factory image:
- Cross-architecture builds are not supported. Unlike the upstream image, this variant cannot build ARM images on AMD containers or AMD images on ARM containers.
- ISO generation is unavailable when using the ARM version of the image.
- **FIPS Compliance**: Ships with validated redistribution of OpenSSL's FIPS provider module for environments requiring FIPS 140-3 compliance

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

These changes are intended to optimize app performance while maintaining FIPS compliance and keeping the image aligned with the latest platform capabilities.

Chainguard's Image Factory FIPS image is smaller in size compared to the original image and has few-to-zero CVEs.

## Prerequisites

To run the Image Factory container successfully, the host environment must provide the following (a single registry can be used for 1-3):
1. an OCI registry to store schematics (private)
2. an OCI registry to store cached assets (private)
3. an OCI registry to store installer images (should allow public read-only access)
4. a container image signing key: ECDSA P-256 private key in PEM format
5. partitionable loop devices: the container needs access to loop devices that support partitions.

More details regarding the setup can be found [here](https://docs.siderolabs.com/talos/v1.9/learn-more/image-factory#running-your-own-image-factory).

## Getting Started

Image Factory can be deployed either as a standalone container or inside a Kubernetes cluster. This section provides minimal examples to help you start the service using the supported deployment methods. These examples assume you have already set up the prerequisites (registry, signing key, and partitionable loop devices).

### Running with Docker

You can run Image Factory directly as a container.
Example:
```bash
docker run -d --rm --name image-factory-fips \
  -p 8080:8080 \
  --privileged \
  -v /dev:/dev \
  -v $PWD/cache-signing-key.key:/cache-signing-key.key:ro \
  cgr.dev/ORGANIZATION/image-factory-fips \
  -image-registry ghcr.io \
  -external-url http://localhost:8080 \
  -schematic-service-repository <SCHEMATIC-REGISTRY-IP>:<SCHEMATIC-REGISTRY-PORT>/image-factory/schematic \
  -installer-internal-repository <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs \
  -installer-external-repository <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs \
  -cache-repository <CACHE-REGISTRY-IP>:<CACHE-REGISTRY-PORT>/cache \
  -cache-signing-key-path /cache-signing-key.key \
```

After the container starts, the Image Factory API is available on http://localhost:8080 .
You can now submit build requests using the API or CLI tools that interact with Image Factory. Example:

```bash
cat > "metal-amd64.yaml" <<'EOF'
customization:
    extraKernelArgs: # optional
        - vga=791
    meta: # optional, allows to set initial Talos META
      - key: 0xa
        value: "{}"
    systemExtensions: # optional
      officialExtensions: # optional
        - siderolabs/gvisor
        - siderolabs/amd-ucode
    secureboot: # optional, only applies to SecureBoot images
       # optional, include well-known UEFI certificates into auto-enrollment database (SecureBoot ISO only)
      includeWellKnownCertificates: true
overlay: # optional
  image: ghcr.io/siderolabs/sbc-raspberry-pi # overlay image
  name: rpi_generic # overlay name
  options: # optional, any valid yaml, depends on the overlay implementation
    data: "mydata"
EOF

SCHEMATIC_ID=$(curl -fsSL -X POST --data-binary @"./metal-amd64.yaml" "http://localhost:8080/schematics" | jq -r '.id')
# Download raw image
curl -o "./metal-amd64.raw.zst" "http://localhost:8080/image/${SCHEMATIC_ID}/v1.11.5/metal-amd64.raw.zst"
```

### Running in Kubernetes

Image Factory can be deployed using a simple Kubernetes manifest. Example:
```bash
cat > "image-factory-fips.yaml" <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: image-factory
  namespace: image-factory
  labels:
    app: image-factory
spec:
  replicas: 1
  selector:
    matchLabels:
      app: image-factory
  template:
    metadata:
      labels:
        app: image-factory
    spec:
      containers:
        - name: image-factory
          image: cgr.dev/ORGANIZATION/image-factory-fips
          securityContext:
            privileged: true
          args:
            - -image-registry
            - ghcr.io

            - -external-url
            - http://<NODE_IP>:30080

            - -schematic-service-repository
            - <SCHEMATIC-REGISTRY-IP>:<SCHEMATIC-REGISTRY-PORT>/image-factory/schematic

            - -installer-internal-repository
            - <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs

            - -installer-external-repository
            - <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs

            - -cache-repository
            - <CACHE-REGISTRY-IP>:<CACHE-REGISTRY-PORT>/cache

            - -cache-signing-key-path
            - /cache-signing-key.key
          ports:
            - containerPort: 8080
              name: http
          volumeMounts:
            - name: dev
              mountPath: /dev
            - name: cache-signing-key
              mountPath: /cache-signing-key.key
              subPath: cache-signing-key.key
              readOnly: true
      volumes:
        - name: dev
          hostPath:
            path: /dev
            type: Directory
        - name: cache-signing-key
          secret:
            secretName: cache-signing-key
---
apiVersion: v1
kind: Service
metadata:
  name: image-factory
  namespace: image-factory
  labels:
    app: image-factory
spec:
  selector:
    app: image-factory
  type: NodePort
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 30080
EOF

cat > "metal-amd64.yaml" <<'EOF'
customization:
    extraKernelArgs: # optional
        - vga=791
    meta: # optional, allows to set initial Talos META
      - key: 0xa
        value: "{}"
    systemExtensions: # optional
      officialExtensions: # optional
        - siderolabs/gvisor
        - siderolabs/amd-ucode
    secureboot: # optional, only applies to SecureBoot images
       # optional, include well-known UEFI certificates into auto-enrollment database (SecureBoot ISO only)
      includeWellKnownCertificates: true
overlay: # optional
  image: ghcr.io/siderolabs/sbc-raspberry-pi # overlay image
  name: rpi_generic # overlay name
  options: # optional, any valid yaml, depends on the overlay implementation
    data: "mydata"
EOF

kubectl apply -f image-factory-fips.yaml
node_ip=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
factory_url="http://${node_ip}:30080"

# You can now interact with the image-factor API via nodeport service
SCHEMATIC_ID=$(curl -fsSL -X POST --data-binary @"./metal-amd64.yaml" "${factory_url}/schematics" | jq -r '.id')
# Download raw image
curl -o "./metal-amd64.raw.zst" "${factory_url}/image/${SCHEMATIC_ID}/v1.11.5/metal-amd64.raw.zst"
```

### Verifying FIPS Mode

You can test that FIPS mode is active with the following command:

```shell
docker run --rm cgr.dev/ORGANIZATION/image-factory-fips -c "openssl-fips-test"
docker run --rm -it --entrypoint openssl-fips-test cgr.dev/ORGANIZATION/image-factory-fips
```

This uses Chainguard's [`openssl-fips-test` tool](https://github.com/chainguard-dev/openssl-fips-test) to test whether or not OpenSSL is properly configured to use its FIPS module:

```
Checking OpenSSL lifecycle assurance.
	✓ Check FIPS cryptographic module is available... passed.
	✓ Check FIPS approved only mode (EVP_default_properties_is_fips_enabled)... passed.
	✓ Check non-approved algorithm blocked (HMAC-MD5)... passed.
```

## Documentation and Resources

For more information about Image-Factory in container images, please refer to the [official documentation](https://docs.siderolabs.com/talos/v1.9/learn-more/image-factory) or to the [official repository](https://github.com/siderolabs/image-factory).

For FIPS compliance information, consult the [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### policy-bot

# policy-bot
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/policy-bot` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/policy-bot/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A GitHub App that enforces approval policies on pull requests

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

[Policy-bot](https://github.com/palantir/policy-bot) is a GitHub App for enforcing approval policies on pull requests. It does this by creating a status check, which can be configured as a required status check.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### percona-server-mongodb-operator

# percona-server-mongodb-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/percona-server-mongodb-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/percona-server-mongodb-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Kubernetes Operator image which deploys and manages Percona Server for MongoDB on Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `percona-server-mongodb-operator` (psmdb-operator), Chainguard image is meant to serve as a drop-in replacement for the [PSMDB Operator image on Docker Hub](https://hub.docker.com/r/percona/percona-server-mongodb-operator). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

## Getting Started
To deploy the `percona-server-mongodb-operator`, you can follow the steps below:

#### Prerequisites

* `helm`
* `certmanager`

> [!NOTE]
> The cert-manager operator needs to be deployed prior to the `percona-server-mongodb-operator`, otherwise it will fail to deploy.
> > The [cert-manager operator](https://cert-manager.io/) was deployed by following their [Helm install guide](https://cert-manager.io/docs/installation/helm/)
> All example resources are deployed into the `default` namespace.
> For more detail about the configurations options you can refer to the official [Percona Server for MongoDB Helm Chart documentation](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-db) and the [Percona Operator for  MongoDB Operator documentation](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-operator).

#### Deploy the Percona-Server-MongoDB-Operator

1. Add Percona's Helm chart repo and update Helm client
```shell
helm repo add percona https://percona.github.io/percona-helm-charts/
helm repo update
```

2. Create your values.yaml file
```shell
cat <<EOF > /tmp/values.yaml
replicaCount: 1
image:
  repository: cgr.dev/ORGANIZATION/percona-server-mongodb-operator
  tag: latest
EOF
```

3. Install the `percona-server-mongodb-operator`
```shell
helm install psmdb-operator percona/psmdb-operator -f /tmp/values.yaml
```

## Documentation and Resources
- [PSMDB Operator docs - Helm install quickstart](https://docs.percona.com/percona-operator-for-mongodb/helm.html)
- [PSMDB Operator docs - Kubectl install quickstart](https://docs.percona.com/percona-operator-for-mongodb/kubectl.html)
- [PSMDB Operator docs - Connect to Percona Server for MongoDB](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/deploy-configure.md)
- [PSMDB Operator docs - Insert sample data](https://docs.percona.com/percona-operator-for-mongodb/data-insert.html)
- [PSMDB Operator helm chart config options](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-operator)
- [PSMDB helm chart config options](https://github.com/percona/percona-helm-charts/tree/main/charts/psmdb-db)
- [Cert-Manager Operator docs - helm quickstart](https://cert-manager.io/docs/installation/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sonobuoy-systemd-logs

# sonobuoy-systemd-logs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sonobuoy-systemd-logs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sonobuoy-systemd-logs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This is a simple standalone container that gathers log information from systemd, by chrooting into the node's filesystem and running journalctl.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `sonobuoy-systemd-logs` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream sonobuoy-systemd-logs image](https://hub.docker.com/r/sonobuoy/systemd-logs) while maintaining minimal dependencies and enhanced security.

## Prerequisites
Sonobuoy is required to run this plugin.

## Getting Started
The `sonobuoy-systemd-logs` is intended to be used as a plugin with Sonobuoy. To run sonobuoy with the custom image, specify the --systemd-logs-image command line option as shown below.

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

```
  sonobuoy run \
    --systemd-logs-image cgr.dev/ORGANIZATION/sonobuoy-systemd-logs:latest \
    --wait \
    --mode quick
```

## Documentation and Resources
[Sonobuoy systemd-logs repository documentation](https://github.com/vmware-tanzu/sonobuoy-plugins/tree/main/systemd-logs)
[Sonobuoy plugin documentation](https://sonobuoy.io/docs/v0.52.0/plugins/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-ratelimit

# envoy-ratelimit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-ratelimit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-ratelimit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 Go/gRPC service designed to enable generic rate limit scenarios from different types of applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

## Usage

This image should be a drop-in replacement for the upstream `envoyproxy/ratelimit` image.

The [`envoyproxy/ratelimit` GitHub repository](https://gateway.envoyproxy.io/docs/tasks/traffic/global-rate-limit/) contains lots of useful information, as well as [several examples](https://github.com/envoyproxy/ratelimit#examples) showing how `ratelimit` works.

Additionally, the Envoy documentation has resources on [Global rate limiting](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/global_rate_limiting) and [Local rate limiting](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/local_rate_limiting).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wait-for-it-fips

# wait-for-it-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wait-for-it-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wait-for-it-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats-box-fips

# nats-box-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats-box-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats-box-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A lightweight container with NATS utilities(FIPS Compliant).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [nats-box](https://hub.docker.com/r/natsio/nats-box) image. Switching to Chainguard nats-box-fips image should not require any changes to your existing setup. 
The default image is based on the `nonroot` variant. For use cases that require elevated privileges, the upstream `root` variant is also available and can be used by selecting the image with the `-root` suffix.

## Getting Started

The Chainguard Nats-box-fips image includes `nats` cli, `nsc` and `nats-top` tools.

### Docker

To run the nats-box-fips image with Docker(interactive-mode), you can run the following command:

```shell
docker run -it cgr.dev/ORGANIZATION/nats-box
```

This will return output similar to the following:

```
             _             _               
 _ __   __ _| |_ ___      | |__   _____  __
| '_ \ / _` | __/ __|_____| '_ \ / _ \ \/ /
| | | | (_| | |_\__ \_____| |_) | (_) >  < 
|_| |_|\__,_|\__|___/     |_.__/ \___/_/\_\
                                           
nats-box v0.16.0
~ #
```

### Helm

To deploy nats-box on your Kubernetes cluster using Chainguard's nats-box-fips image, you can use the upstream chart's [Helm repository](https://nats-io.github.io/k8s/helm/charts/).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
natsBox:
  enabled: true
  container:
    image:
      repository: ORGANIZATION/nats-box-fips
      tag: latest # use '-root' suffix for root variant
      registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for nats-box project](https://github.com/nats-io/nats-box/blob/main/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opensearch-dashboards

# opensearch-dashboards
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opensearch-dashboards` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opensearch-dashboards/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with OpenSearch Dashboards

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using OpenSearch Dashboards

Chainguard OpenSearch images include the `opensearch` package and helper scripts which can be used to start up or configure OpenSearch.

The full list of included tools is:

```shell
$ ls /usr/share/opensearch-dashboards/bin/
opensearch-dashboards      opensearch-dashboards-plugin      opensearch-dashboards-keystore      use_node
```

The default entrypoint is set to run the included `/usr/share/opensearch-dashboards/opensearch-dashboards-docker-entrypoint.sh` script.

To get started:

Install OpenSearch and then OpenSearch Dashboards.

1. Add the OpenSearch Helm Repository

```shell
helm repo add opensearch https://opensearch-project.github.io/helm-charts
```

2. Create Your Custom OpenSearch Values File

Create a custom values file to specify the configuration for your OpenSearch deployment. Below are the contents you'll use for this example. Copy the following configuration into a file named `values-opensearch.yaml`.

```yaml
singleNode: true # useful for single node testing
majorVersion: "2"
image:
  repository: cgr.dev/chainguard/opensearch
  tag: latest
```

3. Install OpenSearch with Helm
Now, you're ready to install OpenSearch using the Helm chart and your custom values file. Run the following command to start the deployment:
```shell
helm install opensearch opensearch/opensearch -f values-opensearch.yaml
```

4. Create Your Custom OpenSearch Dashboard Values File `values-opensearch-dashboard.yaml`.

```yaml
singleNode: true
majorVersion: "2"
image:
  repository: cgr.dev/chainguard/opensearch-dasboards
  tag: latest
startupProbe:
  timeoutSeconds: 10
  initialDelaySeconds: 20
```

5. Install OpenSearch Dashboards with Helm
```shell
helm install opensearch-dashboards opensearch/opensearch-dashboards  -f values-opensearch-dashboard.yaml
```

6. Access the UI using an ingress controller or kubectl port-forward
```
kubectl port-forward svc/opensearch-dashboards 5601:5601
```

7. Access the Dashboard 

Visit http://localhost:5601

8. Login in 

Using default setup credentials `admin`/`admin`

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-load-balancer-controller-fips

# aws-load-balancer-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-load-balancer-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-load-balancer-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mysql

# mysql
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mysql` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mysql/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MySQL is a widely used open-source relational database management system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's MySQL image is comparable to the [official mysql image](https://hub.docker.com/_/mysql) from Docker Hub. Chainguard images are designed with minimalism and security in mind, and thus the MySQL image has a few key differences from the upstream image:

* Chainguard's MySQL image only has the minimum set of dependencies needed to function. This means it does not come with certain tools or utilities, such as a package manager.
    * Unlike most of Chainguard's container images, though, the MySQL image does come with a shell.
* Chainguard's MySQL image does not ship with a default configuration file (such as `/etc/my.cnf`). However, you can run the image with a custom configuration, or extend it with environment variables. Refer to the **Initializing the database using environment variables** and **Running MySQL with a custom options file** sections for more information. 

## Getting Started

The default MySQL port is `3306`. To run a quick test MySQL server container with an empty root password, use the following command:

```shell
docker run -p 3306:3306 --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 cgr.dev/ORGANIZATION/mysql
```

Don't forget to replace `ORGANIZATION` with your organization's designated private repository.

```
Thu Sep 12 13:42:59 UTC 2024 [Note] [Entrypoint]: Entrypoint script for MySQL Server  started.
Thu Sep 12 13:42:59 UTC 2024 [Note] [Entrypoint]: Initializing database files
2024-09-12T13:42:59.828911Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-09-12T13:42:59.829672Z 0 [System] [MY-013169] [Server] /usr/bin/mysqld (mysqld 8.4.2) initializing of server in progress as process 41
2024-09-12T13:42:59.837924Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-12T13:43:00.401495Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-12T13:43:02.507476Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2024-09-12T13:43:05.547743Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
Thu Sep 12 13:43:05 UTC 2024 [Note] [Entrypoint]: Database files initialized
Thu Sep 12 13:43:05 UTC 2024 [Note] [Entrypoint]: Starting temporary server

(...)

2024-09-12T13:43:09.669017Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-09-12T13:43:09.876146Z 0 [System] [MY-010116] [Server] /usr/bin/mysqld (mysqld 8.4.2) starting as process 1
2024-09-12T13:43:09.889947Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-12T13:43:10.365620Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-12T13:43:10.656614Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-09-12T13:43:10.656633Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-09-12T13:43:10.665823Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/lib/mysql' in the path is accessible to all OS users. Consider choosing a different directory.
2024-09-12T13:43:10.696239Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /run/mysqld/mysqlx.sock
2024-09-12T13:43:10.696283Z 0 [System] [MY-010931] [Server] /usr/bin/mysqld: ready for connections. Version: '8.4.2'  socket: '/run/mysqld/mysqld.sock'  port: 3306  Source distribution.

```

After the server is up and running, you can connect to it using the `mysql` client. This is available for most Linux-based systems in a package called `mysql-client`, in case you don't have it installed yet. To connect to the server as `root` and without a password, use the following command:

```shell
mysql -h 127.0.0.1 -uroot
```
Please note this only works because the server was initialized with the option `MYSQL_ALLOW_EMPTY_PASSWORD`, which should never be used on production environments.

Following that, you will be able to manage the database using the MySQL prompt:

```shell
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 9.1.0 Source distribution

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

You can now create databases, users, and tables as you would with a regular MySQL server. To exit the client, run the `exit` command on the MySQL prompt. To stop the server, press `CTRL + C` in the terminal where Docker is running. The container will stop and be removed automatically.

### Importing Data From an SQL File Upon Initialization

Another feature from the MySQL initialization script allows you to import an SQL file via a volume mounted to `/docker-entrypoint-initdb.d`. For example, if you have a `my-data.sql` file in your current folder, you can run the following command to have this data automatically imported to your database:

```shell
docker run -v ${PWD}/my-data.sql:/docker-entrypoint-initdb.d/my-data.sql cgr.dev/ORGANIZATION/mysql
```

### Initializing the database using environment variables

You can use environment variables to set up your database upon initialization. The following variables are available for this purpose:

- `MYSQL_ROOT_HOST`: This variable allows you to specify the host from which the root user can connect. The default value is `localhost`.
- `MYSQL_ROOT_PASSWORD`: Sets the password for MySQL's root superuser account.
- `MYSQL_RANDOM_ROOT_PASSWORD`: When this variable is set, a random password is generated for the root superuser account. This password is printed to stdout at the end of the container initialization process.
- `MYSQL_ALLOW_EMPTY_PASSWORD`: This variable allows you to run the MySQL container with an empty root password. This is insecure and should only be used for tests and local development.
- `MYSQL_DATABASE`: Creates a new database upon initialization.
- `MYSQL_USER`: Together with `MYSQL_PASSWORD`, this environment variable can be used to create a new database user and grant them full access to the database defined by `MYSQL_DATABASE`.
- `MYSQL_PASSWORD`: This should be used in conjunction with the `MYSQL_USER` environment variable to set up the database user's password.

To facilitate testing the various environment variables and options when initializing your MySQL server, you can use a Docker Compose setup like the following. Again, remember to replace `ORGANIZATION` with your organization's designated private repository.

```yaml
services:
  mysql:
    image: cgr.dev/ORGANIZATION/mysql
    restart: unless-stopped
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: test
    ports:
      - 3306:3306

```

Save this file as `docker-compose.yaml`. Then, from the same directory, start the container:

```shell
docker-compose up
```

Once the server is up and running, you can connect via the `mysql` client with the following command:

```shell
mysql -h 127.0.0.1 -uuser -ppassword
```

This `docker-compose.yaml` sets up a MySQL database with a default database and user. You can add other services to create a local multi-node environment for development and tests. You can iterate on this setup to test different configurations and scenarios.

### `_FILE` variables

Chainguard's MySQL image also supports appending `_FILE` to several of the environment variables mentioned previously, allowing you to instruct the initialization script to load variable values from files. This is useful in cases where you want to avoid passing sensitive information — such as passwords — with environment variables. 

Chainguard's MySQL image currently supports this for the `MYSQL_ROOT_PASSWORD`, `MYSQL_ROOT_HOST`, `MYSQL_DATABASE`, `MYSQL_USER`, and `MYSQL_PASSWORD` variables.

### Running MySQL with a custom options file

You can also run Chainguard's MySQL image with a custom [options file](https://dev.mysql.com/doc/refman/8.4/en/option-files.html). To illustrate, create a configuration file named `my.cnf` with the following command:

```shell
cat > my.cnf <<EOF
[mysqld]
thread_cache_size=8
EOF
```

This command creates an options file with a single option (`thread_cache_size`) and changes its value to `8` from the default `9`.

Then create and run a new MySQL container with the following command, which also mounts the `my.cnf` file to the container's `/etc/` directory:

```shell
docker run --name custom-mysql -d --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -v $PWD/my.cnf:/etc/my.cnf cgr.dev/chainguard-private/mysql
```

This command includes the `-d` option to detach the container and run it in the background.

Next, run a `docker exec` command to access the container's shell:

```shell
docker exec -it custom-mysql sh
```

From there, you can confirm that the MySQL server is using the custom configuration using the `mysqld` command:

```container
mysqld --verbose --help | grep thread-cache 
```
```Output
  --thread-cache-size=#
thread-cache-size                                        	8
```

As this output shows, the MySQL server is using the `thread-cache-size` option value defined in the custom options file. 

MySQL will read options files in the following order: `/etc/mysql/my.cnf`, `/etc/my.cnf`, and finally `~/.my.cnf`. Be aware that it's recommended that you don't place your custom options file in the `~/` directory, as you will then have to consider which user is going to run the `mysqld` process when you run the image.

## Documentation and Resources

* [MySQL Documentation](https://dev.mysql.com/doc/)
* [Upstream MySQL Image Overview](https://hub.docker.com/_/mysql)
* [Basic Steps for MySQL Server Deployment with Docker](https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html)
* [More Topics on Deploying MySQL Server with Docker](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/docker-mysql-more-topics.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-alertmanager-fips

# prometheus-alertmanager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-alertmanager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-alertmanager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on prometheus-alertmanager, refer to the
[official documentation](https://prometheus.io/docs/alerting/latest/alertmanager).
The GitHub repository can also be [found here](https://github.com/prometheus/alertmanager).

### Default config settings
The upstream docker image, overrides some of the default values for
alertmanager, for example, [see here](https://github.com/prometheus/alertmanager/blob/main/Dockerfile#L20).
We replicate the same behavior in the Chainguard image to provide parity with
the upstream image.

### Helm
To deploy via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/main/charts/alertmanager/values.yaml).

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-alertmanager prometheus-community/alertmanager \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-alertmanager-fips \
 --set image.tag=latest
```

The [upstream helm chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/alertmanager)
provides some default `config:` values, but if you intend to deploy with
additional configuration, i.e defining routes and receivers, you'll need to
create your own custom values.yaml and pass this into the chart at deployment.

### Docker

#### Create config file
Before running the container, you'll need to create a configuration file. This
contains all the necessary configurations for Alertmanager, such as alerting
routes, receivers, and integrations.

Refer to the [official documentation](https://prometheus.io/docs/alerting/latest/alertmanager)
for more information. Below is a simple example:

```yaml
# Save this as 'alertmanager.yml')
global:
  resolve_timeout: 11m
  pagerduty_url: https://example-pagerduty.com/v2/test
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10m
  repeat_interval: 1h
receivers:
  - name: 'example-webhook'
    webhook_configs:
    - url: 'http://example.com/hook'
```

In order to ensure the 'nonroot' container user can access the file when
volume mounted (below step), ensure you've set read-only permissions:

```bash
chmod 400 alertmanager.ym
```

#### Run container

> **IMPORTANT**: Prometheus looks for a file mounted as 'alertmanager.yml' (i.e not .yaml).

```bash
# TODO: Update '$(pwd)/alertmanager.yml' accordingly to reference your locally
# created config file.
docker run -p 9093:9093 \
  -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  --name alertmanager \
  cgr.dev/ORGANIZATION/prometheus-alertmanager-fips:latest
```

Verify that Alertmanager is running correctly by accessing http://localhost:9093
on your browser.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5510

# request-5510
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5510` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5510/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A time-series database for high-performance real-time analytics packaged as a Postgres extension

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's TimescaleDB Compat image is comparably to the [official open source TimescaleDB image](https://hub.docker.com/r/timescale/timescaledb) from Docker Hub. However, this image only contains Apache 2 from TimescaleDB; no proprietary code is included, so some features may not be available. Please see this [feature comparison](https://docs.tigerdata.com/about/latest/timescaledb-editions/#feature-comparison) for more information.

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it -p 5432:5432 -e POSTGRES_PASSWORD=password cgr.dev/ORGANIZATION/request-5510:latest
```

It should return output similar to this:
```
The files belonging to this database system will be owned by user "nonroot".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
# ...
```

Note that the only mandatory environment variable needed by the TimescaleDB image is `POSTGRES_PASSWORD`. 

This command will run the image, but no data within the underlying PostgreSQL database will persist after the image stops running. For a persistent database you can mount a volume mapped to the container's data folder:

```sh
docker run --rm -v timescaledb_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -it --name postgres-test cgr.dev/ORGANIZATION/request-5510:latest
```

From there you can start making queries with tools that interop with PostgreSQL, for example, with the `psql` CLI tool.

### Example: Using PSQL CLI to deploy a basic database using TimescaleDB's extensions

Create a file named `hello_world.sql` with the following contents in your current working directory

```sql
-- Create table 'rides' which will store trip data
DROP TABLE IF EXISTS "rides";
CREATE TABLE "rides"(
    vendor_id TEXT,
    pickup_datetime TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    dropoff_datetime TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    passenger_count NUMERIC,
    trip_distance NUMERIC,
    pickup_longitude  NUMERIC,
    pickup_latitude   NUMERIC,
    rate_code         INTEGER,
    dropoff_longitude NUMERIC,
    dropoff_latitude  NUMERIC,
    payment_type INTEGER,
    fare_amount NUMERIC,
    extra NUMERIC,
    mta_tax NUMERIC,
    tip_amount NUMERIC,
    tolls_amount NUMERIC,
    improvement_surcharge NUMERIC,
    total_amount NUMERIC
);

-- Create hypertable for rides 
-- This allows us to take advantage of timescaledb's space and time partitioning
SELECT create_hypertable('rides', 'pickup_datetime', 'payment_type', 2, create_default_indexes=>FALSE);
-- Create indexes (special look up tables/ pointers) on the following columns to speed up data retrieval
CREATE INDEX ON rides (vendor_id, pickup_datetime desc);
CREATE INDEX ON rides (pickup_datetime desc, vendor_id);
CREATE INDEX ON rides (rate_code, pickup_datetime DESC);
CREATE INDEX ON rides (passenger_count, pickup_datetime desc);

-- Create table 'payment_types' to store description of payment types for easy lookup
CREATE TABLE IF NOT EXISTS "payment_types"(
    payment_type INTEGER,
    description TEXT
);
INSERT INTO payment_types(payment_type, description) VALUES
(1, 'credit card'),
(2, 'cash'),
(3, 'no charge'),
(4, 'dispute'),
(5, 'unknown'),
(6, 'voided trip');

-- Create table 'rates' to store description of rate codes for for easy lookup
CREATE TABLE IF NOT EXISTS "rates"(
    rate_code   INTEGER,
    description TEXT
);
INSERT INTO rates(rate_code, description) VALUES
(1, 'standard rate'),
(2, 'JFK'),
(3, 'Newark'),
(4, 'Nassau or Westchester'),
(5, 'negotiated fare'),
(6, 'group ride');
```

Then run the following to apply the database schema: 

```shell
psql -h "${PGHOST:-127.0.0.1}" -U postgres -f hello_world.sql
```

Make sure to specify the password either via stdin or by manually typing it

You should see output similar to the following:
```
psql:hello_world.sql:2: NOTICE:  table "rides" does not exist, skipping
DROP TABLE
CREATE TABLE
psql:hello_world.sql:26: WARNING:  column type "timestamp without time zone" used for "pickup_datetime" does not follow best practices
HINT:  Use datatype TIMESTAMPTZ instead.
psql:hello_world.sql:26: WARNING:  column type "timestamp without time zone" used for "dropoff_datetime" does not follow best practices
HINT:  Use datatype TIMESTAMPTZ instead.
 create_hypertable
--------------------
 (1,public,rides,t)
(1 row)

CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 6
```

## Documentation References

- [TimescaleDB Documentation](https://docs.tigerdata.com/self-hosted/latest)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
- [How to deploy TimescaleDB on Kubernetes](https://docs.tigerdata.com/self-hosted/latest/install/installation-kubernetes/#install-timescaledb-on-kubernetes)
- [TimescaleDB Apache 2 Edition Compatibility Notice](https://docs.tigerdata.com/about/latest/timescaledb-editions/#timescaledb-apache-2-edition)
- [TimescaleDB Editions Feature Comparison](https://docs.tigerdata.com/about/latest/timescaledb-editions/#feature-comparison)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-exporter

# apache-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

apache-exporter exposes Apache HTTP server metrics from mod_status in Prometheus format for monitoring

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `apache-exporter` container image is comparable to the [Lusitaniae/apache_exporter](https://github.com/Lusitaniae/apache_exporter) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `apache-exporter` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

Create a Deployment:

`deployment.yaml`:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apache-exporter
  template:
    metadata:
      labels:
        app: apache-exporter
    spec:
      containers:
      - name: apache-exporter
        image: cgr.dev/ORGANIZATION/apache-exporter:latest
        args:
          - --scrape_uri=http://apache-server/server-status?auto
          - --web.listen-address=:9117
          - --telemetry.endpoint=/metrics
        ports:
        - containerPort: 9117
---
apiVersion: v1
kind: Service
metadata:
  name: apache-exporter
spec:
  selector:
    app: apache-exporter
  ports:
    - protocol: TCP
      port: 9117
      targetPort: 9117
  type: ClusterIP
```

Apply the YAML:

```bash
kubectl apply -f deployment.yaml
```

Access metrics:

```bash
kubectl port-forward svc/apache-exporter 9117:9117
```

Now, you can access metrics at:  
`http://localhost:9117/metrics`

## Documentation and Resources

- **[Official Documentation](https://github.com/Lusitaniae/apache_exporter#readme)**
- **[GitHub Repository](https://github.com/Lusitaniae/apache_exporter)**
- **[Prometheus Apache Exporter Dashboard for Grafana](https://grafana.com/grafana/dashboards/3894-apache/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### linkerd-cni-plugin

# linkerd-cni-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/linkerd-cni-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/linkerd-cni-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Init container that sets up the iptables rules to forward traffic into the Linkerd2 sidecar proxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `linkerd-cni-plugin` image is comparable to [Linkerd's `cni-plugin` image](https://linkerd.io/2-edge/features/cni/).

## Getting started

This image is meant to be deployed into a cluster following the Linkerd CNI plugin documentation, changing the respective image to the Chainguard image wherever possible

Currently, Linkerd CNI plugin can be installed via Helm and the Linkerd CLI:

### Linkerd CLI

Before deploying Linkerd to your cluster, install the CNI using the following command:

```bash
linkerd install-cni --cni-image "cgr.dev/ORGANIZATION/linkerd-cni-plugin" --cni-image-version "latest" | kubectl apply -f -
```

`latest` can be replaced by the image version you want to run.

You can check if the CNI got correctly installed:

```bash
linkerd check --pre --linkerd-cni-enabled
```

Then you can install Linkerd into your cluster as expected following [upstream documentation](https://linkerd.io/2-edge/features/cni/#using-the-cli)

#### Upgrading the CNI plugin via the Linkerd CLI

The deployed Chainguard Linkerd CNI image can be upgraded by using the specifying the desired image during upgrade:

```bash
linkerd install-cni --cni-image "cgr.dev/ORGANIZATION/linkerd-cni-plugin" --cni-image-version "latest" | kubectl apply --prune -l linkerd.io/cni-resource=true -f -
```

### Helm chart

Alternatively, a helm chart installation method is officially supported by Linkerd. To deploy Chainguard's Linkerd CNI plugin image, add the repository

```bash
helm repo add linkerd https://helm.linkerd.io/stable
helm repo update
```

Create a `values.yaml` manifest, replacing the upstream image with Chainguard's image:

```yaml
image:
  name: "cgr.dev/ORGANIZATION/linkerd-cni-plugin"
  version: "latest"
```

Install the chart:

```shell
helm install linkerd-cni -n linkerd-cni --create-namespace linkerd/linkerd2-cni --values values.yaml --wait
```

Then ensure that the CNI plugin got installed correctly by using the Linkerd CLI:

```bash
linkerd check --pre --linkerd-cni-enabled
```

## Resources and Documentation

- [Linkerd CNI Plugin documentation](https://linkerd.io/2-edge/features/cni)
- [Linkerd CLI documentation](https://linkerd.io/2-edge/features/cni)
- [Linkerd documentation](https://linkerd.io/2-edge/overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1276

# request-1276
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1276` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1276/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dex

# dex
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dex` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dex/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[dex](https://dexidp.io) is a federated OpenID Connect provider.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using dex

`dex` has several operating modes, the most common being kubernetes, installed via `helm` using the upstream source shown below:

```bash
helm repo add dex https://charts.dexidp.io
helm install --generate-name --wait dex/dex -f values.yaml
```

An example `values.yaml` file is provided below:

```yaml
# values.yaml
image:
  repository: cgr.dev/chainguard/dex
  tag: latest

config:
  issuer: "http://127.0.0.1:5556/dex"

  storage:
    type: memory

  web:
    http: 0.0.0.0:5556

  expiry:
    deviceRequests: "5m"
    signingKeys: "6h"
    idTokens: "24h"
    authRequests: "24h"

  logger:
    level: "info"
    format: "text"

  oauth2:
    responseTypes: [ "code" ]
    skipApprovalScreen: false
    alwaysShowLoginScreen: false

  enablePasswordDB: true

  connectors:
  - type: mockCallback
    id: mock
    name: Example
```

> WARNING: The example above should _not_ be used in production, it simply exists to get up and running quickly.

For an incomplete values file that only contains the minimum required settings to use the Chainguard Images variant, use the snippet below:

```yaml
# non functional defaults! fill in with your own values.yaml
image:
  repository: cgr.dev/chainguard/dex
  tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ratify

# ratify
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ratify` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ratify/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Artifact Ratification Framework (CNCF Sandbox)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `ratify` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream Ratify image](https://ghcr.io/ratify-project/ratify) while maintaining minimal dependencies and enhanced security.

But there are some differences between the upstream and Chainguard's `ratify` container image:
- The Chainguard image stores the configuration file at `/opt/ratify/config.json` instead of `/.ratify/config.json`.
- The plugins in the Chainguard image reside at `/opt/ratify/plugins` instead of `/.ratify/plugins`.

## Getting Started

In order to deploy Ratify in your Kubernetes cluster, first things first, you need to install the [Gatekeeper](https://github.com/open-policy-agent/gatekeeper) admission controller. You can follow the [Gatekeeper installation guide](https://open-policy-agent.github.io/gatekeeper/website/docs/install).

To deploy Gatekeeper, first, you need to add the Gatekeeper Helm repository:

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
```

You can use [Chainguard image for Gatekeeper](https://images.chainguard.dev/directory/image/gatekeeper/versions) by setting the `image.repository` and `image.release` values in a `values.yaml` file:

```shell
cat > values-gatekeeper.yaml << EOF
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper
  release: latest
EOF
```

Then, you can install Gatekeeper using the following command:

```shell
helm install gatekeeper/gatekeeper  \
    --name-template=gatekeeper \
    --namespace gatekeeper-system --create-namespace \
    --set enableExternalData=true \
    --set validatingWebhookTimeoutSeconds=5 \
    --set mutatingWebhookTimeoutSeconds=2 \
    --set externaldataProviderResponseCacheTTL=10s \
    -f values-gateekeper.yaml
```

Once Gatekeeper is installed, you can deploy the Ratify admission controller. You can use the [Ratify Helm chart](https://artifacthub.io/packages/helm/ratify/ratify) to deploy Ratify in your cluster. First, add the Ratify Helm repository:

```shell
helm repo add ratify https://notaryproject.github.io/ratify
```

You can use the Chainguard image for Ratify by setting the `image.repository` and `image.tag` values in a `values.yaml` file:

```shell
cat > values.yaml << EOF
image:
  repository: cgr.dev/ORGANIZATION/ratify
  crdRepository: cgr.dev/ORGANIZATION/ratify-crds
  tag: latest
EOF
```

Then install the webhook using the `values.yaml` file:

> **NOTE**: Do not forget to use the `--set-file` flag to provide the `notation.crt` file, which is required for the Ratify webhook to function properly.

```shell
  helm install ratify ratify/ratify \
    --namespace gatekeeper-system \
    --set-file notationCerts[0]="./notation.crt" \
    --set featureFlags.RATIFY_CERT_ROTATION=true \
    --set policy.useRego=true \
    -f values.yaml
```

Then you can follow up the [Ratify documentation](https://ratify.dev/docs/quickstarts/quickstart-manual#step-3-see-ratify-in-action) to configure Ratify constraints to enforce policies on your Kubernetes cluster.

## Documentation and Resources

* [Ratify Documentation](https://ratify.dev)
* [Quickstart Guide](https://ratify.dev/docs/quick-start)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pgbouncer-exporter-fips

# prometheus-pgbouncer-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pgbouncer-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pgbouncer-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant image for PgBouncer Exporter. A Prometheus exporter that collects and exposes metrics from PgBouncer, a lightweight connection pooler for PostgreSQL

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream `quay.io/prometheuscommunity/pgbouncer-exporter` Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager. Switching to Chainguard's `prometheus-pgbouncer-exporter-fips` image should not require any changes to your existing setup. 

### FIPS Support
The PgBouncer Exporter FIPS Chainguard Image is shipped with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on FIPS-enabled Chainguard Images on Chainguard Academy

## Usage Instructions
To use the PgBouncer Exporter, you'll need a working `PgBouncer` setup in your Environment.

### PGBouncer configuration
The PgBouncer-Exporter [requires a configuration change](https://github.com/prometheus-community/pgbouncer_exporter/blob/master/README.md#pgbouncer-configuration) to `pgbouncer` to ignore a PostgreSQL driver connection parameter. In the `pgbouncer.ini` please include this option:
```
   ignore_startup_parameters = extra_float_digits
```

### Run with docker
```
docker run ORGANIZATION/prometheus-pgbouncer-exporter-fips:latest <flags>
```

### Helm

To deploy `prometheus-pgbouncer-exporter` on your Kubernetes cluster using Chainguard's `prometheus-pgbouncer-exporter-fips` image, you can use the the upstream Helm chart from the [Prometheus Community repository](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-pgbouncer-exporter).

To use the Chainguard image, override the image repository and tag in your own `values.yaml` file:
```yaml
image:
    repository: ORGANIZATION/prometheus-pgbouncer-exporter-fips
    tag: latest
```
Deploy PgBouncer-Exporter with Helm:
```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pgbouncer-exporter prometheus-community/prometheus-pgbouncer-exporter -f values.yaml
kubectl rollout status deployment/prometheus-pgbouncer-exporter
```
Once PgBouncer-Exporter is up and running, you can validate metrics from Host:
```shell
kubectl port-forward -n pgbouncer-demo svc/prometheus-pgbouncer-exporter 8080:9127 &
curl http://localhost:8080/metrics
```

## Documentation and Resources
- [Official documentation for pgbouncer-exporter project](https://github.com/prometheus-community/pgbouncer_exporter/blob/master/README.md)
- [Metrics Documentation](https://github.com/prometheus-community/pgbouncer_exporter/tree/master?tab=readme-ov-file#metrics)
- [GoDoc / API docs](https://pkg.go.dev/github.com/prometheus-community/pgbouncer_exporter)
- [GitLab Docs (usage in Gitlab)](https://docs.gitlab.com/administration/monitoring/prometheus/pgbouncer_exporter/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-operator

# keycloak-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes Operator based on the Operator SDK for installing and managing Keycloak.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Kubernetes

You can install the Operator on a vanilla Kubernetes cluster by using kubectl commands:

Install the CRDs by entering the following commands:

```bash
kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/24.0.4/kubernetes/keycloaks.k8s.keycloak.org-v1.yml
kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/24.0.4/kubernetes/keycloakrealmimports.k8s.keycloak.org-v1.yml
```

Next, install the Keycloak operator with Chainguard images using following steps: 

##### Step 1: Download the YAML file and save it with a different name
curl -o keycloak-operator.yml https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/24.0.4/kubernetes/kubernetes.yml

##### Step 2: Use sed to replace the image repository for Keycloak (adjust for macOS)
sed -i '' 's|quay\.io/keycloak/keycloak:.*|cgr.dev/chainguard/keycloak:latest|' keycloak-operator.yml

##### Step 3: Use sed to replace the image repository for Keycloak Operator (adjust for macOS)
sed -i '' 's|quay\.io/keycloak/keycloak-operator:.*|cgr.dev/chainguard/keycloak-operator:latest|' keycloak-operator.yml

##### Step 4: Apply the modified YAML file
kubectl apply -f keycloak-operator.yml

**NOTE** : The above sed commands were for MacOS (BSD based), for Linux GNU based, replace `sed -i '' 's`  with `sed -i 's`

Currently the Operator watches only the namespace where the Operator is installed.

### Basic Keycloak deployment with Keycloak Operator 

Once the Keycloak Operator is installed and running in the cluster namespace, you can set up the other deployment prerequisites.

* Database

* Hostname

* TLS Certificate and associated keys

#### Database

For development purposes, you can use an ephemeral PostgreSQL pod installation. To provision it, follow the approach below:

Create YAML file `example-postgres.yaml`:

```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql-db
spec:
  serviceName: postgresql-db-service
  selector:
    matchLabels:
      app: postgresql-db
  replicas: 1
  template:
    metadata:
      labels:
        app: postgresql-db
    spec:
      containers:
        - name: postgresql-db
          image: postgres:15
          volumeMounts:
            - mountPath: /data
              name: cache-volume
          env:
            - name: POSTGRES_USER
              value: testuser
            - name: POSTGRES_PASSWORD
              value: testpassword
            - name: PGDATA
              value: /data/pgdata
            - name: POSTGRES_DB
              value: keycloak
      volumes:
        - name: cache-volume
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-db
spec:
  selector:
    app: postgresql-db
  type: LoadBalancer
  ports:
  - port: 5432
    targetPort: 5432
```

Apply the changes:

```bash
kubectl apply -f example-postgres.yaml
```

#### Hostname

For a production ready installation, you need a hostname that can be used to contact Keycloak. See [Configuring the hostname](https://www.keycloak.org/server/hostname) for the available configurations.

For development purposes, this guide will use `test.keycloak.org`.

#### TLS Certificate and key
See your Certification Authority to obtain the certificate and the key.

For development purposes, you can enter this command to obtain a self-signed certificate:

```bash
openssl req -subj '/CN=test.keycloak.org/O=Test Keycloak./C=US' -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
```

You should install it in the cluster namespace as a Secret by entering this command:

```bash
kubectl create secret tls example-tls-secret --cert certificate.pem --key key.pem
```

### Deploying Keycloak

Consider storing the Database credentials in a separate Secret. Enter the following commands:

```bash
kubectl create secret generic keycloak-db-secret \
  --from-literal=username=testuser \
  --from-literal=password=testpassword
```

For a basic deployment, you can stick to the following approach:

Create YAML file `example-kc.yaml`:

```yaml
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  instances: 1
  db:
    vendor: postgres
    host: postgres-db
    usernameSecret:
      name: keycloak-db-secret
      key: username
    passwordSecret:
      name: keycloak-db-secret
      key: password
  http:
    tlsSecret: example-tls-secret
  hostname:
    hostname: test.keycloak.org
  proxy:
    headers: xforwarded # double check your reverse proxy sets and overwrites the X-Forwarded-* headers
```

Apply the changes:

```bash
kubectl apply -f example-kc.yaml
```
To check that the Keycloak instance has been provisioned in the cluster, check the status of the created CR by entering the following command:

```bash
kubectl get keycloaks/example-kc -o go-template='{{range .status.conditions}}CONDITION: {{.type}}{{"\n"}}  STATUS: {{.status}}{{"\n"}}  MESSAGE: {{.message}}{{"\n"}}{{end}}'
```
When the deployment is ready, look for output similar to the following:

```yaml
CONDITION: Ready
  STATUS: true
  MESSAGE:
CONDITION: HasErrors
  STATUS: false
  MESSAGE:
CONDITION: RollingUpdate
  STATUS: false
  MESSAGE:
```

For further reference, please refer to [official documentation of the project](https://www.keycloak.org/guides#operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics-operator-fips

# victoriametrics-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

To install the VictoriaMetrics operator using the Helm, refer to the
installation instructions provided in the README of the relevant chart:

- [victoria-metrics-operator/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-operator/README.md)
- [victoria-metrics-k8s-stack/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-k8s-stack/README.md)).

For additional information, see the [quick start guide](https://docs.victoriametrics.com/operator/quick-start).
Below is an example:

```bash
helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update
```

Specify the Chainguard image when deploying the chart:

```bash
helm install vmoperator vm/victoria-metrics-operator \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/victoriametrics-operator-fips \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chromium

# chromium
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chromium` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chromium/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [Chromium](https://chromium.googlesource.com/chromium/src/) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Chromium image provides a minimal, fast, and secure installation of [Chromium](https://www.chromium.org/Home/), powered by Wolfi.

Please note that, by default, Chromium is configured to run in a headless state with the sandbox and GPU access disabled with the flags:
     
```       
--headless --no-sandbox --disable-gpu
```
            
We run Chromium headless with GPU access disabled, as by default, the container does not have GPU access. Chromium's sandbox has also been disabled as the container is sandboxed from the host environment.

These options can be overridden via the environment variable `CHROMIUM_USER_FLAGS`, though this is unsupported.

## Getting Started

Getting started with Chromium is as simple as running the image with Docker:

```bash
docker run cgr.dev/ORGANIZATION/chromium:latest
```

## Documentation and Resources

- [Chromium documentation](https://www.chromium.org/Home/)
- [Chromium source](https://source.chromium.org/chromium)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-object-browser-iamguarded-fips

# minio-object-browser-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-object-browser-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-object-browser-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MinIO Console is a library that provides a management and browser UI overlay for the MinIO Server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MinIO Object Storage IAMGuarded FIPS is a security-enhanced, FIPS-140 compliant variant of MinIO Object Storage designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard MinIO deployments and meets FIPS-140 compliance requirements.

## Helm Chart Installation

You can enable MinIO Object Storage IAMGuarded in the MinIO Helm Chart which is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install minio oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

To view all available configuration options:

```bash
helm show values oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Registry Configuration

For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MinIO server image (FIPS)
image:
  registry: myregistry.example.com
  repository: mirrored/minio-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# MinIO client image (FIPS)
clientImage:
  registry: myregistry.example.com
  repository: mirrored/minio-client-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions (FIPS)
defaultInitContainers:
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag

# MinIO Object Storage image
console:
  registry: myregistry.example.com
  repository: mirrored/minio-object-browser-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Standalone Docker Usage

While this image is optimized for use with the iamguarded Helm chart, it can also be run standalone:

```bash
docker container run -p 9090:9090 \
  cgr.dev/$ORGANIZATION/minio-object-browser:latest server
```

### MinIO Object Storage

The MinIO Object Storage image is also available:

```bash
docker run cgr.dev/$ORGANIZATION/minio-object-browser-iamguarded-fips:latest --help
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafbat-ui

# kafbat-ui
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafbat-ui` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafbat-ui/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Kafbat-UI](https://kafbat.io/) is an open-source Web UI for managing Apache Kafka clusters

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started with Docker

To run Kafbat UI with Docker, you'll need a Kafka cluster running in KRaft mode. This example demonstrates a complete setup with both Kafka and Kafbat UI.

### Step 1: Create a Docker Network

```bash
docker network create kafbat-net
```

### Step 2: Generate a Cluster ID for KRaft Mode

KRaft mode requires a unique cluster ID. Generate one using the Kafka storage tool:

```bash
CLUSTER_ID=$(docker run --rm --entrypoint /usr/lib/kafka/bin/kafka-storage.sh \
  cgr.dev/ORGANIZATION/confluent-kafka:latest random-uuid)
echo "Generated Cluster ID: $CLUSTER_ID"
```

### Step 3: Start a Kafka Broker in KRaft Mode

```bash
docker run -d \
  --name kafka \
  --hostname kafka0 \
  --network kafbat-net \
  -p 9092:9092 \
  -e KAFKA_NODE_ID=1 \
  -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' \
  -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://kafka0:29092,PLAINTEXT_HOST://localhost:9092' \
  -e KAFKA_LISTENERS='PLAINTEXT://kafka0:29092,CONTROLLER://kafka0:29093,PLAINTEXT_HOST://0.0.0.0:9092' \
  -e KAFKA_JMX_PORT=9997 \
  -e KAFKA_JMX_HOSTNAME=localhost \
  -e KAFKA_PROCESS_ROLES='broker,controller' \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS='1@kafka0:29093' \
  -e KAFKA_INTER_BROKER_LISTENER_NAME='PLAINTEXT' \
  -e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
  -e CLUSTER_ID="$CLUSTER_ID" \
  cgr.dev/ORGANIZATION/confluent-kafka:latest
```

### Step 4: Start Kafbat UI

```bash
docker run -d \
  --name kafbat-ui \
  --network kafbat-net \
  -p 8080:8080 \
  -e DYNAMIC_CONFIG_ENABLED="true" \
  -e KAFKA_CLUSTERS_0_NAME="local-cluster" \
  -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS="kafka:29092" \
  -e KAFKA_CLUSTERS_0_METRICS_PORT=9997 \
  -e SERVER_PORT=8080 \
  cgr.dev/ORGANIZATION/kafbat-ui:latest
```

The Kafbat UI will be accessible at `http://localhost:8080`.

To verify the service is running and the cluster is online:

```bash
curl -s http://localhost:8080/actuator/health | jq '.status'
curl -s http://localhost:8080/api/clusters | jq '.[] | {name: .name, status: .status}'
```

### Step 5: Create Test Topics

Create a test topic to verify everything is working:

```bash
docker exec kafka kafka-topics \
  --create --topic test-topic \
  --partitions 3 \
  --replication-factor 1 \
  --if-not-exists \
  --bootstrap-server kafka0:29092
```

Produce some test messages:

```bash
echo "Hello Kafka" | docker exec -i kafka \
  kafka-console-producer \
  --bootstrap-server kafka0:29092 \
  --topic test-topic
```

You can now view the topic and messages in the Kafbat UI at `http://localhost:8080`.

## Getting Started with Kubernetes

Kafbat UI can be deployed to Kubernetes using the [official Helm chart](https://github.com/kafbat/helm-charts/tree/main/charts/kafka-ui). This guide demonstrates deploying Kafbat UI with a Kafka cluster in KRaft mode managed by the Confluent Operator.

### Step 1: Install Confluent Operator

The Confluent Operator simplifies deploying and managing Kafka clusters in Kubernetes.

Add the Confluent Helm repository:

```bash
helm repo add confluent https://packages.confluent.io/helm
helm repo update
```

Install the Confluent Operator:

```bash
helm install confluent-operator confluent/confluent-for-kubernetes \
  --namespace default
```

Wait for the operator to be ready:

```bash
kubectl rollout status deployment/confluent-operator --timeout=60s
kubectl wait --for=condition=ready pod \
  --selector app=confluent-operator \
  --timeout=60s
```

### Step 2: Deploy a Kafka Cluster in KRaft Mode

Create a minimal Kafka cluster with KRaft controller and demo topic:

```bash
kubectl apply -f - <<EOF
---
apiVersion: platform.confluent.io/v1beta1
kind: KRaftController
metadata:
  name: kraftcontroller
  namespace: default
spec:
  dataVolumeCapacity: 1G
  image:
    application: docker.io/confluentinc/cp-server:7.9.0
    init: confluentinc/confluent-init-container:2.11.0
  replicas: 1
---
apiVersion: platform.confluent.io/v1beta1
kind: Kafka
metadata:
  name: kafka
  namespace: default
spec:
  dependencies:
    kRaftController:
      clusterRef:
        name: kraftcontroller
  dataVolumeCapacity: 1G
  image:
    application: docker.io/confluentinc/cp-server:7.9.0
    init: confluentinc/confluent-init-container:2.11.0
  replicas: 1
---
apiVersion: platform.confluent.io/v1beta1
kind: KafkaRestClass
metadata:
  name: krc-cfk
  namespace: default
spec:
  kafkaClusterRef:
    name: kafka
  kafkaRest:
    endpoint: http://kafka.default.svc.cluster.local:8090
---
apiVersion: platform.confluent.io/v1beta1
kind: KafkaTopic
metadata:
  name: demotopic
  namespace: default
spec:
  kafkaRestClassRef:
    name: krc-cfk
  replicas: 1
  partitionCount: 4
  configs:
    cleanup.policy: "delete"
EOF
```

Wait for the Kafka cluster to be ready:

```bash
kubectl rollout status statefulset/kraftcontroller --timeout=120s
kubectl wait --for=condition=ready pod \
  --selector app=kraftcontroller \
  --timeout=120s

kubectl rollout status statefulset/kafka --timeout=120s
kubectl wait --for=condition=ready pod \
  --selector app=kafka \
  --timeout=120s
```

Verify the KafkaRestClass is connected:

```bash
kubectl get kafkarestclass krc-cfk -o jsonpath='{.status.kafkaClusterID}'
```

Wait for the topic to be created:

```bash
kubectl wait --for=jsonpath='{.status.state}'=CREATED \
  kafkatopic demotopic \
  --timeout=60s
```

Produce test messages:

```bash
kubectl exec -it kafka-0 -- bash -c \
  "seq 1 5 | sed 's/^/Message/' | kafka-console-producer \
    --topic demotopic \
    --bootstrap-server kafka.default.svc.cluster.local:9092"
```

### Step 3: Add the Kafbat Helm Repository

```bash
helm repo add kafbat https://kafbat.github.io/helm-charts
helm repo update
```

### Step 4: Create a `values.yaml` file for Kafbat UI

```bash
cat <<EOF > kafbat-ui-values.yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/kafbat-ui
  tag: latest

replicaCount: 1

envs:
  config:
    DYNAMIC_CONFIG_ENABLED: "true"
    KAFKA_CLUSTERS_0_NAME: "confluent-kafka"
    KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"

service:
  type: ClusterIP
  port: 8080
EOF
```

### Step 5: Install Kafbat UI

```bash
helm install kafbat-ui kafbat/kafka-ui -f kafbat-ui-values.yaml
```

Wait for Kafbat UI to be ready:

```bash
kubectl rollout status deployment/kafbat-ui-kafka-ui --timeout=60s
kubectl wait --for=condition=ready pod \
  --selector app.kubernetes.io/name=kafka-ui \
  --timeout=60s
```

Verify the cluster is online:

```bash
curl -s http://localhost:8080/actuator/health | jq '.status'
curl -s http://localhost:8080/api/clusters | jq '.[] | {name: .name, status: .status}'
```

### Step 6: Access the Kafbat UI

Port-forward the Kafbat UI service to access it locally:

```bash
kubectl port-forward svc/kafbat-ui-kafka-ui 8080:8080
```

The UI can now be accessed at `http://localhost:8080`

## Documentation and Resources

- [Kafbat UI Documentation](https://ui.docs.kafbat.io/)
- [Kafbat UI GitHub Repository](https://github.com/kafbat/kafka-ui)
- [Kafbat UI Helm Chart Repository](https://github.com/kafbat/helm-charts)
- [Kafbat UI Quickstart](https://ui.docs.kafbat.io/configuration/helm-charts/quick-start)
- [Kafbat UI Examples](https://github.com/kafbat/kafka-ui/blob/main/documentation/compose/DOCKER_COMPOSE.md)

For advanced configuration options, refer to the [official Kafbat UI configuration documentation](https://ui.docs.kafbat.io/configuration/configuration-file).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-ui-server

# temporal-ui-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-ui-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-ui-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Golang Server for https://github.com/temporalio/ui

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-config-cli

# keycloak-config-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-config-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-config-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Import YAML/JSON-formatted configuration files into Keycloak - Configuration as Code for Keycloak.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [adorsys/keycloak-config-cli image available from Docker Hub](https://hub.docker.com/r/adorsys/keycloak-config-cli). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

These instructions assume you have a running instance of Keycloak with which `keycloak-config-cli` can interact.

### Docker

You can run the following command to test Chainguard's keycloak-config-cli image:

```shell
docker run --rm \
-e KEYCLOAK_URL=<keycloak url> \
-e KEYCLOAK_USER=<keycloak username> \
-e KEYCLOAK_PASSWORD=<keycloak password> \
-v <hostpath to config files>:/config \
cgr.dev/ORGANIZATION/keycloak-config-cli:latest
```

### Helm

You can use the [official Helm chart](https://github.com/adorsys/keycloak-config-cli/tree/main/contrib/charts/keycloak-config-cli) and replace the image in `values.yaml` with the Chainguard image.

For example, you could use the following `values.yaml` file to configure the Helm chart:

```yaml
env:
  IMPORT_FILES_LOCATIONS: file:/config/*
  KEYCLOAK_URL: "<URL to Keycloak running in your cluster>"

image:
  repository: cgr.dev/ORGANIZATION/keycloak-config-cli
  tag: latest

secrets:
  KEYCLOAK_PASSWORD: <Keycloak password>

# Any config files you wish to use can be added to a Kubernetes secret
# This secret is mounted into the keycloak-config-cli container automatically to its /config directory
existingConfigSecret: "keycloak-config-cli-config"
```

Run the following commands to install and run Chainguard's keycloak-config-cli image using Helm:

```bash
helm repo add keycloak-config-cli https://jkroepke.github.io/helm-charts/
```
```
"keycloak-config-cli" has been added to your repositories
```
```shell
helm repo update
```
```
...Successfully got an update from the "keycloak-config-cli" chart repository
Update Complete. ⎈Happy Helming!⎈
```
```shell
helm install keycloak-config-cli keycloak-config-cli/keycloak-config-cli --values values.yaml
```
```
NAME: keycloak-config-cli
LAST DEPLOYED: <DATE>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

## Documentation and Resources

* [Official keycloak-config-cli repository](https://github.com/adorsys/keycloak-config-cli/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5291

# request-5291
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5291` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5291/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The Tailscale image allows for containers to join an existing Tailnet.

### Prerequisites

* Create a Tailscale account
* Create a Tailnet
* Create an [auth key](https://tailscale.com/kb/1085/auth-keys) or [OAuth client](https://tailscale.com/kb/1215/oauth-clients#setting-up-an-oauth-client)
    * If deploying the Kubernetes operator, an OAuth client must be used as the operator utilizes the OAuth client to mint auth keys for itself

### Example Usage

**Docker**:
```bash
docker run \
 --name tailscale \
 -e TS_AUTHKEY=tskey-client-EXAMPLE_KEY_REPLACED \
 -e TS_EXTRA_ARGS=--advertise-tags=tag:container \
 cgr.dev/ORGANIZATION/tailscale:latest
```

**Helm command**:
```bash
helm upgrade \
  --install \
  tailscale-operator \
  tailscale/tailscale-operator \
  --namespace=tailscale \
  --create-namespace \
  --set-string operatorConfig.image.repo="cgr.dev/ORGANIZATION/tailscale"
  --set-string operatorConfig.image.tag="latest"
  --set-string oauth.clientId="<OAauth client ID>" \
  --set-string oauth.clientSecret="<OAuth client secret>" \
  --wait
```

**Helm values**:
```yaml
operatorConfig:
  image:
    repository: cgr.dev/ORGANIZATION/tailscale
    tag: "latest"
    pullPolicy: Always
```

For more information, refer to the Tailscale documentation for [Docker](https://tailscale.com/kb/1282/docker) or [Kubernetes](https://tailscale.com/kb/1185/kubernetes).

### Troubleshooting

The `TS_USERSPACE` environment variable is `True` by default which utilizes userspace networking rather than kernel networking.

For more information, refer to the [userspace networking](https://tailscale.com/kb/1112/userspace-networking) documentation or the [kernel vs. netstack](https://tailscale.com/kb/1177/kernel-vs-userspace-routers) comparison.

If `TS_USERSPACE` is `False`, then additional capabilities will need to be specified for the container to avoid running the pod in privileged mode.

For Docker: `--cap-add NET_ADMIN`
For Kubernetes:
```yaml
securityContext:
  capabilities:
      add:
      - NET_ADMIN
```

## Documentation and Resources

Documentation for installing and using Tailscale can be found on the Tailscale project website:
- [Install](https://tailscale.com/kb/1017/install)
- [Guides](https://tailscale.com/kb/1415/quick-guides)
  - [Kubernetes](https://tailscale.com/learn/managing-access-to-kubernetes-with-tailscale)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nextflow-fips

# nextflow-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nextflow-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nextflow-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nextflow is a domain-specific language (DSL) for data-driven computational pipelines.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Nextflow pipelines. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's Nextflow FIPS image maintains functional parity with the upstream image.

## Getting Started

Start by pulling the image from your registry:

```shell
docker pull cgr.dev/ORGANIZATION/nextflow-fips:latest
```

Then run a simple pipeline

```shell
docker run --rm -it cgr.dev/chainguard/nextflow-fips:latest nextflow run hello
```
This will download and run the "Hello World" pipeline from the Nextflow examples repository.

You can also get help with any command when using the Nextflow CLI by following any command with `help`. For example, the following command displays help for the general Nextflow CLI options and the available top-level commands:

```shell
docker run --rm -it cgr.dev/chainguard/nextflow-fips:latest nextflow help
```

## Documentation and Resources

Please refer to the official [Getting Started](https://nextflow.io/docs/latest/your-first-script.html#your-first-script) guide for more information.

 - [Nextflow Github Repository](https://github.com/nextflow-io/nextflow)
 - [Nextflow Documentation](https://nextflow.io/docs/latest/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spark-iamguarded

# spark-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spark-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spark-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Spark, is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Spark IAMGuarded is a security-enhanced variant of Spark designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Spark deployments.

## Helm Chart Installation

The Spark IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/spark
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install spark oci://cgr.dev/$ORGANIZATION/iamguarded-charts/spark \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Spark image
image:
  registry: myregistry.example.com
  repository: mirrored/spark-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install spark oci://cgr.dev/$ORGANIZATION/iamguarded-charts/spark@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/spark
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/spark:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Spark IAMGuarded installation using standard Spark verification methods. The deployment functions as a standard Spark instance, so all typical Spark validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Spark IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Spark and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rstudio

# rstudio
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rstudio` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rstudio/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [RStudio](https://github.com/rstudio/rstudio) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Running the Image
In order to run RStudio, execute the following command in a terminal:

```bash
docker run -it -p 8787:8787 cgr.dev/chainguard/rstudio:latest
```

The server will now start and the IDE will be accessible at [localhost:8787](http://localhost:8787) in your browser of choice.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kor

# kor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Golang Tool to discover unused Kubernetes Resources

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Kor - Kubernetes Orphaned Resources Finder

Kor is a tool to discover unused Kubernetes resources. Currently, Kor can identify and list unused:
- ConfigMaps  
- Secrets
- Services
- ServiceAccounts
- Deployments
- StatefulSets
- Roles
- HPAs
- PVCs
- Ingresses
- PDBs
- CRDs

![Kor Screenshot](/images/screenshot.png)

for more information refer [kor](https://github.com/yonahd/kor)

## Installation

### Docker
Run a container with your kubeconfig mounted:
```sh
docker run --rm -i cgr.dev/chainguard/kor:latest

docker run --rm -i -v "/path/to/.kube/config:/root/.kube/config" cgr.dev/chainguard/kor:latest all
```

### Helm
Run as a cronjob in your Cluster (with an option for sending slack updates)

```sh
git clone https://github.com/yonahd/kor.git
```

```sh
helm upgrade --install kor \
    --namespace kor \
    --create-namespace \
    --set cronJob.enabled=true \
    --set cronJob.image.repository=cgr.dev/chainguard/kor \
    --set cronJob.image.tag=latest \
    --set prometheusExporter.enabled=true \
    --set prometheusExporter.deployment.image.repository=cgr.dev/chainguard/kor \
    --set prometheusExporter.deployment.image.tag=latest \
    --wait \
    --timeout=300s \
    ./kor/charts/kor
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spdx-tools

# spdx-tools
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spdx-tools` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spdx-tools/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A command-line utility for creating, converting, comparing, and validating SPDX documents across multiple formats.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard's `spdx-tools` Container Image is meant to provide the [spdx/tools-java](https://github.com/spdx/tools-java) tool in a container. It currently does not have an external counterpart image which is actively maintained. Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

You can make use of the `spdx-tools` Container Image to perform actions on SPDX documents. You can generate one using `syft` or any tool you like.

Once you have an SBOM in SPDX format, run the following command to make use of the `spdx-tools` Container Image:

```
docker run -v $(pwd):/tmp cgr.dev/chainguard/spdx-tools:latest Verify /tmp/sbom.json
```

The above command will help you to validate if the SPDX document is valid or not.

## Documentation and Resources
* [Official GitHub Repo](https://github.com/spdx/tools-java)
* [Official Getting Started](https://github.com/spdx/tools-java?tab=readme-ov-file#getting-starting)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cyberark-secrets-provider-for-k8s

# cyberark-secrets-provider-for-k8s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cyberark-secrets-provider-for-k8s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cyberark-secrets-provider-for-k8s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The CyberArk Secrets Provider for Kubernetes provides Kubernetes-based applications with access to secrets that are stored and managed in Conjur.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `cyberark-secrets-provider-for-k8s` image is comparable to the [upstream image from CyberArk](https://hub.docker.com/r/cyberark/secrets-provider-for-k8s) on Docker Hub.

## Getting Started

You can deploy an application container using Chainguard's `cyberark-secrets-provider-for-k8s` image with Helm.

First, add the CyberArk Helm repository:

```bash
helm repo add cyberark https://cyberark.github.io/helm-charts
helm repo update
```

Then, deploy the secrets provider with the chart, substituting CyberArk's image with Chainguard's:

```bash
helm install secrets-provider cyberark/secrets-provider \
  -n <YOUR APPLICATION'S NAMESPACE> \
  --set secretsProvider.image=cgr.dev/ORGANIZATION/cyberark-secrets-provider-for-k8s \
  --set secretsProvider.tag=latest \
  --set environment.k8sSecrets="{<YOUR K8S SECRET>}" \
  --set environment.conjur.conjurConnConfigMap=conjur-connect \
  --set environment.conjur.authnLogin="<YOUR APPLICATION'S HOST>"
```

Alternatively, you can deploy the secrets provider as an init container for your application. Please refer to the [official documentation](https://docs.cyberark.com/conjur-open-source/latest/en/content/integrations/k8s-ocp/cjr-k8s-secrets-provider-ic-lp.htm?tocpath=Integrations%7COpenShift%252FKubernetes%7CApp%20owner%253A%20Set%20up%20workloads%20in%20Kubernetes%7CSet%20up%20workloads%20(cert-based%20authn)%7CSecrets%20Provider%20for%20Kubernetes%7CInit%20container%252FSidecar%7C_____0) for more details.

## Documentation and Resources

- [Official documentation](https://docs.cyberark.com/conjur-open-source/latest/en/content/integrations/k8s-ocp/cjr-secrets-provider-lp.htm?tocpath=Integrations%7COpenShift%252FKubernetes%7CApp%20owner%253A%20Set%20up%20workloads%20in%20Kubernetes%7CSet%20up%20workloads%20(cert-based%20authn)%7CSecrets%20Provider%20for%20Kubernetes%7C_____0)
- [GitHub repository](https://github.com/cyberark/secrets-provider-for-k8s)
- [Helm chart](https://github.com/cyberark/secrets-provider-for-k8s/tree/main/helm/secrets-provider)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-istio-csr-fips

# cert-manager-istio-csr-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-istio-csr-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-istio-csr-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

istio-csr is an agent that allows for Istio workload and control plane components to be secured using cert-manager.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard cert-manager-istio-csr image is designed to be a drop-in replacement for the upstream [quay.io/jetstack/cert-manager-istio-csr image](https://quay.io/repository/jetstack/cert-manager-istio-csr?tab=tags&tag=latest). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a package manager, while maintaining full compatibility.

## Usage

There is a detailed guide on how to use this image with cert-manager and Istio in the [official documentation](https://cert-manager.io/docs/usage/istio-csr/installation/).

Fortunately, there is a Helm chart available that simplifies the installation process. You can install the Helm chart with the following command:

```shell
helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
  --install \
  --namespace cert-manager \
  --wait \
  --set image.repository=cgr.dev/ORGANIZATION/cert-manager-istio-csr-fips \
  --set image.tag=latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

### FIPS Support
The `cert-manager-istio-csr-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-operator-fips

# thanos-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS image with the [thanos-operator](https://github.com/banzaicloud/thanos-operator) for managing Thanos components in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `thanos-operator-fips` image is a drop-in replacement for the upstream [banzaicloud/thanos-operator](https://hub.docker.com/r/banzaicloud/thanos-operator/) container image. It is fully compatible with the official [thanos-operator Helm chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator) and supports all core functionality for managing Thanos components in Kubernetes. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `thanos-operator-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [thanos-operator Helm chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/thanos-operator-fips
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `thanos-operator` helm chart

```shell
helm repo add banzaicloud-stable https://kubernetes-charts.banzaicloud.com
helm repo update
helm install thanos-operator banzaicloud-stable/thanos-operator -f values.yaml --wait
```

## Documentation
- [Thanos-Operator Github Repository](https://github.com/banzaicloud/thanos-operator)
- [Thanos-Operator Helm Chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### actions-runner

# actions-runner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/actions-runner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/actions-runner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

actions-runner is a self-hosted application that runs GitHub Actions jobs on your own infrastructure.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `actions-runner` container image is comparable to the [actions/runner](https://github.com/actions/runner) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `actions-runner` features a stripped down, minimal design container image
* It has few-to-zero CVEs

## Getting Started

### Run the runner Container

```bash
docker run -it cgr.dev/ORGANIZATION/actions-runner:latest bash
```

### Configure the runner

```bash
#/ ./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO --token YOUR_TOKEN
```

This will prompt you for runner group name, runner name, and additional labels, then register the runner with GitHub.

### Start the runner

```bash
#/ ./run.sh
```
This will connect to GitHub and start listening for jobs.

## Usage with Kubernetes

### Deploy Actions Runner Controller

```bash
helm install controller \
  oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
```

### Create Runner Scale Set

```bash
cat > runner-values.yaml <<EOF
# GitHub-related config
githubConfigUrl: https://github.com/YOUR_ORG/YOUR_REPO
githubConfigSecret: github-token

# Runner-related config
minRunners: 1
maxRunners: 3
runnerImage: cgr.dev/ORGANIZATION/actions-runner
runnerTag: latest
EOF
```

### Create a Secret with GitHub Token

```bash
kubectl create secret generic github-token \
  --from-literal=github_token=YOUR_GITHUB_TOKEN
```

### Install the Runner Scale Set

```bash
helm install runner \
  oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set \
  -f runner-values.yaml
```

### Verify Installation

```bash
kubectl get pods
```

## Documentation and Resources

- **[Official Documentation](https://docs.github.com/en/actions/concepts/runners)**  
- **[GitHub](https://github.com/actions/runner)**  
- **[Adding Self-Hosted Runners Guide](https://docs.github.com/actions/hosting-your-own-runners/adding-self-hosted-runners)**  
- **[Actions Runner Controller (ARC) for Kubernetes](https://docs.github.com/en/actions/concepts/runners/actions-runner-controller)**  
- **[GitHub Actions Main Documentation](https://docs.github.com/actions)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vllm-openai

# vllm-openai
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vllm-openai` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vllm-openai/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

vLLM is a high-throughput and memory-efficient inference engine for Large Language Models (LLMs). It provides an OpenAI-compatible API server for production LLM deployments with GPU acceleration.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's vLLM image is comparable to the [vllm/vllm-openai](https://hub.docker.com/r/vllm/vllm-openai) image, with several key differences:

### Version Updates

vLLM is a rapidly evolving project where even minor version bumps can introduce significant changes, including breaking changes to APIs, dependencies, or kernel requirements. Due to this, Chainguard's vLLM image updates may take additional time to ensure stability and compatibility. We recommend testing new versions in a non-production environment before upgrading.

### Package Differences

The following packages have been modified or removed compared to upstream:

* **CuPy**: Removed entirely. CuPy's vendor backends require cuDNN 8, which conflicts with cuDNN 9 shipped in this image. CuPy is optional for vLLM and primarily used by Ray
* **torch-c-dlpack-ext**: Not pre-installed. You may see a warning about `EnvTensorAllocator` not being enabled during startup. This is an optional TVM optimization and does not affect vLLM functionality
* **LMCache**: Not pre-installed. For distributed KV cache sharing across multiple vLLM instances, install via `pip install lmcache` at runtime. See [vLLM LMCache Examples](https://docs.vllm.ai/en/latest/examples/others/lmcache/) for configuration

### Expert Parallel (EP) Kernels for MoE Models

For [Expert Parallel deployment](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html) with Mixture-of-Experts (MoE) models like DeepSeek-V2/V3, the EP kernels are **not pre-installed** in this image. Unlike upstream which ships pre-built EP kernels, Chainguard provides a build script due to upstream's specific version pinning requirements and custom patches for components like NVSHMEM, pplx-kernels, and DeepEP.

#### Building EP Kernels

The image includes `/vllm-workspace/install_python_libraries.sh` to build the required components. Before running, ensure you have:

1. A GPU with the appropriate CUDA architecture
2. Set `TORCH_CUDA_ARCH_LIST` for your GPU (e.g., `"8.0;9.0"` for A100/H100)

```bash
# Start an interactive container with persistent storage for the build
docker run --rm -it --gpus all \
  --shm-size 8g \
  -v ep_kernels_cache:/vllm-workspace/ep_kernels_workspace \
  -e TORCH_CUDA_ARCH_LIST="8.0;9.0" \
  cgr.dev/$ORGANIZATION/vllm-openai:latest \
  bash

# Inside the container, run the build script
/vllm-workspace/install_python_libraries.sh /vllm-workspace/ep_kernels_workspace
```

The script builds:
- **NVSHMEM** (with DeepSeek patches) - NVIDIA shared memory library
- **pplx-kernels** - Perplexity AI's optimized MoE kernels
- **DeepEP** - DeepSeek's Expert Parallel kernels

Build time is approximately 10-20 minutes depending on hardware. The built kernels persist in the mounted volume for reuse.

#### Using Pre-built EP Kernels

After building once, mount the volume when running vLLM:

```bash
docker run --rm -it --gpus all \
  --shm-size 8g \
  -v ep_kernels_cache:/vllm-workspace/ep_kernels_workspace \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai:latest \
  --model deepseek-ai/DeepSeek-V2-Lite \
  --tensor-parallel-size 2 \
  --host 0.0.0.0
```

See the [Expert Parallel Deployment Guide](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html) for detailed configuration options.

## Running vLLM

### Prerequisites

* NVIDIA GPU with CUDA support
* [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) installed
* Docker with GPU support enabled

### Basic Usage

Set the following environment variable to the name of your organization:

```bash
ORGANIZATION=my-organization
```

Start the vLLM OpenAI-compatible server with a model:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 1g \
  -p 8000:8000 \
  -v /path/to/cache:/root/.cache \
  cgr.dev/$ORGANIZATION/vllm-openai:latest \
  --model facebook/opt-125m \
  --host 0.0.0.0 \
  --port 8000
```

The server exposes OpenAI-compatible endpoints at `http://localhost:8000`.

### Testing the API

Once the server is running, test it with curl:

```bash
# Check health
curl http://localhost:8000/health

# List models
curl http://localhost:8000/v1/models

# Generate completions
curl http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "facebook/opt-125m",
    "prompt": "Deep learning is",
    "max_tokens": 50
  }'
```

### GPU Memory and Shared Memory

For optimal performance, configure shared memory size with `--shm-size`:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 8g \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai:latest \
  --model meta-llama/Llama-2-7b-hf \
  --host 0.0.0.0
```

### Audio Transcription with Whisper

Audio dependencies are not pre-installed (same as upstream) due to [licensing concerns](https://github.com/vllm-project/vllm/issues/8030). To use Whisper models for speech-to-text, first install the audio dependencies:

```bash
docker exec <container_name> pip install vllm[audio]
docker restart <container_name>
```

Then start the server with a Whisper model:

```bash
docker run --rm -it \
  --gpus all \
  --shm-size 1g \
  -p 8000:8000 \
  cgr.dev/$ORGANIZATION/vllm-openai:latest \
  --model openai/whisper-large-v3 \
  --host 0.0.0.0
```

Test audio transcription:

```bash
curl -X POST http://localhost:8000/v1/audio/transcriptions \
  -F "file=@/path/to/audio.wav" \
  -F "model=openai/whisper-large-v3"
```

### CUDA Compatibility

If you're running an older CUDA driver, you may encounter errors like:

```
CUDA error: the provided PTX was compiled with an unsupported toolchain
```

To resolve this, use CUDA forward compatibility by setting the `LD_LIBRARY_PATH` environment variable:

```bash
docker run --rm -it \
  --gpus all \
  -e LD_LIBRARY_PATH="/usr/local/cuda-12.9/compat" \
  cgr.dev/$ORGANIZATION/vllm-openai-fips:latest \
  --model facebook/opt-125m \
  --host 0.0.0.0
```

The `/usr/local/cuda-12.9/compat` directory contains NVIDIA's forward compatibility libraries that allow applications built with newer CUDA versions to run on older drivers.

Refer to [NVIDIA's CUDA Compatibility documentation](https://docs.nvidia.com/deploy/cuda-compatibility/index.html) for more details on driver requirements and compatibility.

## Documentation and Resources

* [vLLM Documentation](https://docs.vllm.ai/)
* [vLLM Docker Quickstart](https://docs.vllm.ai/en/latest/getting_started/quickstart.html#openai-compatible-server)
* [OpenAI API Reference](https://platform.openai.com/docs/api-reference)
* [Expert Parallel Deployment Guide](https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jitsucom-bulker

# jitsucom-bulker
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jitsucom-bulker` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jitsucom-bulker/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Service for bulk-loading data to databases with automatic schema management (Redshift, Snowflake, BigQuery, ClickHouse, Postgres, MySQL)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

```sh
helm upgrade --install jitsucom-bulker oci://registry-1.docker.io/stafftasticcharts/jitsu \
    -n jitsucom-bulker \
    --create-namespace \
    --set bulker.image.repository=cgr.dev/chainguard/jitsucom-bulker \
    --set bulker.image.tag=latest \
    --set ingest.image.repository=cgr.dev/chainguard/jitsucom-ingest \
    --set ingest.image.tag=latest \
    --set syncctl.image.repository=cgr.dev/chainguard/jitsucom-syncctl \
    --set syncctl.image.tag=latest \
    --set tokenGenerator.image.tag=1.30.0 # `:latest` tag doesn't not exist, so set to _latest_ version
```

* Refer to [values.yaml](https://github.com/stafftastic/jitsu-chart/blob/main/values.yaml) file for more configuration options.

> [!WARNING]
> The Helm Chart we used in the tests is the official, stable and is used to run Jitsu in production, according to maintainer's [comment](https://github.com/jitsucom/jitsu/issues/880#issuecomment-1987928495).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### listmonk

# listmonk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/listmonk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/listmonk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

High performance, self-hosted, newsletter and mailing list manager with a modern dashboard. Single binary app.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

listmonk is a standalone, newsletter and mailing list manager. It uses a PostgreSQL database as its data store. Chainguard's listmonk container image is comparable to the upstream [listmonk image available on Docker Hub](https://hub.docker.com/r/listmonk/listmonk).

## Getting Started
listmonk requires a PostgreSQL database. Upstream provides documentation under https://listmonk.app/docs/ .

### Running with Docker
listmonk provides a [docker-compose.yml](https://github.com/knadh/listmonk/blob/master/docker-compose.yml) which can be used together with the Chainguard image:

```bash
curl -s -O --fail https://raw.githubusercontent.com/knadh/listmonk/refs/heads/master/docker-compose.yml
# use the Chainguard listmonk image
sed -i "s|image: listmonk/listmonk:latest|image: cgr.dev/ORGANIZATION/listmonk|" docker-compose.yml
# use the Chainguard postgres image
sed -i "s|image: postgres:|image: cgr.dev/ORGANIZATION/postgres|" docker-compose.yml
docker compose up -d
```

Access the application at `http://localhost:9000`.

### Deploying with Helm on Kubernetes

listmonk can be deployed to Kubernetes using the community Helm chart with Chainguard images.

Create some credentials required for the database access:

```bash
LISTMONK_DB_PASSWORD=$(openssl rand -base64 32)
POSTGRES_PASSWORD=$(openssl rand -base64 32)
```

First, deploy PostgreSQL using the Chainguard IAMGuarded PostgreSQL Helm chart:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --namespace listmonk \
  --create-namespace \
  --set auth.username=listmonk \
  --set auth.password=$LISTMONK_DB_PASSWORD \
  --set auth.database=listmonk \
  --set auth.postgresPassword=$POSTGRES_PASSWORD
```

Wait for PostgreSQL to be ready:

```bash
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=postgresql -n listmonk --timeout=300s
```

Create a values file for listmonk:

```bash
cat <<EOF > values.yaml
# values.yaml
listmonk:
  image:
    repository: cgr.dev/ORGANIZATION/listmonk
    tag: latest

postgres:
  enabled: false  # Use external PostgreSQL
  hostname: postgresql.listmonk.svc.cluster.local
  database: listmonk
  user: listmonk
  password: $LISTMONK_DB_PASSWORD
EOF
```

Install listmonk with the Helm chart:

```bash
helm install listmonk listmonk \
  --repo https://th0th.github.io/helm-charts \
  --namespace listmonk \
  --values values.yaml
```

Verify the deployment:

```bash
kubectl get pods -n listmonk
```

Access the application by port-forwarding or through the LoadBalancer service:

```bash
kubectl port-forward -n listmonk svc/listmonk-listmonk 9000:80
```

Navigate to `http://localhost:9000` to complete the initial setup.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dex-iamguarded

# dex-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dex-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dex-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

dex is a federated OpenID Connect provider.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Dex IAMGuarded is a security-enhanced variant of Dex, used as part of other IAMGuarded Helm Charts such as the Argo CD IAMGuarded deployment.

## Helm Chart Installation

Dex IAMGuarded does not come with its own Helm Chart, but rather is used as part of other charts, such as the Argo CD IAMGuarded Helm chart.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for IAMGuarded charts that use Dex and pins the image to specific digest:

```yaml
# Dex image configuration
dex:
  image:
    registry: myregistry.example.com
    repository: mirrored/dex-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chart-testing

# chart-testing
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chart-testing` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chart-testing/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Tool for testing Helm charts, used for linting and testing pull requests.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [chart-testing](https://quay.io/repository/helmpack/chart-testing) image. Switching to Chainguard `chart-testing` image should not require any changes to your existing setup. The Chainguard `chart-testing` image also comes with all necessary tools installed.
- `helm`
- `git`
- `yamllint`
- `yamale`
- `kubectl`

### Usage instructions

To run the `chart-testing` image with Docker(`interactive-mode`), you can run the following command:

```shell
docker run -it cgr.dev/ORGANIZATION/chart-testing
```
For `ct` usage instructions and how-to guide please refer to the [official usage instructions for chart-testing](https://github.com/helm/chart-testing?tab=readme-ov-file#usage)

## Documentation and Resources
For more information, please refer to [the official documentation for chart-testing project](https://github.com/helm/chart-testing) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-metrics-adapter

# kube-metrics-adapter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-metrics-adapter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-metrics-adapter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Adapter to expose custom metrics to Kubernetes HPA via Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kube-metrics-adapter` image is a minimal drop-in replacement for the upstream [zalando-incubator/kube-metrics-adapter](https://github.com/zalando-incubator/kube-metrics-adapter). It is fully compatible with the official [Helm chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm) and supports collecting external metrics from Prometheus to drive Horizontal Pod Autoscalers (HPA) via the Kubernetes `external.metrics.k8s.io` API. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [kube-metrics-adapter Helm chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
registry:
  image: cgr.dev/ORGANIZATION/kube-metrics-adapter
  imageTag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kube-metrics-adapter` helm chart.

```shell
helm install kube-metrics-adapter . --namespace kube-system --create-namespace --values values.yaml --wait
```

## Documentation
- [kube-metrics-adapter Github Repository](https://github.com/zalando-incubator/kube-metrics-adapter/)
- [kube-metrics-adapter Helm Chart](https://github.com/zalando-incubator/kube-metrics-adapter/tree/master/docs/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### skopeo-fips

# skopeo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/skopeo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/skopeo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based skopeo image for interacting with container registries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `skopeo-fips` image is comparable to the [Skopeo image](https://quay.io/skopeo/stable). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting started

You can inspect container images using the `skopeo-fips` image with the following command. This will show detailed information about the image manifest, configuration, and layers.

```shell
docker run --rm cgr.dev/ORGANIZATION/skopeo-fips:latest inspect docker://chainguard/wolfi-base
```

You can also list all available tags for a container image:

```shell
docker run --rm cgr.dev/ORGANIZATION/skopeo-fips:latest list-tags docker://chainguard/wolfi-base
```

## Documentation and Resources

For more information, you can refer to the [official Skopeo documentation](https://github.com/containers/skopeo) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana

# grafana
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal wolfi-based image for grafana, which is an open-source monitoring and observability application

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Image for Grafana is meant to serve as a drop-in replacement for [the official Grafana image from Docker Hub](https://hub.docker.com/r/grafana/grafana). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The Chainguard Image for Grafana can be deployed using Docker or Helm.

### Using Docker to Deploy

Refer to the [Grafana Docker image documentation](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker) for full instructions on how to launch Grafana using Docker.

Example:

```bash
docker run --name=local-grafana -p 3000:3000 cgr.dev/ORGANIZATION/grafana:latest
```

The Grafana Web UI will then be accessible at [`http://localhost:3000`](http://localhost:3000).

### Using Helm to Deploy

Grafana can be deployed using [this Helm chart](https://artifacthub.io/packages/helm/grafana/grafana).

Be aware that when using this Helm chart, you will need to override the default image and tag used by replacing it with the Chainguard image, as in this example:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```
Then, create a values.yaml manifest with the following content:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/grafana
  tag: latest
securityContext:
  # Chainguard's image runs with a UID/GID of 65532 instead of 472
  fsGroup: 65532
  runAsGroup: 65532
  runAsUser: 65532
```

If you want to leverage the Chainguard Image for sidecar images you are using, add these lines to `values.yaml`:

```yaml
image:
  registry: cgr.dev
  repository: cgr.dev/ORGANIZATION/k8s-sidecar
  tag: latest
```

Refer to the [Helm chart documentation](https://artifacthub.io/packages/helm/grafana/grafana) for more information.

## Documentation and Resources

- [Grafana documentation](https://grafana.com/docs/)
- [Grafana GitHub repository](https://github.com/grafana/grafana)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dex-fips

# dex-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dex-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dex-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using dex

`dex` has several operating modes, the most common being kubernetes, installed via `helm` using the upstream source shown below:

```bash
helm repo add dex https://charts.dexidp.io
helm install --generate-name --wait dex/dex -f values.yaml
```

An example `values.yaml` file is provided below:

```yaml
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/dex-fips
  tag: latest

config:
  issuer: "http://127.0.0.1:5556/dex"

  storage:
    type: memory

  web:
    http: 0.0.0.0:5556

  expiry:
    deviceRequests: "5m"
    signingKeys: "6h"
    idTokens: "24h"
    authRequests: "24h"

  logger:
    level: "info"
    format: "text"

  oauth2:
    responseTypes: [ "code" ]
    skipApprovalScreen: false
    alwaysShowLoginScreen: false

  enablePasswordDB: true

  connectors:
  - type: mockCallback
    id: mock
    name: Example
```

> WARNING: The example above should _not_ be used in production, it simply exists to get up and running quickly.

For an incomplete values file that only contains the minimum required settings to use the Chainguard Images variant, use the snippet below:

```yaml
# non functional defaults! fill in with your own values.yaml
image:
  repository: cgr.dev/ORGANIZATION/dex-fips
  tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm-chartmuseum

# helm-chartmuseum
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm-chartmuseum` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm-chartmuseum/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [chartmuseum](https://github.com/helm/chartmuseum) binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Create a helm chart, and package it into a `charts/` directory:

```
helm create hello
mkdir charts/
helm package hello -d ./charts
```

Start the chartmuseum server:

```
docker run --rm -p 8080:8080 -v $(pwd)/charts:/charts \
  cgr.dev/chainguard/chartmuseum:latest
```

From another terminal, use it as a helm repository:
```
helm repo add chartmuseum http://localhost:8080
helm search repo chartmuseum/
helm upgrade --install chartmuseum-demo chartmuseum/hello
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm

# helm
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [helm](https://helm.sh) binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Testing the Helm Image

The following command will pull the image to your local system and automatically execute the `helm version` command:

```shell
docker run --rm  cgr.dev/chainguard/helm version
```

This will return output similar to this.

```
version.BuildInfo{Version:"v3.13.2", GitCommit:"2a2fb3b98829f1e0be6fb18af2f6599e0f4e8243", GitTreeState:"clean", GoVersion:"go1.21.4"}
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-sigv4-proxy-fips

# aws-sigv4-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-sigv4-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-sigv4-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This project signs and proxies HTTP requests with Sigv4

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image is comparable to the upstream [aws-observability/aws-sigv4-proxy](https://gallery.ecr.aws/aws-observability/aws-sigv4-proxy) image. Chainguard's container contains only the minimum set of dependencies needed to run aws-sigv4-proxy.

## Getting Started

To get started with the aws-sigv4-proxy, you need to configure it with your AWS credentials and the target service you want to access. The proxy will sign requests using AWS Signature Version 4.

```bash
docker container run -d \
  --name aws-sigv4-proxy \
  -p 8080:8080 \
  -e AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>" \
  -e AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>" \
  cgr.dev/ORGANIZATION/aws-sigv4-proxy-fips:latest
```

Then you can access the AWS service through the proxy by sending requests to `http://localhost:8080`. The proxy will automatically sign the requests with your AWS credentials.

For example to access an S3 bucket, you can use the following command:

```bash
# us-east-1
curl -s -H 'host: s3.amazonaws.com' http://localhost:8080/<BUCKET_NAME>
```

You will see the logs of the signing requests in the container logs, which will look like this:

```
2023/10/01 12:00:00 [INFO] Signing request for service s3 in region us-east-1
2023/10/01 12:00:00 [INFO] Request signed successfully
2023/10/01 12:00:00 [INFO] Forwarding request to s3.amazonaws.com
```

To learn more about how to run the aws-sigv4-proxy for different use cases, you can refer to the [aws-sigv4-proxy examples in GitHub repository](https://github.com/awslabs/aws-sigv4-proxy/#examples).

Also, you can deploy the aws-sigv4-proxy as a sidecar container alongside your application and there is a project named aws-sigv4-proxy-admission-controller that can automatically inject the aws-sigv4-proxy sidecar into your pods. To get more information about aws-sigv4-proxy-admission-controller, you can refer to the [aws-sigv4-proxy-admission-controller GitHub repository](https://github.com/aws-observability/aws-sigv4-proxy-admission-controller#example-deployment).

## Documentation and Resources
- [AWS Signature Version 4 for API requests](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)
- [AWS SigV4 Proxy GitHub Repository](https://github.com/awslabs/aws-sigv4-proxy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-sidecar

# k8s-sidecar
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-sidecar` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-sidecar/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the k8s-sidecar app.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using k8s-sidecar

The Chainguard k8s-sidecar image contains the k8s-sidecar python app.
The default entrypoint just runs the `k8s-sidecar` app without any flags.

This image is a drop-in replacement for the upstream image.
For full documentation on how to configure the app, check the [upstream documentation](https://github.com/kiwigrid/k8s-sidecar).

```shell
$ docker run cgr.dev/chainguard/k8s-sidecar
{"time": "2023-03-31T11:50:30.950603+00:00", "msg": "Starting collector", "level": "INFO"}
{"time": "2023-03-31T11:50:30.950708+00:00", "msg": "No folder annotation was provided, defaulting to k8s-sidecar-target-directory", "level": "WARNING"}
{"time": "2023-03-31T11:50:30.950751+00:00", "msg": "Should have added {LABEL} as environment variable! Exit", "level": "CRITICAL"}
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatekeeper-crds

# gatekeeper-crds
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatekeeper-crds` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatekeeper-crds/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image for installing Gatekeeper Custom Resource Definitions (CRDs) in Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `gatekeeper-crds` image is a drop-in replacement for the upstream `opa/gatekeeper-crds` image. This image includes all necessary CRDs to configure Gatekeeper and is fully compatible with the official [Gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper) and supports all core functionality. This image is designed to be minimal, secure alternative and runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [opa/gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper-crds
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `gatekeeper` helm chart

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update
helm install gatekeeper/gatekeeper --name-template=gatekeeper --namespace gatekeeper-system --create-namespace -f values.yaml --wait
```

## Documentation and Resources

You can refer to the [official documentation](https://open-policy-agent.github.io/gatekeeper/website/) for more information and [usage examples](https://open-policy-agent.github.io/gatekeeper/website/docs/examples).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### karma-fips

# karma-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/karma-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/karma-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A dashboard for managing alerts from Alertmanager

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`karma` is comparable to the upstream [karma](https://hub.docker.com/layers/lmierzwa/karma/v0.120/images/sha256-c9364c1e2dc2e4bbfb286e70f31a1517e7ccf9ceb997f79177f0b0cb21eb9c36?context=explore) image, with the following differences:

- Like all other Chainguard Images, `karma` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user

Most importantly, the `karma` image contains the OpenSSL FIPS Provider Module (CMVP [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282)).

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

Karma is dashboard for managing alerts from AlertManager. Karma requires an alertmanager instance to be available. Both Karma and AlertManager requires config files.
The following is an example `altertmanager.yaml` configuration file:

alermanager.yaml

```
global:
  resolve_timeout: 30s
route:
group_by: ["alertname"]
group_wait: 5s
group_interval: 10s
repeat_interval: 999h
receiver: "default"
routes:
  - receiver: "default"
    group_by: []
    match_re:
      alertname: .*
    continue: true
  - receiver: "pagination"
    group_by: ["alertname", "instance"]
    match_re:
      alertname: Pagination Test
    continue: false
  - receiver: "by-cluster-service"
    group_by: ["alertname", "cluster", "service"]
    match_re:
      alertname: .*
    continue: true
  - receiver: "by-name"
    group_by: [alertname]
    match_re:
      alertname: .*
    continue: true
  - receiver: "by-cluster"
    group_by: [cluster]
    match_re:
      alertname: .*
    continue: true

inhibit_rules:
  - source_match:
      severity: "critical"
    target_match:
      severity: "warning"
    # Apply inhibition if the alertname and cluster is the same in both
    equal: ["alertname", "cluster"]
receivers:
  - name: "default"
  - name: "pagination"
  - name: "by-cluster-service"
  - name: "by-name"
  - name: "by-cluster"
```

More information can be found in the [Karma configuration documentation](https://github.com/prymitive/karma/blob/main/docs/CONFIGURATION.md).

To test out this image, deploy a prometheus alertmanager image:

```
docker run -d \
    --rm \
    --network karma \
    --name prom \
    -p 9093:9093 \
    -v /alertmanager.yaml:/etc/alertmanager/alertmanager.yml \
    cgr.dev/ORGANIZATION/prometheus-alertmanager:latest
```

Start a karma container by running the command below

```
docker run -d \
    --rm \
    --network karma \
    --name karma \
    -p 8083:8080 -e ALERTMANAGER_URI=http://prom:9093/ \
    -v /acls.yaml:/etc/acls.yaml -v /karma.yaml:/etc/karma.yaml \
    cgr.dev/ORGANIZATION/karma:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-vip-fips

# kube-vip-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-vip-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-vip-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-infrastructure-k8s

# newrelic-infrastructure-k8s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-infrastructure-k8s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-infrastructure-k8s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
helm upgrade --install nik \
  --repo https://newrelic.github.io/nri-kubernetes newrelic-infrastructure \
  --version 2.10.3 \
  --set cluster=$CLUSTER_NAME \
  --set privileged=true \
  --set licenseKey=$LICENSE_KEY \
  --set image.repository=cgr.dev/chainguard-private/newrelic-infrastructure-k8s \
  --set image.tag=latest

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### haproxy-fips

# haproxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/haproxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/haproxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s HAProxy container image is a minimal image that comes in three variants:
- a `-slim` version that only contains the `haproxy` binary,
- a regular version that contains a `docker-entrypoint.sh` script that is compatible with the external `docker-library/haproxy` image for use with Helm charts or established Docker based deployments. The version comes with extended capability which allows it to listen on system ports (<1024).
- there is also another version `-nocaps`, which is same as regular version, but is without extended capability.

### FIPS Support

The haproxy-fips Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Similar to the `docker-library/haproxy` container image, this image does not come with any default configuration.

Let say you have a `haproxy.cfg` config file in the current working directory. To test that configuration file, you can run the following command:

```shell
docker run -it --rm -v "$(pwd):/etc/haproxy" --name haproxy-syntax-check cgr.dev/ORGANIZATION/haproxy-fips haproxy -c -f /etc/haproxy/haproxy.cfg
```

In order for the container to work, you need to mount your custom `haproxy.cfg` file in the container. The following example runs HAProxy with a custom configuration file:

```shell
docker run -it --rm -v "$(pwd):/etc/haproxy" cgr.dev/ORGANIZATION/haproxy-fips haproxy -f /etc/haproxy/haproxy.cfg
```

### Helm install

Helm charts with `securityContexts` that drops `[ "ALL" ]` capabilities should use `-nocaps` image.
The regular version of the image needs extended capability, and needs below modifications in `securityContexts`, to add `NET_ADMIN` capabilities.

For example, in the `ha-redis` chart used by `argocd`, the `values.yaml` becomes:

```yaml
# values.yaml
haproxy:
  enabled: true
  containerSecurityContext:
    capabilities:
      add:
        - NET_BIND_SERVICE
```

### Note on adding users

By default, the Chainguard HAProxy container image runs as the `haproxy` user and group, with a UID and GID of `65532`. You could represent this in an `haproxy.cfg` file as follows:

```
global
  user  haproxy
  group haproxy
```

In the Kubernetes security context, this information might look like this:

```
securityContext:
  runAsUser: 65532
  runAsGroup: 65532
```

If you add a user, make sure that you use the correct matching user in your `haproxy.cfg` file. If the user listed in your `haproxy.cfg` file doesn't match what's in the Kubernetes security context, it will result in errors.

## Documentation and Resources

Please refer to [the HAProxy documentation](https://docs.haproxy.org/) for more information on configuring HAProxy for your needs.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cass-operator

# cass-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cass-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cass-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[cass-operator](https://github.com/k8ssandra/cass-operator), is a Kubernetes operator for managing Apache Cassandra. It automates tasks like deployment, scaling, and configuration management, facilitating the integration of Cassandra clusters with Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
cass-operator is a Kubernetes operator, which can be deployed using helm. Refer to the [upstream repositories documentation](https://github.com/k8ssandra/cass-operator) for how to get started with cass-operator.

To use our minimal, wolfi-based image with this Helm chart you'll need to override the image used by the official helm chart and specify the chainguard image as per below example:

```shell
helm repo add k8ssandra https://helm.k8ssandra.io/stable
helm repo update

helm install cass-operator k8ssandra/cass-operator -n cass-operator
helm upgrade cass-operator \
    -n cass-operator \
    --set image.repository=cgr.dev/chainguard/cass-operator \
    --set image.tag=latest
    --wait \
    k8ssandra/cass-operator
}
```

As per [project documentation](https://github.com/k8ssandra/cass-operator/blob/master/README.md#installing-the-operator-with-helm), by default, the Helm installation requires cert-manager to be present in the Kubernetes installation. If you do not have cert-manager installed, follow the steps at [cert-manager's](https://cert-manager.io/docs/installation/helm/) documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton-chains-fips

# tekton-chains-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton-chains-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton-chains-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Tekton Chains is a Kubernetes Custom Resource Definition (CRD) controller that allows you to manage your supply chain security in Tekton.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

[Tekton Chains](https://tekton.dev/docs/chains/) provides additional supply chain security features.

## Usage

These images a drop-in replacement for the upstream images.

You can use an [upstream release](https://github.com/tektoncd/pipeline/releases) and replace the released images with those from Chainguard.

```shell
curl -sL https://storage.googleapis.com/tekton-releases/chains/latest/release.yaml | \
    sed "s|ghcr.io/tektoncd/github.com/tektoncd/chains/cmd/controller[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-chains-fips|g" | \
    kubectl apply -f -
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rook-ceph

# rook-ceph
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rook-ceph` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rook-ceph/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Storage Orchestration for Kubernetes. This is specifically for the Rook Ceph operator, which provides storage solutions for Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard version of [Rook Ceph](https://hub.docker.com/r/rook/ceph/tags) is a minimal, secure, and regularly updated container image designed to deploy storage clusters in a kubernetes environment. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds. `cephadm` and `restful` modules have been removed from the `mgr` application in this image due to [underlying issues with the Py03 library](https://github.com/PyO3/pyo3/issues/3451).
The Chainguard Rook Ceph image defines a [pycache](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPYCACHEPREFIX) directory for rook to read and write `.pyc` files. The directory is provided as an environment variable `PYTHONPYCACHEPREFIX=/tmp/pycache`.

## Getting Started

To spin a minimal ceph cluster, the rook-ceph operator can be used. The chart is found [here - github](https://github.com/rook/rook/tree/7908e52a415c3eb9f95f814966ee9c7b772b830f/deploy/charts/rook-ceph).
Create a custom values file as shown below

```yaml
image: 
  repository: "cgr.dev/ORGANIZATION/rook-ceph"
  tag: latest
csi:
  enableRbdDriver: false
  clusterName: "test-ceph"
allowLoopDevices: true
operatorNamespace: rook-ceph
```

Add the helm repo by executing
`helm repo add rook-release https://charts.rook.io/release`
Finally, install the helm chart with

```bash
helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph -f custom-values.yaml
```

This will create the `helm-operator` deployment and other custom resources. Ensure that the operator pods are running.

The next step is to create the ceph cluster and here also a helm chart is used.
First create another custom values file.

```yaml
image:
  repository: "cgr.dev/ORGANIZATION/rook-ceph"
  tag: latest
csi:
  clusterName: "test-ceph"
  allowLoopDevices: true
  image:"cgr.dev/ORGANIZATION/rook-ceph"

cephClusterSpec:
  cephVersion:
    image: "cgr.dev/ORGANIZATION/rook-ceph"
```

Deploy the helm chart to create the ceph-cluster by running;
`helm install --create-namespace --namespace rook-ceph rook-ceph-cluster rook-release/rook-ceph-cluster -f custom-values.yaml`
This will create several resources and in the end, the resources created should contain the resources shown below.

```
NAME                                                              READY   STATUS      RESTARTS   AGE
ceph-csi-controller-manager-5dc6b7cf95-sz2vg                      1/1     Running     0          5d6h
rook-ceph-crashcollector-0a5dc2dab029e8f8d84a037a1b474dfd-k9g52   1/1     Running     0          5d6h
rook-ceph-crashcollector-bc926a7d71ac72a997bb915e41199eaf-gz4vt   1/1     Running     0          5d6h
rook-ceph-crashcollector-c54e91a0c8f218fd8f425652c21ec85d-8cl88   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-4-11.us-west-2.compute.inter54fhm   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-51-239.us-west-2.compute.int7j4xh   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-93-131.us-west-2.compute.intp7csn   1/1     Running     0          5d6h
rook-ceph-mds-ceph-filesystem-a-78886b4f74-9pdqg                  2/2     Running     0          5d6h
rook-ceph-mds-ceph-filesystem-b-69b9676488-znv47                  2/2     Running     0          5d6h
rook-ceph-mgr-a-5d7c9f6776-l8wbg                                  3/3     Running     0          5d6h
rook-ceph-mgr-b-5b78474744-d8d5h                                  3/3     Running     0          5d6h
rook-ceph-mon-a-79949fdbdb-wp5v2                                  2/2     Running     0          5d6h
rook-ceph-mon-b-7cd7c6f58-px4zw                                   2/2     Running     0          5d6h
rook-ceph-mon-c-64549cd54d-gh5cj                                  2/2     Running     0          5d6h
rook-ceph-operator-8cf478d75-fr7hn                                1/1     Running     0          5d6h
rook-ceph-osd-0-5499cb4cbd-lbg2h                                  2/2     Running     0          5d6h
rook-ceph-osd-1-6546d58f6d-bh4fz                                  2/2     Running     0          5d6h
rook-ceph-osd-2-85b98c8657-dkhrl                                  2/2     Running     0          5d6h
rook-ceph-osd-prepare-0a5dc2dab029e8f8d84a037a1b474dfd-zzc2f      0/1     Completed   0          5d6h
rook-ceph-osd-prepare-bc926a7d71ac72a997bb915e41199eaf-dv9wq      0/1     Completed   0          5d6h
rook-ceph-osd-prepare-c54e91a0c8f218fd8f425652c21ec85d-ppvxq      0/1     Completed   0          5d6h
rook-ceph-rgw-ceph-objectstore-a-666ccbb8c5-5xgf4                 2/2     Running     0          5d6h
rook-ceph-tools-c9b78dd99-kp2mg                                   1/1     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-779d456fbf-f5kq6         5/5     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-779d456fbf-vb6jb         5/5     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-62k9c                    2/2     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-qlsnf                    2/2     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-sqjhp                    2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-ctrlplugin-cf6c5dc96-bgxpl             5/5     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-ctrlplugin-cf6c5dc96-s4hpg             5/5     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-9h5zh                       2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-t5xh4                       2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-xx6kd                       2/2     Running     0          5d6h
```

To get information about the ceph cluster, execute commands through the rook-ceph-tools pods. For example to get the ceph cluster status,

```bash
kubectl -n rook-ceph exec rook-ceph-tools-5cb8797f56-zxzns -- ceph status
```

## Documentation and Resources
* Rook Github - https://github.com/rook/rook
* Ceph Github - https://github.com/ceph/ceph
* Rook Docs - https://rook.github.io/docs/rook
* Ceph Docs - https://docs.ceph.com/en/reef
* Rook Helm Chart - https://rook.io/docs/rook/latest-release/Helm-Charts/operator-chart/

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nemo

# nemo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nemo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nemo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NVIDIA NeMo Framework is an end-to-end, cloud-native framework to build, customize, and deploy generative AI models anywhere.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Running the Image

To run the NeMo Chainguard Image interactively in an environment with connected GPU:

``` bash 
docker run -it --rm \
  --gpus all \
  --shm-size=8g \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  cgr.dev/chainguard/nemo:latest
```

These options allow access to connected GPU, allocate more shared memory to the container, and put an upper bound on container memory use. If you are running the image in an environment without connected GPU, omit the `  --gpus all` option.

## Testing GPU Access

If your environment has connected GPUs, you can check that NeMo has access. First, run the NeMo Chainguard Image interactively with the above command. At the container prompt, run:

```bash
$ python
Python 3.11.9 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nemo.core import pytorch_lightning
>>> len(pytorch_lightning.accelerators.find_usable_cuda_devices())
1
```

The above result shows that the environment has one connected GPU.

## Testing NeMo

You can run the below commands on your host machine to download and execute a script to test NeMo functionality. The script uses two pretrained models to generate audio output from plain text (text to speech). 

```bash
mkdir nemo-test && cd nemo-test
curl https://raw.githubusercontent.com/chainguard-dev/nemo-examples/main/tts.py > tts.py
docker run -it --rm \
  --gpus all \
  --user root \
  --shm-size=8g \
  --ulimit memlock=-1 \
 --ulimit stack=67108864 \
  -v $PWD:/home/nonroot/nemo-test \
  cgr.dev/chainguard/nemo:latest \
  -c "python /home/nonroot/nemo-test/tts.py"
```

After running the below, you should have a test.wav file in the current working directory on your host machine. The above example uses a root login in order to write the output to the volume. Remember not to use root or privileged access in a production scenario.

## Resources

For more information on using NVIDIA NeMo, see the following resources.

- [NeMo Overview](https://docs.nvidia.com/nemo-framework/user-guide/latest/index.html)
- [NeMo Tutorials](https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/starthere/tutorials.html)
- [NeMo Playbooks](https://docs.nvidia.com/nemo-framework/user-guide/latest/playbooks/index.html)
- [NeMo on GitHub](https://github.com/NVIDIA/NeMo)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### datadog-agent-fips

# datadog-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/datadog-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/datadog-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `datadog-agent-fips` container image is functionally equivalent to the regular `datadog-agent` and is comparable to the [Datadog Agent image](https://hub.docker.com/r/datadog/agent) available on Docker Hub.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started

The Datadog Agent collects events and metrics from hosts and sends them to Datadog.

### Prerequisites

* Create a Datadog account
* Have your Datadog API key available

```bash
docker run \
 --name dd-agent \
 -e DD_API_KEY=${DD_API_KEY} \
 -e DD_SITE="datadoghq.com" \
 -e DD_APM_ENABLED=true \
 -e DD_APM_NON_LOCAL_TRAFFIC=true \
 -v /var/run/docker.sock:/var/run/docker.sock:ro \
 -v /proc/:/host/proc/:ro \
 -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
 -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
 cgr.dev/ORGANIZATION/datadog-agent-fips:latest
```

## Documentation and Resources

- [Datadog Agent Getting Started Guide](https://docs.datadoghq.com/getting_started/agent/)
- [Datadog Agent GitHub Repository](https://github.com/DataDog/datadog-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-bit-fips

# fluent-bit-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-bit-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-bit-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Fluent Bit image is meant to serve as a drop-in replacement for [the official Fluent Bit image from Docker Hub](https://hub.docker.com/r/fluent/fluent-bit). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

Run a Fluent Bit instance that will receive messages over TCP port 24224 through the Forward protocol, and send the messages to the STDOUT interface in JSON format every second:

```sh
docker run -p 127.0.0.1:24224:24224 cgr.dev/ORGANIZATION/fluent-bit-fips /usr/bin/fluent-bit -i forward -o stdout -p format=json_lines -f 1
```

In a separate terminal window, start a separate container that will send a test message. This time the Docker container will use the [Fluent output protocol](https://docs.fluentbit.io/manual/pipeline/outputs/forward) as the logging driver:

```sh
docker run --log-driver=fluentd -t ubuntu echo "Testing a log message"
```

In the Fluent Bit container output in the first terminal, this second container will print a new entry to stdout at the end of the output, like this:

```sh
Fluent Bit v2.2.1
* Copyright (C) 2015-2023 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

[2024/12/03 13:16:12] [ info] [fluent bit] version=2.2.1, commit=842a48223b, pid=1
[2024/12/03 13:16:12] [ info] [storage] ver=1.5.1, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2024/12/03 13:16:12] [ info] [cmetrics] version=0.6.6
[2024/12/03 13:16:12] [ info] [ctraces ] version=0.4.0
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] initializing
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] storage_strategy='memory' (memory only)
[2024/12/03 13:16:12] [ info] [input:forward:forward.0] listening on 0.0.0.0:24224
[2024/12/03 13:16:12] [ info] [sp] stream processor started
[2024/12/03 13:16:12] [ info] [output:stdout:stdout.0] worker #0 started
{"date":1733231822.0,"source":"stdout","log":"Testing a log message\r","container_id":"f142171cc239a9a51e9dc75f2ca603183293514e625cbef50906e9256be2f0a5","container_name":"/intelligent_gagarin"}

```

You can instead deploy Fluent Bit as a Helm chart by running the following:

```shell
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
```

Then, create a YAML values file with the following command:

```shell
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/fluent-bit-fips
  tag: latest

command:
  - /usr/bin/fluent-bit

EOF
```

Next, install it with the following command:

```shell
helm upgrade --install fluent-bit -f values.yaml fluent/fluent-bit
```

## Documentation and Resources

* [Fluent Bit official documentation](https://docs.fluentbit.io/manual)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### logstash-oss-with-opensearch-output-plugin

# logstash-oss-with-opensearch-output-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/logstash-oss-with-opensearch-output-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/logstash-oss-with-opensearch-output-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An image with the Logstash plugin that sends event data to a OpenSearch clusters and stores as an index.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-bit-plugin-loki

# fluent-bit-plugin-loki
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-bit-plugin-loki` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-bit-plugin-loki/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Fluent Bit Loki plugin allows you to send your log or events to a Loki service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Docker

You can run a Fluent Bit container with the Loki output plugin pre-installed using the following command:

```bash
docker run -v /var/log:/var/log \
    -e LOG_PATH="/var/log/*.log" -e LOKI_URL="http://localhost:3100/loki/api/v1/push" \
    cgr.dev/chainguard/fluent-bit-plugin-loki:latest
```
The [GitHub repository](https://github.com/grafana/loki/tree/main/clients/cmd/fluent-bit) has more details on running the fluent-bit plugin.  
**Note:** The default loki plugin config can be found at `/fluent-bit/etc/fluent-bit-loki.conf`.

### Helm
The plugin can also be installed using the fluent-bit helm chart by configuring the image values:

```yaml
image:
  repository: cgr.dev/chainguard/fluent-bit-plugin-loki
  tag: latest
```
For detailed instructions on setting up the Fluent Bit Loki plugin, refer to the [Loki documentation](https://grafana.com/docs/loki/latest/send-data/fluentbit/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dive

# dive
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dive` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dive/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [dive](https://github.com/wagoodman/dive) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `dive` container image is comparable to the [upstream image](https://github.com/wagoodman/dive), with the following differences:

* Like all other Chainguard Containers, `dive` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting started

You need to mount the Docker socket so Dive can access your local images:
```
docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  cgr.dev/ORGANIZATION/dive:latest <your-image-tag>
```

If the image is not present locally, Dive will pull it from the registry

### Output
This outputs a summary including image efficiency and wasted space, suitable for automated pipelines
```
Analyzing image...
  efficiency: 99.0268 %
  wastedBytes: 3569864 bytes (3.6 MB)
  userWastedPercent: 3.5550 %
Inefficient Files:
Count  Wasted Space  File Path
    2        1.6 MB  /var/cache/debconf/templates.dat
    2        1.5 MB  /var/cache/debconf/templates.dat-old
    2        201 kB  /var/lib/dpkg/status
    2        201 kB  /var/lib/dpkg/status-old
    2         21 kB  /var/cache/debconf/config.dat
    2         20 kB  /var/cache/debconf/config.dat-old
    2         18 kB  /etc/ld.so.cache
    2         13 kB  /var/lib/apt/extended_states
    2         11 kB  /var/log/apt/eipp.log.xz
    2        1.7 kB  /etc/passwd
    2        1.7 kB  /etc/passwd-
    2         968 B  /etc/shadow
    2         881 B  /etc/group
    2         868 B  /etc/group-
    2         738 B  /etc/gshadow
    2           0 B  /var/lib/dpkg/triggers/Lock
    2           0 B  /var/lib/dpkg/triggers/Unincorp
    2           0 B  /var/lib/dpkg/lock
Results:
  PASS: highestUserWastedPercent
  SKIP: highestWastedBytes: rule disabled
  PASS: lowestEfficiency
Result:PASS [Total:3] [Passed:2] [Failed:0] [Warn:0] [Skipped:1]
```

## Documentation and Resources
**[Github Repository](https://github.com/wagoodman/dive)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### az-iamguarded

# az-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/az-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/az-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure CLI (IAM Guarded)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

IAMGuarded-compatible version of the Azure CLI image.

## Overview

This image provides the Azure CLI in an IAMGuarded-compatible format. It includes the `az` command-line tool for interacting with Microsoft Azure services.

## Usage

Check the Azure CLI version:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded:latest --version
```

Get help:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded:latest --help
```

List Azure subscriptions:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded:latest account list
```

List virtual machines in a resource group:
```bash
docker run --rm cgr.dev/chainguard-private/az-iamguarded:latest vm list --resource-group myResourceGroup
```

## Configuration

The image runs with a non-root user named "az" (UID/GID 1001) and installs the Azure CLI at `/opt/iamguarded/azure-cli/`.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nacos

# nacos
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nacos` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nacos/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dynamic service discovery, configuration and service management platform for building AI cloud native applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `nacos` image is compatible with the upstream [nacos/nacos-server](https://hub.docker.com/r/nacos/nacos-server) image with the following differences:

* The image runs as a non-root user
* Uses Wolfi packages for improved security
* Contains minimal dependencies for reduced attack surface

There are no breaking changes in the API or configuration.

## Getting Started

The `nacos` image can be run in standalone or cluster mode. For development and testing, standalone mode is recommended:

```sh
docker run -d --name nacos \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=false \
  -p 8848:8848 \
  cgr.dev/ORGANIZATION/nacos
```

After starting, the Nacos console will be available at http://localhost:8848/nacos. The default credentials are `nacos/nacos`.

For production deployments, enable authentication and use cluster mode:

```sh
docker run -d --name nacos \
  -e MODE=cluster \
  -e NACOS_AUTH_ENABLE=true \
  -e NACOS_AUTH_TOKEN=your-secret-token \
  -e NACOS_AUTH_IDENTITY_KEY=serverIdentity \
  -e NACOS_AUTH_IDENTITY_VALUE=security \
  -p 8848:8848 \
  cgr.dev/ORGANIZATION/nacos
```

### Usage with Helm

To deploy Nacos on Kubernetes using Helm:

```sh
helm repo add ygqygq2 https://ygqygq2.github.io/charts
helm repo update

cat > values.yaml <<EOF
image:
  registry: cgr.dev/ORGANIZATION
  repository: nacos
  tag: latest

nacos:
  serverMode: standalone
  domainName: nacos.example.com
EOF

helm install nacos ygqygq2/nacos -f values.yaml
```

## Configuration

Nacos can be configured through environment variables. Key configuration options include:

* `MODE`: Set to `standalone` for single-node deployment or `cluster` for multi-node
* `NACOS_AUTH_ENABLE`: Enable authentication (recommended for production)
* `NACOS_AUTH_TOKEN`: JWT token for authentication (base64 encoded)
* `SPRING_DATASOURCE_PLATFORM`: Database type (`mysql` for external database)
* `MYSQL_SERVICE_HOST`: MySQL host when using external database
* `MYSQL_SERVICE_DB_NAME`: Database name for MySQL

For a complete list of configuration options, refer to the [Nacos documentation](https://nacos.io/docs/latest/guide/admin/deployment/).

## Documentation and Resources

* [Nacos Official Documentation](https://nacos.io/docs/latest/what-is-nacos/)
* [Nacos Quick Start Guide](https://nacos.io/docs/latest/quickstart/quick-start/)
* [Nacos Docker Hub](https://hub.docker.com/r/nacos/nacos-server)
* [Helm Chart Repository](https://github.com/ygqygq2/nacos-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-apisix-iamguarded

# apache-apisix-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-apisix-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-apisix-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

APISIX API Gateway provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `apache-apisix-iamguarded` image is based on Apache APISIX and provides the same functionality as the upstream project with the following differences:

* This image follows IAMGuarded container standards for enterprise compatibility
* The binary is located at `/opt/iamguarded/apisix/bin/apisix` instead of the default path
* Configuration files are located under `/opt/iamguarded/apisix/conf/`
* The container runs as user ID 1001 (apisix user) with group ID 0 (root group) following IAMGuarded standards
* Custom environment variables including `LUA_PATH` for Lua module loading
* Luarocks is not included in this image, as its usage with openresty [is strongly discouraged](https://openresty.org/en/using-luarocks.html) in favor of openresty's own package manager `opm`

These changes ensure enterprise-grade security compliance while maintaining full compatibility with the upstream Apache APISIX functionality.

## Getting Started

Apache APISIX requires etcd as a configuration store. Here's how to get started with the basic setup:

### Basic Version Check

First, verify the image works correctly:

```sh
docker run --rm cgr.dev/ORGANIZATION/apache-apisix-iamguarded:latest version
```

### Running with Docker and etcd

Create a minimal setup with etcd and APISIX:

```sh
# Create a network for APISIX and etcd
docker network create apisix-network

# Start etcd
docker run -d \
  --name apisix-etcd \
  --network apisix-network \
  -p 2379:2379 \
  -e ALLOW_NONE_AUTHENTICATION=yes \
  cgr.dev/ORGANIZATION/etcd:latest \
  etcd --listen-client-urls=http://0.0.0.0:2379 --advertise-client-urls=http://0.0.0.0:2379
```

Create APISIX configuration:

```sh
cat > apisix-config.yaml <<EOF
deployment:
  role: traditional
  role_traditional:
    config_provider: etcd
  etcd:
    host:
      - "http://apisix-etcd:2379"
    prefix: "/apisix"
    timeout: 30
  admin:
    admin_key_required: false
    enable_admin_cors: true
    admin_listen:
      ip: 0.0.0.0
      port: 9180

apisix:
  node_listen: 9080
  enable_ipv6: false
EOF
```

Start APISIX with the configuration:

```sh
docker run -d \
  --name apisix-gateway \
  --network apisix-network \
  -p 9080:9080 \
  -p 9180:9180 \
  -v "$(pwd)/apisix-config.yaml:/usr/local/apisix/conf/config.yaml" \
  --entrypoint=/bin/bash \
  cgr.dev/ORGANIZATION/apache-apisix-iamguarded:latest \
  -c 'apisix init && apisix init_etcd && exec /usr/bin/openresty -p /usr/local/apisix -g "daemon off;"'
```

### Testing the Setup

Once running, test the admin API:

```sh
# Check routes (should return empty initially)
curl "http://localhost:9180/apisix/admin/routes"

# Create a test route
curl -X PUT -H "Content-Type: application/json" \
  "http://localhost:9180/apisix/admin/routes/1" \
  -d '{
    "uri": "/test",
    "plugins": {
      "response-rewrite": {
        "body": "APISIX is working!",
        "status_code": 200
      }
    }
  }'

# Test the proxy endpoint
curl "http://localhost:9080/test"
```

## Configuration

APISIX configuration is primarily handled through the `config.yaml` file and admin API. Key configuration areas include:

### Core Configuration

The main configuration file structure:

```yaml
deployment:
  role: traditional              # or data_plane for distributed setup
  role_traditional:
    config_provider: etcd       # Configuration storage backend

etcd:
  host:
    - "http://etcd-host:2379"   # etcd cluster endpoints
  prefix: "/apisix"             # Key prefix in etcd
  timeout: 30                   # Connection timeout

admin:
  admin_listen:
    ip: 0.0.0.0
    port: 9180                  # Admin API port
  admin_key_required: false     # Set to true for production
  enable_admin_cors: true       # Allow cross-origin requests

apisix:
  node_listen: 9080             # Gateway port for client traffic
  enable_ipv6: false            # IPv6 support
```

### Security Considerations

For production deployments:

* Enable admin API key authentication by setting `admin_key_required: true`
* Configure proper TLS certificates
* Restrict admin API access through firewall rules
* Use strong authentication plugins for client traffic
* Implement proper rate limiting and circuit breaker patterns

### Environment Variables

The image sets specific environment variables for proper operation:

* `LUA_PATH`: Configured for Lua module loading
* `PATH`: Includes APISIX binary paths and dependencies

## Documentation and Resources

For comprehensive documentation and advanced configuration:

* [Apache APISIX Official Documentation](https://apisix.apache.org/docs/apisix/getting-started/)
* [APISIX Plugin Hub](https://apisix.apache.org/plugins/)
* [API Reference](https://apisix.apache.org/docs/apisix/admin-api/)
* [Chainguard Academy](https://edu.chainguard.dev/) for container best practices

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-ui-server-fips

# temporal-ui-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-ui-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-ui-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq

# rabbitmq
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[RabbitMQ](https://github.com/rabbitmq/rabbitmq-server) is a message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using RabbitMQ

The default RabbitMQ port is 5672.
To run with Docker using default configuration:

```sh
docker run -p 5672:5672 --rm cgr.dev/chainguard/rabbitmq
2023-01-02 00:11:37.199274+00:00 [notice] <0.44.0> Application syslog exited with reason: stopped
2023-01-02 00:11:37.206489+00:00 [notice] <0.229.0> Logging: switching to configured handler(s); following messages may not be visible in this log output

  ##  ##      RabbitMQ 3.11.5
  ##  ##
  ##########  Copyright (c) 2007-2022 VMware, Inc. or its affiliates.
  ######  ##
  ##########  Licensed under the MPL 2.0. Website: https://rabbitmq.com

  Erlang:      25.2 [jit]
  TLS Library: OpenSSL - OpenSSL 3.0.7 1 Nov 2022
  Release series support status: supported

  Doc guides:  https://rabbitmq.com/documentation.html
  Support:     https://rabbitmq.com/contact.html
  Tutorials:   https://rabbitmq.com/getstarted.html
  Monitoring:  https://rabbitmq.com/monitoring.html

  Logs: /var/log/rabbitmq/rabbit@02bee2143fb7.log
        /var/log/rabbitmq/rabbit@02bee2143fb7_upgrade.log
        <stdout>

  Config file(s): (none)

  Starting broker... completed with 0 plugins.
```

## Configuration

RabbitMQ takes three configuration files: the rabbitmq configuration file, the advanced configuration file,
and the environment file.

These can be placed into the image at the following locations, or overridden with the corresponding
environment variables:

```shell
RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf
RABBITMQ_ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config
RABBITMQ_CONF_ENV_FILE=/etc/rabbitmq/rabbitmq-env.conf
```

## Users and Directories

By default this image runs as a non-root user named `rabbitmq` with a uid of 65532.

Logs go to `/var/log/rabbitmq/` by default.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nextcloud-server-fips

# nextcloud-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nextcloud-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nextcloud-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nextcloud server, a safe home for all your data

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Nextcloud server. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's Nextcloud image maintains functional parity with the [upstream image](https://hub.docker.com/_/nextcloud/).

### FIPS support

Chainguard's `nextcloud-server-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Docker

Simply run the image with the following command:

```shell
docker container run --pull always --rm -it -p 80:80 -p 443:443 cgr.dev/ORGANIZATION/nextcloud-server-fips:latest
```

And jump to your browser to `http://localhost:80` to access the Nextcloud dashboard.

### Kubernetes

To deploy Nextcloud on Kubernetes, you can use the Helm chart provided by the Nextcloud community. First, add the Nextcloud Helm repository:

```shell
helm repo add nextcloud https://nextcloud.github.io/helm/
helm repo update
```

Override the default image repository and tag in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/nextcloud-server-fips
  tag: latest
EOF
```

Then, install the chart with the following command:

```shell
helm install nextcloud nextcloud/nextcloud -f values.yaml --wait
```

## Documentation and Resources
- [Nextcloud Helm Chart](https://github.com/nextcloud/helm)
- [Nextcloud Server documentation](https://docs.nextcloud.com/server/latest/admin_manual/contents.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-operator-fips

# minio-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### syft

# syft
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/syft` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/syft/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A tool for generating a Software Bill of Materials (SBOM) from container images and filesystems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Image Variants

Our `latest` tag uses the most recent build of the [Wolfi syft](https://github.com/wolfi-dev/os/blob/main/syft.yaml) package. The following tagged variant is available without authentication:

- `latest`: This is an image for running `syft` commands. It does not include a shell or other applications.

### Compatibility Notes

Chainguard's `syft` image is comparable to the [official Syft Image.](https://hub.docker.com/r/anchore/syft) but with the following changes:
* We use a different entrypoint `/usr/bin/syft` as compared to the upstream's endpoint `/syft`.
* We use a different `CMD` which is `help` whereas the upstream leaves it unset.
* We don't define any WorkingDir whereas the upstream sets it to `/tmp`.

### syft help
This will automatically pull the image to your local system and execute the command `syft help`:

```shell
docker run --rm cgr.dev/chainguard/syft help
Generate a packaged-based Software Bill Of Materials (SBOM) from container images and filesystems

Usage:
  syft [SOURCE] [flags]
  syft [command]

Examples:
  syft scan alpine:latest                                a summary of discovered packages
  syft scan alpine:latest -o json                        show all possible cataloging details
  syft scan alpine:latest -o cyclonedx                   show a CycloneDX formatted SBOM
  syft scan alpine:latest -o cyclonedx-json              show a CycloneDX JSON formatted SBOM
  syft scan alpine:latest -o spdx                        show a SPDX 2.3 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx@2.2                    show a SPDX 2.2 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx-json                   show a SPDX 2.3 JSON formatted SBOM
  syft scan alpine:latest -o spdx-json@2.2               show a SPDX 2.2 JSON formatted SBOM
  syft scan alpine:latest -vv                            show verbose debug information
  syft scan alpine:latest -o template -t my_format.tmpl  show a SBOM formatted according to given template file

  Supports the following image sources:
    syft scan yourrepo/yourimage:tag     defaults to using images from a Docker daemon. If Docker is not present, the image is pulled directly from the registry.
    syft scan path/to/a/file/or/dir      a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

  You can also explicitly specify the scheme to use:
    syft scan docker:yourrepo/yourimage:tag            explicitly use the Docker daemon
    syft scan podman:yourrepo/yourimage:tag            explicitly use the Podman daemon
    syft scan registry:yourrepo/yourimage:tag          pull image directly from a registry (no container runtime required)
    syft scan docker-archive:path/to/yourimage.tar     use a tarball from disk for archives created from "docker save"
    syft scan oci-archive:path/to/yourimage.tar        use a tarball from disk for OCI archives (from Skopeo or otherwise)
    syft scan oci-dir:path/to/yourimage                read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    syft scan singularity:path/to/yourimage.sif        read directly from a Singularity Image Format (SIF) container on disk
    syft scan dir:path/to/yourproject                  read directly from a path on disk (any directory)
    syft scan file:path/to/yourproject/file            read directly from a path on disk (any single file)

Available Commands:
  attest      Generate an SBOM as an attestation for the given [SOURCE] container image
  cataloger   Show available catalogers and configuration
  completion  Generate the autocompletion script for the specified shell
  config      show the syft configuration
  convert     Convert between SBOM formats
  help        Help about any command
  login       Log in to a registry
  scan        Generate an SBOM
  version     show version information

Flags:
      --base-path string                          base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
  -c, --config string                             syft configuration file
      --enrich stringArray                        enable package data enrichment from local and online sources (options: all, golang, java, javascript)
      --exclude stringArray                       exclude paths from being scanned using a glob expression
      --file string                               file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
      --from stringArray                          specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
  -h, --help                                      help for syft
  -o, --output stringArray                        report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
      --override-default-catalogers stringArray   set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source)
      --platform string                           an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
  -q, --quiet                                     suppress all logging output
  -s, --scope string                              selection of layers to catalog, options=[squashed all-layers] (default "squashed")
      --select-catalogers stringArray             add, remove, and filter the catalogers to be used
      --source-name string                        set the name of the target being analyzed
      --source-version string                     set the version of the target being analyzed
  -t, --template string                           specify the path to a Go template file
  -v, --verbose count                             increase verbosity (-v = info, -vv = debug)
      --version                                   version for syft

Use "syft [command] --help" for more information about a command.
```

### syft scan

Show a summary of discovered packages using `syft scan`:

```shell
docker run --rm cgr.dev/chainguard/syft -q scan cgr.dev/chainguard/wolfi-base:latest
NAME                    VERSION       TYPE
apk-tools               2.14.4-r0     apk
busybox                 1.37.0-r0     apk
ca-certificates-bundle  20241010-r1   apk
glibc                   2.40-r3       apk
glibc-locale-posix      2.40-r3       apk
ld-linux                2.40-r3       apk
libcrypt1               2.40-r3       apk
libcrypto3              3.3.2-r2      apk
libgcc                  14.2.0-r3     apk
libssl3                 3.3.2-r2      apk
libxcrypt               4.4.36-r8     apk
wolfi-base              1-r6          apk
wolfi-baselayout        20230201-r15  apk
wolfi-keys              1-r8          apk
zlib                    1.3.1-r4      apk
```

### Documentation and Resources

* [Syft Documentation](https://github.com/anchore/syft/wiki)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-logging-operator

# kube-logging-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-logging-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-logging-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Logging operator for Kubernetes Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-cluster-operator-fips

# rabbitmq-cluster-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-cluster-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-cluster-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-iamguarded-fips

# envoy-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Envoy](https://www.envoyproxy.io/) Cloud-native high-performance edge/middle/service proxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `envoy-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Envoy IAMGuarded is a security-enhanced variant of Envoy designed to be deployed as part of Contour IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Envoy and Contour deployments.

## Helm Chart Installation

The Contour IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/contour
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Contour image
contour:
  image:
    registry: myregistry.example.com
    repository: mirrored/contour-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Envoy proxy image
envoy:
  image:
    registry: myregistry.example.com
    repository: mirrored/envoy-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Nginx image
defaultBackend:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/contour:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Contour IAMGuarded installation:

```bash
kubectl get po -l app.kubernetes.io/name=contour
```

You should see Contour and Envoy pods running:

```bash
NAME                              READY   STATUS    RESTARTS   AGE
contour-contour-c66d5cb67-z7ql6   1/1     Running   0          98s
contour-envoy-cw6vs               2/2     Running   0          98s
```

For more information on Contour, including follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

For more information on Envoy, please refer to [Getting started with Envoy](https://www.envoyproxy.io/docs/envoy/latest/start/start).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-gitlab

# crossplane-provider-gitlab
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-gitlab` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-gitlab/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the Crossplane GitLab provider, which allows you to manage GitLab resources using Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-provider-gitlab` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-gitlab](https://github.com/crossplane-contrib/provider-gitlab/pkgs/container/provider-gitlab) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gitlab
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-gitlab:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the provider is healthy:
```bash
kubectl get providers
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-gitlab).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-7270

# request-7270
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-7270` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-7270/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [opentelemetry-collector](https://github.com/open-telemetry/opentelemetry-collector)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's request-7270 image is a Wolfi based FIPS image. This image is based on the OpenTelemetry Collector and includes the OpenTelemetry Collector Builder (ocb) binary for creating custom collector configurations.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

### Getting Started

Chainguard cgr.dev/ORGANIZATION/request-7270 is a drop in replacement for the upstream image, tested using the community [helm chart](https://opentelemetry.io/docs/kubernetes/helm/collector/).

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set mode=<daemonset|deployment|statefulset> \
   --set image.repository=cgr.dev/ORGANIZATION/request-7270 \
   --set image.tag=latest
```

To use custom configuration it is easier to use a `values.yaml` file:

```yaml
mode: daemonset
configMap:
  create: false
image:
  tag: latest
  repository: cgr.dev/ORGANIZATION/request-7270
command:
  extraArgs:
    - "--config=/conf/custom-config.yaml"
extraVolumeMounts:
  - name: "custom-vm"
    mountPath: "/conf"
extraVolumes:
  - name: "custom-vm"
    configMap:
      name: "custom"

```
```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install open-telemetry opentelemetry/opentelemetry-collector --namespace open-telemetry-custom-config -f values.yaml
```

### OpenTelemetry Collector Builder (ocb)

This image includes the OpenTelemetry Collector Builder (`ocb`) binary, which allows you to build custom collector configurations using your own `builder-config.yaml` file. This is particularly useful for creating collectors with specific components and extensions tailored to your needs.

To use the ocb binary:
```bash
# Example: Build a custom collector
ocb --config=builder-config.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1295

# request-1295
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1295` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1295/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Bundled Prometheus image

A custom image request for c3.ai, provides a `bundled` container image,
containing prometheus and multiple supporting applications.

## Image contents

This bundled image contains the following applications:

- prometheus-fips
- prometheus-operator-fips
- prometheus-config-reloader-fips
- prometheus-alertmanager-fips
- prometheus-node-exporter-fips
- prometheus-postgres-exporter-fips
- kube-state-metrics-fips-fips

### prometheus

Prometheus (including all its dependencies), are installed to `/usr/bin`. For
more information, refer to the [prometheus image docs](https://images.chainguard.dev/directory/image/prometheus/overview).

As an example, to run `prometheus` on the bundled image:

```bash
docker run -p 9090:9090 --entrypoint prometheus cgr.dev/c3.ai/bundled-prometheus-fips:latest \
--config.file=/etc/prometheus/prometheus.yml
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-operator
Refer to the [prometheus-operator](https://images.chainguard.dev/directory/image/prometheus-operator/overview)
image documentation for more information.

> Note, as this is a bundled image as per request, depending how this is deployed,
> the helm chart / deployment mechanism may need extended to be able to support
> passing a path to the executable, which is `/usr/bin/operator`.

### prometheus-config-reloader
Refer to the [prometheus-config-reloader](https://images.chainguard.dev/directory/image/prometheus-config-reloader/overview)
image documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run -d --entrypoint prometheus-config-reloader cgr.dev/c3.ai/bundled-prometheus-fips:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-alertmanager
Refer to the [prometheus-alertmanager](https://images.chainguard.dev/directory/image/prometheus-alertmanager/overview)
documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run \
    -d --rm --entrypoint alertmanager \
    -p "<FREE_PORT>:9093" \
    -v "<DIR>/alertmanager-config.yml:/etc/alertmanager/alertmanager.yml" \
    cgr.dev/c3.ai/bundled-prometheus-fips:latest \
    --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager)
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-node-exporter
Refer to the [prometheus-node-exporter](https://images.chainguard.dev/directory/image/prometheus-node-exporter/overview)
documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run -d --entrypoint node_exporter cgr.dev/c3.ai/bundled-prometheus-fips:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-postgres-exporter
Refer to the [prometheus-postgres-exporter](https://images.chainguard.dev/directory/image/prometheus-postgres-operator/overview)
documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

 ```bash
 docker run \
    -d --rm --entrypoint postgres_exporter \
     -p "<FREE_PORT>:9093" \
    -v "<DIR>/postgres_exporter.yml:/etc/postgres/postgres_exporter.yml" \
    cgr.dev/c3.ai/bundled-prometheus-fips:latest --config.file=/etc/postgres/postgres_exporter.yml
 ```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### kube-state-metrics-fips
Refer to the [kube-state-metrics](https://images.chainguard.dev/directory/image/kube-state-metrics/overview)
documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run --entrypoint kube-state-metrics cgr.dev/c3.ai/bundled-prometheus-fips:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

## Entrypoint

Due to containing multiple applications, no entrypoint is configured for this
image. The executable path will need to be passed when running the image, to
launch the appropriate application.

## Default user

Note, `prometheus` requires to be executed with the root user. This means we
need to configure the bundled image to run as root, thus applying the same
change to all the bundled applications.

## Image versioning

Due to containing multiple applications, each with their own independent
version streams, this bundled image simply provides a `latest` tagged image.
Image digests can be used to pin to a specific point in time.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### huggingface-pytorch-inference

# huggingface-pytorch-inference
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/huggingface-pytorch-inference` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/huggingface-pytorch-inference/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

General-purpose PyTorch inference Deep Learning Container for inferencing on Sagemaker instances

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's huggingface-pytorch-inference image is meant to be comparabile to the [official huggingface-pytorch-inference image](https://huggingface.co/docs/sagemaker/en/dlcs/available#pytorch-inference-dlc) from Huggingface's DLC images.

## Getting started

The quickest way of getting started with this image is by using `docker`. You can configure its behavior by passing environment variables to it at runtime.
```shell
docker run --rm -d \
  -p 8080:8080 \
  -e "HF_MODEL_ID=distilbert/distilbert-base-uncased-finetuned-sst-2-english" \
  -e "HF_TASK=sentiment-analysis" \
  cgr.dev/ORGANIZATION/huggingface-pytorch-inference:latest

# Read https://huggingface.co/docs/transformers/main_classes/pipelines to find out what HF_TASK to use for your usecase
# Models can be found at https://huggingface.co/ 's model repository
```

Then you can interact with the API via CURL
```bash
curl \
  --request POST \
  --url "http://localhost:8080/invocations" \
  --header "Content-Type: application/json" \
  --data "{\"inputs\": \"I love Chainguard!\"}"
```
```
[{"label":"POSITIVE","score":0.9998224377632141}]
```

## GPU Acceleration

Running with GPU acceleration requires arguments for passing through the GPU to the container at runtime:
```bash
docker run --rm -d \
  -p 8080:8080 \
  --gpus all \
  -e "HF_MODEL_ID=distilbert/distilbert-base-uncased-finetuned-sst-2-english" \
  -e "HF_TASK=sentiment-analysis" \
  cgr.dev/ORGANIZATION/huggingface-pytorch-inference:latest
```

The output from the server should indicate that your GPU is being used:
```
MMS Home: /usr/lib/python3.13/site-packages
Current directory: /
Temp directory: /tmp
Number of GPUs: 1
Number of CPUs: 1
Max heap size: 885 M
Python executable: /usr/bin/python3.13
```

## Resources and Documentation

- [Huggingface DLC documentation](https://huggingface.co/docs/sagemaker/en/dlcs/available)
- [Sagemaker SDK Quickstart Documentation](https://huggingface.co/docs/sagemaker/en/index#deploy-with-sagemaker-sdk)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-kubeseal

# sealed-secrets-kubeseal
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-kubeseal` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-kubeseal/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes tool that uses one-way encryption of Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Sealed Secrets Kubeseal Chainguard image is comparable to the official Sealed Secrets Kubeseal image from Docker Hub.

## Getting Started
Sealed Secrets is typically used alongside GitOps workflows to safely manage encrypted Kubernetes Secrets.

## Encrypting Secrets with Docker

The `sealed-secrets-kubeseal` image can be used to encrypt and/or validate the sealed secrets.

To seal a secret, run the image and mount the Kubernetes config file - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal \
  -o yaml \
  <secret.yaml >sealed-secret.yaml
```

This will encrypt contents of `secret.yaml` as `sealed-secret.yaml`.

It's also possible to validate a sealed secret using the `--validate` flag to make sure the sealed secret is correct - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal \
  --validate \
  <sealed-secret.yaml
```

### Applying Sealed Secrets

Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f sealed-secret.yaml
```

Sealed secrets controller needs to be running in the cluster for this to work. The `sealed-secrets-controller` Chainguard image can be used for this purpose.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falco-exporter-fips

# falco-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falco-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falco-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-2682

# request-2682
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-2682` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-2682/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A container registry offering secure image storage, access control, scanning, and replication, built as Harbor's customized Docker Distribution registry service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Harbor-registry image is a lean, Wolfi-based container image.
It is comparable to the [Upstream Harbor registry Image](https://hub.docker.com/r/goharbor/registry-photon) in functionality and has minimal dependencies.
Chainguard's Harbor-registry image release tags are in-sync with Harbor releases which is similar to the upstream Harbor registry Image.

## Getting Started
For getting started with Harbor-registry, we can use helm to deploy it:
### Deploying Harbor with Helm
The easiest way to get up and running with Chainguard's Harbor-registry is via deployment with Harbor's official Helm chart.

To get started, we need to add Harbor's Helm repository:  

```bash
helm repo add harbor https://helm.goharbor.io
```
Now that we've added the repository, we can deploy Harbor-registry:
```shell
helm install harbor harbor/harbor \
  --set registry.registry.image.repository=cgr.dev/ORGANIZATION/request-2682,registry.registry.image.tag=latest
```
**Note:** In order to deploy Harbor-registry along with entire Chainguard's Harbor images, we can use:

```bash
helm install harbor harbor/harbor \
  --set core.image.repository=cgr.dev/ORGANIZATION/harbor-core,core.image.tag=latest \
  --set jobservice.image.repository=cgr.dev/ORGANIZATION/harbor-jobservice,jobservice.image.tag=latest \
  --set portal.image.repository=cgr.dev/ORGANIZATION/harbor-portal,portal.image.tag=latest \
  --set registry.registry.image.repository=cgr.dev/ORGANIZATION/request-2682,registry.registry.image.tag=latest \
  --set registry.registryctl.image.repository=cgr.dev/ORGANIZATION/harbor-registryctl,registry.registryctl.image.tag=latest \
  --set trivy.image.repository=cgr.dev/ORGANIZATION/harbor-trivy-adapter,trivy.image.tag=latest \
  --set registry.registry.extraEnvVars[0].name=REGISTRY_REDIS_OPTIONS_ADDRS \
  --set registry.registry.extraEnvVars[0].value="[harbor-redis:6379]"
```
*You will need to override the `image` and `tag` values for each image like we've done here to point to Chainguard's Harbor images and tags.*

Additionally, you may fetch Harbor's Helm chart after adding the repository and edit values directly without overriding them on installation:

```bash
helm fetch harbor/harbor --untar
```

Afterwards, edit `values.yml` and substitute in Chainguard's images/tags. For instance, for `harbor-core`, the following changes should be made:

```yaml
core:
  ...
  image: cgr.dev/ORGANIZATION/harbor-core
  tag: latest
  ...
```

## Documentation and Resources
- [Official Documentation](https://goharbor.io/docs/2.14.0/install-config/)
- [Project Repository](https://github.com/goharbor/harbor)
- [Configuration Guide](https://goharbor.io/docs/2.14.0/install-config/configure-system-settings-cli/)
- [Architecture](https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### lvm-driver-fips

# lvm-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/lvm-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/lvm-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dynamically provision Stateful Persistent Node-Local Volumes & Filesystems for Kubernetes that is integrated with a backend LVM2 data storage stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `lvm-driver-fips` container image is comparable to Coders's [lvm-driver](https://hub.docker.com/r/openebs/lvm-driver). Chainguard's container contains only the minimum set of dependencies needed to run code-server.

### FIPS support

Chainguard's `lvm-driver-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The [official documentation](https://openebs.io/docs/4.0.x/quickstart-guide/installation) outlines how to run the lvm-driver image or you can use the official GitHub repo for the installation steps [here](https://github.com/openebs/lvm-localpv/blob/develop/docs/quickstart.md#installation).

> **NOTE**: To setup lvm-driver properly we need some pre-requisites outlined in the [official documentation](https://openebs.io/docs/4.0.x/user-guides/local-storage-user-guide/local-pv-lvm/lvm-installation#prerequisites).

```yaml
cat <<EOF > init.yaml
lvm-localpv:
  lvmPlugin:
    image:
      registry: cgr.dev
      repository: ORGANIZATION/lvm-driver-fips
      tag: latest
      pullPolicy: IfNotPresent
EOF
```

After creating the values.yaml file, follow the remaining instructions to install with helm:

```bash
helm repo add openebs https://openebs.github.io/openebs
helm repo update
helm upgrade --install openebs \
 --set engines.local.lvm.enabled=true \
 openebs/openebs \
  --values init.yaml
```

## Documentation and Resources
- [lvm local-pv documentation](https://openebs.github.io/lvm-localpv)
- [lvm local-pv Github](https://github.com/openebs/lvm-localpv)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-statsd-exporter-iamguarded

# prometheus-statsd-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-statsd-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-statsd-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[statsd_exporter](https://github.com/prometheus/statsd_exporter) receives StatsD-style metrics and exports them as Prometheus metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus StatsD Exporter IAMGuarded is a generic image allowing exporting data to Prometheus, used to perform basic operations in Helm Charts.

## Helm Chart Installation

Prometheus StatsD Exporter does not come with its own Helm Chart, but rather is used as part of other charts.

Certain IAMGuarded Helm Charts use the image for exporting statsd-type metrics.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for many IAMGuarded charts that enables exporting statsd-type metrics and pins the image to specific digest:

```yaml
# OS Shell image for volume permissions
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-statsd-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ant

# ant
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ant` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ant/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `ant` container image provides [Apache Ant](https://ant.apache.org/), a Java-based build automation tool. Since there is no official Apache Ant Docker image, this image serves as a secure alternative to community-maintained versions. 

This container image's tags are in the form of `<ANT_VERSION>-jdk<OPENJDK_VERSION>[-dev]`, such that one can track `1-jdk21` for Ant 1.x.x with OpenJDK 21. The `-dev` variants contain jmods, and are thus suitable to use jlink.

## Getting Started

Use the container to build Java projects with Ant build files:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant:latest
```

To compile and package a Java project:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant:latest compile jar
```

To run a specific Ant target:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant:latest [target-name]
```

## Documentation and Resources

- [Apache Ant Manual](https://ant.apache.org/manual/)
- [Apache Ant Project](https://ant.apache.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-alloy-operator-fips

# images/grafana-alloy-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/grafana-alloy-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/grafana-alloy-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Alloy Operator is a Kubernetes Operator that manages the lifecycle of Grafana Alloy instances

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `grafana-alloy-operator-fips` container image is designed to be a drop-in replacement for the upstream [grafana-alloy-operator image](https://github.com/grafana/alloy-operator).

**Note:** The 'Grafana Alloy Operator Helm chart' and 'Grafana Alloy Operator image' use different versioning schemes upstream. For example, the Helm chart may be versioned as `v0.3.10`, while that version of the chart uses a Grafana Operator image tagged as `v1.3.0`. The Chainguard image follows the versioning associated with the upstream Grafana Operator image.

For more information, see:
[https://github.com/grafana/alloy-operator/issues/82](https://github.com/grafana/alloy-operator/issues/82)

## FIPS Support

The `grafana-alloy-operator-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/grafana-alloy-operator-fips
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana-alloy-operator grafana/alloy-operator \
  --namespace alloy-system \
  --create-namespace -f values.yaml
```

### Deploy an Alloy Instance

After installing the operator, you can deploy an Alloy instance:

```yaml
apiVersion: collectors.grafana.com/v1alpha1
kind: Alloy
metadata:
  name: alloy-example
  namespace: default
spec:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/grafana-alloy-fips
    tag: latest
  alloy:
    configMap:
      content: |-
        prometheus.exporter.self "default" {}
```

## Documentation and Resources

- [Grafana Alloy Operator Documentation](https://github.com/grafana/alloy-operator#alloy-operator)
- [Grafana Alloy Documentation](https://grafana.com/docs/alloy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-operator-iamguarded

# prometheus-operator-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-operator-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-operator-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Operator IAMGuarded is a security-enhanced variant of the Prometheus Operator designed to be deployed using the Kube-Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Prometheus Operator deployments and manages Prometheus and Alertmanager instances in Kubernetes.

## Kube-Prometheus Helm Chart Usage

This image is primarily used with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

### Prometheus Operator Configuration

When using the Kube-Prometheus chart, you can override the Prometheus Operator image under the `operator` section in your `values.yaml`:

```yaml
operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubescape-operator-fips

# kubescape-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubescape-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubescape-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Fips image of Kubescape-Operator is an in-cluster component of the Kubescape security platform that orchestrates security scanning and policy enforcement.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kubescape-operator-fips` container image is a drop-in replacement for the upstream [kubescape/operator](https://oci.dag.dev/?image=quay.io/kubescape/operator:v0.2.69) container image. It is fully compatible with the official [Kubescape-Operator Helm chart](https://github.com/kubescape/helm-charts/tree/main/charts/kubescape-operator) and supports all standard functionality, including security scanning, policy enforcement and vulnerability assessment. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS Support

The `kubescape-operator-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the official [Kubescape-Operator Helm chart](https://github.com/kubescape/helm-charts/tree/main/charts/kubescape-operator). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
operator:
  image:
    repository: cgr.dev/ORGANIZATION/kubescape-operator-fips
    tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kubescape-operator` helm chart

```shell
helm repo add kubescape https://kubescape.github.io/helm-charts/
helm repo update
helm install kubescape kubescape/kubescape-operator --namespace=kubescape --create-namespace --set clusterName=`kubectl config current-context` -f values.yaml --wait
```

## Documentation and Resources
- [Kubescape-Operator Github Repository](https://github.com/kubescape/operator)
- [Kubescape-Operator Helm Charts](https://github.com/kubescape/helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openai

# openai
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openai` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openai/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the OpenAI CLI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image requires the `OPENAI_API_KEY` environment variable to be set to work correctly.
You can obtain this directly from openai.com, and set it with the `-e` flag to `docker run`, or the `--env-file` flag to specify it as a file.

```shell
$ docker run -e OPENAI_API_KEY=$OPENAI_API_KEY cgr.dev/chainguard/openai api
usage: openai api [-h]
                  {engines.list,engines.get,engines.update,engines.generate,chat_completions.create,completions.create,deployments.list,deployments.get,deployments.delete,deployments.create,models.list,models.get,models.delete,files.create,files.get,files.delete,files.list,fine_tunes.list,fine_tunes.create,fine_tunes.get,fine_tunes.results,fine_tunes.events,fine_tunes.follow,fine_tunes.cancel,fine_tunes.delete,image.create,image.create_edit,image.create_variation,audio.transcribe,audio.translate}
                  ...

positional arguments:
  {engines.list,engines.get,engines.update,engines.generate,chat_completions.create,completions.create,deployments.list,deployments.get,deployments.delete,deployments.create,models.list,models.get,models.delete,files.create,files.get,files.delete,files.list,fine_tunes.list,fine_tunes.create,fine_tunes.get,fine_tunes.results,fine_tunes.events,fine_tunes.follow,fine_tunes.cancel,fine_tunes.delete,image.create,image.create_edit,image.create_variation,audio.transcribe,audio.translate}
                        All API subcommands

options:
  -h, --help            show this help message and exit
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spicedb-operator

# spicedb-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spicedb-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spicedb-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SpiceDB Operator is a Kubernetes operator for managing SpiceDB clusters, providing automated deployment, scaling, and management of SpiceDB instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `spicedb-operator` image is designed to be a drop-in replacement for the upstream [`authzed/spicedb-operator`](https://github.com/authzed/spicedb-operator) image.

## Getting Started

### Installing the SpiceDB Operator

To install the SpiceDB Operator on your Kubernetes cluster, first download the operator bundle:

```sh
curl -LO https://github.com/authzed/spicedb-operator/releases/latest/download/bundle.yaml
```

Then replace the operator image with the Chainguard image and apply:

```sh
sed -i 's|ghcr.io/authzed/spicedb-operator:.*|cgr.dev/ORGANIZATION/spicedb-operator:latest|g' bundle.yaml
kubectl apply --server-side -f bundle.yaml
```

### Creating a SpiceDB Cluster with FIPS-Compliant Components

Once the operator is installed, you can create a SpiceDB cluster:

```yaml
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: spicedb-config
  namespace: default
stringData:
  preshared_key: "somerandomkeyatleastthirtytwocharacters"
  datastore_uri: "memory://"
---
apiVersion: authzed.com/v1alpha1
kind: SpiceDBCluster
metadata:
  name: spicedb
  namespace: default
spec:
  config:
    replicas: 1
    datastoreEngine: memory
    # Use FIPS-compliant SpiceDB image:
    image: "cgr.dev/ORGANIZATION/spicedb:latest"
  secretName: spicedb-config
EOF
```

For detailed configuration options, see the [SpiceDB Operator documentation](https://github.com/authzed/spicedb-operator).

## Documentation and Resources

* [SpiceDB Operator Documentation](https://github.com/authzed/spicedb-operator)
* [SpiceDB Documentation](https://authzed.com/docs/spicedb/getting-started/discovering-spicedb)
* [SpiceDB on GitHub](https://github.com/authzed/spicedb)
* [Authzed Community Discord](https://authzed.com/discord)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-bundle

# valkey-bundle
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-bundle` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-bundle/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey bundle with pre-installed modules for extended functionality.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `valkey-bundle` image is based on the upstream [Valkey](https://github.com/valkey-io/valkey) project and includes several popular Valkey modules pre-installed:

- **valkey-bloom**: Probabilistic data structures (Bloom filters, Cuckoo filters, Count-Min Sketch, Top-K)
- **valkey-json**: Native JSON data type support
- **valkey-search**: Full-text search and secondary indexing
- **valkey-ldap**: LDAP authentication support

This image differs from the standard `valkey` image in the following ways:

- Includes pre-loaded modules for extended functionality
- Uses `bundle-docker-entrypoint.sh` as the entrypoint to automatically load modules

> [!NOTE]
> For Valkey 8.0, the bloom module uses `valkey-bloom` built with `--features valkey_8_0` for compatibility.
> For Valkey <9.0, the bloom module uses an older version of `valkey-search` for compatibility.

## Getting Started

To run `valkey-bundle` with Docker:

```sh
docker run -p 6379:6379 cgr.dev/ORGANIZATION/valkey-bundle:latest
```

You should see output indicating that Valkey has started with the modules loaded.

To verify the modules are loaded, connect with the Valkey CLI:

```sh
docker run --rm -it cgr.dev/ORGANIZATION/valkey-bundle:latest valkey-cli -h host.docker.internal MODULE LIST
```

This will display a list of loaded modules including bloom, json, and search.

## Using Valkey Modules

### JSON Module

The JSON module provides native support for storing, updating, and querying JSON documents directly in Valkey. This eliminates the need to serialize/deserialize JSON data in your application code, enabling atomic operations on nested JSON structures and efficient memory usage through binary storage.

**Example: Store and retrieve JSON data:**

```sh
valkey-cli JSON.SET user:1 $ '{"name":"Alice","age":30}'
```
```
OK
```

```sh
valkey-cli JSON.GET user:1 $.name
```
```
"[\"Alice\"]"
```

### Bloom Filter Module

The Bloom module provides probabilistic data structures for efficient membership testing and cardinality estimation. Bloom filters allow you to check if an element "possibly exists" or "definitely does not exist" in a set, using significantly less memory than storing the actual elements.

**Example: Create a Bloom filter and test membership:**

```sh
valkey-cli BF.ADD myfilter item1
```
```
(integer) 1
```

```sh
valkey-cli BF.EXISTS myfilter item1
```
```
(integer) 1
```

### Search Module

The Search module adds full-text search and secondary indexing capabilities to Valkey. It enables complex queries across your data without external search infrastructure, supporting text search, numeric filtering, geo-spatial queries, and aggregations.

**Example: Create a search index on JSON documents:**

```sh
valkey-cli FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC
```
```
OK
```

```sh
valkey-cli FT.SEARCH idx:users "@name:Alice"
```

## Users and Directories

By default, this image runs as a non-root user named `valkey` with a uid of 65532. The default working directory is `/data`, which is writable by the `valkey` user.

## Documentation and Resources

- [Valkey Documentation](https://valkey.io/docs/)
- [Valkey GitHub Repository](https://github.com/valkey-io/valkey)
- [Valkey-Bundle GitHub Repository](https://github.com/valkey-io/valkey-bundle)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tofu-controller-fips

# tofu-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tofu-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tofu-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A GitOps OpenTofu and Terraform controller for Flux

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`tofu-controller-fips` is composed of multiple images:
- `cgr.dev/ORGANIZATION/tofu-controller-fips:latest`
- `cgr.dev/ORGANIZATION/tofu-controller-runner-fips:latest`

The container images are comparable to the official `v16.0.0-rc.x` ***pre-release*** version of [tofu-controller](https://github.com/flux-iac/tofu-controller/pkgs/container/tofu-controller/338509733?tag=latest) and [tf-runner](https://github.com/flux-iac/tf-runner-images/pkgs/container/tf-runner/338515834?tag=latest) images.

## FIPS Notes

Some images may include GnuPG, gpgme, and `libgcrypt` cryptographic modules in unapproved mode. The majority of Git repositories use SHA-1 for commit and tag identification, which can optionally be signed with GPG, SSH or S/MIME. SHA-1 is deprecated and will be [unapproved after 2030](https://www.nist.gov/news-events/news/2022/12/nist-retires-sha-1-cryptographic-algorithm). Please consider using SSH & S/MIME signing options with [SHA256](https://about.gitlab.com/blog/2024/08/19/gitlab-now-supports-sha256-repositories/) repositories.

## Getting Started
To deploy `tofu-controller`, you can follow the steps below:

#### Prerequisites

* `helm`
* `flux v2.0+`

> [!NOTE]
> Before using `tofu-controller`, you have to install `Flux v2.0+`
> > Flux and it's related CRDs were deployed via `kubectl` through the official install manifests: [Flux Releases](https://github.com/fluxcd/flux2/releases)
> All example resources are deployed into the `flux-system` namespace.
> For more detail about the configurations options you can refer to the official [Flux configuration documentation](https://fluxcd.io/flux/installation/configuration/).

#### Install Flux
1. Install flux operator and related CRDs via kubectl
```shell
kubectl apply -f https://github.com/fluxcd/flux2/releases/latest/download/install.yaml
```

2. Verify CRDs have been established
```shell
kubectl wait --for=condition=Established crd --all -n flux-system --timeout=60s
```

3. Verify all flux related pods are ready
```shell
kubectl wait --for=condition=ready -n flux-system pod -l app=helm-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=image-automation-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=image-reflector-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=kustomize-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=notification-controller --timeout=30s
kubectl wait --for=condition=ready -n flux-system pod -l app=source-controller --timeout=30s
```

### Install tofu-controller via Helm using `values.yaml`
1. Create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
# -- Controller-specific configurations
image:
  # -- Controller image repository
  repository: cgr.dev/ORGANIZATION/tofu-controller-fips
  # -- Controller image pull policy
  pullPolicy: IfNotPresent
  # -- Controller image tag
  tag: "latest"

# -- Runner-specific configurations
runner:
  image:
    # -- Runner image repository
    repository: cgr.dev/ORGANIZATION/tofu-controller-runner-fips
    # -- Controller image pull policy
    pullPolicy: IfNotPresent
    # -- Runner image tag
    tag: "latest"
EOF
```

2. Install the Helm chart for Rancher Fleet using the following command:

```shell
helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
    fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet \
    fleet/fleet  --values values.yaml
```

3. Verify that the tofu-controller pod is up and running
```shell
kubectl wait --for=condition=ready -n flux-system pod -l app.kubernetes.io/name=tofu-controller --timeout=60s
```

You should now have Chainguard `tofu-controller` with a Chainguard `tf-runner` running in your cluster.

## Documentation and Resources

- [Tofu-Controller Docs](https://flux-iac.github.io/tofu-controller/)
- [Tofu-Controller Helm Chart Docs](https://github.com/flux-iac/tofu-controller/tree/main/charts/tofu-controller)
- [Flux Docs](https://fluxcd.io/flux/get-started/)
- [Flux Operator Docs](https://fluxcd.control-plane.io/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubo

# kubo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based container image for the IPFS Kubo (go-ipfs) node.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a minimal, secure, and regularly updated container for [IPFS Kubo](https://github.com/ipfs/kubo) (formerly go-ipfs). It is comparable to the [official Kubo image](https://hub.docker.com/r/ipfs/kubo/), but is built with Wolfi for a reduced attack surface and improved supply chain security. 

**Note:** WebTransport is not supported in this image due to FIPS-compliance requirements in some builds. This image does not include a shell or package manager.

## Getting Started

To run an IPFS Kubo node using this image:

```sh
docker run -d --name ipfs-kubo -p 4001:4001 -p 5001:5001 -p 8080:8080 cgr.dev/ORGANIZATION/kubo:latest daemon
```

- `4001` is the libp2p swarm port
- `5001` is the API port
- `8080` is the HTTP gateway port

You can now interact with your node using the [IPFS CLI](https://docs.ipfs.tech/install/command-line/) or the HTTP API.

Guide to Install IPFS Kubo inside Docker, refer to the [official Kubo documentation](https://docs.ipfs.tech/how-to/run-ipfs-inside-docker/).

## Documentation and Resources

- [IPFS Documentation](https://docs.ipfs.tech/)
- [Kubo GitHub Repository](https://github.com/ipfs/kubo)
- [IPFS HTTP API Reference](https://docs.ipfs.tech/reference/http/api/)
- [Running IPFS in Docker](https://docs.ipfs.tech/how-to/run-ipfs-inside-docker/)

## What are Chainguard Containers?

[Chainguard Containers](https://www.chainguard.dev/containers?utm_source=readmes) are minimal container images that are secure by default. 

In many cases, the Chainguard Containers tagged as `:latest` contain only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager. Chainguard Containers are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_ designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with a `-dev` variant.

Although the `-dev` container image variants have similar security features as their more minimal versions, they feature additional software that is typically not necessary in production environments. We recommend using multi-stage builds to leverage the `-dev` variants, copying application artifacts into a final minimal container that offers a reduced attack surface that won't allow package installations or logins.

## Learn More

To better understand how to work with Chainguard Containers, please visit [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes) and [Chainguard Courses](https://courses.chainguard.dev/?utm_source=readmes).

In addition to [Containers](https://www.chainguard.dev/containers?utm_source=readmes), Chainguard offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes). [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) to access additional products. 

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### influxdb

# influxdb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/influxdb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/influxdb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with influxdb.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Influxdb

The Chainguard Influxdb image contains the `influxd` server binary, the `influx` client, and the docker `entrypoint.sh` script.

The entrypoint script contains logic to bootstrap, initialize, and upgrade existing installations.
For full documentation, see the [script docs](https://hub.docker.com/_/influxdb).

This image can be run directly:

```shell
$ docker run -p 8086:8086 cgr.dev/chainguard/influxdb:latest
2023-04-15T11:56:12.%NZ warn    boltdb not found at configured path, but DOCKER_INFLUXDB_INIT_MODE not specified, skipping setup wrapper        {"system": "docker", "bolt_path": ""}
ts=2023-04-15T11:56:12.323316Z lvl=info msg="Welcome to InfluxDB" log_id=0hDCD0dW000 version=v2.7.0 commit=85f725f build_date=2023-04-15T11:56:12Z log_level=info
ts=2023-04-15T11:56:12.323358Z lvl=warn msg="nats-port argument is deprecated and unused" log_id=0hDCD0dW000
ts=2023-04-15T11:56:12.326781Z lvl=info msg="Resources opened" log_id=0hDCD0dW000 service=bolt path=/var/lib/influxdb2/influxd.bolt
ts=2023-04-15T11:56:12.326920Z lvl=info msg="Resources opened" log_id=0hDCD0dW000 service=sqlite path=/var/lib/influxdb2/influxd.sqlite
ts=2023-04-15T11:56:12.327433Z lvl=info msg="Bringing up metadata migrations" log_id=0hDCD0dW000 service="KV migrations" migration_count=20
ts=2023-04-15T11:56:12.352187Z lvl=info msg="Bringing up metadata migrations" log_id=0hDCD0dW000 service="SQL migrations" migration_count=8
ts=2023-04-15T11:56:12.370027Z lvl=info msg="Using data dir" log_id=0hDCD0dW000 service=storage-engine service=store path=/var/lib/influxdb2/engine/data
ts=2023-04-15T11:56:12.370132Z lvl=info msg="Compaction settings" log_id=0hDCD0dW000 service=storage-engine service=store max_concurrent_compactions=6 throughput_bytes_per_second=50331648 throughput_bytes_per_second_burst=50331648
ts=2023-04-15T11:56:12.370144Z lvl=info msg="Open store (start)" log_id=0hDCD0dW000 service=storage-engine service=store op_name=tsdb_open op_event=start
ts=2023-04-15T11:56:12.370198Z lvl=info msg="Open store (end)" log_id=0hDCD0dW000 service=storage-engine service=store op_name=tsdb_open op_event=end op_elapsed=0.055ms
ts=2023-04-15T11:56:12.370254Z lvl=info msg="Starting retention policy enforcement service" log_id=0hDCD0dW000 service=retention check_interval=30m
ts=2023-04-15T11:56:12.370273Z lvl=info msg="Starting precreation service" log_id=0hDCD0dW000 service=shard-precreation check_interval=10m advance_period=30m
ts=2023-04-15T11:56:12.371172Z lvl=info msg="Starting query controller" log_id=0hDCD0dW000 service=storage-reads concurrency_quota=1024 initial_memory_bytes_quota_per_query=9223372036854775807 memory_bytes_quota_per_query=9223372036854775807 max_memory_bytes=0 queue_size=1024
ts=2023-04-15T11:56:12.373840Z lvl=info msg="Configuring InfluxQL statement executor (zeros indicate unlimited)." log_id=0hDCD0dW000 max_select_point=0 max_select_series=0 max_select_buckets=0
ts=2023-04-15T11:56:12.378435Z lvl=info msg=Starting log_id=0hDCD0dW000 service=telemetry interval=8h
ts=2023-04-15T11:56:12.378653Z lvl=info msg=Listening log_id=0hDCD0dW000 service=tcp-listener transport=http addr=:8086 port=8086
```

Or using the helm chart:

```shell
$ helm repo add influxdata https://helm.influxdata.com/
$ helm upgrade --install influxdb \
    influxdata/influxdb2 \
    --set image.repository=cgr.dev/chainguard/influxdb \
    --set image.tag=latest-arm64
Release "influxdb" does not exist. Installing it now.
NAME: influxdb
LAST DEPLOYED: Sat Apr 15 07:57:28 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
InfluxDB 2 is deployed as a StatefulSet on your cluster.

You can access it by using the service name: influxdb-influxdb2

To retrieve the password for the 'admin' user:

  echo $(kubectl get secret influxdb-influxdb2-auth -o "jsonpath={.data['admin-password']}" --namespace default | base64 --decode)

Note: with enabled persistence, admin password is only set once during the initial deployment. The password is not changed when InfluxDB 2 is re-deployed with different password.
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### strimzi-kafka-operator

# strimzi-kafka-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/strimzi-kafka-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/strimzi-kafka-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Strimzi provides a way to run an Apache Kafka cluster on Kubernetes in various deployment configurations.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

It provides a way to run an Apache Kafka cluster on Kubernetes in various deployment configurations.

One of the quickest ways to deploy Strimzi Kafka Operator is to use the Helm chart. [Here](https://strimzi.io/quickstarts/) is the quick start guide to deploy Strimzi Kafka Operator using Helm.

```bash
helm install strimzi-cluster-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator
helm install strimzi-cluster-operator \
    --set replicas=2 \
    --version 0.35.0 \
    oci://quay.io/strimzi-helm/strimzi-kafka-operator
```

but you have to patch the deployment because in Helm it is not possible to override image in a way you expect, so:

```bash
kubectl patch deployment strimzi-cluster-operator -n kafka --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"cgr.dev/chainguard/strimzi-kafka-operator:latest"}]'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-77

# request-77
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-77` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-77/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-server-iamguarded

# metrics-server-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-server-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-server-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Metrics Server is a Kubernetes component that collects and provides resource usage metrics (CPU, memory) for nodes and pods

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Metrics Server IAMGuarded is a security-enhanced variant of metrics-server designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard metrics-server deployments.

## Helm Chart Installation

The Metrics Server IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install metrics-server oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main metrics-server image
image:
  registry: myregistry.example.com
  repository: mirrored/metrics-server-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install metrics-server oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/metrics-server:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Metrics Server IAMGuarded installation by checking that metrics are being exposed correctly:

```bash
# Check if metrics-server is running
kubectl get pods -n kube-system | grep metrics-server

# Test metrics API
kubectl top nodes
kubectl top pods --all-namespaces
```

The deployment functions as a standard metrics-server instance, so all typical metrics-server validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Metrics Server IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both metrics-server and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-agent

# rancher-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Rancher Agent is responsible for communicating between the managed Kubernetes clusters and the Rancher server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The Rancher agent is typically deployed as a DaemonSet or a Deployment depending on the type of the agent in a Kubernetes cluster.

There is a detailed explanation about Rancher Agents in the [official Rancher documentation](https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/launch-kubernetes-with-rancher/about-rancher-agents).

There are some problems around configuring the Rancher agent's image in Kubernetes. There is an open issue on the Rancher GitHub repository that discusses the problem, [here](https://github.com/rancher/rancher/issues/40696).

In case you would like to configure the `cattle-cluster-agent`, the way you can do it is use the `kubectl patch` command with a proper patch file:

```yaml
$ cat configure-image-patch.yaml
spec:
  template:
    spec:
      containers:
      - name: cluster-register
        image: cgr.dev/chainguard/rancher-agent:latest

kubectl patch deployment cattle-cluster-agent --patch-file p.yaml -n cattle-system
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-iamguarded

# thanos-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Highly available Prometheus setup with long term storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Thanos IAMGuarded is a security-enhanced variant of Thanos designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Thanos deployments.

## Helm Chart Installation

The Thanos IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/thanos
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install thanos oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Thanos image
image:
  registry: myregistry.example.com
  repository: mirrored/thanos-iamguarded
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
# MinIO chart images
minio:
  image:
    registry: myregistry.example.com
    repository: mirrored/minio-iamguarded
    digest: sha256:... # Use specific digest instead of tag
  client:
    image:
      registry: myregistry.example.com
      repository: mirrored/minio-client-iamguarded
      digest: sha256:... # Use specific digest instead of tag
  defaultInitContainers:
    volumePermissions:
      image:
        registry: myregistry.example.com
        repository: mirrored/os-shell-iamguarded
        digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install thanos oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/thanos:3.0.4
   Digest: sha256:083c999b293bd86aa63204e7a41325efa2c2ac4bca21cbd890b5eb5897d243ec
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Thanos IAMGuarded installation using standard Thanos verification methods. The deployment functions as a standard Thanos instance, so all typical Thanos validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Thanos IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Thanos and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-secrets-fips

# external-secrets-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-secrets-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-secrets-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Fetches secrets from external systems and exposes them as Kubernetes Secrets.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to 'ghcr.io/external-secrets/external-secrets'.
Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started

This image can be deployed by leveraging the [external secrets helm chart](https://external-secrets.io/latest).

Create a `values.yaml` file, specifying the Chainguard image:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/external-secrets-fips
  tag: latest

installCRDs: true

webhook:
  image:
    repository: cgr.dev/ORGANIZATION/external-secrets-fips
    tag: latest

certController:
  image:
    repository: cgr.dev/ORGANIZATION/external-secrets-fips
    tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add external-secrets https://charts.external-secrets.io
helm repo update
helm install external-secrets external-secrets/external-secrets -n external-secrets-system -f values.yaml --create-namespace
```

## Documentation and Resources

- [External Secrets Operator Documentation](https://external-secrets.io/)
- [External Secrets GitHub Repository](https://github.com/external-secrets/external-secrets)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-aws-controller

# cluster-api-aws-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-aws-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-aws-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API Provider AWS provides consistent deployment and day 2 operations of "self-managed" and EKS Kubernetes clusters on AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-aws-controller image is compatible with the upstream [Cluster API Provider AWS](https://github.com/kubernetes-sigs/cluster-api-provider-aws). This image contains only the minimum set of dependencies needed to run the AWS infrastructure provider components.

## Getting Started

The Cluster API Provider for AWS enables you to create and manage Kubernetes clusters on Amazon Web Services using Cluster API. It provides declarative APIs for provisioning and managing AWS infrastructure resources including EC2 instances, VPCs, load balancers, and security groups.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Amazon Web Services account with appropriate permissions
- AWS credentials configured (AWS CLI, IAM roles, or environment variables)

### Installation

Initialize the AWS infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure aws
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: aws
  namespace: aws-infrastructure-system
spec:
  version: v2.8.4
  configSecret:
    name: aws-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-aws-controller:latest
EOF
```

### Usage Example

Create an AWS cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSCluster
metadata:
  name: my-aws-cluster
  namespace: default
spec:
  region: us-east-1
  network:
    vpc:
      id: ""
  controlPlaneEndpoint:
    host: "1.2.3.4"
    port: 6443
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: AWSMachineTemplate
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      instanceType: t3.medium
      ami:
        id: ami-12345678
      publicIP: true
      rootVolume:
        size: 50
        type: gp3
```

### Configuration

The controller requires AWS credentials with the following IAM permissions:
- EC2 Full Access or equivalent granular permissions
- ELB (Elastic Load Balancer) management permissions
- VPC and networking management permissions
- IAM permissions for service-linked roles

Create and configure the credentials secret:

```bash
kubectl create secret generic aws-credentials \
  --from-literal="AWS_B64ENCODED_CREDENTIALS=$(base64 -w0 < ./aws-credentials)" \
  --namespace aws-infrastructure-system
```

Where `aws-credentials` file contains:
```
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
```

## Documentation and Resources

* [Cluster API Provider AWS GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-aws)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Amazon Web Services Documentation](https://docs.aws.amazon.com/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-redis-exporter-iamguarded-fips

# prometheus-redis-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-redis-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-redis-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus Redis Exporter image for exporting metrics to Redis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Redis Exporter IAMGuarded FIPS is a FIPS-compliant security-enhanced variant of Redis designed to be deployed using multiple IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Redis deployments with FIPS 140-2 compliance.

## Helm Chart Installation

The Redis IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Redis server image
image:
  registry: myregistry.example.com
  repository: mirrored/redis-server-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Redis Sentinel image for high availability
sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-sentinel-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctl:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Redis exporter for metrics
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# kubectl image for management operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication
For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/redis:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Redis IAMGuarded FIPS installation using standard Redis verification methods. The deployment functions as a standard Redis instance, so all typical Redis validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Redis IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both Redis and Kubernetes environments. This FIPS-compliant variant ensures cryptographic operations meet FIPS 140-2 standards. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

### Redis Cluster

For sharded, distributed Redis deployments with FIPS compliance, use the Redis Cluster chart:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster
```

#### Basic Installation

```bash
helm install redis-cluster oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

#### Configuration

The Redis Cluster chart uses the following FIPS-compliant images from this module:

- **redis-cluster-iamguarded-fips**: Main Redis Cluster nodes with FIPS compliance
- **os-shell-iamguarded-fips**: Volume permissions initialization with FIPS compliance
- **prometheus-redis-exporter-iamguarded-fips**: Metrics collection with FIPS compliance (when enabled)

Example configuration with custom registry:

```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/redis-cluster-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:...
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### langfuse-fips

# langfuse-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/langfuse-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/langfuse-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Langfuse is an open-source observability and analytics platform for LLM applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Langfuse is an open-source LLM observability and analytics platform. Chainguard's langfuse container images are comparable to the standard [Langfuse images available on Docker Hub](https://hub.docker.com/u/langfuse). However, the Chainguard images contain only the minimum set of tools and dependencies needed to function. This means it does not include things like a shell or a package manager.

### FIPS Support

The `langfuse-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

### langfuse-web-fips

The `langfuse-web-fips` image contains the [langfuse frontend](https://github.com/langfuse/langfuse/tree/main/web). Chainguard's langfuse-web container image is comparable to the upstream `langfuse/langfuse` image available on [Docker Hub](https://hub.docker.com/r/langfuse/langfuse).

### langfuse-worker-fips

The `langfuse-worker-fips` image contains the [langfuse backend](https://github.com/langfuse/langfuse/tree/main/worker). Chainguard's langfuse-worker container image is comparable to the upstream langfuse/langfuse-worker image available on [Docker Hub](https://hub.docker.com/r/langfuse/langfuse-worker). 

## Getting Started Guide

### Deploying with Helm

The most common deployment case is to use the Langfuse Helm chart, which can be deployed as follows:

```bash
cat <<EOF > values.yaml
langfuse:
  web:
    deploy: true
    image:
      repository: cgr.dev/ORGANIZATION/langfuse
      tag: latest
  worker:
    deploy: true
    image:
      repository: cgr.dev/ORGANIZATION/langfuse-worker
      tag: latest
EOF
```
Then install the helm chart with the following command
```bash
helm install langfuse-worker langfuse \
  --repo https://langfuse.github.io/langfuse-k8s \
  --namespace default \
  --create-namespace \
  --values values.yaml
```

## Documentation and Resources:

- [Langfuse Github Repository](https://github.com/langfuse/langfuse)
- [Langfuse Quickstart Guide](https://langfuse.com/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-server

# temporal-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image for [Temporal](https://docs.temporal.io/), a durable execution platform that handles intermittent failures and retries failed operations

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The default entrypoint for this image is `/etc/temporal/entrypoint.sh`

To test:

```shell
$ docker run cgr.dev/chainguard/temporal-server:latest start --config <config dir path relative to root (default: "config")>

USAGE:
   temporal-server [global options] command [command options]  

VERSION:
   1.22.0

COMMANDS:
   start    Start Temporal server
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --root value, -r value    root directory of execution environment (default: ".") [$TEMPORAL_ROOT]
   --config value, -c value  config dir path relative to root (default: "config") [$TEMPORAL_CONFIG_DIR]
   --env value, -e value     runtime environment (default: "development") [$TEMPORAL_ENVIRONMENT]
   --zone value, --az value  availability zone [$TEMPORAL_AVAILABILITY_ZONE, $TEMPORAL_AVAILABILTY_ZONE]
   --allow-no-auth           allow no authorizer (default: false) [$TEMPORAL_ALLOW_NO_AUTH]
   --help, -h                show help (default: false)
   --version, -v             print the version (default: false)
```

Notes: 

* Here's the docker compose repo link for further reference on how this image can run https://github.com/temporalio/docker-compose
* For Helm Chart working, here's the reference: https://github.com/temporalio/helm-charts/tree/master#install-temporal-with-helm-chart 
TLDR, for a minimal helm installation:

```
helm -n temporaltest install \
    --set server.replicaCount=1 \
    --namespace temporaltest \
    --create-namespace \
    --set cassandra.config.cluster_size=1 \
    --set prometheus.enabled=false \
    --set grafana.enabled=false \
    --set elasticsearch.enabled=false \
    --set server.image.repository=cgr.dev/chainguard/temporal-server \
    --set server.image.tag=latest \
    temporaltest . --timeout 15m
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cilium-envoy-fips

# cilium-envoy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cilium-envoy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cilium-envoy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cilium-envoy-fips is a FIPS 140-3 compliant, specialized Envoy proxy used by Cilium for Layer 7 policy enforcement and service mesh functionality.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS 140-3 Compliance

This image is designed to be compliant with FIPS 140-3 standards. It includes:

- FIPS-validated cryptographic modules
- Configuration enforcing the use of FIPS-approved algorithms and key sizes
- Removal of non-compliant cryptographic functions

The cilium-envoy-fips image uses Chainguard's FIPS 140-3 validated OpenSSL provider for all cryptographic operations.

## Compatibility Notes

This image is compatible with the quay.io/cilium/cilium-envoy image and can be used as a drop-in replacement in Cilium deployments where FIPS compliance is required. It provides the same functionality as the standard cilium-envoy image but with FIPS-compliant cryptography.

### cilium-envoy-fips runs as root by default

Matching the public counterpart image, the Chainguard image runs as root by default.

If you need to use a non-root user, specify `1337` as the runAsUser in the cilium Helm chart:

```yaml
# values.yaml

envoy:
  podSecurityContext:
    runAsUser: 1337
```

## Getting Started

### Docker

The cilium-envoy-fips container requires specific Linux capabilities to function properly:

```bash
docker run --rm \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_ADMIN \
  --cap-add=BPF \
  cgr.dev/ORGANIZATION/cilium-envoy-fips:latest cilium-envoy --version
```

### Kubernetes/Helm

To use the FIPS-compliant image with a Cilium deployment, configure the Cilium Helm chart to use this custom image:

1. Create a `values.yaml` file with the following content:

```yaml
envoy:
  image:
    override: true
    repository: cgr.dev/ORGANIZATION/cilium-envoy-fips
    tag: latest
    pullPolicy: IfNotPresent
```

2. Install or upgrade Cilium with the custom values:

```bash
helm upgrade --install cilium cilium/cilium \
  --namespace kube-system \
  --values values.yaml
```

### Required Capabilities

The cilium-envoy-fips container requires the following Linux capabilities:

- `CAP_NET_ADMIN`: Required for network operations
- `CAP_SYS_ADMIN` or `CAP_BPF`: Required for BPF operations

## Documentation and Resources

* [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
* [Cilium Documentation](https://docs.cilium.io/)
* [Cilium Proxy Repository](https://github.com/cilium/proxy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### imagemagick

# imagemagick
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/imagemagick` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/imagemagick/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ImageMagick® is a free and open-source software suite, used for editing and manipulating digital images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard ImageMagick Image is meant to provide ImageMagick [command-line tools](https://imagemagick.org/script/command-line-tools.php) in a container.  It currently does not have an external counterpart image.  Like most other Chainguard Images, the imagemagick image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The current `imagemagick` image has no entrypoint, so any ImageMagick commands and/or subcommands passed to this image should work, with the comprehensive list of available tools found [here](https://imagemagick.org/script/command-line-tools.php).

For example, the following command will convert a JPEG image to a PNG:

```shell
docker run -v host/path/to/images:/container/path/to/images --rm cgr.dev/ORGANIZATION/imagemagick:latest magick /container/path/to/images/my-image.jpeg /container/path/to/images/my-image.png
```

> [!NOTE]
> In order to manipulate image files, they need to be mounted into the running container via a volume.

## Documentation and Resources

* [ImageMagick 7.x Command-line Processing Documentation](https://imagemagick.org/script/command-line-processing.php).
* [Legacy Command-line Processing Documentation](https://legacy.imagemagick.org/script/command-line-processing.php).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### descheduler-fips

# descheduler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/descheduler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/descheduler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Descheduler is a tool that evicts pods from nodes based on configurable policies to improve cluster balance, resource utilization, and scheduling efficiency.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard image for Kubernetes descheduler is comparable to the official
image linked in [the projects documentation](https://github.com/kubernetes-sigs/descheduler?tab=readme-ov-file#%EF%B8%8F--documentation-versions-by-release).

Similar to the upstream image, our image does not contain a shell or a package
manager, and only the minimum set of tools and dependencies needed to function.

## Getting started

The Chainguard image for Kubernetes descheduler can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/descheduler/descheduler).

Add the helm repository:

```bash
helm repo add descheduler https://kubernetes-sigs.github.io/descheduler/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:

```bash
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/descheduler-fips
  tag: latest
```

Deploy using helm:

```bash
helm install --namespace kube-system descheduler descheduler/descheduler -f values.yaml
```

## Documentation and Resources

For more information on how to deploy and configure kubernetes scheduler, please
refer to the [GitHub project documentation](https://github.com/kubernetes-sigs/descheduler).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ingress-nginx-controller

# ingress-nginx-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ingress-nginx-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ingress-nginx-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 Ingress-NGINX Controller for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The `ingress-nginx-controller` Chainguard image is a drop-in replacement for the `ingress-nginx` image from the [`kubernetes.github.io/ingress-nginx`](https://kubernetes.github.io/ingress-nginx) repository. To install with the upstream Helm chart you could run the following commands:

```bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
cat <<EOF > values.yaml
controller:
  image:
    registry: cgr.dev
    image: ORGANIZATION/ingress-nginx-controller
    tag: latest
    digest: null
EOF
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx -f values.yaml
```
Rather than using `latest` we recommend using a named version and setting the digest value as appropriate. To keep the version and digest updated automatically you can use [Renovate](https://edu.chainguard.dev/chainguard/chainguard-images/staying-secure/updating-images/renovate/) or [Digestabot](https://edu.chainguard.dev/chainguard/chainguard-images/staying-secure/updating-images/digestabot/)

## `ingress-nginx-custom-error-pages`

The `ingress-nginx-custom-error-pages` Chainguard image is a drop-in replacement for the upstream `registry.k8s.io/ingress-nginx/custom-error-pages` image.

To install with the upstream helm chart you could use the following `values.yaml`:

```bash
cat <<EOF > values.yaml
defaultBackend:
  enabled: true
  image:
    registry: cgr.dev
    image: ORGANIZATION/ingress-nginx-custom-error-pages
    tag: latest
EOF
```

For more information about the Custom Errors image, please refer to [the official documentation](https://kubernetes.github.io/ingress-nginx/examples/customization/custom-errors/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-extension-installer

# argocd-extension-installer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-extension-installer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-extension-installer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Install Argo CD extensions using init-containers

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To get more detail about how to use this installer, please refer to the [Install UI Extensions](https://github.com/argoproj-labs/argocd-extension-metrics#install-ui-extension).

The yaml file below is an example of how to define a kustomize patch to install this UI extension:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-server
spec:
  template:
    spec:
      initContainers:
        - name: extension-metrics
          image: cgr.dev/chainguard/argocd-extension-installer:latest
          env:
          - name: EXTENSION_URL
            value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension.tar.gz
          - name: EXTENSION_CHECKSUM_URL
            value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension_checksums.txt
          volumeMounts:
            - name: extensions
              mountPath: /tmp/extensions/
          securityContext:
            runAsUser: 1000
            allowPrivilegeEscalation: false
      containers:
        - name: argocd-server
          volumeMounts:
            - name: extensions
              mountPath: /tmp/extensions/
      volumes:
        - name: extensions
          emptyDir: {}

```

or you can use the following settings while installing the ArgoCD server through Helm:

```yaml
...
  ## Argo CD extensions
  ## This function in tech preview stage, do expect instability or breaking changes in newer versions.
  ## Ref: https://github.com/argoproj-labs/argocd-extension-installer
  ## When you enable extensions, you need to configure RBAC of logged in Argo CD user.
  ## Ref: https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/#the-extensions-resource
  extensions:
    # -- Enable support for Argo CD extensions
    enabled: false

    ## Argo CD extension installer image
    image:
      # -- Repository to use for extension installer image
      repository: "quay.io/argoprojlabs/argocd-extension-installer"
      # -- Tag to use for extension installer image
      tag: "v0.0.1"
      # -- Image pull policy for extensions
      # @default -- `""` (defaults to global.image.imagePullPolicy)
      imagePullPolicy: ""

    # -- Extensions for Argo CD
    # @default -- `[]` (See [values.yaml])
    ## Ref: https://github.com/argoproj-labs/argocd-extension-metrics#install-ui-extension
    extensionList: []
    #  - name: extension-metrics
    #    env:
    #      - name: EXTENSION_URL
    #        value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension.tar.gz
    #      - name: EXTENSION_CHECKSUM_URL
    #     
...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bash-fips

# bash-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bash-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bash-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `bash-fips` container image is comparable to the upstream [GNU Bash](https://www.gnu.org/software/bash/) shell with FIPS-validated cryptographic libraries.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Run interactive bash commands:

```shell
docker run --rm cgr.dev/ORGANIZATION/bash-fips:latest -c "echo 'Hello from FIPS bash'"
```

Execute a bash script by mounting it into the container:

```shell
cat > script.sh <<EOF
#!/bin/bash
echo "FIPS-enabled bash script running"
echo "Current date: \$(date)"
EOF

chmod +x script.sh
docker run --rm -v $(pwd)/script.sh:/script.sh cgr.dev/ORGANIZATION/bash-fips:latest /script.sh
```
```
FIPS-enabled bash script running
Current date: Tue Jun 17 20:01:59 UTC 2025
```

You can also test that FIPS mode is active with the following command:

```shell
docker run --rm cgr.dev/ORGANIZATION/bash-fips:latest -c "openssl-fips-test"
```

This uses Chainguard's [`openssl-fips-test` tool](https://github.com/chainguard-dev/openssl-fips-test) to test whether or not OpenSSL is properly configured to use its FIPS module:

```
Checking OpenSSL lifecycle assurance.
*** Running check: FIPS module is available...
    HMAC : (KAT_Integrity) : Pass
    SHA1 : (KAT_Digest) : Pass
    SHA2 : (KAT_Digest) : Pass
    [... additional validation tests ...]
*** Running check: EVP_default_properties_is_fips_enabled returns true... passed.
*** Running check: verify unapproved cryptographic routines are not available by default (e.g. MD5)... passed.

Lifecycle assurance satisfied.
```

## Documentation and Resources

- [GNU Bash Documentation](https://www.gnu.org/software/bash/manual/)
- [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-microsoft-azure-fips

# velero-plugin-for-microsoft-azure-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-microsoft-azure-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-microsoft-azure-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Velero plugin for Microsoft Azure that provides backup and restore functionality for Azure Blob Storage and Azure Disk snapshots

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Compliance

This FIPS-compliant version of the velero-plugin-for-microsoft-azure image is built with FIPS 140-3 validated cryptographic modules, ensuring compliance with federal security standards. The image includes hardened OpenSSL configurations that enforce FIPS-approved cryptographic algorithms for all encryption operations.

## Compatibility Notes

The `velero-plugin-for-microsoft-azure-fips` image is fully compatible with the public [Velero plugin for Microsoft Azure](https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure). This image includes both the VolumeSnapshotter and ObjectStore plugins required for Azure integration:

* **VolumeSnapshotter**: Handles Azure Disk snapshots for persistent volume backups
* **ObjectStore**: Manages backups stored in Azure Blob Storage

The plugin is designed to be used as an init container with Velero deployments, following the standard Velero plugin architecture. There are no breaking changes from the public implementation.

## Getting Started

The `velero-plugin-for-microsoft-azure-fips` image is designed to be used as an init container in Velero deployments. The image contains a `cp-plugin` command that copies the plugin binary to a shared volume where Velero can load it.

Here's an example of using this image with a Velero deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: velero
  namespace: velero
spec:
  template:
    spec:
      serviceAccountName: velero
      initContainers:
      - name: velero-plugin-for-microsoft-azure-fips
        image: cgr.dev/ORGANIZATION/velero-plugin-for-microsoft-azure-fips:latest
        volumeMounts:
        - mountPath: /target
          name: plugins
      containers:
      - name: velero
        image: cgr.dev/ORGANIZATION/velero-fips:latest
        command:
        - /velero
        args:
        - server
        - --plugin-dir=/plugins
        volumeMounts:
        - name: plugins
          mountPath: /plugins
      volumes:
      - name: plugins
        emptyDir: {}
```

When the init container runs, it will copy the plugin binary to `/target/velero-plugin-for-microsoft-azure`, making it available to the Velero server in the `/plugins` directory.

You can also install Velero with this plugin using the official Velero CLI:

```sh
velero install \
  --provider azure \
  --plugins cgr.dev/ORGANIZATION/velero-plugin-for-microsoft-azure-fips:latest \
  --bucket my-backup-bucket \
  --secret-file ./credentials-velero
```

**Note**: For full FIPS compliance, ensure you're using the FIPS-compliant Velero server image (`cgr.dev/ORGANIZATION/velero-fips:latest`) alongside this FIPS plugin.

## Configuration

To use this plugin, you'll need to configure Velero with Azure-specific settings. Create a `BackupStorageLocation` resource:

```yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: azure
  namespace: velero
spec:
  provider: velero.io/azure
  objectStorage:
    bucket: my-backup-bucket
    prefix: velero-backups
  config:
    resourceGroup: my-resource-group
    storageAccount: mystorageaccount
    subscriptionId: 00000000-0000-0000-0000-000000000000
```

For Azure Disk snapshots, create a `VolumeSnapshotLocation`:

```yaml
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
  name: azure
  namespace: velero
spec:
  provider: velero.io/azure
  config:
    resourceGroup: my-resource-group
    subscriptionId: 00000000-0000-0000-0000-000000000000
```

You'll also need to provide Azure credentials to Velero. Create a secret with your Azure service principal credentials:

```sh
cat > credentials-velero <<EOF
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_ID=<your-client-id>
AZURE_CLIENT_SECRET=<your-client-secret>
AZURE_RESOURCE_GROUP=<your-resource-group>
AZURE_CLOUD_NAME=AzurePublicCloud
EOF

kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-file cloud=credentials-velero
```

## Documentation and Resources

* [Velero plugin for Microsoft Azure documentation](https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure)
* [Velero supported providers documentation](https://velero.io/docs/supported-providers/)
* [Azure Backup documentation](https://learn.microsoft.com/en-us/azure/backup/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### graalvm-native

# graalvm-native
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/graalvm-native` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/graalvm-native/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Base image with just enough files to run native [GraalVM](https://www.graalvm.org/) native-image binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using

This image includes `glibc` and `libz`, and is designed to contain exactly what's needed to run GraalVM native-image binaries.

This image is meant to be used as a base image only, and is otherwise useless.  It contains the `wolfi-baselayout-data` package from Wolfi, which is just a set of data files needed to support glibc static binaries at runtime.

## Users

The image has a single user `nonroot` with uid `65532`, belonging to gid `65532`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-provider-aws

# secrets-store-csi-driver-provider-aws
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-provider-aws` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-provider-aws/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The AWS provider for the Secrets Store CSI Driver allows you to fetch secrets from AWS Secrets Manager and AWS Systems Manager Parameter Store, and mount them into Kubernetes pods.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The [official docs](https://github.com/aws/secrets-store-csi-driver-provider-aws/tree/main?tab=readme-ov-file#aws-secrets-manager-and-config-provider-for-secret-store-csi-driver) provide a reference for setting up the AWS provider for Secrets Store CSI Driver. Below are some important considerations:

1. **Using Chainguard Image:**

   When installing the Secrets Store CSI Driver via Helm, you can utilize the `secrets-store-csi-drive` Chainguard image:

   ```bash
   helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
   helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
     --set image.repository=cgr.dev/ORGANIZATION/secrets-store-csi-driver \
     --set image.tag=latest
   ```

2. **Using Private ECR Repository:**

   If you're using a private ECR repository, you will need the `private-installer.yaml` file, which can be found [here](https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/refs/heads/main/deployment/private-installer.yaml). The [private build](https://github.com/aws/secrets-store-csi-driver-provider-aws/tree/main?tab=readme-ov-file#private-builds) section in the official docs has additional information for this setup.

   Follow the [AWS ECR guide](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) and pull the `cgr.dev/ORGANIZATION/secrets-store-csi-driver` image, tag it, and push it to your private repository(`$PRIVREPO`).

3. **FIPS Compliance:**

   For FIPS-compliant images, set the FIPS endpoint in the Helm chart by adding the `--set useFipsEndpoint=true` flag during installation:

    ```bash
   helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
   helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws \
     --set image.repository=$PRIVREPO \
     --set image.tag=latest \
     --set useFipsEndpoint=true
   ```
   The `$PRIVREPO` here is your private ECR repository that contains the tagged `cgr.dev/ORGANIZATION/secrets-store-csi-driver` image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-ca-fips

# step-ca-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-ca-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-ca-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS image of [step-ca](https://smallstep.com/docs/step-ca), an online Certificate Authority (CA) for secure, automated X.509 and SSH certificate management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `step-ca-fips` image is a minimal drop-in replacement for the upstream [smallstep/step-ca](https://hub.docker.com/r/smallstep/step-ca) container image. It provides equivalent functionality for operating a private Certificate Authority (CA) and is fully compatible with official configurations and the [smallstep Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates). This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `step-ca-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [step-ca Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/step-ca-fips
  tag: "latest"
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `step-ca` helm chart.

```shell
helm repo add smallstep https://smallstep.github.io/helm-charts
helm repo update
helm install step-ca smallstep/step-certificates --namespace step-ca --create-namespace --values values.yaml --wait
```

### Issue a Certificate

Once deployed, you can issue a certificate using the step CLI by port-forwarding the CA service and referencing the provisioner and root certificate.

```bash
kubectl port-forward svc/step-ca-step-certificates -n step-ca 9000:443 &
export STEP_CA_URL=https://127.0.0.1:9000
```

#### 1. Extract root certificate
```bash
kubectl get configmap step-ca-step-certificates-certs -n step-ca \
  -o jsonpath="{.data['root_ca.crt']}" > root_ca.crt
export STEP_CERTIFICATE_AUTHORITY=root_ca.crt
```

#### 2. Extract provisioner password
```bash
PASSWORD=$(kubectl get secret step-ca-step-certificates-provisioner-password -n step-ca -o jsonpath="{.data.password}" | base64 -d)
```

#### 3. Request a certificate
```bash
step ca certificate "test.step-ca.local" cert.crt cert.key \
  --provisioner "admin" \
  --password-file <(echo "$PASSWORD") \
  --ca-url "$STEP_CA_URL" \
  --root "$STEP_CERTIFICATE_AUTHORITY"
```

If successful, `step` will issue a TLS certificate signed by the step-ca instance.

## Documentation and Resources
- [step-ca Github Repository](https://github.com/smallstep/certificates)
- [step-ca Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates)
- [step CLI](https://smallstep.com/docs/step-cli/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### glibc

# glibc
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/glibc` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/glibc/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The GNU C Library (glibc) is a C standard library implementation maintained by the GNU Project. glibc aims to provide a consistent interface to help developers write software that will work across multiple platforms.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is meant to be used as just a base image only. It does not contain any programs that can be run, other than `/sbin/ldconfig`.

You must bring your own artifacts to use this image, e.g. with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

## Getting Started

To illustrate how you can use Chainguard's `glibc` container image, start by creating the following Go program:

```shell
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```

This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require glibc.

Next, create a Dockerfile that uses the Chainguard `glibc` container as a base image:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/ORGANIZATION/glibc
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Note that this example Dockerfile uses the public Chainguard Go image and a private `glibc` image. You will need to change `ORGANIZATION` to reflect your organization's private repository within the Chainguard registry.

Using this Dockerfile, build an image:

```shell
docker build -t glibc-example .
```

Then run the newly-built image:

```shell
docker run --rm glibc-example
```

This will return the following output, indicating the program was run successfully and the `glibc` base image worked as expected:

```
Hello, world!
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### filebeat-fips

# filebeat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/filebeat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/filebeat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[filebeat](https://github.com/elastic/beats/tree/main/filebeat) Tails and ships log files

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Filebeat Image is comparable to [the official Filebeat image from Docker Hub](https://hub.docker.com/r/elastic/filebeat). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Compliance
The `filebeat-fips` image is built with FIPS-approved cryptographic modules, ensuring it meets relevant FIPS standards.

## Getting Started
There are no actively supported Helm charts for deploying Filebeat upstream. The most recent are present [here](https://github.com/elastic/helm-charts/tree/main/filebeat) and were archived in 2023. There are, however, [manifest-based deployments](https://github.com/elastic/beats/tree/main/deploy/kubernetes/filebeat) offered as an alternative by the upstream maintainers.

You will need to override the image properties to use the Chainguard-provided image for Filebeat. Additionally, make sure to change the image in the daemonset to the Chainguard filebeat Image.

Be aware that you can configure Filebeat to write to a specific output by [setting options in the `Outputs` section of the `filebeat.yml` config file](https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html). In the manifests provided above, it can be done [here](https://github.com/elastic/beats/blob/main/deploy/kubernetes/filebeat/filebeat-configmap.yaml#L55).

2. The above manifests will bring Filebeat up in `kube-system` namespace. And you will be able to see Filebeat output in `*.ndjson` file in `/usr/share/filebeat/output` directory in the Filebeat pod.

## Documentation and Resources

- [Filebeat official docs](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html)

> [!NOTE]
> The upstream documentation doesn't currently maintain a Filebeat Helm chart, and testing with [the deprecated chart](https://github.com/elastic/helm-charts/tree/2fd64d0af65f14df7aa01da591919460dabac4b3/filebeat) requires installing additional packages (such as curl and bash) in the container.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-ca

# step-ca
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-ca` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-ca/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image of [step-ca](https://smallstep.com/docs/step-ca), an online Certificate Authority (CA) for secure, automated X.509 and SSH certificate management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `step-ca` image is a minimal drop-in replacement for the upstream [smallstep/step-ca](https://hub.docker.com/r/smallstep/step-ca) container image. It provides equivalent functionality for operating a private Certificate Authority (CA) and is fully compatible with official configurations and the [smallstep Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates). This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [step-ca Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/step-ca
  tag: "latest"
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `step-ca` helm chart.

```shell
helm repo add smallstep https://smallstep.github.io/helm-charts
helm repo update
helm install step-ca smallstep/step-certificates --namespace step-ca --create-namespace --values values.yaml --wait
```

### Issue a Certificate

Once deployed, you can issue a certificate using the step CLI by port-forwarding the CA service and referencing the provisioner and root certificate.

```bash
kubectl port-forward svc/step-ca-step-certificates -n step-ca 9000:443 &
export STEP_CA_URL=https://127.0.0.1:9000
```

#### 1. Extract root certificate
```bash
kubectl get configmap step-ca-step-certificates-certs -n step-ca \
  -o jsonpath="{.data['root_ca.crt']}" > root_ca.crt
export STEP_CERTIFICATE_AUTHORITY=root_ca.crt
```

#### 2. Extract provisioner password
```bash
PASSWORD=$(kubectl get secret step-ca-step-certificates-provisioner-password -n step-ca -o jsonpath="{.data.password}" | base64 -d)
```

#### 3. Request a certificate
```bash
step ca certificate "test.step-ca.local" cert.crt cert.key \
  --provisioner "admin" \
  --password-file <(echo "$PASSWORD") \
  --ca-url "$STEP_CA_URL" \
  --root "$STEP_CERTIFICATE_AUTHORITY"
```

If successful, `step` will issue a TLS certificate signed by the step-ca instance.

## Documentation and Resources
- [step-ca Github Repository](https://github.com/smallstep/certificates)
- [step-ca Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-certificates)
- [step CLI](https://smallstep.com/docs/step-cli/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mariadb-operator

# mariadb-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mariadb-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mariadb-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Mariadb-operator is a Kubernetes operator for managing MariaDB databases. It automates the deployment, scaling, and management of MariaDB instances in Kubernetes clusters, providing declarative configuration and lifecycle management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
mariadb-operator is a Kubernetes operator that can be deployed using Helm. Refer to the [upstream repository documentation](https://github.com/mariadb-operator/mariadb-operator) for detailed setup and usage instructions.

To use our minimal, Wolfi-based image with the official Helm chart, you'll need to override the image used by the chart and specify the Chainguard image as shown in the example below:

```shell
helm repo add mariadb-operator https://helm.mariadb.com/mariadb-operator
helm repo update

# Install the CRDs first
helm install mariadb-operator-crds mariadb-operator/mariadb-operator-crds \
  --namespace mariadb-system \
  --create-namespace

# Install the operator with chainguard image
helm install mariadb-operator mariadb-operator/mariadb-operator \
  --namespace mariadb-system \
  --set image.repository=cgr.dev/ORGANIZATION/mariadb-operator:latest
```

For complete configuration options and advanced usage scenarios, please refer to the [official mariadb-operator documentation](https://github.com/mariadb-operator/mariadb-operator).

## Documentation and Resources
- [MariaDB Operator GitHub Repository](https://github.com/mariadb-operator/mariadb-operator)
- [MariaDB Operator Images Documentation](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/docker.md)
- [MariaDB Operator Helm Documentation](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/helm.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-controller-iamguarded

# sealed-secrets-controller-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-controller-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-controller-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes controller and tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Sealed Secrets is used to safely manage encrypted Kubernetes Secrets and is designed to run as a native Kubernetes controller. Sealed Secrets IAmGuarded security-enhanced variant of Sealed Secrets designed to be deployed using its companion IAMGuarded Helm chart. This image provides the Sealed Secrets Controller component with the security benefits of IAMGuarded deployments.

## Helm Chart Installation

The Sealed Secrets IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/sealed-secrets
```

### Basic Installation

To deploy sealed secrets with the Chainguard image, create a `values.yaml` file with the image information - such as:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/sealed-secrets-controller-iamguarded
  tag: latest
```

Then install the controller using Helm:

```shell
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets \
  --namespace kube-system \
  --create-namespace \
  -f values.yaml
```

This deploys the Sealed Secrets controller in the `kube-system` namespace using the specified image. This is the default namespace that `kubeseal` tool for encrypting secrets is expected, so changing the namespace will also require providing `--controller-namespace` argument to `kubeseal` whenever encrypting a secret.

## Encrypting Secrets
To encrypt a secret, use the `kubectl` to create a Kubernetes Secret YAML file (unless you already have it) and then use `kubeseal` CLI tool to encrypt it. Such as:

```shell
kubectl create secret generic \
  --namespace default mysecret \
  --dry-run=client \
  --from-literal=password=supersecret \
  -o yaml >secret.yaml

kubeseal <secret.yaml -o yaml >sealedsecret.yaml
```

This generates a `SealedSecret` that can be safely committed to version control.

### Applying Sealed Secrets
Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f mysealedsecret.yaml
```

The controller will decrypt it and create the actual Kubernetes Secret.

### Authentication
For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:
[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices
1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install sealed oci://cgr.dev/$ORGANIZATION/iamguarded-charts/sealed-secrets@sha256:DIGEST \
     --namespace sealed-secrets \
     --create-namespace \
     --set "global.org=$ORGANIZATION" \
     --set "global.image.repository=sealed-secrets-controller-iamguarded"
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Sealed Secrets IAMGuarded installation using standard Sealed Secrets verification methods. The deployment functions as a standard Sealed Secrets instance, so all typical Sealed Secrets validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### solr

# solr
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/solr` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/solr/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Solr is an open-source multi-modal search platform built on top of Lucene.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `solr` container image is comparable to the `slim` variant of the [official Solr image](https://hub.docker.com/_/solr) on Docker Hub. The Chainguard Container includes the same Apache Solr functionality while providing enhanced security through a minimal design that excludes unnecessary software.

## Getting Started

### Deploy with Solr Operator

The recommended way to deploy Solr in Kubernetes is using the official Apache
Solr Operator:

```shell
# Install the Solr Operator
helm repo add apache-solr https://solr.apache.org/charts
helm repo update

helm install solr-operator apache-solr/solr-operator \
  --namespace solr-operator \
  --create-namespace \
  --set zookeeper-operator.crd.create=true
```

Next, we'll leverage the solr-operator to deploy a new instance of solr.
Create a values.yaml file, specifying the Chainguard image:

```yaml
apiVersion: solr.apache.org/v1beta1
kind: SolrCloud
metadata:
  name: solr
spec:
  replicas: 1
  solrImage:
    repository: cgr.dev/ORGANIZATION/solr
    tag: latest
```

Create a new Solr instance:

```yaml
kubectl apply -f values.yaml
```

### Deploy with Docker

Run Solr with persistent storage:

```shell
docker run -d \
  -p 8983:8983 \
  -v solr-data:/var/solr \
  cgr.dev/ORGANIZATION/solr:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

After starting, access the Solr Admin Console at http://localhost:8983/solr/.

[!NOTE] This is a basic example. For production deployments, configure authentication and resource limits as needed.

## Documentation and Resources

For more information on using Apache Solr, refer to:

- [Apache Solr Documentation](https://solr.apache.org/guide/)
- [Solr on Docker Guide](https://solr.apache.org/guide/solr/latest/deployment-guide/solr-in-docker.html)
- [Solr Operator Documentation](https://solr.apache.org/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-beat-exporter-fips

# prometheus-beat-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-beat-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-beat-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey

# valkey
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Valkey](https://github.com/valkey-io/valkey) image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Minimalist Wolfi-based [Valkey](https://github.com/valkey-io/valkey) image.

Valkey is an open source (BSD) high-performance key/value datastore that supports a variety workloads such as caching, message queues, and can act as a primary database. Valkey can run as either a standalone daemon or in a cluster, with options for replication and high availability.

The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps.

- [Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/reference/valkey)
- [Provenance Information](https://edu.chainguard.dev/chainguard/chainguard-images/reference/valkey/provenance_info/)

## Valkey Version
This will automatically pull the image to your local system and execute the command `valkey --version`:

```shell
docker run --rm cgr.dev/chainguard/valkey --version
```

You should see output similar to this:

```
valkey server v=7.0.8 sha=00000000:0 malloc=libc bits=64 build=736cb94cbb0b299
```

## Using Valkey

The default Valkey port is 6379.
To run with Docker using default configuration:

```sh
docker run -p 6379:6379 --rm cgr.dev/chainguard/valkey
1:C 18 Apr 2024 00:52:45.176 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:C 18 Apr 2024 00:52:45.176 * oO0OoO0OoO0Oo Valkey is starting oO0OoO0OoO0Oo
1:C 18 Apr 2024 00:52:45.176 * Valkey version=7.2.5, bits=64, commit=26388270, modified=1, pid=1, just started
1:C 18 Apr 2024 00:52:45.176 # Warning: no config file specified, using the default config. In order to specify a config file use /usr/bin/valkey-server /path/to/valkey.conf
1:M 18 Apr 2024 00:52:45.177 * monotonic clock: POSIX clock_gettime
                .+^+.                                                
            .+#########+.                                            
        .+########+########+.           Valkey 7.2.5 (26388270/1) 64 bit
    .+########+'     '+########+.                                    
 .########+'     .+.     '+########.    Running in standalone mode
 |####+'     .+#######+.     '+####|    Port: 6379
 |###|   .+###############+.   |###|    PID: 1                     
 |###|   |#####*'' ''*#####|   |###|                                 
 |###|   |####'  .-.  '####|   |###|                                 
 |###|   |###(  (@@@)  )###|   |###|          https://valkey.io      
 |###|   |####.  '-'  .####|   |###|                                 
 |###|   |#####*.   .*#####|   |###|                                 
 |###|   '+#####|   |#####+'   |###|                                 
 |####+.     +##|   |#+'     .+####|                                 
 '#######+   |##|        .+########'                                 
    '+###|   |##|    .+########+'                                    
        '|   |####+########+'                                        
             +#########+'                                            
                '+v+'                                                

1:M 18 Apr 2024 00:52:45.177 * Server initialized
1:M 18 Apr 2024 00:52:45.177 * Ready to accept connections tcp
```

## Users and Directories

By default this image runs as a non-root user named `valkey` with a uid of 65532.
Valkey does not have a default data directory, it defaults to whatever the working directory is for the process.
We provide a default `WORKDIR` of `/data` that is writeable by the `valkey` user.

If you supply a different configuration file or change the user, UID, or `WORKDIR`, you'll need to ensure the user running the valkey process has permissions to write to that directory.

When running in Docker using a volume, that should also be taken care of automatically.
Here's an example of using a host volume:

```
% docker run -d -v $(pwd):/data -p 6379:6379 cgr.dev/chainguard/valkey
d029bfb291c7a00618342ab26702dc3788cfda24b85208de04464ccb06681797
$ valkey-cli set foo bar
OK
$ valkey-cli save
OK
$ valkey-cli get foo
"bar"
$ docker kill d029bfb291c7a00618342ab26702dc3788cfda24b85208de04464ccb06681797
d029bfb291c7a00618342ab26702dc3788cfda24b85208de04464ccb06681797
$ docker run -d -v $(pwd):/data -p 6379:6379 cgr.dev/chainguard/valkey
29845f88b862d8e337cf8183e8fb6ac1bd9b43c4ec2de37111bfe08b227e1caa
$ valkey-cli get foo
"bar"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-system-upgrade-controller

# rancher-system-upgrade-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-system-upgrade-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-system-upgrade-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A general-purpose, Kubernetes-native upgrade controller for nodes that provides automated upgrade capabilities for Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream `rancher/system-upgrade-controller` image. All configuration and upgrade plans that work with the upstream image are fully compatible with this Chainguard Container.

## Getting Started

The Rancher System Upgrade Controller automates node upgrades in Kubernetes clusters using Custom Resource Definitions (CRDs). It watches for `Plan` resources and executes upgrade jobs on matching nodes.

## Installation

### Using Helm Chart

```bash
helm repo add rancher-charts https://charts.rancher.io
helm repo update
```

use a `values.yaml` file:

```yaml
# values.yaml
systemUpgradeController:
  image:
    repository: cgr.dev/ORGANIZATION/rancher-system-upgrade-controller
    tag: latest
```

Then install with:

```bash
helm install system-upgrade-controller rancher-charts/system-upgrade-controller \
  --namespace cattle-system \
  --create-namespace \
  --values values.yaml
```

## Documentation and Resources

- [System Upgrade Controller Documentation](https://github.com/rancher/system-upgrade-controller)
- [Rancher Documentation](https://ranchermanager.docs.rancher.com/)
- [System Upgrade Controller charts](https://github.com/rancher/charts/tree/dev-v2.12/charts/system-upgrade-controller)
- [K3s Upgrade Examples](https://github.com/rancher/system-upgrade-controller/tree/master/examples)
- [RKE2 Upgrade Examples](https://github.com/rancher/system-upgrade-controller/tree/master/examples)
- [Kubernetes Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flannel

# flannel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flannel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flannel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Flannel is a network fabric for Kubernetes, providing a way to manage network configurations across a cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [upstream Flannel image](https://quay.io/repository/coreos/flannel). Switching to the Chainguard image should not require any changes to your existing setup.

Note that Chainguard's Flannel image runs as **root** by default, which is required for network operations.

## Getting Started

To deploy the Chainguard Flannel image with Helm, first add the Flannel Helm repository:

```shell
helm repo add flannel https://flannel-io.github.io/flannel/
helm repo update
```

Next create a values file. The following is a minimal example:

```yaml
# values.yaml

# Image configuration
image:
    
  repository: "cgr.dev/ORGANIZATION/flannel"
  tag: "latest"
```

Finally, install Flannel. This example assumes the values file is named `values.yaml`:

```shell
helm install flannel flannel/flannel \
  --namespace kube-flannel \
  --create-namespace \
  -f values.yaml
```

### Troubleshooting

For troubleshooting, you can use the `-dev` variant which includes additional tools:

```shell
kubectl exec -it -n kube-flannel <flannel-pod-name> -- /bin/sh
```

## Documentation and Resources

For more information about Flannel, refer to the following resources:

- [Flannel GitHub Repository](https://github.com/flannel-io/flannel)
- [Flannel Documentation](https://github.com/flannel-io/flannel/tree/master/Documentation)
- [Flannel CNI Plugin Documentation](https://github.com/flannel-io/cni-plugin/blob/main/README.md)
- [Kubernetes Networking with Flannel](https://kubernetes.io/docs/concepts/cluster-administration/networking/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cadvisor-fips

# cadvisor-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cadvisor-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cadvisor-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dcgm-exporter-fips

# dcgm-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dcgm-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dcgm-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NVIDIA GPU metrics exporter for Prometheus leveraging DCGM

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `dcgm-exporter-fips` image is designed to be a drop-in replacement for the upstream [`NVIDIA/dcgm-exporter`](https://github.com/NVIDIA/dcgm-exporter) image, with an important difference:
The upstream image contains an entrypoint script which adds `cap_sys_admin=+ep` to the `dcgm-exporter` binary at runtime when `--cap-add SYS_ADMIN` is passed to the container. This Entrypoint script needs packages like `bash` and `libcap-utils` which increases the attack surface area of the image. The Chainguard image excludes these extra packages as well as the entrypoint script while ensuring no changes in the Image behaviour.

This image contains **2 different tags**:
| Tag Version | Description | Privileges Required | DCP Metrics |
|--------------|--------------|---------------------|-------------------|
| `latest` or `4.4.*` | Runs with privileged `dcgm-exporter` binary (`cap_sys_admin=+ep`). | Requires `CAP_SYS_ADMIN` at container or pod runtime. | ✅ Enabled |
| `4.4.*-noprof` | Runs without privileged capabilities in `dcgm-exporter`. | Does **not** require `CAP_SYS_ADMIN` at runtime. | ❌ Disabled |

* Why is SYS_ADMIN capability required?
_The requirement for `SYS_ADMIN` privileges comes from DCGM, while the `dcgm-exporter` binary is simply a client. The specific use cases for how and where `DCGM` (`nv-hostengine`) and `dcgm-exporter` (`binary`) run and communicate can vary. It is required for following cases:_
   * _`DCP` metrics or **DCGM Profiling metrics** require root privileges unless configured otherwise in the kernel parameters._
   * _MIG-enabled systems_
* All components are minimal, distroless images with low-to-zero CVEs

### FIPS Support

The `dcgm-exporter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Usage

DCGM-Exporter is a tool based on the Go APIs to NVIDIA DCGM that allows users to gather GPU metrics and understand workload behavior or monitor GPUs in clusters. DCGM Exporter is written in Go and exposes GPU metrics at an HTTP endpoint (/metrics) for monitoring solutions such as Prometheus.

To test the functionality of NVIDIA DCGM Exporter Image, it requires an environment with connected GPUs. If you have connected GPUs, here's one way to use this image:

### Using Docker 

#### Run Image

Install [Docker Engine](https://docs.docker.com/engine/install/ubuntu/) and configure it with your credentials to pull image

Run the image:

```bash
docker run -d --rm \
   --gpus all \
   --net host \
   --cap-add SYS_ADMIN \
   cgr.dev/chainguard/dcgm-exporter-fips:<version> \
   -f /etc/dcgm-exporter/dcp-metrics-included.csv
```

#### Retrieve the metrics

```bash
$ curl localhost:9400/metrics
```

#### Output should be something like this

```bash
# HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz).
# TYPE DCGM_FI_DEV_SM_CLOCK gauge
# HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
# TYPE DCGM_FI_DEV_MEM_CLOCK gauge
# HELP DCGM_FI_DEV_MEMORY_TEMP Memory temperature (in C).
# TYPE DCGM_FI_DEV_MEMORY_TEMP gauge
...
DCGM_FI_DEV_SM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 139
DCGM_FI_DEV_MEM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 405
DCGM_FI_DEV_MEMORY_TEMP{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 9223372036854775794
...
```

### Helm Installation 

Step 1: Add and Update Helm Repository
Add the NVIDIA  DCGM Exporter repository and update it to ensure you have access to the latest charts.

```shell
$ helm repo add gpu-helm-charts \
   https://nvidia.github.io/dcgm-exporter/helm-charts

$ helm repo update
```

Step 2: Install NVIDIA DCGM Exporter

Install NVIDIA DCGM Exporter using Helm with the specified version, namespace, and optional configuration settings.

```shell
$ helm install \
  --generate-name \
  gpu-helm-charts/dcgm-exporter \
  --set image.repository=cgr.dev/chainguard/dcgm-exporter-fips \
  --set image.tag=latest
```

Step 3: Verify Installation

```shell
$ kubectl get pods -A

NAMESPACE     NAME                                                              READY   STATUS      RESTARTS   AGE
default       dcgm-exporter-2-1603213075-w27mx                                  1/1     Running     0          2m18s
kube-system   calico-kube-controllers-8f59968d4-g28x8                           1/1     Running     1          43m
kube-system   calico-node-zfnfk                                                 1/1     Running     1          43m
kube-system   coredns-f9fd979d6-p7djj                                           1/1     Running     1          43m
kube-system   coredns-f9fd979d6-qhhgq                                           1/1     Running     1          43m
kube-system   etcd-ip-172-31-92-253                                             1/1     Running     1          43m
kube-system   kube-apiserver-ip-172-31-92-253                                   1/1     Running     2          43m
kube-system   kube-controller-manager-ip-172-31-92-253                          1/1     Running     1          43m
kube-system   kube-proxy-mh528                                                  1/1     Running     1          43m
kube-system   kube-scheduler-ip-172-31-92-253                                   1/1     Running     1          43m
kube-system   nvidia-device-plugin-1603211071-7hlk6                             1/1     Running     0          35m
prometheus    alertmanager-kube-prometheus-stack-1603-alertmanager-0            2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603-operator-6b95bcdc79-wmbkn              2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-grafana-67ff56c449-tlmxc         2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-kube-state-metrics-877df67c49f   1/1     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-prometheus-node-exporter-b5fl9   1/1     Running     0          33m
prometheus    prometheus-kube-prometheus-stack-1603-prometheus-0                3/3     Running     1          33m
```

For more information and setting it up with prometheus stack, refer to the official documentation:
- [Helm Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/latest/kube-prometheus.html#setting-up-prometheus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-resizer-fips

# kubernetes-csi-external-resizer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-resizer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-resizer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [kubernetes-csi/external-resizer](https://github.com/kubernetes-csi/external-resizer).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-resizer-fips` container image is the FIPS version of Chainguard's `kubernetes-csi-external-resizer` image and is comparable to the [official csi-resizer image](https://gcr.io/k8s-staging-sig-storage/csi-resizer:canary). Chainguard Containers are designed with minimalism and security in mind, and thus the Jenkins image has the following differences from the upstream image:

* Chainguard's `kubernetes-csi-external-resizer-fips` image does not sets any `WorkingDir` whereas the upstream sets it to: `/`.
* Chainguard's `kubernetes-csi-external-resizer-fips` image sets the entrypoint to `/usr/bin/csi-resizer` whereas the upstream sets it to: `/csi-resizer`.

### FIPS Support

The `kubernetes-csi-external-resizer-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the following [manifest](https://raw.githubusercontent.com/kubernetes-csi/external-resizer/master/deploy/kubernetes/deployment.yaml). Once you apply this manifest, make sure to run the below command to replace the image with Chainguard's `kubernetes-csi-external-resizer-fips`

```
  kubectl set image deployment/csi-resizer csi-resizer="cgr.dev/ORGANIZATION/kubernetes-csi-external-resizer-fips"
```

You'll additionally need to create a new service account and give it enough privileges to run the `external-resizer`. Please follow the [official
instructions](https://github.com/kubernetes-csi/external-resizer/blob/master/README.md#usage) for more.

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-resizer/blob/master/README.md#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5947

# request-5947
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5947` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5947/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A custom build of dcgm-exporter without setcap SYS_ADMIN

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

DCGM-Exporter is a tool based on the Go APIs to NVIDIA DCGM that allows users to gather GPU metrics and understand workload behavior or monitor GPUs in clusters. DCGM Exporter is written in Go and exposes GPU metrics at an HTTP endpoint (/metrics) for monitoring solutions such as Prometheus.

To test the functionality of NVIDIA DCGM Exporter Image, it requires an environment with connected GPUs. If you have connected GPUs, here's one way to use this image:

### Using Docker 

#### Run Image

Install [Docker Engine](https://docs.docker.com/engine/install/ubuntu/) and configure it with your credentials to pull image

Run the image:

```bash
docker run -d --rm \
   --gpus all \
   --net host \
   cgr.dev/ORGANIZATION/request-5947:latest \
   -f /etc/dcgm-exporter/dcp-metrics-included.csv
```

### Helm Installation 

Step 1: Add and Update Helm Repository
Add the NVIDIA  DCGM Exporter repository and update it to ensure you have access to the latest charts.

```shell
$ helm repo add gpu-helm-charts \
   https://nvidia.github.io/dcgm-exporter/helm-charts

$ helm repo update
```

Step 2: Install NVIDIA DCGM Exporter

Install NVIDIA DCGM Exporter using Helm with the specified version, namespace, and optional configuration settings.

```shell
$ helm install \
  --generate-name \
  gpu-helm-charts/dcgm-exporter \
  --set image.repository=cgr.cgr.dev/ORGANIZATION/request-5947 \
  --set image.tag=latest
```

For more information and setting it up with prometheus stack, refer to the official documentation:
- [Helm Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/latest/kube-prometheus.html#setting-up-prometheus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6766

# request-6766
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6766` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6766/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A custom build of ingress-nginx-controller-fips with image config changes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

`request-6766` can be deployed using the upstream [ingress-nginx helm chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx).

The Chainguard image must be specified when invoking the chart, example:

```bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx --set image.repository=cgr.dev/ORGANIZATION/request-6766
```

For more information on ingress-nginx, refer to the [upstream documentation](https://kubernetes.github.io/ingress-nginx).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metricbeat-fips

# metricbeat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metricbeat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metricbeat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-object-browser-iamguarded

# minio-object-browser-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-object-browser-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-object-browser-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MinIO Console is a library that provides a management and browser UI overlay for the MinIO Server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MinIO Object Storage IAMGuarded is a security-enhanced variant of minio-object-browser designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard minio-object-browser deployments.

## Helm Chart Installation

You can enable MinIO Object Storage IAMGuarded in the MinIO Helm Chart which is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install minio oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

To view all available configuration options:

```bash
helm show values oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Registry Configuration

For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MinIO server image
image:
  registry: myregistry.example.com
  repository: mirrored/minio-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# MinIO client image
clientImage:
  registry: myregistry.example.com
  repository: mirrored/minio-client-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
defaultInitContainers:
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# MinIO Object Storage image
console:
  registry: myregistry.example.com
  repository: mirrored/minio-object-browser-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Standalone Docker Usage

While this image is optimized for use with the iamguarded Helm chart, it can also be run standalone:

```bash
docker container run -p 9090:9090 \
  cgr.dev/$ORGANIZATION/minio-object-browser:latest server
```

### MinIO Object Storage

The MinIO Object Storage image is also available:

```bash
docker run cgr.dev/$ORGANIZATION/minio-object-browser-iamguarded:latest --help
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apm-server-fips

# apm-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apm-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apm-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elastic APM is an application performance monitoring system built on the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/elastic/apm-server). Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support

The apm-server-fips Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To start the Chainguard `apm-server` image, simply start the container - such as:

```shell
docker run --rm cgr.dev/ORGANIZATION/apm-server-fips:latest version
apm-server version 8.17.1 (linux/amd64) [cff9e464471f4e641164cb38215a18e899784b37 2025-01-10 16:05:01 +0000 UTC (modified)]
```

APM server requires configuration to be able to communicate with other services, such as Elasticsearch and Kibana.
These can be passed via command line, as well as via configuration file.

For example to pass details via command line:

```
docker run -p 8200:8200 cgr.dev/ORGANIZATION/apm-server-fips:latest \
  -E output.elasticsearch.hosts=elasticsearch:9200 \
  -E output.elasticsearch.username=$ELASTIC_USER \
  -E output.elasticsearch.password=$ELASTIC_PASSWORD \
  -E apm-server.host=:8200 \
  -E apm-server.kibana.host="kibana:5601" \
```

After which is should be possible to communicate with `apm-server` and check its status by checking `http://localhost:8200` URL.

A sample answer for a working APM server should be:

```
{
  "build_date": "2025-01-30T22:07:00Z",
  "build_sha": "cff9e464471f4e641164cb38215a18e899784b37",
  "publish_ready": true,
  "version": "8.17.1"
}
```

## Run Chainguard image with Elastic Cloud on Kubernetes (ECK)

This image can be run as part of Elastic Cloud on Kubernetes (ECK) deployments of Elasticsearch and Kibana.

To get started, add the Helm repository - such as:

```shell
helm repo add elastic https://helm.elastic.co
helm repo update
```

Next, install the `eck-operator` - such as:

```shell
helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace
```

Then create an instance of Elasticsearch and Kibana 

```shell
kubectl apply -f - <<EOF
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: VERSION
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: VERSION
  count: 1
  elasticsearchRef:
    name: quickstart
EOF
```

You will need to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry. Addiitionally, be sure to replace the `VERSION` placeholder with the version of Elasticsearch and Kibana - such as `8.17.1`.

Next, deploy APM server, specifying the image in its `spec` - such as:

```shell
kubectl apply -f - <<EOF
apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
  name: apm-server-quickstart
  namespace: default
spec:
  version: VERSION
  count: 1
  image: cgr.dev/ORGANIZATION/apm-server-fips:latest
  elasticsearchRef:
    name: quickstart
  kibanaRef:
    name: quickstart
```

The ECK operator will set up the APM server and configure it to communicate with Elasticsearch and Kibana.

## Documentation and Resources
Refer to upstream [Get started with APM documentation](https://www.elastic.co/guide/en/observability/current/apm-getting-started-apm-server.html) to learn more about usage of APM Server and this image.

Please refer to [Elastic Cloud on Kubernetes (ECK) documentation](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html) for more details on how to set up and operate it.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### klipper-helm

# klipper-helm
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/klipper-helm` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/klipper-helm/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Helm integration job image for K3s/RKE2 with automated chart lifecycle management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `klipper-helm` container image is a drop-in replacement for the upstream [rancher/klipper-helm](https://hub.docker.com/r/rancher/klipper-helm) image. It provides the same functionality for managing Helm charts in K3s clusters, including support for essential Helm plugins like helm-mapkubeapis and helm-set-status. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

The `klipper-helm` image provides Helm functionality for use within clusters. It supports operations such as installing, upgrading, and deleting Helm charts with built-in plugins like `mapkubeapis` and `set-status`.

First, create the ServiceAccount and RBAC configuration:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: klipper-helm-sa
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: klipper-helm-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: klipper-helm-sa
  namespace: default
EOF
```

Then, deploy a Helm Release by running `klipper-helm` as a Pod

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: helm-install-nginx
  namespace: default
spec:
  serviceAccountName: klipper-helm-sa
  restartPolicy: Never
  containers:
  - name: klipper-helm
    image: cgr.dev/ORGANIZATION/klipper-helm:latest
    command: ["entry"]
    args: ["install"]
    env:
    - name: NAME
      value: "test-nginx"
    - name: TARGET_NAMESPACE
      value: "default"
    - name: CHART
      value: "test-nginx/ingress-nginx"
    - name: REPO
      value: "https://kubernetes.github.io/ingress-nginx"
EOF
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

## Documentation and Resources
- [Klipper-helm Github Repository](https://github.com/k3s-io/klipper-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-alertmanager

# prometheus-alertmanager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-alertmanager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-alertmanager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for Prometheus Alertmanager. Handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing to the correct receiver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on prometheus-alertmanager, refer to the
[official documentation](https://prometheus.io/docs/alerting/latest/alertmanager).
The GitHub repository can also be [found here](https://github.com/prometheus/alertmanager).

### Default config settings
The upstream docker image, overrides some of the default values for
alertmanager, for example, [see here](https://github.com/prometheus/alertmanager/blob/main/Dockerfile#L20).
We replicate the same behavior in the Chainguard image to provide parity with
the upstream image.

### Helm
To deploy via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/main/charts/alertmanager/values.yaml).

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-alertmanager prometheus-community/alertmanager \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-alertmanager \
 --set image.tag=latest
```

The [upstream helm chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/alertmanager)
provides some default `config:` values, but if you intend to deploy with
additional configuration, i.e defining routes and receivers, you'll need to
create your own custom values.yaml and pass this into the chart at deployment.

### Docker

#### Create config file
Before running the container, you'll need to create a configuration file. This
contains all the necessary configurations for Alertmanager, such as alerting
routes, receivers, and integrations.

Refer to the [official documentation](https://prometheus.io/docs/alerting/latest/alertmanager)
for more information. Below is a simple example:

```yaml
# Save this as 'alertmanager.yml')
global:
  resolve_timeout: 11m
  pagerduty_url: https://example-pagerduty.com/v2/test
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10m
  repeat_interval: 1h
receivers:
  - name: 'example-webhook'
    webhook_configs:
    - url: 'http://example.com/hook'
```

In order to ensure the 'nonroot' container user can access the file when
volume mounted (below step), ensure you've set read-only permissions:

```bash
chmod 400 alertmanager.ym
```

#### Run container

> **IMPORTANT**: Prometheus looks for a file mounted as 'alertmanager.yml' (i.e not .yaml).

```bash
# TODO: Update '$(pwd)/alertmanager.yml' accordingly to reference your locally
# created config file.
docker run -p 9093:9093 \
  -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  --name alertmanager \
  cgr.dev/ORGANIZATION/prometheus-alertmanager:latest
```

Verify that Alertmanager is running correctly by accessing http://localhost:9093
on your browser.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mcp-grafana

# mcp-grafana
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mcp-grafana` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mcp-grafana/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

mcp-grafana is a Model Context Protocol (MCP) server for Grafana that enables AI assistants and automation tools to interact with your Grafana dashboards, incidents, alerts, and datasources through a standardized protocol

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `mcp-grafana` container image is comparable to the [upstream image](https://github.com/grafana/mcp-grafana), with the following differences:

* Like all other Chainguard Containers, `mcp-grafana` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting started

**Pull the mcp-grafana Image**

```bash
docker pull cgr.dev/ORGANIZATION/mcp-grafana
```

**Run the Container**

Replace `` with your actual Grafana API key.

```bash
docker run --rm -p 8000:8000 \
  -e GRAFANA_URL=http://localhost:3000 \
  -e GRAFANA_API_KEY= \
  mcp/grafana
```

Once the container is running, the MCP-Grafana server will be listening on port 8000 and ready to accept requests from compatible clients or AI agents.

**You do not interact directly with the container via a shell.**  
Instead, you connect to the MCP-Grafana server from a client application (such as Claude Desktop, VSCode, or another compatible AI tool) or by sending HTTP requests.

### **Connect a Client or Agent**

- Configure your client (e.g., Claude Desktop) to use the MCP-Grafana server.  
  This typically involves adding your MCP-Grafana server details to the client’s configuration file.  
  For example, in Claude Desktop, add an entry pointing to the MCP-Grafana server.

### **Invoke Grafana Tools via the Client**

- Once connected, you can use your client’s interface to tools which can be found in the [upstream doc](https://github.com/grafana/mcp-grafana?tab=readme-ov-file#tools)
- You can use natural language prompts (e.g., “List all dashboards”) or select tools from the client’s tools panel.

## Documentation and Resources

- **[Official Documentation](https://github.com/grafana/mcp-grafana#readme)**
- **[GitHub Repository](https://github.com/grafana/mcp-grafana)**
- **[Model Context Protocol (MCP) Documentation](https://modelcontextprotocol.io/introduction)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### guacamole-server

# guacamole-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/guacamole-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/guacamole-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [Guacamole server](https://guacamole.apache.org/) remote desktop gateway image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### conda

# conda
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/conda` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/conda/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [Conda](https://docs.conda.io/en/latest/) programming environment.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

This image contains the `conda` command, which can be used to create and manage conda environments, as well
as other assorted conda utilities.

The image can be run directly and sets the conda binary as the entrypoint:

```
docker run cgr.dev/chainguard/conda:latest
usage: conda [-h] [-V] command ...

conda is a tool for managing and deploying applications, environments and packages.

Options:

positional arguments:
  command
    clean             Remove unused packages and caches.
    compare           Compare packages between conda environments.
    config            Modify configuration values in .condarc. This is modeled after the git config command. Writes to the user .condarc file (/root/.condarc) by default. Use the --show-sources flag to display all identified configuration locations on your computer.
    create            Create a new conda environment from a list of specified packages.
    info              Display information about current conda install.
    init              Initialize conda for shell interaction.
    install           Installs a list of packages into a specified conda environment.
    list              List installed packages in a conda environment.
    package           Low-level conda package utility. (EXPERIMENTAL)
    remove (uninstall)
                      Remove a list of packages from a specified conda environment. Use `--all` flag to remove all packages and the environment itself.
    rename            Renames an existing environment.
    run               Run an executable in a conda environment.
    search            Search for packages and display associated information. The input is a MatchSpec, a query language for conda packages. See examples below.
    update (upgrade)  Updates conda packages to the latest compatible version.
    notices           Retrieves latest channel notifications.

options:
  -h, --help          Show this help message and exit.
  -V, --version       Show the conda version number and exit.

conda commands available from other packages (legacy):
  content-trust
  env
```

The `conda` binary and tools are in the `/opt/conda/bin` directory.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-fips

# kubernetes-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Production-Grade Container Scheduling and Management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1278

# request-1278
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1278` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1278/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rke2-cloud-provider-fips

# rke2-cloud-provider-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rke2-cloud-provider-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rke2-cloud-provider-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using the Chainguard RKE2 Cloud Provider

### Replacing the Default Cloud Provider

To use the Chainguard RKE2 cloud provider image instead of the default implementation, configure your RKE2 cluster to use the hardened image:

```yaml
# /etc/rancher/rke2/config.yaml
cloud-provider-name: external
kube-apiserver-arg:
  - cloud-provider=external
kube-controller-manager-arg:
  - cloud-provider=external
kubelet-arg:
  - cloud-provider=external
```

Then deploy the Chainguard cloud provider as a DaemonSet or deployment in your cluster:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: rke2-cloud-provider
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: rke2-cloud-provider
  template:
    metadata:
      labels:
        app: rke2-cloud-provider
    spec:
      containers:
      - name: rke2-cloud-provider
        image: cgr.dev/ORGANIZATION/rke2-cloud-provider-fips:latest
        # Add necessary configuration and arguments
```

## Documentation and Resources

- [RKE2 Cloud Provider Configuration](https://rke.docs.rancher.com/config-options/cloud-providers/custom)
- [Rancher Cloud Provider Setup](https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers)
- [Upstream Repository](https://github.com/rancher/image-build-rke2-cloud-provider)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### statsd-fips

# statsd-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/statsd-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/statsd-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### min-toolkit-debug-fips

# min-toolkit-debug-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/min-toolkit-debug-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/min-toolkit-debug-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wolfi container image with some debugging utilities included. Suitable for using as a debugging tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `min-toolkit-debug-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/). This image also ships with go binaries that are compiled using `go-fips` toolchain.

## Getting Started
This container image is useful for debugging various networking and DNS issues.

To illustrate, start an interactive container using this image:

```shell
docker run --rm -it --entrypoint=bash cgr.dev/ORGANIZATION/min-toolkit-debug-fips:latest
```

From the container's shell, you can run various diagnostic commands, like `ss`, `dig`, and `traceroute`:

```
bash-5.2# ss -tunlp
bash-5.2# dig +short google.com
bash-5.2# traceroute google.com
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jdk-fips

# jdk-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jdk-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jdk-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This is a base image containing both OpenJDK and the Bouncy Castle
crypto libraries for FIPS.

The FIPS validated version of Bouncy Castle is compliant to the FIPS
140-3 standard when used in accordance with the [Bouncy Castle
Security Policy].

When using the OpenJDK Chainguard Image for FIPS compliance, please
make sure to read the security policy and adapt your code as
needed. Follow these documents:

* [Bouncy Castle FIPS Java API User Guide (PDF)]
* [Bouncy Castle FIPS Migration Hints (PDF)]
* [JDK Providers Documentation]

OpenSSL FIPS provider is also included for convenience to add any
other non-Java applications that use OpenSSL for their cryptographic
needs.

## Available versions and variants

This image is currently available in the following versions and variants:

| Java version | Image name            |
|--------------|-----------------------|
| Java 21      | `jdk-fips:openjdk-21` |
| Java 17      | `jdk-fips:openjdk-17` |
| Java 11      | `jdk-fips:openjdk-11` |

## How are the `java.policy` and `java.security` files configured?

An updated version of the `java.security` configuration file is shipped under
the default location (`$JAVA_HOME/conf/security/java.security`) in this image and
is configured as described below:

* It sets up BouncyCastle FIPS providers at highest priority
* Security providers that implement non-validated cryptography are omitted
* SUN provider is loaded at lowest priority, as it is required to validate the BouncyCastle signed jars
* Detailed services which stock security providers implement are described in [JDK Providers Documentation]
* Hardening is applied to block security-sensitive usage of algorithms that may leak from the SUN provider

* It loads the `java.policy` file shipped under `/usr/lib/jvm/jdk-fips-config/java.policy`
    as an additional policy file, at position 2, leaving the policy configuration
    as:
    ```none
    policy.url.1=file:${java.home}/conf/security/java.policy
    policy.url.2=file:/usr/lib/jvm/jdk-fips-config/java.policy
    ```

    The additional policy file is configured as described in the BCFIPS user manual:
    ```none
    grant {
        permission java.lang.PropertyPermission "java.runtime.name", "read";

        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.internal.spec";
        permission java.lang.RuntimePermission "getProtectionDomain";
        permission java.lang.RuntimePermission "accessDeclaredMembers";

        permission org.bouncycastle.crypto.CryptoServicesPermission "tlsAlgorithmsEnabled";
        permission org.bouncycastle.crypto.CryptoServicesPermission "exportKeys";
    };
    ```

* Supported `truststore.type` are `jks`, `pkcs12` and `bcfks` for public CA certificates in approved mode.

* Supported `keystore.type` is only `bcfks`, in order for keystores used for private key storage to be FIPS-compliant.

* It sets the algorithms for the `KeyManagerFactory` and `TrustManagerFactory` as PKIX:
    ```none
    ssl.KeyManagerFactory.algorithm=PKIX
    ssl.TrustManagerFactory.algorithm=PKIX
    ```

* It sets BCFIPS to `approved_only` mode:
    ```none
    org.bouncycastle.fips.approved_only=true
    ```

## Using the provided Bouncy Castle libraries

Whenever possible ensure to use `--module-path
/usr/share/java/bouncycastle-fips`, as that allows one to execute
classes, jars, modules correctly with bouncycastle-fips JCA & JSSE
providers available to the JVM.

There are many additional environment variables preset in the image
that enable using `CLASSPATH` instead if desired.

This image ships with the following environment variables exported by default:
* `JAVA_FIPS_CLASSPATH=/usr/share/java/bouncycastle-fips/*`
* `JDK_JAVA_FIPS_OPTIONS="--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED"`
* `JDK_JAVAC_FIPS_OPTIONS="--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED"`
* `JAVA_TRUSTSTORE_OPTIONS="-Djavax.net.ssl.trustStoreType=FIPS"`

> **Warning**:
> These variable values **must not** be changed. If you need to use custom `CLASSPATH`
> or other JDK options, make sure to include these variables in your new variable declarations.
> Ensure that the `JAVA_TRUSTSTORE_OPTIONS` is part of your `JDK_JAVA_OPTIONS` variablee when
> using this image as a base image.

In addition, the following environment variables are also exported by default and can
be updated as needed:
* `CLASSPATH=$JAVA_FIPS_CLASSPATH:.:./*`
* `JDK_JAVA_OPTIONS=$JDK_JAVA_FIPS_OPTIONS $JAVA_TRUSTSTORE_OPTIONS`
* `JDK_JAVAC_OPTIONS=$JDK_JAVAC_FIPS_OPTIONS`

When updating your classpath variable, make sure to keep the path to the
`bouncycastle-fips` folder in your classpath, so the Bouncy Castle libraries
are discoverable:
```shell
CLASSPATH="${JAVA_FIPS_CLASSPATH}:${CLASSPATH}"
```

When updating the `JDK_JAVA_OPTIONS`/`JDK_JAVAC_OPTIONS` environment variables,
make sure to specify the exports options required for Bouncy Castle to work
properly:
```shell
JDK_JAVA_OPTIONS="${JDK_JAVA_FIPS_OPTIONS} ${JDK_JAVA_OPTIONS}"
JDK_JAVAC_OPTIONS="${JDK_JAVAC_FIPS_OPTIONS} ${JDK_JAVAC_OPTIONS}"
```

If you need the use of the converted keystore, make sure to also add the
`JAVA_TRUSTSTORE_OPTIONS` variable to your `JDK_JAVA_OPTIONS`:
```shell
JDK_JAVA_OPTIONS="${JAVA_TRUSTSTORE_OPTIONS} ${JDK_JAVA_OPTIONS}"
JDK_JAVAC_OPTIONS="${JDK_JAVAC_OPTIONS}"
```

Alternatively, these can be also set as an argument to the JVM tools via the
`--class-path`/`-cp` and `-D` options. Please note these arguments take
precedence over the environment variables:
```shell
javac --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS} TestClass.java
java -cp "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVA_FIPS_OPTIONS} TestClass
jshell --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS}
```

## Checking the configuration is being loaded correctly

Execute the `org.bouncycastle.util.DumpInfo`:

```
docker run --rm -t --pull=always cgr.dev/ORGANIZATION/jdk-fips java org.bouncycastle.util.DumpInfo
```

It should provide output similar to the below:

```
$ docker run --rm -t --pull=always cgr.dev/ORGANIZATION/jdk-fips java org.bouncycastle.util.DumpInfo
latest: Pulling from ORGANIZATION/jdk-fips
Digest: sha256:b9ce5e8d7a8005e8a22e2bc443ec04d24cf01bea28a75803cc15c8e9e817a5f5
Status: Image is up to date for cgr.dev/ORGANIZATION/jdk-fips:latest
NOTE: Picked up JDK_JAVA_OPTIONS: --add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED -Djavax.net.ssl.trustStoreType=FIPS
Picked up JAVA_TOOL_OPTIONS: --module-path=/usr/share/java/bouncycastle-fips
Version Info: BouncyCastle Security Provider (FIPS edition) v2.1.0
FIPS Ready Status: READY
Native Ready Status: READY
Native Variant: vaes
Native Build Date: 2024-11-15T15:56:42
Native Support: AES/CBC AES/CFB AES/CTR AES/ECB AES/GCM DRBG NRBG SHA2
Module SHA-256 HMAC: 941ebff8db149f871fbbeaf90269c19453b1e9d3777541fda1c0cf9132b426ce
```

This class is also available to execute from within the codebase of
your own applications.

As part of the effort to build this image, a set of tests was created
that validates that the BCFIPS and BCJSSE providers are in use.

Some of these tests are shipped in the image in
`/usr/lib/bcfips-policy-140-3`. They validate that allowed algorithms
are available, and disallowed ones are blocked.

## Using this as a base image

### Java 21 JDK

To consume this image as a base image, add it in the `FROM` statement of your Dockerfile. One can execute jars like this `java --module-path /usr/share/java/bouncycastle-fips -jar`. Without the ``-module-path` setting one will eventually see cryptic runtime errors from JCA or JSSE APIs. Alternatively one can add jars to the `CLASSPATH` and invoke the main class directly:
```dockerfile
FROM cgr.dev/ORGANIZATION/jdk-fips:openjdk-21

WORKDIR /src
COPY MyClass.java .

RUN javac MyClass.java && \
    jar cvf my-app.jar *.class
```

This can also be worked into a multistage build using the JRE FIPS
variant for running your application:
```dockerfile
FROM cgr.dev/ORGANIZATION/jdk-fips:openjdk-21

WORKDIR /src
COPY MyClass.java .

RUN javac MyClass.java && \
    jar cvf my-app.jar *.class

FROM cgr.dev/ORGANIZATION/jre-fips:openjdk-21

WORKDIR /jars
COPY --from=builder /src/my-app.jar .

ENV CLASSPATH="${JAVA_FIPS_CLASSPATH}:/jars/*"
CMD ["MyApp"]
```

[Bouncy Castle Security Policy]: https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp4743.pdf
[Bouncy Castle FIPS Java API User Guide (PDF)]: https://downloads.bouncycastle.org/fips-java/BC-FJA-UserGuide-2.0.0.pdf
[Bouncy Castle FIPS Migration Hints (PDF)]: https://downloads.bouncycastle.org/fips-java/docs/BC-FJA%202.0.0%20Porting%20Guide.pdf
[JDK Providers Documentation]: https://docs.oracle.com/en/java/javase/21/security/oracle-providers.html#GUID-FE2D2E28-C991-4EF9-9DBE-2A4982726313

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-195

# request-195
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-195` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-195/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### omni

# omni
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/omni` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/omni/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Omni managing Kubernetes clusters across bare metal, VMs, and cloud

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `omni` container image is comparable to the [siderolabs/omni](https://github.com/siderolabs/omni) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `omni` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

**Run the Container**

Replace paths to your TLS certs and private keys and adjust parameters as needed:

```bash
docker run --rm -it \
  -v /path/to/tls.crt:/tls.crt \
  -v /path/to/tls.key:/tls.key \
  -v /path/to/privatekey.asc:/omni.asc \
  cgr.dev/ORGANIZATION/omni:latest \
  --cert=/tls.crt \
  --key=/tls.key \
  --private-key-source=file:///omni.asc \
```

- This starts the Omni container with the minimal required configuration.
- The container listens on port 443 by default (you can modify this with `--bind-addr`).

**What to Expect**

- The container will start running the omni backend services (API, control plane).
- Logs will output startup success.
- Omni will serve its API and associated services on the bind address.

**Accessing the Web UI**

- Once the container is running, access the Omni Web UI by navigating to the domain or IP you configured for Omni in your browser.
- If you used the IP or domain `omni.example.com` and bind address `0.0.0.0:443`, visit:

```
https://omni.example.com/
```

- If running on localhost for testing and binding to port 443, you can try:

```
https://localhost/
```

## Documentation and Resources

- **[Official Omni Documentation](https://github.com/siderolabs/omni)** 
- **[Omni Getting Started Guide](https://omni.siderolabs.com/tutorials/getting_started)** 
- **[Omni CLI Docs - omnictl](https://omni.siderolabs.com/reference/cli)** 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opal

# opal
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opal` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opal/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OPAL is an administration layer for Policy Engines

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility

Chainguard's `opal-client` and `opal-server` images are drop-in compatible with the upstream images from [Permit.io’s OPAL project](https://docs.opal.ac/).

## Getting Started

### Deploy with Docker Compose

Start by downloading the upstream Docker Compose example provided by the OPAL project:

```sh
curl -L https://raw.githubusercontent.com/permitio/opal/master/docker/docker-compose-example.yml > docker-compose.yml
```

Edit the downloaded `docker-compose.yml` file and replace the image references with the Chainguard images:

```yaml
opal-server:
  image: cgr.dev/ORGANIZATION/opal-server:latest

opal-client:
  image: cgr.dev/ORGANIZATION/opal-client:latest
```

Bring up the stack:

```sh
docker-compose up
```

This deployment starts the OPAL server and client, a broadcast channel, and loads example policies and data. Once the services are running, verify the setup by querying the OPA Agent API, which is exposed on port `8181`:

```sh
curl http://localhost:8181/v1/data/users
```

A successful response returns example user data similar to the following:

```json
{
  "result": {
    "alice": {
      "location": {
        "country": "US",
        "ip": "8.8.8.8"
      },
      "roles": ["admin"]
    }
  }
}
```

To learn how to modify policies or data sources, see the [OPAL quickstart guide](https://docs.opal.ac/getting-started/quickstart/opal-playground/overview).

### Deploy with Helm

To deploy OPAL in Kubernetes, first add the upstream OPAL Helm repository:

```sh
helm repo add permitio https://permitio.github.io/opal-helm-chart
helm repo update
```

Create a `values.yaml` file to override the default image locations:

```yaml
image:
  client:
    registry: cgr.dev/ORGANIZATION
    repository: opal-client
    tag: latest
  server:
    registry: cgr.dev/ORGANIZATION
    repository: opal-server
    tag: latest
```

Install the chart into a new namespace:

```sh
helm install --create-namespace -n opal opal permitio/opal -f values.yaml
```

By default, the Helm chart deploys OPAL with the same example policies and data used in the Docker Compose setup. These examples are maintained in the upstream [OPAL example policy repository](https://github.com/permitio/opal-example-policy-repo).

After installation, forward the OPA Agent API to your local machine:

```sh
kubectl wait --for=condition=available deployment/opal-client -n opal --timeout=300s

kubectl port-forward -n opal service/opal-client 8181:8181
```

You can then verify the deployment by querying the same `/v1/data/users` endpoint used in the Docker example:

```sh
curl http://localhost:8181/v1/data/users
```

For a full list of supported Helm configuration values, see the OPAL documentation on the [Helm chart configuration options](https://docs.opal.ac/tutorials/helm-chart-for-kubernetes#important-configuration).

## References

* [OPAL website](https://opal.ac/)
* [OPAL GitHub repository](https://github.com/permitio/opal)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-csi-driver-fips

# cert-manager-csi-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-csi-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-csi-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes CSI driver that automatically mounts signed certificates to Pods using ephemeral volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cert-manager-csi-driver-fips image is comparable to the [quay.io/jetstack/cert-manager-csi-driver](https://quay.io/repository/jetstack/cert-manager-csi-driver?tab=tags&tag=latest) image. As with many of Chainguard's other container images, this image contains only the minimum number of dependencies it needs to function. It doesn't include things like a shell or package manager.

### FIPS support

Chainguard's `cert-manager-csi-driver-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

Even though the image itself is FIPS compliant, its PKCS#12 feature is not. When you set any pkcs12-* volume attribute, the driver calls the [LegacyRC2 encoder](https://github.com/cert-manager/csi-driver/blob/b662bdb6265e37fe7875c4ed72668c47010b0c1c/pkg/keystore/pkcs12/pkcs12.go#L62) in [SSLMate/go-pkcs12](https://github.com/SSLMate/go-pkcs12/blob/fa70679f0f1622a2705336a97225ee8d6c555f96/pkcs12.go#L81-L95), which encrypts certificates with RC2-40-CBC and private keys with `3DES`, both wrapped with `SHA-1`. These ciphers are no longer permitted for encryption under FIPS-140-3, so a Go binary running in FIPS mode rejects them and the volume mount fails.

## Getting Started

### Pre-requisites
* A Kubernetes cluster with [cert-manager](https://cert-manager.io/docs/installation/) installed

### Deployment

Create a `values.yaml` file with the following content:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cert-manager-csi-driver-fips
  tag: latest
```

To install csi-driver, use Helm:

```shell
helm repo add jetstack https://charts.jetstack.io --force-update

helm upgrade cert-manager-csi-driver-fips jetstack/cert-manager-csi-driver \
  --install \
  --namespace cert-manager \
  -f values.yaml \
  --wait
```

## Documentation and Resources
* [Official Documentation](https://cert-manager.io/docs/usage/csi-driver/)
* [Helm Chart](https://github.com/cert-manager/csi-driver/tree/main/deploy/charts/csi-driver)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra

# cassandra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Cassandra](https://cassandra.apache.org) is a free and open-source, distributed, wide-column store, NoSQL database.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying
Deploy a new instance of Cassandra using this image:

```bash
docker run -d \
  --name cassandra \
  -e CASSANDRA_START_RPC=true \
  -p 9042:9042 cgr.dev/chainguard/cassandra:latest
```

You can use `nodetool status` command to check if Cassandra is running properly.
Note, it'll take a couple of minutes for Cassandra to become fully operational:

```bash
docker exec -it cassandra nodetool status

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load        Tokens  Owns (effective)  Host ID                               Rack
UN  127.0.0.1  104.38 KiB  16      100.0%            0e75f72d-d273-4fac-807e-2b230583458c  rack1
```

`cqlsh` is available on the image:

```bash
docker exec -i cassandra cqlsh -e "
CREATE KEYSPACE testkeyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE testkeyspace;
CREATE TABLE users (user_id UUID PRIMARY KEY, name text);
INSERT INTO users (user_id, name) VALUES (uuid(), 'Chainguard');
SELECT * FROM users;
"

 user_id                              | name
--------------------------------------+------------
 3f13c6b4-4a22-4de7-a1f6-a3ac6e887ddb | Chainguard
 67e3be15-07f9-4dd6-b9b9-c00037d705ac | Chainguard

(2 rows)
```

For more information, refer to the [Cassandra documentation](https://cassandra.apache.org/_/quickstart.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### plugin-barman-cloud-fips

# plugin-barman-cloud-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/plugin-barman-cloud-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/plugin-barman-cloud-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CloudNativePG barman-cloud plugin for PostgreSQL backup and recovery to S3-compatible storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `plugin-barman-cloud-fips` images are FIPS-hardened versions of the [CloudNativePG barman-cloud plugin](https://github.com/cloudnative-pg/plugin-barman-cloud). This plugin provides PostgreSQL backup and recovery capabilities to S3-compatible storage using Barman Cloud tools with FIPS 140-2 compliant cryptographic operations.

### FIPS 140-2 Compliance
The `plugin-barman-cloud-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module, ensuring all cryptographic operations used for backup encryption and S3 communication meet FIPS 140-2 standards. This includes:

- **Backup encryption** - All backup data is encrypted using FIPS-approved algorithms
- **S3 communication** - HTTPS connections to S3-compatible storage use FIPS-validated TLS
- **Authentication** - AWS credentials and authentication mechanisms comply with FIPS standards

For comprehensive information on FIPS support in Chainguard Images:
* [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
* [FIPS 140-2 Standard Overview](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/#what-is-fips-140-2)

The plugin consists of two components:
- **Plugin Manager** (`plugin-barman-cloud-fips`): Runs as a deployment and manages plugin lifecycle
- **Sidecar** (`plugin-barman-cloud-sidecar-fips`): Injected into PostgreSQL pods to handle backup operations

## Getting Started

### Using Chainguard's FIPS-Compliant CloudNative-PG Operator

Create a `values-fips.yaml` file to configure the CloudNative-PG operator with Chainguard FIPS images:

```yaml
# values-fips.yaml for CloudNative-PG with Chainguard FIPS images
image:
  repository: cgr.dev/ORGANIZATION/cloudnative-pg-fips
  tag: latest
  pullPolicy: IfNotPresent
```

```bash
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm repo update

# Install with Chainguard FIPS images
helm install cnpg cnpg/cloudnative-pg \
  --namespace cnpg-system \
  --create-namespace \
  --values values-fips.yaml

# Wait for operator to be ready
kubectl wait --for=condition=Available deployment/cnpg-cloudnative-pg -n cnpg-system --timeout=120s

# Verify the FIPS image is being used
kubectl get deployment cnpg-cloudnative-pg -n cnpg-system \
  -o jsonpath='{.spec.template.spec.containers[0].image}'
```

Download the plugin manifest and modify it to use Chainguard FIPS images:

```bash
# Set your custom FIPS images
PLUGIN_IMAGE="cgr.dev/ORGANIZATION/plugin-barman-cloud-fips:latest"
SIDECAR_IMAGE="cgr.dev/ORGANIZATION/plugin-barman-cloud-sidecar-fips:latest"

# Download and modify the manifest with yq to inject custom sidecar image
curl -fsSL "https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.6.0/manifest.yaml" | \
  yq eval "select(.kind == \"Secret\") |= .data.SIDECAR_IMAGE = \"$(echo -n ${SIDECAR_IMAGE} | base64)\"" | \
  kubectl apply -f -

# Update the plugin operator deployment with custom FIPS image
kubectl set image deployment/barman-cloud "*=${PLUGIN_IMAGE}" -n cnpg-system
kubectl rollout status deployment barman-cloud -n cnpg-system --timeout=120s
```

## Related FIPS Images

For complete PostgreSQL deployments with FIPS compliance, consider these related Chainguard FIPS images:

* [`postgresql-fips`](https://images.chainguard.dev/directory/image/postgresql-fips/overview) - FIPS-hardened PostgreSQL database
* [`cloudnative-pg-fips`](https://images.chainguard.dev/directory/image/cloudnative-pg-fips/overview) - FIPS-hardened CloudNativePG operator  
* [`plugin-barman-cloud-sidecar-fips`](https://images.chainguard.dev/directory/image/plugin-barman-cloud-sidecar-fips/overview) - FIPS-hardened sidecar component

## Documentation and Resources

* [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/) - Complete guide to using FIPS images
* [CloudNativePG Plugin Documentation](https://cloudnative-pg.io/docs/)
* [Barman Cloud Plugin Repository](https://github.com/cloudnative-pg/plugin-barman-cloud)
* [CloudNativePG Backup and Recovery Guide](https://cloudnative-pg.io/documentation/current/backup_recovery/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-nifi-registry

# apache-nifi-registry
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-nifi-registry` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-nifi-registry/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Registry for storing and managing shared resources such as versioned flows across one or more instances of NiFi.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Apache Nifi-Registry Image is comparable to the [official Nifi Registry Image from Docker Hub](https://github.com/apache/nifi/tree/main/nifi-registry). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

### Running with Docker

Run NiFi Registry with Docker:

```bash
docker run -d \
  -p 18080:18080 \
  --name nifi-registry \
  cgr.dev/ORGANIZATION/apache-nifi-registry:latest
```

### Deployment on Kubernetes

Deploy NiFi Registry on Kubernetes:

```yaml
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nifi-registry
spec:
  selector:
    matchLabels:
      app: nifi-registry
  template:
    metadata:
      labels:
        app: nifi-registry
    spec:
      containers:
      - name: nifi-registry
        image: cgr.dev/ORGANIZATION/apache-nifi-registry:latest
EOF
```

## Documentation and Resources

* [Apache NiFi Registry Documentation](https://nifi.apache.org/docs/nifi-registry-docs/)
* [Apache NiFi Registry Administration Guide](https://nifi.apache.org/docs/nifi-registry-docs/html/administration-guide.html)
* [Apache NiFi User Guide](https://nifi.apache.org/docs/nifi-docs/html/user-guide.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### frr

# frr
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/frr` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/frr/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The FRRouting Protocol Suite

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### usage 

This image can be run with docker:
```bash
docker run --rm --privileged -d -it cgr.dev/chainguard/frr:latest-dev
```

Similar to metallb, we can use Kubernetes to run this application. When setting up Frr to run in Kubernetes environments, Metallb enables the use of Frr as a backend.

See https://metallb.io/index.html#frr-mode for additional information.

Read the upstream frr user guide here to find out more about configuring frr itself: https://docs.frrouting.org/en/latest/index.html

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### go-msft-fips

# go-msft-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/go-msft-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/go-msft-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Go applications with FIPS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Go FIPS with OpenSSL

This image provides go toolchain that produces FIPS compliant binaries. It is go toolchain compiled with [microsoft/go](https://github.com/microsoft/go) patches applied. The image itself has the `go` binary itself compiled in FIPS compliant mode, and contains a CMVP certified OpenSSL FIPS provider.

The image has recommended environment variables set to compile binaries in enforcing mode.

 * `CGO_ENABLED=1`
 * `GOEXPERIMENT=systemcrypto`
 * `GODEBUG=fips140=on`
 * `GOFLAGS=-tags=requirefips`

Further documentation is available from upstream:

 * [README](https://github.com/microsoft/go/blob/microsoft/main/eng/doc/fips/README.md) covering build and runtime options
 * [User Guide](https://github.com/microsoft/go/blob/microsoft/main/eng/doc/fips/UserGuide.md) covering changes to individual golang standard library APIs

Whilst Chainguard's edition of OpenSSL FIPS is recommended, the resulting binaries are vendor-agnostic and can be used at runtime with OpenSSL FIPS providers on other OpenSSL FIPS hosts.

FIPS compliance is achieved by not using any native golang cryptographic functionality and redirecting all calls to OpenSSL at runtime.

If no other cryptographic algorithms are implemented or used, certification status will depend on the runtime OpenSSL FIPS certification. For Chainguard that is [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282) and the submitted rebrand of that.

## Usage guidance

Default execution of the container has all of the recommended flags preset. The toolchain defaults to `GOEXPERIMENT=systemcrypto`, even when `GOEXPERIMENT` variable is unset.

 * Use `CGO_ENABLED=1`
 * Either compile applications with `-tags=requirefips` OR use `GODEBUG=fips140=on` at runtime
 * Ensure runtime environment has OpenSSL with FIPS provider (e.g. `cgr.dev/chainguard-private/glibc-openssl-fips` image)

## Interactive build with FIPS operation validation

This section contains two examples of how you can use the Go FIPS Chainguard Image to build an example Go application. For more information on working with this Image, check out our [Getting Started with the Go Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/getting-started-go/) guide.

Start interactive shell in the `go-msft-fips` image:

```sh
docker run --rm -ti --user root -w /root --entrypoint bash cgr.dev/chainguard-private/go-msft-fips:latest
```

User `root` is used here, to perform tampering with the FIPS module selfcheck after compiling and running the application.

Install a golang demo application `helloserver`:

```sh
# go install golang.org/x/example/helloserver@latest
go: downloading golang.org/x/example v0.0.0-20240205180059-32022caedd6a
go: downloading golang.org/x/example/helloserver v0.0.0-20240205180059-32022caedd6a
```

Observe build settings used to build the binary:

```sh
# go version -m go/bin/helloserver
go/bin/helloserver: go1.25.0
        path    golang.org/x/example/helloserver
        mod     golang.org/x/example/helloserver        v0.0.0-20250605160450-8b405629c4a5      h1:0JvruIGF0CrrXuph0bOeqKYj2LBuyxi2VVkpNL321EE=
        build   microsoft_systemcrypto=1
        build   -buildmode=exe
        build   -compiler=gc
        build   -tags=requirefips
        build   DefaultGODEBUG=asynctimerchan=1,containermaxprocs=0,decoratemappings=0,fips140=on,gotestjsonbuildtext=1,gotypesalias=0,httplaxcontentlength=1,httpmuxgo121=1,httpservecontentkeepheaders=1,multipathtcp=0,panicnil=1,randseednop=0,rsa1024min=0,tls10server=1,tls3des=1,tlsmlkem=0,tlsrsakex=1,tlssha1=1,tlsunsafeekm=1,updatemaxprocs=0,winreadlinkvolume=0,winsymlink=0,x509keypairleaf=0,x509negativeserial=1,x509rsacrt=0,x509sha256skid=0,x509usepolicies=0
        build   CGO_ENABLED=1
        build   CGO_CFLAGS=
        build   CGO_CPPFLAGS=
        build   CGO_CXXFLAGS=
        build   CGO_LDFLAGS=
        build   GOARCH=amd64
        build   GOFIPS140=latest
        build   GOOS=linux
        build   GOAMD64=v1
```

Observe the following settings are in place:

 * `build CGO_ENABLED=1` enables access to OpenSSL via CGO
 * `build microsoft_systemcrypto=1` enables systemcrypto
 * `build -tags=requirefips` ensures FIPS mode is enforced at the binary startup

Verify that OpenSSL symbols are used by the binary:

```sh
# $ go tool nm go/bin/helloserver | grep -e OpenSSL_version
  6a4300 T _cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version
  6a4340 T _cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version_num
  6a46a0 T _cgo_ba70ff964674_Cfunc__mkcgo_available_OpenSSL_version_num
  a0ecf0 D _g_OpenSSL_version
  a0ece8 D _g_OpenSSL_version_num
  6acb90 T _mkcgo_OpenSSL_version
  6acbc0 T _mkcgo_OpenSSL_version_num
  6acba0 T _mkcgo_available_OpenSSL_version_num
  4fbe60 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_OpenSSL_version.abi0
  4fbf00 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_OpenSSL_version_num.abi0
  4fc380 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_available_OpenSSL_version_num.abi0
  9a3898 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version
  9a38a0 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version_num
  9a38e0 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_available_OpenSSL_version_num
```

Note that `golang-fips/openssl/v2` are the underlying bindings for all the available APIs, even if individual binary may not use all of them.

Verify binary execution with suitable OpenSSL FIPS provider (use `Ctrl+C` to terminate):

```sh
# go/bin/helloserver
2024/04/15 10:22:21 serving http://localhost:8080
^C
```

Now tamper with the fips provider to observe failure to start the application in FIPS mode

```sh
# cp /etc/ssl/fipsmodule.cnf /etc/ssl/fipsmodule.cnf.back
# sed -i 's|:*|:00|' /etc/ssl/fipsmodule.cnf
# go/bin/helloserver
panic: opensslcrypto: FIPS mode requested (environment variable GODEBUG=fips140=on) but not available: OpenSSL 3.5.2 5 Aug 2025

goroutine 1 [running]:
crypto/internal/backend.init.0()
        /usr/lib/go/src/crypto/internal/backend/openssl_linux.go:48 +0x129
```

As you can see above `helloserver` panics when on startup OpenSSL FIPS fails self tests.

Now restore `fipsmodule.cnf` to get back into operational state:

```sh
cp /etc/ssl/fipsmodule.cnf.back /etc/ssl/fipsmodule.cnf
```

## Dockerfile example

The following example Dockerfile builds a helloserver program in Go and copies it on top of the `cgr.dev/chainguard-private/glibc-openssl-fips:latest` base image:

```dockerfile
FROM cgr.dev/chainguard-private/go-msft-fips:latest AS build

RUN go install golang.org/x/example/helloserver@latest

FROM cgr.dev/chainguard-private/glibc-openssl-fips:latest

COPY --from=build /home/nonroot/go/bin/helloserver /helloserver
CMD ["/helloserver"]
```

Run the following command to build the demo image and tag it as `go-helloserver-fips`:

```sh
docker build -t go-helloserver-fips .
```

Now you can run the image with:

```sh
docker run go-helloserver-fips
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### volsync-fips

# volsync-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/volsync-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/volsync-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Asynchronous data replication for Kubernetes volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `volsync-fips` container image is comparable to [the volsync image](https://quay.io/repository/backube/volsync?tab=tags). Like most other Chainguard container images, the `volsync-fips` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

Chainguard's `volsync-fips` container image does not ship `diskrsync` and `diskrsync-tcp` with it.

### FIPS support

Chainguard's `volsync-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The Chainguard's `volsync-fips` container image can be installed via the [volsync helm chart](https://artifacthub.io/packages/helm/backube-helm-charts/volsync).

Create a `values.yaml` file with the following values

```
image:
    repository: cgr.dev/ORGANIZATION/volsync-fips
    tag: latest
```

Run the following command to install the helm chart:

```
helm repo add backube-helm-charts https://backube.github.io/helm-charts/
helm install --create-namespace --namespace volsync-system volsync backube/volsync -f values.yaml
```

You can then try to configure backups using different movers such as `restic`, `rclone`, `syncthing` etc.

Below is an example of a `ReplicationSource` resource which uses the `restic` mover. You should define your own spec for the following resource.

```
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
  name: mydata-backup
spec:
  sourcePVC: mydata
  trigger:
    schedule: "*/30 * * * *"
  restic:
    pruneIntervalDays: 14
    repository: restic-config
    retain:
      hourly: 6
      daily: 5
      weekly: 4
      monthly: 2
      yearly: 1
    copyMethod: Clone
```

## Documentation and Resources
- [Official Documentation](https://volsync.readthedocs.io/en/stable/index.html)
- [Official Usage Guide](https://volsync.readthedocs.io/en/stable/usage/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trillian

# trillian
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trillian` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trillian/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Trillian](https://github.com/google/trillian) is a Merkle tree implementation that is used as the backing for various functionalities including Certificate Transparency and the Sigstore Rekor transparency log.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Sigstore

Trillian is also deployed as part of the sigstore stack.  For more information
on this see [`sigstore-scaffolding`](../sigstore-scaffolding/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-wait-for-fips

# k8s-wait-for-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-wait-for-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-wait-for-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for waiting for a k8s service, job or pods to enter a desired state.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard k8s-wait-for-fips Image is comparable to the [official k8s-wait-for Image from Docker Hub](https://hub.docker.com/r/groundnuty/k8s-wait-for). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS support

Chainguard's `k8s-wait-for-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
You can start simple. Run it on your cluster in a namespace you already have something deployed:
```
kubectl run k8s-wait-for --rm -it --image cgr.dev/ORGANIZATION/REPO_NAME:latest --restart Never --command /bin/sh
```
Read --help and play with it!

## Documentation and Resources
- [Upstream Github Repository](https://github.com/groundnuty/k8s-wait-for/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### yunikorn-scheduler

# yunikorn-scheduler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/yunikorn-scheduler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/yunikorn-scheduler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache YuniKorn K8shim

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is a Getting Started guide for the YuniKorn Scheduler available in the official repository [here](https://yunikorn.apache.org/docs/) where you can learn more about deploying and using Yunikorn Scheduler but the most common way to deploy it is by using the following Helm command:

```shell
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
kubectl create namespace yunikorn
helm install yunikorn yunikorn/yunikorn \
   --namespace yunikorn \
   --set image.repository=cgr.dev/chainguard/yunikorn-scheduler \
   --set image.tag=latest
```

Then you will be able to deploy your applications using the YuniKorn Scheduler like this:

```shell
cat <<EOF | kubectl apply -f-
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-different-scheduler
  labels:
    name: multischeduler-example
spec:
  schedulerName: yunikorn
  containers:
  - name: pod-with-different-scheduler
    image: alpine
    command: ["sh"]
    args: ["-c", "sleep 3600"]
EOF
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-event-exporter-iamguarded

# kubernetes-event-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-event-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-event-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

IAMGuarded compatible image of [Kubernetes Event Exporter](https://github.com/resmoio/kubernetes-event-exporter) for exporting Kubernetes events to various outputs to be used for observability or alerting purposes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Kubernetes-event-exporter IAMGuarded is a security-enhanced variant of Kubernetes-event-exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Kubernetes-event-exporter deployments.

## Helm Chart Installation

The Kubernetes-event-exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kubernetes-event-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Kubernetes-event-exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/kubernetes-event-exporter-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kubernetes-event-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kubernetes-event-exporter:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kubernetes-event-exporter IAMGuarded installation using standard Kubernetes-event-exporter verification methods. The deployment functions as a standard Kubernetes-event-exporter instance, so all typical Kubernetes-event-exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kubernetes-event-exporter IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Kubernetes-event-exporter and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-azure-controller

# cluster-api-azure-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-azure-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-azure-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API provider for Microsoft Azure infrastructure management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-azure-controller image is compatible with the upstream [Cluster API Provider Azure](https://github.com/kubernetes-sigs/cluster-api-provider-azure). This image contains only the minimum set of dependencies needed to run the Azure infrastructure provider components.

## Getting Started

The Cluster API Provider for Azure enables you to create and manage Kubernetes clusters on Microsoft Azure using Cluster API. It provides declarative APIs for provisioning and managing Azure infrastructure resources including Virtual Machines, Virtual Networks, and Load Balancers.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Microsoft Azure account with appropriate permissions
- Azure service principal credentials configured

### Installation

Initialize the Azure infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure azure
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: azure
  namespace: capz-system
spec:
  version: v1.20.2
  configSecret:
    name: capz-manager-bootstrap-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-azure-controller:latest
EOF
```

### Usage Example

Create an Azure cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureClusterIdentity
metadata:
  name: azure-identity
spec:
  type: ServicePrincipal
  allowedNamespaces:
    list:
      - azure-infrastructure-system
  clientID: "00000000-0000-0000-0000-000000000000"
  clientSecret:
    name: azure-credentials
    namespace: azure-infrastructure-system
  tenantID: "22222222-2222-2222-2222-222222222222"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureCluster
metadata:
  name: my-azure-cluster
spec:
  identityRef:
    kind: AzureClusterIdentity
    name: azure-identity
  location: eastus
  resourceGroup: my-cluster-rg
  subscriptionID: "12345678-1234-1234-1234-123456789012"
  networkSpec:
    vnet:
      name: my-cluster-vnet
      cidrBlocks:
      - "10.0.0.0/8"
    subnets:
    - name: control-plane-subnet
      cidrBlocks:
      - "10.0.0.0/16"
      role: control-plane
    - name: node-subnet
      cidrBlocks:
      - "10.1.0.0/16"
      role: node
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureMachineTemplate
metadata:
  name: my-cluster-control-plane
spec:
  template:
    spec:
      vmSize: Standard_D2s_v3
      image:
        marketplace:
          publisher: cncf-upstream
          offer: capi
          sku: ubuntu-2004-gen1
          version: latest
      osDisk:
        osType: Linux
        diskSizeGB: 50
        managedDisk:
          storageAccountType: Premium_LRS
```

### Configuration

The controller requires an Azure service principal with the following permissions:
- Contributor role on the subscription or resource group
- Network Contributor role (if managing virtual networks)

Create and configure the credentials secret:

```bash
kubectl create secret generic capz-manager-bootstrap-credentials \
  --from-literal=clientSecret="$AZURE_CLIENT_SECRET" \
  --namespace capz-system

kubectl patch secret capz-manager-bootstrap-credentials \
  --namespace capz-system \
  --patch '{
    "data": {
      "clientId": "'$(echo -n "$AZURE_CLIENT_ID" | base64 -w0)'",
      "tenantId": "'$(echo -n "$AZURE_TENANT_ID" | base64 -w0)'",
      "subscriptionId": "'$(echo -n "$AZURE_SUBSCRIPTION_ID" | base64 -w0)'"
    }
  }'
```

## Documentation and Resources

* [Cluster API Provider Azure GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-azure)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Microsoft Azure Documentation](https://docs.microsoft.com/en-us/azure/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chainguard-base-fips

# chainguard-base-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chainguard-base-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chainguard-base-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal, FIPS-validated image useful as a base for building secure images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`chainguard-base-fips` is the FIPS version of our `chainguard-base` image. Like the regular `chainguard-base` image, it is comparable to other common base images, like [`alpine`](https://hub.docker.com/_/alpine), [`debian`](https://hub.docker.com/_/debian), or [`ubuntu`](https://hub.docker.com/_/ubuntu), with the following differences:

* Like all other Chainguard Images, `chainguard-base-fips` features a stripped down, minimal design
* This base image comes with apk and BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs

Most importantly, the `chainguard-base-fips` image contains the OpenSSL FIPS Provider Module (CMVP [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282)). 

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information. 

## Getting Started

The `chainguard-base-fips` image includes a shell and package manager, making it useful for installing an application’s OS-level dependencies. The image will start in a shell by default:

```sh
docker run -it cgr.dev/ORGANIZATION/chainguard-base-fips
```
```
9f5a09772f0f:/#
```

You can run commands from within the shell like this, or you can run commands directly on your local machine without opening a shell:

```sh
docker run cgr.dev/ORGANIZATION/chainguard-base-fips ps
```
```
PID   USER 	TIME  COMMAND
	1 root  	0:00 ps
```

`chainguard-base-fips` is commonly used in Dockerfiles, as in the following example:

```
FROM cgr.dev/ORGANIZATION/chainguard-base-fips

RUN apk update && apk add redis

ENTRYPOINT ["/usr/bin/redis-server"]
```

This example Dockerfile will update `apk` and install the Redis server onto the base image.

You could use a Dockerfile like this to build a new image:

```sh
docker build -t myredis-fips --progress plain --no-cache .
```
```
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 162B done
#1 DONE 0.0s

#2 [internal] load metadata for cgr.dev/ORGANIZATION/chainguard-base-fips:latest
#2 DONE 0.0s

#3 [internal] load .dockerignore
#3 transferring context: 48B done
#3 DONE 0.0s

#4 [1/2] FROM cgr.dev/ORGANIZATION/chainguard-base-fips:latest
#4 CACHED

#5 [2/2] RUN apk update && apk add redis
#5 0.130 fetch https://packages.cgr.dev/extras/x86_64/APKINDEX.tar.gz
#5 5.741 fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
#5 6.860  [https://packages.cgr.dev/extras]
#5 6.860  [https://packages.wolfi.dev/os]
#5 6.860 OK: 99768 distinct packages available
#5 7.224 (1/5) Installing ncurses-terminfo-base (6.5_p20241006-r4)
#5 7.407 (2/5) Installing ncurses (6.5_p20241006-r4)
#5 7.626 (3/5) Installing bash (5.2.37-r2)
#5 7.854 (4/5) Installing posix-libc-utils (2.40-r3)
#5 8.128 (5/5) Installing redis-7.4 (7.4.1-r0)
#5 8.579 Executing glibc-2.40-r3.trigger
#5 8.618 Executing busybox-1.37.0-r0.trigger
#5 8.623 OK: 23 MiB in 24 packages
#5 DONE 8.7s

#6 exporting to image
#6 exporting layers 0.0s done
#6 writing image sha256:d238ef34e477c11aef56793c3c4a6ea436a06f53d258e606fa14e42c321ba1bf done
#6 naming to docker.io/library/myredis-fips done
#6 DONE 0.1s
```

Following that, you can run the new image built from the `chainguard-base-fips` image.

```sh
docker run myredis-fips
```

## Configuration

The `chainguard-base-fips` image uses the [ash](https://www.in-ulm.de/~mascheck/various/ash/) shell from BusyBox by default. 

If you need to port a bash and Debian centric entrypoint script to Chainguard Images, you can update your scripts to work in ash. Alternatively, you can install the shell that works with your scripts.

For example:

```sh
docker run -it cgr.dev/ORGANIZATION/chainguard-base-fips
```
```
85660a3cca6d:/# echo {1..5}
{1..5}

85660a3cca6d:/# apk add bash
fetch https://packages.cgr.dev/extras/x86_64/APKINDEX.tar.gz
fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
(1/3) Installing ncurses-terminfo-base (6.5_p20241006-r4)
(2/3) Installing ncurses (6.5_p20241006-r4)
(3/3) Installing bash (5.2.37-r2)
Executing glibc-2.40-r3.trigger
Executing busybox-1.37.0-r0.trigger
OK: 19 MiB in 22 packages

85660a3cca6d:/# bash

85660a3cca6d:/# echo {1..5}
1 2 3 4 5

85660a3cca6d:/#
```

Oftentimes, you’ll need to install extra utilities to provide required dependencies for applications and scripts. These dependencies are likely to have different package names compared to other Linux distributions, so the apk search command can be very useful for finding the package you need.

For example, say you are porting a Dockerfile that uses the `groupadd` command. You could convert this to the BusyBox `addgroup` equivalent, but it’s also perfectly fine to add the `groupadd` utility. The only issue is that there’s no `groupadd` package, so you will have to search for it:

```
85660a3cca6d:/# groupadd
/bin/sh: groupadd: not found

85660a3cca6d:/# apk add groupadd
ERROR: unable to select packages:
  groupadd (no such package):
	required by: world[groupadd]

85660a3cca6d:/# apk update
fetch https://packages.cgr.dev/extras/x86_64/APKINDEX.tar.gz
fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
 [https://packages.cgr.dev/extras]
 [https://packages.wolfi.dev/os]

e9804f9b1ca9:/# apk search groupadd
shadow-4.16.0-r2

85660a3cca6d:/# apk add shadow
(1/4) Installing libmd (1.1.0-r2)
(2/4) Installing libbsd (0.12.2-r1)
(3/4) Installing linux-pam (1.7.0-r2)
(4/4) Installing shadow (4.16.0-r2)
Executing glibc-2.40-r3.trigger
Executing busybox-1.37.0-r0.trigger
OK: 22 MiB in 23 packages

85660a3cca6d:/# groupadd
Usage: groupadd [options] GROUP

Options:
  -f, --force               	exit successfully if the group already exists,
                            	and cancel -g if the GID is already used
  -g, --gid GID             	use GID for the new group
  -h, --help                	display this help message and exit
  -K, --key KEY=VALUE       	override /etc/login.defs defaults
  -o, --non-unique          	allow to create groups with duplicate
                            	(non-unique) GID
  -p, --password PASSWORD   	use this encrypted password for the new group
  -r, --system              	create a system account
  -R, --root CHROOT_DIR     	directory to chroot into
  -P, --prefix PREFIX_DIR   	directory prefix
  -U, --users USERS         	list of user members of this group
```

Another useful trick is the `cmd: syntax` for finding packages that provide commands. For example, searching for `ldd` returns multiple results:

```
85660a3cca6d:/# apk search ldd
dpkg-dev-1.22.11-r1
nfs-utils-2.8.1-r1
pax-utils-1.3.8-r0
posix-libc-utils-2.40-r3
```

But if you use the `cmd:` syntax it will narrow down the results:

```
85660a3cca6d:/# apk search cmd:ldd
pax-utils-1.3.8-r0
posix-libc-utils-2.40-r3
```

You can even use the syntax directly in `apk add`:

```
85660a3cca6d:/# apk add cmd:ldd
(1/4) Installing ncurses-terminfo-base (6.5_p20241006-r4)
(2/4) Installing ncurses (6.5_p20241006-r4)
(3/4) Installing bash (5.2.37-r2)
(4/4) Installing posix-libc-utils (2.40-r3)
Executing glibc-2.40-r3.trigger
Executing busybox-1.37.0-r0.trigger
OK: 25 MiB in 27 packages
```

## Documentation and Resources

The following resources provide helpful information on working with Chainguard's base images. Note that some of these resources focus on `chainguard-base` and `wolfi-base` — the free-tier alternative to the `chainguard-base` image — but these same principles and practices apply to `chainguard-base-fips`.

* (Blog) [How to use Dockerfiles with wolfi-base images](https://www.chainguard.dev/unchained/how-to-use-dockerfiles-with-wolfi-base-images)
* [Vulnerability Comparison: wolfi-base](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/wolfi-base/)
* [Overview of Migrating to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migrations-overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rook-ceph-fips

# rook-ceph-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rook-ceph-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rook-ceph-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard version of [Rook Ceph](https://hub.docker.com/r/rook/ceph/tags) is a minimal, secure, and regularly updated container image designed to deploy storage clusters in a kubernetes environment. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds. `cephadm` and `restful` modules have been removed from the `mgr` application in this image due to [underlying issues with the Py03 library](https://github.com/PyO3/pyo3/issues/3451).
The Chainguard Rook Ceph image defines a [pycache](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPYCACHEPREFIX) directory for rook to read and write `.pyc` files. The directory is provided as an environment variable `PYTHONPYCACHEPREFIX=/tmp/pycache`.
## Getting Started

To spin a minimal ceph cluster, the rook-ceph operator can be used. The chart is found [here - github](https://github.com/rook/rook/tree/7908e52a415c3eb9f95f814966ee9c7b772b830f/deploy/charts/rook-ceph).
Create a custom values file as shown below

```yaml
image:
  repository: "cgr.dev/ORGANIZATION/rook-ceph-fips"
  tag: latest
csi:
  enableRbdDriver: false
  clusterName: "test-ceph"
allowLoopDevices: true
operatorNamespace: rook-ceph
```

Add the helm repo by executing
`helm repo add rook-release https://charts.rook.io/release`
Finally, install the helm chart with

```bash
helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph -f custom-values.yaml
```

This will create the `helm-operator` deployment and other custom resources. Ensure that the operator pods are running.

The next step is to create the ceph cluster and here also a helm chart is used.
First create another custom values file.

```yaml
image:
  repository: "cgr.dev/ORGANIZATION/rook-ceph-fips"
  tag: latest
csi:
  clusterName: "test-ceph"
  allowLoopDevices: true
  image:"cgr.dev/ORGANIZATION/rook-ceph-fips"

cephClusterSpec:
  cephVersion:
    image: "cgr.dev/ORGANIZATION/rook-ceph-fips"
```

Deploy the helm chart to create the ceph-cluster by running;
`helm install --create-namespace --namespace rook-ceph rook-ceph-cluster rook-release/rook-ceph-cluster -f custom-values.yaml`
This will create several resources and in the end, the resources created should contain the resources shown below.

```
NAME                                                    READY   STATUS    RESTARTS        AGE
ceph-csi-controller-manager-5dc6b7cf95-sz2vg                      1/1     Running     0          5d6h
rook-ceph-crashcollector-0a5dc2dab029e8f8d84a037a1b474dfd-k9g52   1/1     Running     0          5d6h
rook-ceph-crashcollector-bc926a7d71ac72a997bb915e41199eaf-gz4vt   1/1     Running     0          5d6h
rook-ceph-crashcollector-c54e91a0c8f218fd8f425652c21ec85d-8cl88   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-4-11.us-west-2.compute.inter54fhm   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-51-239.us-west-2.compute.int7j4xh   1/1     Running     0          5d6h
rook-ceph-exporter-ip-192-168-93-131.us-west-2.compute.intp7csn   1/1     Running     0          5d6h
rook-ceph-mds-ceph-filesystem-a-78886b4f74-9pdqg                  2/2     Running     0          5d6h
rook-ceph-mds-ceph-filesystem-b-69b9676488-znv47                  2/2     Running     0          5d6h
rook-ceph-mgr-a-5d7c9f6776-l8wbg                                  3/3     Running     0          5d6h
rook-ceph-mgr-b-5b78474744-d8d5h                                  3/3     Running     0          5d6h
rook-ceph-mon-a-79949fdbdb-wp5v2                                  2/2     Running     0          5d6h
rook-ceph-mon-b-7cd7c6f58-px4zw                                   2/2     Running     0          5d6h
rook-ceph-mon-c-64549cd54d-gh5cj                                  2/2     Running     0          5d6h
rook-ceph-operator-8cf478d75-fr7hn                                1/1     Running     0          5d6h
rook-ceph-osd-0-5499cb4cbd-lbg2h                                  2/2     Running     0          5d6h
rook-ceph-osd-1-6546d58f6d-bh4fz                                  2/2     Running     0          5d6h
rook-ceph-osd-2-85b98c8657-dkhrl                                  2/2     Running     0          5d6h
rook-ceph-osd-prepare-0a5dc2dab029e8f8d84a037a1b474dfd-zzc2f      0/1     Completed   0          5d6h
rook-ceph-osd-prepare-bc926a7d71ac72a997bb915e41199eaf-dv9wq      0/1     Completed   0          5d6h
rook-ceph-osd-prepare-c54e91a0c8f218fd8f425652c21ec85d-ppvxq      0/1     Completed   0          5d6h
rook-ceph-rgw-ceph-objectstore-a-666ccbb8c5-5xgf4                 2/2     Running     0          5d6h
rook-ceph-tools-c9b78dd99-kp2mg                                   1/1     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-779d456fbf-f5kq6         5/5     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-779d456fbf-vb6jb         5/5     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-62k9c                    2/2     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-qlsnf                    2/2     Running     0          5d6h
rook-ceph.cephfs.csi.ceph.com-nodeplugin-sqjhp                    2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-ctrlplugin-cf6c5dc96-bgxpl             5/5     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-ctrlplugin-cf6c5dc96-s4hpg             5/5     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-9h5zh                       2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-t5xh4                       2/2     Running     0          5d6h
rook-ceph.rbd.csi.ceph.com-nodeplugin-xx6kd                       2/2     Running     0          5d6h
```

To get information about the ceph cluster, execute commands through the rook-ceph-tools pods. For example to get the ceph cluster status,

```bash
kubectl -n rook-ceph exec rook-ceph-tools-5cb8797f56-zxzns -- ceph status
```

## Documentation and Resources
* Rook Github - https://github.com/rook/rook
* Ceph Github - https://github.com/ceph/ceph
* Rook Docs - https://rook.github.io/docs/rook
* Ceph Docs - https://docs.ceph.com/en/reef
* Rook Helm Chart - https://rook.io/docs/rook/latest-release/Helm-Charts/operator-chart/

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-environment-configs-fips

# crossplane-function-environment-configs-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-environment-configs-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-environment-configs-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane function that manages environment-specific configurations for resources in compositions with FIPS 140-3 compliance

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `function-environment-configs-fips` image is based on the [Crossplane function-environment-configs](https://github.com/crossplane-contrib/function-environment-configs) project. This Chainguard Image provides a secure, minimal runtime environment with the following differences from upstream images:

* Built on Wolfi rather than a traditional Linux distribution, resulting in a smaller attack surface
* Runs as a non-root user (uid 65532) by default for enhanced security
* Contains minimal dependencies with few-to-zero CVEs
* Includes both the function binary and compatibility layer for seamless integration

## Getting Started

The `function-environment-configs-fips` image is designed to work with Crossplane compositions for managing environment-specific configurations in FIPS-compliant environments. The image contains a Crossplane function that can be used to inject environment-specific settings into your resources while maintaining cryptographic compliance.

### Basic Usage

You can run the function directly to verify it's working:

```sh
docker run --rm cgr.dev/ORGANIZATION/function-environment-configs-fips:latest --help
```

### Using with Crossplane

Create a function definition for use in your Crossplane cluster:

```sh
cat > function-environment-configs-fips.yaml <<EOF
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: function-environment-configs-fips
spec:
  package: cgr.dev/ORGANIZATION/function-environment-configs-fips:latest
EOF
```

Apply the function to your cluster:

```sh
kubectl apply -f function-environment-configs-fips.yaml
```

### Integration in Compositions

Use the function in your Crossplane compositions to inject environment-specific configurations:

```sh
cat > composition-example-fips.yaml <<EOF
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: example-with-env-configs-fips
spec:
  compositeTypeRef:
    apiVersion: example.com/v1alpha1
    kind: XExample
  functions:
  - name: environment-configs-fips
    type: function
    source: Function
    ref:
      name: function-environment-configs-fips
    input:
      apiVersion: environmentconfigs.fn.crossplane.io/v1beta1
      kind: Input
      spec:
        environmentConfigs:
        - ref:
            name: dev-config
          policy:
            merge: merge
        - ref:
            name: common-config
          policy:
            merge: replace
EOF
```

### Development with the `-dev` Variant

For debugging and development, use the `-dev` variant which includes additional tools:

```sh
docker run -it cgr.dev/ORGANIZATION/function-environment-configs-fips:latest-dev sh
```

## Configuration

The function accepts configuration through its input specification. Key configuration options include:

### Environment Config References

Specify which environment configs to apply:

```yaml
spec:
  environmentConfigs:
  - ref:
      name: my-environment-config
    policy:
      merge: merge  # or "replace"
```

### Merge Policies

* `merge`: Merge environment config with existing values
* `replace`: Replace existing values with environment config

### FIPS Compliance

This image automatically uses FIPS 140-3 validated cryptographic modules. No additional configuration is required to enable FIPS mode, as it is built into the base system. This makes it suitable for environments requiring federal compliance standards such as FedRAMP.

## Troubleshooting

### Crossplane Version Compatibility

If you encounter errors like "incompatible Crossplane version: package is not compatible with Crossplane version (): Invalid Semantic Version", this typically occurs when:

1. **Using `latest` tags**: Crossplane requires semantic versioning for compatibility checks. Ensure your Crossplane deployment uses specific version tags (e.g., `2.0.2`) instead of `latest`.

2. **Version detection issues**: If the error persists with proper version tags, you can bypass version constraints by adding `ignoreCrossplaneConstraints: true` to your Function specification:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: crossplane-function-environment-configs-fips
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-environment-configs-fips:latest
  ignoreCrossplaneConstraints: true  # Add this line
```

## Documentation and Resources

* [Crossplane Function Environment Configs Documentation](https://github.com/crossplane-contrib/function-environment-configs)
* [Crossplane Functions Overview](https://docs.crossplane.io/latest/packages/functions/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoria-metrics-fips

# victoria-metrics-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoria-metrics-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoria-metrics-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

VictoriaMetrics standalone image is a fast, cost-effective and scalable monitoring solution and time series database

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's victoria-metrics standalone image is comparable to the [upstream victoria-metrics image](https://hub.docker.com/r/victoriametrics/victoria-metrics). Switching to the Chainguard image should not require any changes to your existing setup. 

### FIPS support

Chainguard's `victoria-metrics-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
### Helm chart
You can install victoria-metrics using the [standalone helm chart](https://github.com/VictoriaMetrics/helm-charts/tree/master/charts/victoria-metrics-single), you can use a `values.yaml` like the one below, to change the image.
```
server:
  image:
    registry: cgr.dev/ORGANIZATION
    repository: victoria-metrics
    tag: latest
```
To install the helm chart, use:
```
helm install vm oci://ghcr.io/victoriametrics/helm-charts/victoria-metrics-single --namespace victoriametrics --create-namespace -f values.yaml
```

### Docker 
```
docker run -it --rm -v /path/to/victoria-metrics-data:/victoria-metrics-data -p 8428:8428 cgr.dev/ORGANIZATION/victoria-metrics:latest
```
This will run the service on port 8428, all the data will be stored at /path/to/victoria-metrics-data.

## Documentation and Resources
- [Upstream Documentation](https://docs.victoriametrics.com/victoriametrics/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### deck

# deck
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/deck` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/deck/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

deck is a command-line interface for managing Kong Gateway configurations declaratively

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `deck` container image is comparable to the [Kong/deck](https://github.com/Kong/deck) image, with the following differences:

* Like all other Chainguard Images, `deck` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

### Validating Kong Configuration Files

Create a simple Kong configuration file:

```sh
cat > kong-config.yaml << 'EOF'
_format_version: "3.0"
services:
  - name: example-service
    url: http://httpbin.org
    routes:
      - name: example-route
        paths:
          - /example
EOF
```

Validate the configuration file:

```sh
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/deck:latest file validate kong-config.yaml
```

## Documentation and Resources

- **[Official Documentation](https://developer.konghq.com/index/deck/)**
- **[GitHub Repository](https://github.com/Kong/deck)**
- **[Get Started Guide](https://developer.konghq.com/deck/get-started/)**
- **[Gateway Documentation](https://developer.konghq.com/gateway/get-started/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-sharded-iamguarded

# mongodb-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MongoDB](https://www.mongodb.com/) is a document-oriented database management system. MongoDB is a popular example of a NoSQL database, and stores data in JSON-like documents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MongoDB Sharded IAMGuarded is a security-enhanced variant of MongoDB designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard MongoDB deployments.

## Helm Chart Installation

The MongoDB Sharded IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb-sharded
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mongodb-sharded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb-sharded \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MongoDB Sharded image
image:
  registry: myregistry.example.com
  repository: mirrored/mongodb-sharded-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/mongodb-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mongodb-sharded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb-sharded@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb-sharded
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mongodb-sharded:1.2.3
   Digest: sha256:61485fe902828b2859684d8d99df394878131eb6590f738bfa7f6f1f43eb8174
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MongoDB Sharded IAMGuarded installation using standard MongoDB verification methods. The deployment functions as a standard MongoDB instance, so all typical MongoDB validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MongoDB Sharded IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MongoDB and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cass-operator-fips

# cass-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cass-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cass-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cass-operator-fips` container image is a FIPS-enabled variant of the upstream [k8ssandra/cass-operator](https://hub.docker.com/r/k8ssandra/cass-operator) image. As with other Chainguard Containers, the `cass-operator-fips` image was designed with minimalism in mind, and therefore doesn't contain things like a shell or package manager.

## Getting Started

The `cass-operator-fips` image can be used as a drop-in replacement for the standard cass-operator in Kubernetes deployments. The operator manages Apache Cassandra clusters on Kubernetes, automating tasks like deployment, scaling, and configuration management.

### Prerequisites

Before deploying the operator, ensure you have:
- A Kubernetes cluster (v1.21+)
- Helm 3.x installed
- kubectl configured to access your cluster

### Deploying the Operator

First, add the required Helm repositories:

```shell
helm repo add jetstack https://charts.jetstack.io
helm repo add k8ssandra https://helm.k8ssandra.io/stable
helm repo update
```

The cass-operator requires cert-manager for certificate management. Install it first:

```shell
helm install cert-manager jetstack/cert-manager \
  --namespace cass-operator \
  --create-namespace \
  --set installCRDs=true \
  --wait
```

Now deploy the cass-operator using the FIPS-compliant image:

```shell
helm install cass-operator k8ssandra/cass-operator \
  -n cass-operator \
  --set image.registry="" \
  --set image.repository="cgr.dev/ORGANIZATION/cass-operator-fips" \
  --set image.tag="latest" \
  --wait
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Verify the Deployment

Check that the operator is running:

```shell
kubectl get pods -n cass-operator
```

You should see the cass-operator pod in a Running state:

```
NAME                             READY   STATUS    RESTARTS   AGE
cass-operator-xxxxxxxxx-xxxxx    1/1     Running   0          1m
```

The operator is now ready to manage Cassandra clusters. You can create CassandraDatacenter custom resources to deploy Cassandra clusters managed by the operator.

## Documentation and Resources

* [k8ssandra Documentation](https://docs.k8ssandra.io/)
* [cass-operator GitHub Repository](https://github.com/k8ssandra/cass-operator)
* [Apache Cassandra Documentation](https://cassandra.apache.org/doc/latest/)
* [Kubernetes Operator Pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-otel-collector-fips

# aws-otel-collector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-otel-collector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-otel-collector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Distribution of OpenTelemetry Collector for sending data from EKS clusters to AWS monitoring services like CloudWatch and X-Ray.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `aws-otel-collector` image is designed to be a drop-in
replacement for the upstream [AWS OpenTelemetry Collector image](https://hub.docker.com/r/amazon/aws-otel-collector).

### FIPS support

For more information on FIPS support in Chainguard container images, please see:
[FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Prerequisites

- Authenticated with AWS EKS cluster
- IAM role with permissions for the AWS services you plan to use

Below is an example using eksctl to create an IAM service account with the 
necessary permissions for CloudWatch and X-Ray integration:

```bash
kubectl create namespace otel-system
eksctl create iamserviceaccount \
    --name aws-otel-collector \
    --namespace otel-system \
    --cluster MY-CLUSTER-NAME \
    --region MY-AWS-REGION \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
    --approve
```
- For detailed IAM permission requirements, see the [AWS Distro for OpenTelemetry permissions documentation](https://aws-otel.github.io/docs/setup/permissions)

## Getting Started

### Install with Helm

The recommended method for deploying the `aws-otel-collector` with the
Chainguard image is using the official ADOT Helm chart. This example
demonstrates deployment:

```bash
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/aws-otel-collector-fips
  tag: latest

clusterName: MY-CLUSTER-NAME

serviceAccount:
    create: false
    name: aws-otel-collector
EOF
```

Deploy the collector:

```bash
# Add the Helm repository
helm repo add snowplow-devops https://snowplow-devops.github.io/helm-charts
helm repo update

# Install the chart
helm install aws-otel-collector snowplow-devops/aws-otel-collector \
    --namespace otel-system \
    -f values.yaml
```

Once installation completes, validate aws-otel-collector is running:

```bash
kubectl get pods -n otel-system
kubectl get daemonset -n otel-system
```

The collector will automatically start collecting cluster metrics and sending
them to CloudWatch Container Insights.

### Install as an EKS Add-on

EKS allows you to install the ADOT collector as an EKS add-on. For complete
instructions on how you can do this, refer to the [ADOT EKS add-on documentation](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on/installation).

If you've chosen this installation method, be aware that you cannot specify a
custom image while installing as an EKS add-on. You'll need to patch the
`aws-otel-collector` DaemonSet to use the Chainguard image, and this is a step
you'll need to repeat each time that you re-deploy or upgrade the version using
EKS add-ons.

## Documentation and Resources

- [AWS Distro for OpenTelemetry Documentation](https://aws-otel.github.io/docs/)
- [Container Insights Setup Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-EKS-quickstart.html)
- [ADOT Collector Configuration Reference](https://aws-otel.github.io/docs/components/otlp-exporter)
- [OpenTelemetry Collector Documentation](https://opentelemetry.io/docs/collector/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-gcp

# velero-plugin-for-gcp
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-gcp` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-gcp/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Velero plugin for Google Cloud Platform that provides backup and restore functionality for GCS and GCE Persistent Disk snapshots

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `velero-plugin-for-gcp` image is fully compatible with the public [Velero plugin for GCP](https://github.com/vmware-tanzu/velero-plugin-for-gcp). This image includes both the VolumeSnapshotter and ObjectStore plugins required for Google Cloud integration:

* **VolumeSnapshotter**: Handles GCE Persistent Disk snapshots for persistent volume backups
* **ObjectStore**: Manages backups stored in Google Cloud Storage

The plugin is designed to be used as an init container with Velero deployments, following the standard Velero plugin architecture. There are no breaking changes from the public implementation.

## Getting Started

The `velero-plugin-for-gcp` image is designed to be used as an init container in Velero deployments. The image contains a `cp-plugin` command that copies the plugin binary to a shared volume where Velero can load it.

Here's an example of using this image with a Velero deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: velero
  namespace: velero
spec:
  template:
    spec:
      serviceAccountName: velero
      initContainers:
      - name: velero-plugin-for-gcp
        image: cgr.dev/ORGANIZATION/velero-plugin-for-gcp:latest
        volumeMounts:
        - mountPath: /target
          name: plugins
      containers:
      - name: velero
        image: cgr.dev/ORGANIZATION/velero:latest
        command:
        - /velero
        args:
        - server
        - --plugin-dir=/plugins
        volumeMounts:
        - name: plugins
          mountPath: /plugins
      volumes:
      - name: plugins
        emptyDir: {}
```

When the init container runs, it will copy the plugin binary to `/target/velero-plugin-for-gcp`, making it available to the Velero server in the `/plugins` directory.

You can also install Velero with this plugin using the official Velero CLI:

```sh
velero install \
  --provider gcp \
  --plugins cgr.dev/ORGANIZATION/velero-plugin-for-gcp:latest \
  --bucket my-backup-bucket \
  --secret-file ./credentials-velero
```

## Configuration

To use this plugin, you'll need to configure Velero with GCP-specific settings. Create a `BackupStorageLocation` resource:

```yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: gcp
  namespace: velero
spec:
  provider: velero.io/gcp
  objectStorage:
    bucket: my-backup-bucket
    prefix: velero-backups
  config:
    project: my-gcp-project
```

For GCE Persistent Disk snapshots, create a `VolumeSnapshotLocation`:

```yaml
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
  name: gcp
  namespace: velero
spec:
  provider: velero.io/gcp
  config:
    project: my-gcp-project
```

You'll also need to provide GCP credentials to Velero. Create a secret with your GCP service account credentials:

```sh
kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-file cloud=path/to/gcp-service-account.json
```

## Documentation and Resources

* [Velero plugin for GCP documentation](https://github.com/vmware-tanzu/velero-plugin-for-gcp)
* [Velero supported providers documentation](https://velero.io/docs/supported-providers/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-autoscaler-addon-resizer

# kubernetes-autoscaler-addon-resizer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-autoscaler-addon-resizer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-autoscaler-addon-resizer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Addon-resizer is a container that vertically scales a Deployment based on the number of nodes in your cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/addon-resizer/deploy/example.yaml
kubectl set image deployment/nanny-v1 pod-nanny=cgr.dev/chainguard/kubernetes-autoscaler-addon-resizer:latest
```

Find more on the [official documentation](https://github.com/kubernetes/autoscaler/blob/master/addon-resizer/README.md)!

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-podman-exporter

# prometheus-podman-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-podman-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-podman-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for podman environments exposing containers, pods, images, volumes and networks information.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This Chainguard image provides compatibility with the `prometheus-podman-exporter` image.

## Getting Started
To run the image, we need podman to be installed on the host:
```bash
  docker run -d --name exporter \
  -e CONTAINER_HOST=unix:///run/podman/podman.sock \
  -v /run/podman/podman.sock:/run/podman/podman.sock \
  -u root \
  -p 9882:9882 \
  cgr.dev/ORGANIZATION/prometheus-podman-exporter:latest
```
## Documentation & Resources
Please refer to the upstream [documentation](https://github.com/containers/prometheus-podman-exporter/?tab=readme-ov-file#prometheus-podman-exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-volume-modifier-for-k8s-fips

# aws-volume-modifier-for-k8s-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-volume-modifier-for-k8s-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-volume-modifier-for-k8s-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The volume-modifier-for-k8s FIPS image. It's a EBS CSI driver sidecar controller that allows to modify volumes thanks to the CSI `ControllerModifyVolume` CSI API.

Install the EBS CSI driver via the official Helm chart, enabling the `volume-modify` feature that enable the sidecar controller into the CSI driver controller `Deployment`, via the Helm value `controller.volumeModificationFeature.enable`.

Set the `volumemodifier` sidecar controller image to the Chainguard one, via the Helm values `sidecars.volumemodifier.image.repository` and `sidecars.volumemodifier.image.tag`.

Please find an example of `values` below:

```yml
sidecars:
  volumemodifier:
    image:
      repository: cgr.dev/chainguard/aws-volume-modifier-for-k8s-fips
      tag: latest
controller:
  volumeModificationFeature:
    enabled: true
```

Below is an example, of how to use the helm chart, using both the EBS CSI driver and
Volume Modifier Chainguard FIPS images.

Add the helm repo:

```bash
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver/
helm repo update
```

Install the chart:

```bash
helm upgrade --install aws-ebs-csi-driver --namespace kube-system aws-ebs-csi-driver/aws-ebs-csi-driver \
  --set controller.volumeModificationFeature.enabled=true \
  --set sidecars.volumemodifier.image.repository=cgr.dev/chainguard/aws-volume-modifier-for-k8s-fips \
  --set sidecars.volumemodifier.image.tag=latest \
  --set image.repository=cgr.dev/chainguard-private/aws-ebs-csi-driver-fips \
  --set image.tag=latest
```

### Installation via EKS add-on

EKS supports installation of the ebs-csi-driver as an EKS add-on. There are
instructions in the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html).

If you've chosen this installation method, keep in mind that you cannot specify a custom image whilst
installing via EKS add-on.

You'll need to patch the `ebs-csi-controller` deployment to use the Chainguard
image, however this is a step you'll need to repeat each time that you re-deploy
or upgrade the version via EKS add-ons.

## Volume modification

To modify volumes with annotations as expected by the `volumemodifier` EBS CSI driver's sidecar controller, please refer to the [official documentation](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/modify-volume.md#volume-modifier-for-k8s-1). 

Supported annotations on `PersistentVolumeClaim`s are:
* `ebs.csi.aws.com/volumeType`
* `ebs.csi.aws.com/iops`

For instance, you can set and update dynamically those attributes on a `PersistentVolumeClaim` like below:

```yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
  annotations:
    ebs.csi.aws.com/volumeType: "io2"
    ebs.csi.aws.com/iops: "4000"
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 100Gi
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nvidia-gpu-driver

# nvidia-gpu-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nvidia-gpu-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nvidia-gpu-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Tools necessary for GPU and feature discovery for NVIDIA GPU driver container that allows the provisioning of the NVIDIA driver through the use of containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Important Considerations
This image provides tools necessary for GPU and feature discovery, but it does not include the functionality to compile drivers directly within the container. It is important to understand that running the initialization scripts to configure the driver as provided will not be feasible without a host node and a Helm chart that correctly mounts all the required volumes from the host into the container.

1. **Host Node and Helm Chart Requirements**:
    - To use this image effectively, you need a host node with the appropriate hardware and drivers already installed.
    - A Helm chart is required to mount all the expected volumes from the host into the container. This includes device files, driver files, and other necessary resources.
  
2. **Initialization Scripts**:
    - The initialization scripts included in this image are meant for configuration purposes only. They cannot compile drivers within the container.
    - Ensure that the host node is properly configured before attempting to use these scripts.
  
3. **Volume Mounts**:
    - Proper volume mounts are crucial for the functionality of the tools provided in this image.
    - The Helm chart must define the necessary volume mounts to pass through GPU device files, configuration files, and other dependencies from the host node into the container.

## Usage

1. **Container Entry Point**:
    - The entry point is set to `sleep infinity`, which keeps the container running indefinitely. This allows for interactive configuration and troubleshooting.
    - Example command to run the container:
      ```sh
      docker run -d --name test-nvidia cgr.dev/chainguard/nvidia-gpu-driver:latest
      ```

2. **Interacting with the Container**:
    - Once the container is running, you can exec into the container to run the provided GPU and feature discovery tools.
    - Example command to exec into the container:
      ```sh
      docker exec -it test-nvidia /bin/bash
      ```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-adapter-fips

# prometheus-adapter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-adapter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-adapter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm
To deploy Prometheus Adapter using the community helm chart, pass in the
Chainguard FIPS image when deploying:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install adapter prometheus-community/prometheus-adapter \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-adapter-fips \
 --set image.tag=latest
```

For more detail, please refer to the [Prometheus Adapter documentation](https://github.com/kubernetes-sigs/prometheus-adapter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault-secrets-operator

# vault-secrets-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault-secrets-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault-secrets-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Vault Secrets Operator (VSO) allows Pods to consume Vault secrets natively from Kubernetes Secrets.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Vault Secrets Operator image contains the [vault-secrets-operator](https://github.com/hashicorp/vault-secrets-operator) binary. The image is intended to be a drop-in replacement for the [hashicorp/vault-secrets-operator](https://hub.docker.com/r/hashicorp/vault-secrets-operator) image.

This image is not identical to the `hashicorp/vault-secrets-operator` image. In particular:

 - The `vault-secrets-operator` binary is stored in `/usr/bin`, with symlink to the binary placed in `/` for compatibility
 - The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the Hashicorp image uses Distroless

## Getting Started

Chainguard's Vault Secrets Operator image is not meant to be run as standalone and has to be run inside a Kubernetes cluster.

The Chainguard Vault Secrets Operator image is meant to be used with the [hashicorp/vault-secrets-operator](https://github.com/hashicorp/vault-secrets-operator/tree/main/chart) Helm chart, and in conjunction with the [Hashicorp Vault](https://developer.hashicorp.com/vault) deployment. 

To use the Chainguard image, configure the [hashicorp/vault-secrets-operator](https://developer.hashicorp.com/vault/docs/platform/k8s/vso/installation) Helm chart to the specify the image in a `values.yaml` file:

```yaml
controller:
  manager:
    image:
      # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
      repository: "cgr.dev/ORGANIZATION/vault-secrets-operator"
      # NOTE: "latest" tag should be replaced with specific tag for version of vault-secrets-operator to use
      tag: "latest"
# other values to configure Vault Secrets Operator
```

The [Vault Secrets Operator Installation](https://developer.hashicorp.com/vault/docs/platform/k8s/vso/installation) documentation provides step-by-step instructions for installing the Vault Secrets Operator and configuring Vault to allow Kubernetes-based authentication.

## Documentation and Resources

* [Vault Secrets Operator Documentation](https://developer.hashicorp.com/vault/docs/platform/k8s/vso)
* [Vault Secrets Operator Tutorial](https://developer.hashicorp.com/vault/tutorials/kubernetes/vault-secrets-operator)
* [`hashicorp/vault-secrets-operator` GitHub Repository](https://github.com/hashicorp/vault-secrets-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opensearch-k8s-operator

# opensearch-k8s-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opensearch-k8s-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opensearch-k8s-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Kubernetes OpenSearch Operator is used for automating the deployment, provisioning, management, and orchestration of OpenSearch clusters and OpenSearch dashboards.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
opensearch-k8s-operator is a Kubernetes operator, which can be deployed using helm. Refer to the upstream repositories documentation for how to get started with opensearch-k8s-operator.

To use our minimal, wolfi-based image with this Helm chart you'll need to override the image used by the official helm chart and specify the chainguard image as per below example:

```
helm repo add opensearch-operator https://opensearch-project.github.io/opensearch-k8s-operator/
helm repo update

helm install opensearch-operator opensearch-operator/opensearch-operator
helm upgrade opensearch-operator \
    -n opensearchoperator \
    --set image.repository=cgr.dev/chainguard/opensearch-k8s-operator \
    --set image.tag=latest
    --wait \
    opensearch-operator/opensearch-operator
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-fips

# secrets-store-csi-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Kubernetes Secrets Store CSI Driver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Kubernetes Secrets Store CSI Driver

There are various ways to deploy the Secrets Store CSI Driver. The following example demonstrates how to deploy the driver using Helm.

```bash
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
--namespace kube-system \
--set linux.image.repository=cgr.dev/chainguard-private/secrets-store-csi-driver-fips \
--set linux.image.tag=latest
```

To get more detail about how to deploy the driver, refer to the [official documentation](https://secrets-store-csi-driver.sigs.k8s.io/getting-started/installation.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jitsucom-jitsu

# jitsucom-jitsu
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jitsucom-jitsu` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jitsucom-jitsu/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Jitsu is an open-source Segment alternative. Fully-scriptable data ingestion engine for modern data teams. Set-up a real-time data pipeline in minutes, not days

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is no official Helm chart providied for Jitsu, but you can use the following Helm chart to deploy Jitsu on your Kubernetes cluster.

Here is the issue that they discussed: https://github.com/jitsucom/jitsu/issues/880

And here is the Helm chart that you can use: https://github.com/stafftastic/jitsu-chart 

which is the Helm chart we used to deploy Jitsu on Kubernetes during the tests.

```yaml
$ helm install jitsu oci://registry-1.docker.io/stafftasticcharts/jitsu -f-<<EOF
console:
  image:
    repository: cgr.dev/chainguard/jitsucom-console
    tag: latest
    pullPolicy: IfNotPresent
rotor:
  image:
    repository: cgr.dev/chainguard/jitsucom-rotor
    tag: latest
    pullPolicy: IfNotPresent
EOF
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### curl

# curl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/curl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/curl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [curl](https://curl.se/) image base containing curl and ca-certificates.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `curl` image is a drop-in replacement for the upstream [curlimages/curl](https://hub.docker.com/r/curlimages/curl) image. It supports all core functionality and is designed to be a minimal, secure alternative and runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can use Chainguard `curl` image to run standard curl commands in a secure, containerized environment:

```shell
docker pull cgr.dev/ORGANIZATION/curl:latest
docker run --rm cgr.dev/ORGANIZATION/curl --version
```

This will return the below output similar to the following:

```shell
curl 8.9.0 (x86_64-pc-linux-gnu) libcurl/8.9.0-DEV rustls-ffi/0.13.0/rustls/0.23.4 zlib/1.3.1 brotli/1.1.0 libpsl/0.21.5 nghttp2/1.62.1
Release-Date: 2024-07-24
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz PSL SSL threadsafe UnixSockets
```

You can also use it to run any curl command, such as:

```shell
docker run --rm cgr.dev/ORGANIZATION/curl https://cheat.sh/curl
```

## Documentation and Resources

* (Chainguard Academy) [Vulnerability Comparison: curl](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/curl/)
* (Blog post) [Chainguard’s response to CVE-2023-38545 and CVE-2023-38546 in curl](https://www.chainguard.dev/unchained/chainguards-response-to-cve-2023-38545-and-cve-2023-38546-in-curl)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prefect

# prefect
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prefect` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prefect/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, wolfi-based image for Prefect. Prefect is a modern workflow orchestration framework for building, observing, and reacting to data pipelines.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `prefect` container image is designed as a drop-in replacement for the upstream [prefecthq/prefect](https://hub.docker.com/r/prefecthq/prefect) image.

## Usage

### Docker

Start a Prefect server:

```bash
docker run -d --name prefect-server -p 4200:4200 \
  cgr.dev/chainguard/prefect:latest \
  prefect server start --host 0.0.0.0
```

Access the UI at `http://localhost:4200`.

### Helm

Deploy on Kubernetes using the official Helm chart:

```bash
helm repo add prefect https://prefecthq.github.io/prefect-helm
helm repo update

helm install prefect-server prefect/prefect-server \
  --set global.prefect.image.repository=cgr.dev/chainguard/prefect \
  --set global.prefect.image.prefectTag=latest
```

## Documentation and Resources

- [Prefect Documentation](https://docs.prefect.io/)
- [Prefect GitHub](https://github.com/PrefectHQ/prefect)
- [Prefect Helm Charts](https://github.com/PrefectHQ/prefect-helm)
- [Prefect Cloud](https://www.prefect.io/cloud)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### yara

# yara
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/yara` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/yara/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The pattern matching swiss knife.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Inspect the crane image manifest using the crane image:

```
docker run --rm cgr.dev/chainguard/crane:latest manifest cgr.dev/chainguard/crane:latest --platform=linux/amd64
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-agents-operator

# k8s-agents-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-agents-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-agents-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

k8s-agents-operator auto-instruments containerized workloads in Kubernetes with New Relic agents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to 'docker.io/newrelic/k8s-agents-operator:latest'. Switching to the Chainguard image should not require any changes to your existing deployment configuration.

## Getting Started

The `k8s-agent-operator` automatically instruments containerized workloads in Kubernetes with New Relic agents. It supports auto-instrumentation for various language runtimes including Java, Node.js, Python, and .NET.

### Prerequisites

- A Kubernetes cluster with version 1.20+
- Cert-manager installed in your cluster (for webhook functionality)
- New Relic account and license key

### Basic Deployment

Deploy the operator using the official Helm chart with the Chainguard image:

```sh
cat > values.yaml <<EOF
    licenseKey = ""your-license-key-here""
    controllerManager = {
      manager = {
        image = {
          repository = cgr.dev/ORGANIZATION/k8s-agent-operator
          version = latest
        }
EOF
```

Install using Helm:

```sh
helm repo add newrelic https://helm-charts.newrelic.com
helm repo update
helm install newrelic-k8s-agents-operator newrelic/newrelic-k8s-agents-operator \
  -f values.yaml \
  -n newrelic-system \
  --create-namespace
```

### Creating an Instrumentation Resource

Create an Instrumentation resource to define how applications should be instrumented:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: newrelic.com/v1alpha2
kind: Instrumentation
metadata:
  name: selective-java-instrumentation
spec:
  agent:
    image: newrelic/newrelic-java-init:latest
    language: java
  podLabelSelector:
    matchLabels:
      instrument: "java"
  namespaceLabelSelector:
    matchLabels:
      instrumentation: "enabled"
EOF

kubectl apply -f instrumentation.yaml
```

### Auto-Instrumentation via Annotations

Annotate your workloads to enable auto-instrumentation:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: fully-matched-pod
  namespace: k8s-agents-operator-test
  labels:
    instrument: "java"
    app: java-app
spec:
  containers:
  - name: app
    image: busybox:1.35
    command: ["sleep", "3600"]
EOF
```

## Configuration

The operator supports various configuration options through environment variables:

- `NEW_RELIC_LICENSE_KEY`: Your New Relic license key (required)
- `WEBHOOK_PORT`: Port for the admission webhook (default: 9443)
- `METRICS_BIND_ADDRESS`: Address for metrics server (default: :8080)
- `HEALTH_PROBE_BIND_ADDRESS`: Address for health probes (default: :8081)

## Documentation and Resources

- [K8s Agents Operator GitHub Repository](https://github.com/newrelic/k8s-agents-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-attacher

# kubernetes-csi-external-attacher
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-attacher` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-attacher/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for [kubernetes-csi/external-attacher](https://github.com/kubernetes-csi/external-attacher). Watches Kubernetes VolumeAttachment objects and triggers ControllerPublish/Unpublish against a CSI endpoint.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-attacher` container image is comparable to the official csi-attacher image. Chainguard Containers are designed with minimalism and security in mind, and thus `kubernetes-csi-external-attacher` the image has the following differences from the upstream image:

* Chainguard's `kubernetes-csi-external-attacher` image sets the entrypoint to `/usr/bin/csi-attacher` whereas the upstream sets it to: `/csi-attacher`.

## Getting Started

To use Chainguard's `kubernetes-csi-external-attacher` image, first deploy the standard attacher:
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-attacher/master/deploy/kubernetes/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-attacher/master/deploy/kubernetes/rbac.yaml
```

Then substitute the attacher's image with ours:

```
kubectl set image deployment/csi-attacher csi-attacher="${ATTACHER_IMG}"
```

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-attacher/blob/master/README.md#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### x509-certificate-exporter-fips

# x509-certificate-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/x509-certificate-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/x509-certificate-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Prometheus exporter to monitor x509 certificates expiration in Kubernetes clusters or standalone

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/enix/x509-certificate-exporter). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install the [upstream helm chart](https://gateway.envoyproxy.io/docs/install/install-helm/) with Chainguard's `x509-certificate-exporter` image you can perform the following steps.

First, add the Helm repository:

```bash
helm repo add enix https://charts.enix.io
```

If you prefer to use a `values.yaml` file then you can override the image repository and tag as follows:

```yaml
image:
  registry: cgr.dev
  repository: chainguard/x509-certificate-exporter
  tag: latest
secretsExporter:
  podAnnotations:
    prometheus.io/port: "9793"
    prometheus.io/scrape: "true"
service:
  create: false
prometheusServiceMonitor:
  create: false
prometheusRules:
  create: false
```

Once you have your `values.yaml` file you can install the Helm chart with the following command:

```bash
helm install x509-certificate-exporter enix/x509-certificate-exporter -f values.yaml
```

## Documentation and Resources

Please refer to the [upstream documentation](https://github.com/enix/x509-certificate-exporter/blob/main/deploy/charts/x509-certificate-exporter/README.md) for more information on how to use the `x509-certificate-exporter` Helm chart.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pg-timetable-fips

# pg-timetable-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pg-timetable-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pg-timetable-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An advanced standalone job scheduler for PostgreSQL, offering many advantages over traditional schedulers such as cron and others. This image provides FIPS support for pg-timetable.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's pg_timetable image is comparable to the [cybertecpostgresql/pg_timetable image](https://hub.docker.com/r/cybertecpostgresql/pg_timetable) from Docker Hub. It is designed to be minimal and secure and is optimized for running inside a containerized environment. This image is designed to connect to a PostgreSQL instance with SSL/TLS enabled for secure database communications.

### FIPS Support

The `pg-timetable-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Below is an example of how to deploy `pg_timetable` using Docker with a PostgreSQL database secured with TLS:

Start by creating a Docker Network: 
```shell
docker network create pg-timetable-net || true
```

Next, generate SSL certificates:

```shell
mkdir -p /tmp/certs
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out /tmp/certs/ca.key
openssl req -x509 -new -nodes -key /tmp/certs/ca.key -sha256 -days 1024 -out /tmp/certs/ca.crt -subj "/CN=localhost"

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out /tmp/certs/server.key
openssl req -new -key /tmp/certs/server.key -out /tmp/certs/server.csr -subj "/CN=localhost"
openssl x509 -req -in /tmp/certs/server.csr -CA /tmp/certs/ca.crt -CAkey /tmp/certs/ca.key -CAcreateserial -out /tmp/certs/server.crt -days 365
```

Be sure to change the owenrship of certs either to root or to the UID/GID of Postgres (for example, `70:70`) as that is a [hard requirement for Postgres in enabling TLS](https://www.postgresql.org/docs/current/ssl-tcp.html):

```shell
 sudo chown 70:70 /tmp/certs/server.key
 sudo chmod 600 /tmp/certs/server.key
 ```

Next, start PostgreSQL with SSL enabled:

```shell
docker run -d --network=pg-timetable-net --name=postgres \
  -e POSTGRES_DB=timetable \
  -e POSTGRES_USER=scheduler \
  -e POSTGRES_PASSWORD=scheduler \
  -v /tmp/certs:/certs:rw \
  cgr.dev/ORGANIZATION/postgres-fips:latest \
  -c ssl=on \
  -c ssl_cert_file='/certs/server.crt' \
  -c ssl_key_file='/certs/server.key' \
  -c ssl_ca_file='/certs/ca.crt'
```

Following that, start pg_timetable:

```shell
docker run --rm -d --network=pg-timetable-net --name=pg-timetable \
  -p 8008:8008 \
  -e PGTT_URL="postgresql://scheduler:scheduler@postgres:5432/timetable?sslmode=verify-ca&sslrootcert=/certs/ca.crt" \
  -e PGTT_RESTPORT=8008 \
  -e PGTT_RESTHOST="0.0.0.0" \
  -v /tmp/certs:/certs \
  cgr.dev/ORGANIZATION/pg-timetable-fips:latest \
  pg_timetable -c worker001
```

Verify that pg_timetable is ready:

```shell
until docker exec pg-timetable curl -s -o /dev/null -w "%{http_code}" http://0.0.0.0:8008/liveness | grep "200"; do
  sleep 2
done
echo "pg_timetable is ready."
```

You can then insert tasks like in the following example:

```shell
CHAIN_ID=$(docker exec postgres psql "sslmode=verify-ca sslrootcert=/certs/ca.crt" \
  -U scheduler -d timetable -t -A -c \
  "INSERT INTO timetable.chain (chain_name, live) VALUES ('Test Chain', TRUE) RETURNING json_build_object('chain_id', chain_id);" \
  | grep '{' | jq -r '.chain_id')

docker exec postgres psql "sslmode=verify-ca sslrootcert=/certs/ca.crt" \
  -U scheduler -d timetable -c \
  "INSERT INTO timetable.task (chain_id, task_order, kind, command) VALUES ($CHAIN_ID, 1, 'SQL', 'SELECT now();');"
```

And verify the logs:

```shell
2025-03-19 19:04:43.609 [INFO] [chain:1] Starting chain
2025-03-19 19:04:43.611 [INFO] [chain:1] [vxid:12884901926] Chain executed successfully
```

## Documentation and Resources
- [Official `pg_timetable` Documentation](https://www.cybertec-postgresql.com/en/products/pg_timetable)
- [Chainguard Secure Images](https://www.chainguard.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chisel-fips

# chisel-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chisel-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chisel-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A fast TCP/UDP tunnel over HTTP

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `chisel-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What is Chisel?

Chisel is a fast TCP/UDP tunnel, transported over HTTP, secured via SSH. It allows you to create secure tunnels through firewalls and NAT devices. This container image provides both server and client functionality for creating encrypted tunnels.

## Usage

The chisel container can be run in two modes: server and client.

### Server Mode

Start a chisel server with authentication:
```bash
docker run -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server --auth username:password
```

Start a server without authentication (not recommended for production):
```bash
docker run -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server
```

### Client Mode

Connect to a chisel server and create a tunnel:
```bash
docker run -p 28080:28080 --name chisel-client -d \
  cgr.dev/$ORGANIZATION/chisel client --auth username:password \
  http://server-host:8080 28080:target-host:80
```

## Complete Example

Here's a complete example that demonstrates setting up a tunnel to access an nginx server:

1. Create a Docker network:
```bash
docker network create chisel-test
```

2. Start an nginx server:
```bash
docker run --network chisel-test -p 18080:8080 --name nginx -d \
  cgr.dev/$ORGANIZATION/nginx
```

3. Start the chisel server:
```bash
docker run --network chisel-test -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server --auth testuser:S3cr3tP@ssword
```

4. Start the chisel client to create a tunnel:
```bash
docker run --network chisel-test -p 28080:28080 --name chisel-client -d \
  cgr.dev/$ORGANIZATION/chisel client --auth testuser:S3cr3tP@ssword \
  http://chisel-server:8080 28080:nginx:8080
```

5. Test the tunnel:
```bash
# Access nginx directly
curl http://localhost:18080

# Access nginx through the chisel tunnel
curl http://localhost:28080
```

## Common Use Cases

- **Bypassing firewalls**: Create tunnels through restrictive network environments
- **Accessing internal services**: Expose internal services through a single HTTP endpoint
- **Reverse tunnels**: Allow external access to services behind NAT
- **Port forwarding**: Forward local ports to remote services

## Security Notes

- Always use authentication (`--auth username:password`) in production environments
- Consider using TLS/HTTPS for the transport layer when possible
- Regularly rotate authentication credentials
- Monitor tunnel usage and connections

## Troubleshooting

Check server logs:
```bash
docker logs chisel-server
```

Check client logs:
```bash
docker logs chisel-client
```

The server should show "Listening on" and the client should show "Connected" when the tunnel is established successfully.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-fips

# clickhouse-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Clickhouse is the fastest and most resource efficient open-source database for real-time apps and analytics, built with FIPS 140-3 compliant cryptographic modules.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is built with FIPS 140-3 compliant cryptographic modules and follows FIPS compliance requirements. The image includes:

- OpenSSL configured in FIPS mode
- ClickHouse built with FIPS-compliant cryptographic libraries
- Removal of non-FIPS compliant ciphers and algorithms

The default Clickhouse listen_host is `127.0.0.1` and port is `8123`.

## Getting Started

### Quick Start

The entrypoint for the `clickhouse-fips` Chainguard container is `/usr/bin/clickhouse`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `clickhouse`.

To run with Docker and allow empty passwords:

```bash
docker run -d --ulimit nofile=262144:262144 cgr.dev/ORGANIZATION/clickhouse-fips:latest server
```

By default, ClickHouse will be accessible only via the Docker network and will run as the default user without password.

## Configuration

### Users and Directories

By default, this image runs as a non-root user named `clickhouse` with a uid of `101` and a home directory of `/home/clickhouse`.

### Environment Variable Substitution

Environmental variables require the `/entrypoint.sh` script which is not run by default. You will need to modify and mount configuration files for any values that are not editable via CLI options.

### Volume Mounts

Typically you may want to mount the following folders inside your container to achieve persistency:

* `/var/lib/clickhouse/` - main folder where ClickHouse stores the data
* `/var/log/clickhouse-server/` - logs
* `/etc/clickhouse-server/config.d/*.xml` - files with server configuration adjustments
* `/etc/clickhouse-server/users.d/*.xml` - files with user settings adjustments
* `/docker-entrypoint-initdb.d/` - folder with database initialization scripts

```bash
docker run -d \
    -v $(realpath ./ch_data):/var/lib/clickhouse/ \
    -v $(realpath ./ch_logs):/var/log/clickhouse-server/ \
    --ulimit nofile=262144:262144 cgr.dev/ORGANIZATION/clickhouse-fips:latest server
```

**Note**: If adding user and server configuration adjustments please ensure to add the `--config-file` CLI option.

### Docker Compose Example

This `docker-compose.yaml` sets up a Clickhouse database with a default database and user, using the FIPS-compliant image:

```yaml
version: "3.7"
services:
  clickhouse:
    image: cgr.dev/ORGANIZATION/clickhouse-fips:latest
    restart: unless-stopped
    entrypoint: /usr/bin/clickhouse-server -- --listen_host 0.0.0.0
    working_dir: /home/clickhouse
    ports:
      - 8123:8123
    volumes:
      - ./data/clickhouse:/var/lib/clickhouse
      - ./logs/clickhouse:/var/log/clickhouse-server
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge
```

### FIPS-Compliant SSL/TLS Configuration

For production use with FIPS compliance, you'll want to configure ClickHouse with proper SSL/TLS settings. Create a FIPS-compliant ClickHouse configuration:

```xml
<clickhouse>
    <http_port>8123</http_port>
    <https_port>8443</https_port>
    <openSSL>
        <server>
            <certificateFile>/certs/server.crt</certificateFile>
            <privateKeyFile>/certs/server.key</privateKeyFile>
            <verificationMode>strict</verificationMode>
            <protocols>TLSv1.2,TLSv1.3</protocols>
            <preferServerCiphers>true</preferServerCiphers>
        </server>
    </openSSL>
    <listen_host>0.0.0.0</listen_host>

    <path>/var/lib/clickhouse</path>
    <tmp_path>/var/lib/clickhouse/tmp</tmp_path>
    <user_files_path>/var/lib/clickhouse/user_files</user_files_path>
    <format_schema_path>/var/lib/clickhouse/format_schemas</format_schema_path>

    <profiles>
        
    </profiles>

    <users>
        
    </users>

    <quotas>
        
    </quotas>

    <logger>
        
    </logger>
    
    <send_crash_reports>
        <enabled>false</enabled>
    </send_crash_reports>
</clickhouse>
```

Run ClickHouse with the FIPS-compliant configuration and your certificates:

```bash
docker run -d --name clickhouse-fips \
  -v /path/to/fips-config.xml:/etc/clickhouse-server/config.xml \
  -v /path/to/certificates:/certs \
  -p 8123:8123 -p 8443:8443 \
  cgr.dev/ORGANIZATION/clickhouse-fips:latest server --config-file /etc/clickhouse-server/config.xml
```

Replace `/path/to/certificates` with the directory containing your `server.crt` and `server.key` files.

### FIPS Verification

To verify FIPS mode is enabled:

```bash
docker run -it --rm cgr.dev/ORGANIZATION/clickhouse-fips:latest-dev sh -c "cat /proc/sys/crypto/fips_enabled"
```

The command should return `1` indicating FIPS mode is enabled.

## Documentation and Resources

For more advanced configuration, please refer to [ClickHouse's official documentation](https://clickhouse.com/docs/en/operations/configuration-files#configuration_files).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-prometheus-exporter-fips

# nginx-prometheus-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-prometheus-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-prometheus-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The `nginx-prometheus-exporter-fips` image is designed to scrape metrics from an NGINX instance and expose them to Prometheus in a secure and minimal environment. Below are detailed instructions for using the image in both Docker and Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage of the nginx-prometheus-exporter Image

The `nginx-prometheus-exporter-fips` image is designed to scrape metrics from an NGINX instance and expose them to Prometheus in a secure and minimal environment. Below are detailed instructions for using the image in both Docker and Kubernetes environments.

### Running with Docker:

To run nginx-prometheus-exporter with a local NGINX instance, use the following commands:

#### Run NGINX: Start an NGINX instance that has the required /status page enabled.

```bash
docker run -d --name nginx -p 8080:80 nginx:stable-alpine
```

You will need to ensure the /status page is enabled in your NGINX configuration. A simple nginx.conf could look like this:

```nginx
server {
    listen 80;
    location /status {
        stub_status on;
        allow all;
    }
}
```

#### Run the Prometheus Exporter: Start the nginx-prometheus-exporter to scrape metrics from the NGINX instance.

```bash
docker run -d --name nginx-prometheus-exporter -p 9113:9113 --link nginx \
  cgr.dev/chainguard/nginx-prometheus-exporter-fips:latest \
  -nginx.scrape-uri="http://nginx/status"
```

#### Verify Metrics: You can check if the exporter is running and exposing metrics by visiting the following URL:

```bash
http://localhost:9113/metrics
```
You should see metrics related to your NGINX instance, such as:

```bash
nginx_connections_active 1
nginx_connections_reading 0
nginx_connections_writing 1
nginx_connections_waiting 0
```

### Using in Kubernetes

If you're running NGINX in a Kubernetes environment, you can use the following Kubernetes manifest to deploy NGINX and the Prometheus exporter.

#### Deploy NGINX and Exporter

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-exporter-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx-exporter-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:stable-alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx-exporter-test
data:
  default.conf: |
    server {
        listen 80;
        location /status {
            stub_status on;
            allow all;
        }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-prometheus-exporter
  namespace: nginx-exporter-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-prometheus-exporter
  template:
    metadata:
      labels:
        app: nginx-prometheus-exporter
    spec:
      containers:
      - name: nginx-prometheus-exporter
        image: cgr.dev/chainguard/nginx-prometheus-exporter-fips:latest
        args:
        - '-nginx.scrape-uri=http://nginx/status'
        ports:
        - containerPort: 9113
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-prometheus-exporter
  namespace: nginx-exporter-test
spec:
  ports:
  - port: 9113
    targetPort: 9113
  selector:
    app: nginx-prometheus-exporter
```

#### Access Metrics in Kubernetes:

You can use `kubectl port-forward` to forward the exporter service to your local machine for verification:

```bash
kubectl port-forward svc/nginx-prometheus-exporter 9113:9113 -n nginx-exporter-test
```

Access the metrics at:

```bash
http://localhost:9113/metrics
```
Prometheus Configuration: If you’re using Prometheus to scrape the metrics, add the following configuration to your Prometheus configuration file:

```yaml
scrape_configs:
  - job_name: 'nginx-prometheus-exporter'
    static_configs:
      - targets: ['nginx-prometheus-exporter.nginx-exporter-test.svc.cluster.local:9113']
```      
#### Environment Variables and Customization
The nginx-prometheus-exporter allows some additional customization through the following options:

-nginx.scrape-uri: Set the URI where the exporter should scrape NGINX metrics. Defaults to http://localhost/status.
-telemetry.address: Set the address where the Prometheus exporter exposes metrics. Defaults to :9113.

You can pass these as arguments in the Docker run command or in your Kubernetes manifest.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dragonfly-operator

# dragonfly-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dragonfly-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dragonfly-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes operator used to deploy and manage Dragonfly instances inside your Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image is meant to work as a drop-in replacement for the
[operator image](https://www.dragonflydb.io/docs/managing-dragonfly/operator/installation).

## Getting Started
The Chainguard dragonfly-operator image can be deployed using the helm chart residing in the dragonfly-operator github repo. At time of writing there does not appear to be a published helm chart.

```bash
git clone https://github.com/dragonflydb/dragonfly-operator.git
cd dragonfly-operator
helm install operator charts/dragonfly-operator --set manager.image.repository=cgr.dev/ORGANIZATION/dragonfly-operator --set manager.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### az-fips

# az-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/az-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/az-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rke2-runtime

# rke2-runtime
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rke2-runtime` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rke2-runtime/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image of RKE2's container runtime

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`rke2-runtime` is composed of two image variants:
- `cgr.dev/ORGANIZATION/rke2-runtime`
- `cgr.dev/ORGANIZATION/rke2-runtime-airgap`

Chainguard's `rke2-runtime` container images are comparable to the official [rancher/rke2-runtime](https://hub.docker.com/r/rancher/rke2-runtime) image.

The `rke2-runtime-airgap` container image variant includes the addition of the `rke2` binary.

> [!NOTE]
> Deployment of Chainguard's `rke2-runtime` image requires the use of our `rke2-runtime-airgap` image. This is because rke2 had to be patched to support the merge of /bin into /usr/bin.

## Getting Started
### Docker 
You can deploy Chainguard's `rke2-runtime`  image with the following command:
```shell
docker run --rm --privileged \
  --network=host \
  --cgroupns=host \
  cgr.dev/ORGANIZATION/rke2-runtime-airgap:latest server \
  -v /path/to/rke2/config:/etc/rancher/rke2 \
  --token=test \
  --runtime-image="cgr.dev/ORGANIZATION/rke2-runtime:latest"
```

#### For Air Gapped Environments
To deploy Chainguard's `rke2-runtime` image in an airgapped environment, start by creating an image preload to be imported.

> [!NOTE]
> RKE2 expects the preloaded image to have a reference tag in the following format: `vX.Y.Z-rke2r1`
> Example Tag: `rke2-runtime:v1.33.3-rke2r1`
> This means that images tagged as `latest` and our `-dev` images can not be used without retagging them with the above format.

1. First, pull down an image tagged similarly to `rke2-runtime:v1.33.3-rke2r1` with Docker:
```shell
docker pull cgr.dev/ORGANIZATION/rke2-runtime:v1.33.3-rke2r1
```

2. Now, you will need to save the image:
```shell
docker save --output /tmp/rke2-runtime.tar cgr.dev/ORGANIZATION/rke2-runtime:v1.33.3-rke2r1
```

3. Finally, you can run the preloaded runtime image:
```shell
docker run --rm --privileged \
  --network=host \
  --cgroupns=host \
  cgr.dev/ORGANIZATION/rke2-runtime-airgap server \
  -v /path/to/rke2/config:/etc/rancher/rke2 \
  -v /tmp/rke2-runtime.tar:/var/lib/rancher/rke2/agent/images \
  --token=test \
  --runtime-image="cgr.dev/ORGANIZATION/rke2-runtime:v1.33.3-rke2r1"
```

## Documentation and Resources

For more information on working with RKE2's container runtime, please refer to [the official documentation](https://docs.rke2.io/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vertical-pod-autoscaler

# vertical-pod-autoscaler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vertical-pod-autoscaler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vertical-pod-autoscaler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Image to automatically adjust the amount of CPU and memory requested by pods running in the Kubernetes Cluster

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Vertical Pod Autoscaler (VPA) is a Kubernetes component that automatically adjusts the CPU and memory resource requests for pods based on their historical usage patterns. VPA helps optimize resource utilization and ensures applications have adequate resources without over-provisioning.

Chainguard's VPA images are designed to be drop-in replacements for the [upstream VPA images](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler). Some key differences from upstream images include:

- **Minimal base**: Built on Wolfi Linux undistro for reduced attack surface
- **No shell or package manager**: The default images contain only the VPA binaries and required runtime dependencies
- **Dev variants available**: For debugging or custom builds, `-dev` variants include shell and package manager

As of this writing, the image definition produces three separate container images for the VPA components:

### Admission Controller (`vertical-pod-autoscaler-admission-controller`)

The admission controller is a webhook that intercepts pod creation and update requests. It applies the resource recommendations by modifying the pod's resource requests according to the VPA policies before the pod is created or updated in the cluster.

### Recommender (`vertical-pod-autoscaler-recommender`)

The recommender component analyzes the historical resource usage of pods and generates resource recommendations. It monitors metrics from the Kubernetes metrics server and calculates optimal CPU and memory requests based on observed usage patterns.

### Updater (`vertical-pod-autoscaler-updater`)

The updater component is responsible for evicting pods when VPA determines they need to be restarted with new resource requests. Since Kubernetes cannot change resource requests on running pods, the updater evicts pods so they can be recreated with updated resource allocations by the admission controller.

## Getting Started

All three components work together to provide complete vertical autoscaling functionality. Deploy them using the official VPA Helm charts or Kubernetes manifests, replacing the upstream images with these Chainguard variants for enhanced security.

## Documentation and Resources

- [Official Kubernetes VPA Documentation](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler)
- [VPA Design Proposals](https://github.com/kubernetes/design-proposals-archive/blob/main/autoscaling/vertical-pod-autoscaler.md)
- [VPA Installation Guide](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#installation)
- [VPA API Reference](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#api)
- [Best Practices for VPA](https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nrdot-collector-k8s-fips

# nrdot-collector-k8s-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nrdot-collector-k8s-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nrdot-collector-k8s-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

New Relic .NET collector for Kubernetes monitoring

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Compatibility Notes

The Chainguard nrdot-collector-k8s-fips image is comparable to the official [nrdot-collector-k8s Image from Docker Hub](https://hub.docker.com/r/newrelic/nrdot-collector-k8s). Like most other Chainguard Images, this image has few-to-zero CVEs and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

Note - The Chainguard image is built with the latest versions of all dependencies, including `opentelemetry-collector-contrib/receiver/kubeletstatsreceiver`, so we no longer need the featuregate `receiver.kubeletstats.enableCPUUsageMetrics` in the daemonset. This is present by default in the daemonset as of version 1.5.0. To edit this, you could apply a patch after deploying the helm chart like:
```
kubectl -n newrelic patch ds nr-k8s-otel-collector-daemonset \
  --type='json' -p='[
    {
      "op": "replace",
      "path": "/spec/template/spec/containers/0/args",
      "value": [
        "--config",
        "/config/daemonset-config.yaml",
        "--feature-gates",
        "metricsgeneration.MatchAttributes"
      ]
    }
  ]'
```

### FIPS Support

The `nrdot-collector-k8s-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. 

For more on FIPS support in Chainguard Containers, consult the guide on [FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting started
You can install the nrdot-collector-k8s using the official helm chart provided [here](https://github.com/newrelic/helm-charts/tree/master/charts/nr-k8s-otel-collector).
Be sure to use a values.yaml like the one showed below to use Chainguard's nrdot-collector-k8s-fips image:
```
image:
    repository:cgr.dev/ORGANIZATION/REPO_NAME
    tag: latest
```

### Documentation and Resources

* [nrdot-collector-releases GitHub Repository](https://github.com/newrelic/nrdot-collector-releases)
* [kubeletstats-receiver-metrics-deprecation](https://opentelemetry.io/blog/2025/kubeletstats-receiver-metrics-deprecation/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### harbor

# harbor-registry
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/harbor-registry` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/harbor-registry/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolf-based image for Harbor - an open-source container registry with policies and RBAC, vulnerability scans, and provides trusted image signing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying Harbor with Helm

The easiest way to get up and running with Chainguard's Harbor images is via deployment with Harbor's official Helm chart.

To get started, we need to add Harbor's Helm repository:  

```bash
helm repo add harbor https://helm.goharbor.io
```

Now that we've added the repository, we can deploy Harbor!:

```bash
helm install harbor harbor/harbor \
  --set core.image.repository=cgr.dev/chainguard/harbor-core,core.image.tag=latest \
  --set jobservice.image.repository=cgr.dev/chainguard/harbor-jobservice,jobservice.image.tag=latest \
  --set portal.image.repository=cgr.dev/chainguard/harbor-portal,portal.image.tag=latest \
  --set registry.registry.image.repository=cgr.dev/chainguard/harbor-registry,registry.registry.image.tag=latest \
  --set registry.registryctl.image.repository=cgr.dev/chainguard/harbor-registryctl,registry.registryctl.image.tag=latest \
  --set trivy.image.repository=cgr.dev/chainguard/harbor-trivy-adapter,trivy.image.tag=latest \
  --set registry.registry.extraEnvVars[0].name=REGISTRY_REDIS_OPTIONS_ADDRS \
  --set registry.registry.extraEnvVars[0].value="[harbor-redis:6379]"
```

You will need to override the `image` and `tag` values for each image like we've done here to point to Chainguard's Harbor images and tags.

Additionally, you may fetch Harbor's Helm chart after adding the repository and edit values directly without overriding them on installation:

```bash
helm fetch harbor/harbor --untar
```

Afterwards, edit `values.yml` and substitute in Chainguard's images/tags. For instance, for `harbor-core`, the following changes should be made:

```yaml
core:
  ...
  image: cgr.dev/chainguard/harbor-core
  tag: latest
  ...
```

And then deploy after configuration:

```bash
helm install harbor .
```

For more information on deploying Harbor via Helm, see the official documentation [here](https://goharbor.io/docs/1.10/install-config/harbor-ha-helm/).

## Deploying Harbor with Docker Compose

Harbor provides an online installer that can be retrieved from their releases on GitHub [here](https://github.com/goharbor/harbor/releases).

Follow all of their [steps for installation](https://goharbor.io/docs/1.10/install-config/download-installer/) up until you've successfully generated your `docker-compose.yml`. At this point, you can swap the upstream images out for Chainguard's.

For instance, to switch out `harbor-core` with Chainguard's image, edit `docker-compose.yml` and make the following change:

```yaml
services:
  ...
  core:
    image: cgr.dev/chainguard/harbor-core:latest
  ...
```

Then run the following in the terminal:

```bash
docker-compose up
```

Now you're up and running with Harbor powered by Chainguard images!

## Usage

Now that you've deployed Harbor, the portal should be accessible on whatever host you've opted to use. For example, if configured to use `localhost`, the portal will be accessible at [localhost:80](http://localhost) via HTTP or [localhost:443](https://localhost) via HTTPS, if setup.

You may now login with the username and password you've set or via the default username and password, `admin` and `Harbor12345`. You'll be presented with several options, including the ability to create a new project in the registry.

Additionally, you can now login to the registry with Docker! To do so, open a terminal and run:

```bash
docker login localhost
```

Where `localhost` should be substituted with the hostname or external URL you've chosen for Harbor.

Now let's push an image using Chainguard's base container for Wolfi!

Pull Wolfi:

```bash
docker pull cgr.dev/chainguard/wolfi-base:latest
```

Tag Wolfi using the registry and project path (`library` is created by default):

```bash
docker tag cgr.dev/chainguard/wolfi-base:latest localhost/library/wolfi-base:latest
```

And finally, push Wolfi to the registry!:

```bash
docker push localhost/library/wolfi-base:latest
```

Wolfi is now being pushed to the registry and will be viewable in the portal.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### reposilite

# images/reposilite
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/reposilite` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/reposilite/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Lightweight and easy-to-use repository management software dedicated for the Maven-based artifacts in the JVM ecosystem 

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Reposilite is a lightweight repository manager designed for Maven-based artifacts in the JVM ecosystem. It serves as a resource-efficient alternative to enterprise solutions like Nexus or Artifactory, with support for:

- Maven repository hosting and proxying
- Personal access token-based authentication
- Plugin extensibility (Java, Kotlin, Groovy)
- Multiple storage backends (local filesystem, AWS S3, and other cloud providers)

The Chainguard Reposilite image is compatible with the [official Reposilite Helm chart](https://helm.reposilite.com).

## Getting Started

To run Reposilite with Docker:

```bash
docker run -p 8080:8080 cgr.dev/ORGANIZATION/images/reposilite:latest
```

For Kubernetes deployments using the official Helm chart:

```bash
helm repo add reposilite https://helm.reposilite.com
helm repo update

helm install reposilite reposilite/reposilite \
  --set image.name=cgr.dev/ORGANIZATION/images/reposilite \
  --set image.tag=latest
```

Once running, Reposilite will be accessible at `http://localhost:8080` with a web dashboard for repository browsing and management.

## Configuration

Reposilite can be configured through:

1. **Configuration files** - Mount a configuration file to `/app/configuration.yml`
2. **Command-line arguments** - Pass arguments directly to the application
3. **Web dashboard** - Configure settings through the UI at runtime

## Documentation and Resources

- [Official Reposilite Documentation](https://reposilite.com/guide/about)
- [Reposilite GitHub Repository](https://github.com/dzikoysk/reposilite)
- [Reposilite Helm Chart](https://helm.reposilite.com)
- [REST API Documentation](https://reposilite.com/guide/endpoints)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-driver-nfs-fips

# kubernetes-csi-driver-nfs-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-driver-nfs-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-driver-nfs-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access an NFS server running on a Linux node. This image is FIPS compliant.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's kubernetes-csi-driver-nfs-fips Image is comparable to the official `nfsplugin` Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

### FIPS Support

This Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/) on Chainguard Academy.

## Getting started

### Set up an NFS server

If you already have an [NFS server setup](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-server-using-block-storage), you can skip this step. 

If you don't have an existing NFS server setup, you can use the following YAML to get a minimal nfs-server setup up and running. Note that this is **not** a production setup, and is just meant to test the Chainguard image:

```
apiVersion: v1
kind: Service
metadata:
  name: nfs-server
  namespace: default
spec:
  ports:
    - name: nfs
      port: 2049
      protocol: TCP
    - name: rpcbind-tcp
      port: 111
      protocol: TCP
    - name: rpcbind-udp
      port: 111
      protocol: UDP
    - name: mountd-tcp
      port: 20048
      protocol: TCP
    - name: mountd-udp
      port: 20048
      protocol: UDP
  selector:
    app: nfs-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-server
  template:
    metadata:
      labels:
        app: nfs-server
    spec:
      containers:
        - name: nfs-server
          image: itsthenetwork/nfs-server-alpine:latest
          securityContext:
            privileged: true
          ports:
            - name: nfs
              containerPort: 2049
            - name: rpcbind
              containerPort: 111
            - name: mountd
              containerPort: 20048
          env:
            - name: SHARED_DIRECTORY
              value: "/exports"
          volumeMounts:
            - name: nfs-data
              mountPath: "/exports"
      volumes:
        - name: nfs-data
          hostPath:
            path: /mnt/nfs-share
            type: DirectoryOrCreate
```

This YAML will set up a server to expose the other server and deployment that run the server pod. 

### Install csi-driver-nfs with Helm

In this section you will use the Helm chart available from the [NFS CSI driver for Kubernetes GitHub repository](https://github.com/kubernetes-csi/csi-driver-nfs/tree/master/charts). This will enable Kubernetes to handle NFS volumes:

```
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system \
--set image.nfs.repository=cgr.dev/ORGANIZATION/kubernetes-csi-driver-nfs-fips \
--set image.nfs.tag=latest
```

### Usage

Say you want to tell Kubernetes how to provision storage using NFS. To do this, you'll first need to retrieve the NFS server's `clusterIP`: 

```
NFS_SERVER_IP=$(kubectl get svc nfs-server -o jsonpath='{.spec.clusterIP}')
```

Next, you would create a storage class that tells Kubernetes to use the NFS server for storage:

```
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: $NFS_SERVER_IP
  share: /
mountOptions:
  - nolock
  - vers=4
reclaimPolicy: Retain
volumeBindingMode: Immediate
```

Following that, create a [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) (PVC) that will request storage from the storage class:

```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-csi
```

To test that this setup will work, create a pod that uses the PVC:

```
apiVersion: v1
kind: Pod
metadata:
  name: nfs-pvc-test
  namespace: default
spec:
  containers:
    - name: nfs-test
      image: cgr.dev/chainguard/wolfi-base:latest
      command: ["sh", "-c", "sleep infinity"]
      volumeMounts:
        - mountPath: "/mnt/nfs"
          name: nfs-storage
  volumes:
    - name: nfs-storage
      persistentVolumeClaim:
        claimName: nfs-pvc
```

Finally, check whether the pod was created and in a `Ready` state:

```
kubectl wait --for=condition=Ready pod/nfs-pvc-test --timeout=120s
```

This will confirm the csi-driver was able to provision a persistent volume for the pod and that the csi-driver is working as expected.

## Documentation and Resources

- [Upstream Helm charts](https://github.com/kubernetes-csi/csi-driver-nfs/tree/master/charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-k8s-events-forwarder-fips

# newrelic-k8s-events-forwarder-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-k8s-events-forwarder-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-k8s-events-forwarder-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-Compliant & lightweight Kubernetes event forwarder that streams cluster events to New Relic for centralized monitoring and analysis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `newrelic-k8s-events-forwarder-fips` container image is comparable to [the newrelic k8s-events-forwarder image maintained by Newrelic](https://hub.docker.com/r/newrelic/k8s-events-forwarder). Like most other Chainguard container images, the newrelic-k8s-events-forwarder-fips image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## FIPS Support

The `newrelic-k8s-events-forwarder-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The `newrelic-k8s-events-forwarder-fips` image is drop-in replacement for the upstream `newrelic` `k8s-events-forwarder` image which is a part of `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) chart.

### Helm Installation

Add the New Relic Helm repository and install the nri-bundle with FIPS images:

```shell
helm repo add newrelic https://helm-charts.newrelic.com
helm repo update
```

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:
> Note that `latest` is used below for brevity. In long term deployments, this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    forwarder:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder-fips
      tag: latest      
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder-fips
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## Documentation and Resources

- [New Relic Kubernetes events Documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/understand-use-data/kubernetes-events-integration/)
- [nri-bundle Helm Chart](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle)
- [nri kube-events Helm Chart](https://github.com/newrelic/nri-kube-events/tree/main/charts/nri-kube-events)
- [newrelic infrastructure Helm Chart](https://github.com/newrelic/nri-kubernetes/tree/main/charts/newrelic-infrastructure)
- [GitHub Repository](https://github.com/newrelic/infrastructure-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgadmin4

# pgadmin4
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgadmin4` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgadmin4/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

pgAdmin is an open source administration and development platform for PostgreSQL.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s pgAdmin image is a minimal, Wolfi-based container image. It mirrors the [`dpage/pgadmin4` image found on Docker Hub](https://hub.docker.com/r/dpage/pgadmin4/) in functionality but has fewer dependencies, minimizing its attack surface.

## Getting Started

### Helm

To deploy pgAdmin with Helm, create a values manifest leveraging Chainguard's image:

```bash
cat > ./values.yaml <<EOF
values:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/pgadmin4"
    tag: "latest"
EOF
```

Then add the Helm repository:

```bash
helm repo add runix https://helm.runix.net
```

And install the chart:

```bash
helm install pgadmin4 runix/pgadmin4 -f ./values.yaml
```

Optionally, you can port forward pgAdmin:

```bash
kubectl port-forward svc/pgadmin4 8080:80
```

pgAdmin will now be accessible via [localhost:8080](http://localhost:8080).

Please note that the default email set in the chart is `chart@domain.com` and that the default password is `SuperSecret`. These should be changed in a production deployment.

You can find additional Helm chart values [in this GitHub repository](https://github.com/rowanruseler/helm-charts/tree/main/charts/pgadmin4).

### Docker

Alternatively, Chainguard's pgAdmin image can be used with Docker:

```bash
docker run -p 8080:80 \
    -e PGADMIN_DEFAULT_EMAIL="EMAIL" \
    -e PGADMIN_DEFAULT_PASSWORD="PASSWORD" \
    -d cgr.dev/ORGANIZATION/pgadmin4:latest
```

After running this command,pgAdmin will be accessible at [localhost:8080](http://localhost:8080).

The official pgAdmin documentation includes additional information on [deploying pgAdmin using a container image](https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html).

## Documentation and Resources

For more information on the usage of pgAdmin, consult the following resources:

- [pgAdmin Documentation](https://www.pgadmin.org/docs)
- [pgAdmin GitHub Repository](https://github.com/pgadmin-org/pgadmin4)
- [pgAdmin Helm Chart Documentation](https://github.com/rowanruseler/helm-charts/tree/main/charts/pgadmin4)
- [pgAdmin Docker Documentation](https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### influxdb-iamguarded

# influxdb-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/influxdb-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/influxdb-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[InfluxDB](https://github.com/influxdata/influxdb) is a time series database designed to handle high write and query loads.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

InfluxDB IAMGuarded is a security-enhanced variant of InfluxDB designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard InfluxDB deployments.

## Helm Chart Installation

The InfluxDB IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/influxdb
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install influxdb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/influxdb \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main InfluxDB server image
image:
  registry: myregistry.example.com
  repository: mirrored/influxdb-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Backup provider images
backup:
  uploadProviders:
    google:
      image:
        registry: myregistry.example.com
        repository: mirrored/google-cloud-sdk-iamguarded
        digest: sha256:...
    azure:
      image:
        registry: myregistry.example.com
        repository: mirrored/az-iamguarded
        digest: sha256:...
    aws:
      image:
        registry: myregistry.example.com
        repository: mirrored/aws-cli-iamguarded
        digest: sha256:...
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Default Configuration

The chart comes with sensible defaults for InfluxDB IAMGuarded:

- **Admin user**: Automatically created with username `admin`
- **Organization**: Default organization `primary` is created
- **Bucket**: Default bucket `primary` is created
- **Authentication**: HTTP authentication is enabled by default
- **Persistence**: 10Gi persistent volume claim for data storage

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install influxdb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/influxdb@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/influxdb
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/influxdb:2.7.11
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## InfluxDB Features

This image supports all standard InfluxDB v2 features including:

- **Time Series Database**: Optimized for time-stamped data storage and retrieval
- **Flux Query Language**: Powerful data scripting and query language
- **API Compatible**: Full compatibility with InfluxDB v2 API
- **Multi-organization Support**: Isolated tenants within the same instance
- **Token-based Authentication**: Secure API access with fine-grained permissions
- **Backup and Restore**: Built-in backup capabilities with cloud provider support

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The InfluxDB IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both InfluxDB and Kubernetes environments. Key security features include:

- **Non-root execution**: Runs as non-root user by default
- **Minimal attack surface**: Based on Chainguard's hardened base images
- **Regular updates**: Daily rebuilds ensure latest security patches
- **SBOM included**: Full software bill of materials for compliance

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Direct Container Usage

While we recommend using the Helm chart for production deployments, the container can be run directly for testing:

```bash
docker run -p 8086:8086 \
  -e INFLUXD_HTTP_AUTH_ENABLED=true \
  -e INFLUXD_ADMIN_USER=admin \
  -e INFLUXD_ADMIN_PASSWORD=supersecret \
  -e INFLUXD_ADMIN_ORG=myorg \
  -e INFLUXD_ADMIN_BUCKET=mybucket \
  cgr.dev/ORGANIZATION/influxdb-iamguarded:latest
```

Note: For production use, always deploy using the Helm chart which provides proper secrets management, persistence, and security configurations.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-7258

# request-7258
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-7258` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-7258/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rclone-fips

# rclone-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rclone-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rclone-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Rclone syncs files and directories to and from different cloud storage providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable with [upstream image](https://hub.docker.com/r/rclone/rclone). Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support

The `rclone-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

To start using Chainguard rclone image, we can start with checking the version and invoking some commands:
```shell
docker run --rm cgr.dev/ORGANIZATION/rclone-fips:latest version
docker run --rm cgr.dev/ORGANIZATION/rclone-fips:latest sync /usr/bin /tmp/newbin --copy-links
```

## Documentation and Resources
- [Official Rclone documentation](https://rclone.org/install/#docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-fips

# crossplane-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Cloud Native Control Plane

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## How to use this Image

There are plenty ways of installing Crossplane in your Kubernetes cluster. The most common way is to use Helm. Here is an example of how to install Crossplane using Helm with the `crossplane-fips` image:

To get more detail on how to install Crossplane, please refer to the [Crossplane documentation](https://docs.crossplane.io/v2.0/get-started/install/).

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm install crossplane --namespace crossplane-system crossplane-stable/crossplane \
    --set image.repository=cgr.dev/chainguard-private/crossplane-fips \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spegel-fips

# spegel-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spegel-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spegel-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Stateless cluster local OCI registry mirror.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [spegel](https://github.com/spegel-org/spegel/pkgs/container/spegel/431443929?tag=v0.3.0) image. Switching to Chainguard image should not require any changes to your existing setup so this image is a drop in replacement for the upstream [spegel image](https://github.com/spegel-org/spegel/pkgs/container/spegel/431443929?tag=v0.3.0), which means it works everywhere you would expect.

## Getting Started

To install Chainguard's spegel FIPS image on your Kubernetes cluster, you can use the official image's [Helm chart](https://spegel.dev/docs/getting-started/#cli).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/spegel-fips
  tag: latest
```

You can also invoke the following command to install spegel in your cluster.

```shell
helm install spegel oci://ghcr.io/spegel-org/helm-charts/spegel -f values.yaml
```

### FIPS Support
The `spegel-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Documentation and Resources
For more information, please refer to [the official documentation for spegel](https://spegel.dev). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cosign-fips

# cosign-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cosign-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cosign-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Cosign image for signing and verifying images using Sigstore.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Like most other Chainguard Images, Chainguard's `cosign-fips` Container image has few-to-zero CVEs and does not run as the root user.

### FIPS Support
The `cosign-fips` Chainguard Container Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
You can use the `cosign-fips` Container image image to sign and verify container images via Docker or through automated workflows such as GitHub Actions.

### Verifying a container image signature
To verify an image signature, use the image to run Cosign's `verify` command. As of Cosign 2.0, Cosign defaults to using Sigstore's keyless mode, you'll need to also specify the OIDC issuer and signer identity to tell Cosign who you trust for the verification process.

For convenience, you can export those values as environment variables in your shell, and then tell Docker to pass those environment variables into the running Cosign container:

```shell
export COSIGN_CERTIFICATE_OIDC_ISSUER=https://token.actions.githubusercontent.com
export COSIGN_CERTIFICATE_IDENTITY=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main
```

The following example uses the `cosign-fips` Container image to verify the signature of the Cosign image itself:

```
docker run --rm \
  -e COSIGN_CERTIFICATE_OIDC_ISSUER \
  -e COSIGN_CERTIFICATE_IDENTITY \
  cgr.dev/chainguard/cosign-fips \
  verify cgr.dev/chainguard/cosign-fips
```

### Signing a container image

The following GitHub Action will log into the registry, push an image, and then sign it with Cosign:

```yaml
on:
  workflow_dispatch:

env:
  IMAGE: ghcr.io/${{ github.repository }}
  DOCKER_CONFIG: .docker-tmp
jobs:
  push-and-sign:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      packages: write
    steps:
      - name: Log in to registry
        run: |
          set -x
          mkdir -p "${DOCKER_CONFIG}"
          echo '{}' > "${DOCKER_CONFIG}/config.json"
          echo "${{ github.token }}" | docker login \
            -u "${{ github.repository_owner }}" \
            --password-stdin ghcr.io
      - name: Push image with docker
        run: |
          set -x
          docker pull cgr.dev/chainguard/wolfi-base
          docker tag cgr.dev/chainguard/wolfi-base "${IMAGE}"
          docker push "${IMAGE}"
      - name: Sign image with cosign
        run: |
          set -x
          env | grep -v ^HOME= > github-actions.txt
          docker run --rm --env-file=./github-actions.txt \
            -v "${PWD}/${DOCKER_CONFIG}:/tmp/${DOCKER_CONFIG}" \
            -e DOCKER_CONFIG="/tmp/${DOCKER_CONFIG}" \
            cgr.dev/chainguard/cosign-fips \
            sign "${IMAGE}" \
              --yes \
              -a sha=${{ github.sha }} \
              -a run_id=${{ github.run_id }} \
              -a run_attempt=${{ github.run_attempt }}
```

### Attesting to an image's SBOM

Another common use case for Cosign is attesting to an image's SBOM (software bill of materials). The following command creates an attestation of type `spdxjson` for an image based on the provided SBOM file and image digest:

```shell
docker run --rm cgr.dev/chainguard/cosign-fips attest --type spdxjson \
 --predicate example-image.spdx.json \
 sha256:7f95c5aa7e789ad51737e03021586949346f38ced1533ecdcb2ef2b9104137ac

```

A detailed guide on how to sign an SBOM with Cosign is available on [Chainguard Academy](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/).

### Verifying an Attestation

Cosign can also be used to verify the identity of the person or entity issuing an attestation. To verify that an attestation was issued by a specific entity, we use the `cosign verify-attestation` command, specifying the email address of the issuer:

```shell
cosign verify-attestation \
 --certificate-oidc-issuer=https://github.com/login/oauth \
 --type https://spdx.dev/Document \
 --certificate-identity=emailaddress@emailprovider.com \
 sha256:7f95c5aa7e789ad51737e03021586949346f38ced1533ecdcb2ef2b9104137ac
```

If the identity is successfully verified, an initial message similar to the following is printed to stderr:

```shell
Verification for user/example-image@sha256:545a731e803b917daf44e292b03b427427f8090c4e6c4a704e4c18d56c38539f --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority certificates
Certificate subject: <you@domain.com>
Certificate issuer URL: https://github.com/login/oauth
```

## Configuration

The following environment variables are required when verifying a container image signature:

- `COSIGN_CERTIFICATE_OIDC_ISSUER`: Trusted OIDC issuer, example: `https://token.actions.githubusercontent.com`
- `COSIGN_CERTIFICATE_IDENTITY`: Trusted certificate identity, example: `https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main`

### Detailed Environment Information

To obtain detailed information about the environment, you can run the `cosign env` command:

```shell
docker run --rm cgr.dev/chainguard/cosign-fips env --show-descriptions=false
```

You'll get output similar to this, containing the environment variables used to configure Cosign:

```shell
ACTIONS_ID_TOKEN_REQUEST_TOKEN=
ACTIONS_ID_TOKEN_REQUEST_URL=
BUILDKITE_AGENT_ACCESS_TOKEN=
BUILDKITE_AGENT_ENDPOINT=
BUILDKITE_AGENT_LOG_LEVEL=
BUILDKITE_JOB_ID=
COSIGN_DOCKER_MEDIA_TYPES=
COSIGN_EXPERIMENTAL=
COSIGN_MAX_ATTACHMENT_SIZE=
COSIGN_PASSWORD=
COSIGN_PKCS11_IGNORE_CERTIFICATE=
COSIGN_PKCS11_MODULE_PATH=
COSIGN_PKCS11_PIN=
COSIGN_REPOSITORY=
GITHUB_HOST=
GITHUB_TOKEN=
GITLAB_HOST=
GITLAB_TOKEN=
GOOGLE_SERVICE_ACCOUNT_NAME=
SIGSTORE_CT_LOG_PUBLIC_KEY_FILE=
SIGSTORE_ID_TOKEN=
SIGSTORE_REKOR_PUBLIC_KEY=
SIGSTORE_ROOT_FILE=
SIGSTORE_TSA_CERTIFICATE_FILE=
SOURCE_DATE_EPOCH=
SPIFFE_ENDPOINT_SOCKET=
COSIGN_CERTIFICATE_OIDC_ISSUER=******
COSIGN_CERTIFICATE_IDENTITY=******
```

## Documentation and Resources

- [Chainguard Academy: An Introduction to Cosign](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/)
- [Blog Post: Chainguard announces new Sigstore Images to bring critical software supply chain tooling to enterprises](https://www.chainguard.dev/unchained/chainguard-announces-new-sigstore-images-to-bring-critical-software-supply-chain-tooling-to-enterprises)
 - [Chainguard Academy: How to Sign an SBOM with Cosign](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/)
- [Chainguard Academy: Verifying Chainguard Images and Metadata Signatures with Cosign](https://edu.chainguard.dev/chainguard/chainguard-images/verifying-chainguard-images-and-metadata-signatures-with-cosign/)

- [Video: Signing and Verifying Container Images With Sigstore Cosign and Kyverno ](https://www.youtube.com/watch?v=HLb1Q086u6M)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-iamguarded

# mongodb-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MongoDB](https://www.mongodb.com/) is a document-oriented database management system. MongoDB is a popular example of a NoSQL database, and stores data in JSON-like documents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MongoDB IAMGuarded is a security-enhanced variant of MongoDB designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard MongoDB deployments.

## Helm Chart Installation

The MongoDB IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MongoDB image
image:
  registry: myregistry.example.com
  repository: mirrored/mongodb-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus MongoDB exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mongodb-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# When external access to MongoDB is enabled:
externalAccess:
  # This is the image of the auto-discovery init container that
  # auto-detects LB IPs or node ports.
  autoDiscovery:
    image:
      registry: myregistry.example.com
      repository: mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag
  # Image of the init container that ensures public names can be resolved.
  dnsCheck:
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# Image of the container that enables TLS support to MongoDB.
tls:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image of the init container that sets up volume permissions.
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mongodb:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MongoDB IAMGuarded installation using standard MongoDB verification methods. The deployment functions as a standard MongoDB instance, so all typical MongoDB validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MongoDB IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MongoDB and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4077

# request-4077
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4077` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4077/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image with cuda runtime and devel packages with python

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2_exporter

# pgpool2_exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2_exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2_exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter image for Pgpool-II metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [pgpool2_exporter](https://hub.docker.com/r/pgpool/pgpool2_exporter) image. Switching to Chainguard `pgpool2_exporter` image should not require any changes to your existing setup. 
- Supported `Pgpool-II 3.6` and later.
## Getting Started
### Docker

The following environment variables configure the docker container:
- `POSTGRES_USERNAME` PostgreSQL user name. Default is `postgres`.
- `POSTGRES_PASSWORD` PostgreSQL user password. Default is `postgres`.
- `POSTGRES_DATABASE` Database name. Default is `postgres`.
- `PGPOOL_SERVICE` Pgpool-II hostname. Default is `localhost`.
- `PGPOOL_SERVICE_PORT` Pgpool-II port number. Default is `9999`.

```shell
docker run --name pgpool2_exporter \
  --net=host --rm \
  -e POSTGRES_USERNAME=<username> \
  -e POSTGRES_PASSWORD=<password> \
  -e POSTGRES_DATABASE=<database> \
  -e PGPOOL_SERVICE=<hostname> \
  -e PGPOOL_SERVICE_PORT=<port> \
  -e SSLMODE=<sslmode> \
  cgr.dev/ORGANIZATION/pgpool2_exporter:latest
```

## Documentation and Resources
For more information, please refer to [the official documentation for pgpool2_exporter project](https://github.com/pgpool/pgpool2_exporter/blob/master/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### squid-proxy

# squid-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/squid-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/squid-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Squid Proxy is an open-source, high-performance, and highly configurable caching and forwarding web proxy. It is widely used for speeding up web servers by caching web, DNS, and other computer network lookups for a group of people sharing network resources, and for aiding security by filtering traffic.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image provides a high-performance Squid proxy server suitable for a wide range of caching and forwarding requirements. It is a drop-in replacement for traditional Squid proxy images but is enhanced for security and minimized to reduce its attack surface. Ideal for both development and production environments where a proxy server is required.

Note: We are running this image as non-root user called `squid` by default for more security.

## Usage

### Running the Squid Proxy Container
To run the squid-proxy container with default settings:

```bash
docker run --rm -p 3128:3128 cgr.dev/chainguard/squid-proxy:latest
```

#### Testing it with curl

```bash
export PROXY_HOST="localhost"
export PROXY_PORT="3128"
export URL="http://example.com"

curl -x http://"$PROXY_HOST":"$PROXY_PORT" "$URL" -o /dev/null -w '%{http_code}\n' -s
```

You will get a 403 response on this very likely, because of ACL on the default `/etc/squid.conf`. Access Control Lists (ACLs) in `squid.conf` are a crucial part of Squid's configuration. They allow you to define rules that grant or deny access to internet resources based on various criteria such as source IP, destination IP, URLs, protocols, and more.

Log may not be visible with default configuration, you can set it using the below custom configuration.

### Custom Configuration For Docker

Add the following lines to the 'squid.conf' to redirect the logs to the '/dev/stdout':

```
http_port 3128
logfile_rotate 0
cache_log stdio:/dev/stdout
access_log stdio:/dev/stdout
cache_store_log stdio:/dev/stdout
```

For custom configurations, mount your squid.conf file into the container:

```bash
docker run --rm -v /path/to/your/squid.conf:/etc/squid.conf -p 3128:3128 cgr.dev/chainguard/squid-proxy:latest
```

### Custom Configuration For Kubernetes

For working in Kubernetes, you can also run a parallel container in a pod containing squid container. This container will tail these (/var/log/squid/{cache,access}.log or any other) logs on its stdout.

```yaml
---
kind: Pod
apiVersion: v1
metadata:
  name: squid-proxy
  labels:
    app: squid
spec:
  volumes:
  - name: log-dir
    emptyDir: {}
  containers:
  - name: squid
    image: cgr.dev/chainguard/squid-proxy:latest
    volumeMounts:
    - name: log-dir
      mountPath: "/var/log/squid/"
  - name: tailer
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    args:
    - tail -F /var/log/squid/access.log
    volumeMounts:
    - name: log-dir
      mountPath: "/var/log/squid/"
```

For more detailed instructions and advanced configurations, refer to the [Squid Official Documentation](https://www.squid-cache.org/Doc/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wavefront-collector-for-kubernetes

# wavefront-collector-for-kubernetes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wavefront-collector-for-kubernetes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wavefront-collector-for-kubernetes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kaniko-fips

# kaniko-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kaniko-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kaniko-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Build Container Images In Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are several ways of running Kaniko and one of them is Kubernetes, where you can use the official documentation of Kaniko to deploy it in a Kubernetes cluster, [here](https://github.com/GoogleContainerTools/kaniko/blob/main/README.md#running-kaniko-in-a-kubernetes-cluster) but in a nutshell, you can use the following command:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: cgr.dev/chainguard-private/kaniko-fips:latest
    args:
    - "--context=<your_git_reference_with_Dockerfile_included>" # many others contextes are available
    - "--destination=<your_docker_image_reference>"
    volumeMounts:
    - name: kaniko-secret
      mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
  - name: kaniko-secret
    secret:
      secretName: dockercred
      items:
        - key: .dockerconfigjson
          path: config.json
EOF
```

**NOTE:** If you are using a private registry, you will need to have a secret named `dockercred` with the `.dockerconfigjson` key containing your Docker credentials in this example.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### unbound-mailcow

# unbound-mailcow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/unbound-mailcow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/unbound-mailcow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Unbound is a validating, recursive, and caching DNS resolver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Unbound Mailcow image is comparable to the [mailcow/unbound image](https://hub.docker.com/r/mailcow/unbound) on Docker Hub. As with many of Chainguard's other container images, the Unbound Mailcow image contains only the minimum number of dependencies it needs to function.

The `unbound-mailcow` Chainguard Image runs as the `root` user to support use of `supervisord` as the default command for the image.  The `unbound` daemon started by `supervisord` drops privileges to `unbound` on startup.

## Getting Started

You can start an `unbound` DNS resolver with a command like the following:

```shell
docker run --rm -d --name=unbound-resolver -p 5454:53/udp -p 5454:53/tcp cgr.dev/ORGANIZATION/unbound-mailcow:latest unbound
```

Following that, you can check that `unbound` is working:

```shell
dig @127.0.0.1 -p 5454 chainguard.dev
```

## Documentation and Resources

You can find more information in the [official Unbound documentation](https://unbound.docs.nlnetlabs.nl/en/latest/index.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### camunda-keycloak

# camunda-keycloak
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/camunda-keycloak` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/camunda-keycloak/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Camunda Keycloak](https://github.com/camunda/keycloak/) image for identity and access management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Camunda Keycloak image is comparable to the [camunda/keycloak image on Docker Hub](https://hub.docker.com/r/camunda/keycloak), designed to be deployed using the Keycloak IAMGuarded Helm chart. This Keycloak image variant provides additional JARs that allow for the use of AWS Identity and Access Management (IAM) Roles for Service Accounts (IRSA) for database authentication.

Unlike the [camunda/keycloak image](https://hub.docker.com/r/camunda/keycloak), Chainguard's image does not include any custom themes.

## Helm Chart Installation

The Keycloak IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "image.repository=$ORGANIZATION/camunda-keycloak"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### AWS Wrapper Configuration
In order to connect to Postgres using JDBC, we have to use the AWS wrapper. To do so, use the following values:
```yaml
extraEnvVars:
- name: KEYCLOAK_JDBC_PARAMS
  value: wrapperPlugins=iam
- name: KEYCLOAK_JDBC_DRIVER
  value: aws-wrapper:postgresql
- name: KC_DC_URL
  value: "jdbc:aws-wrapper:postgresql://postgresql.default.svc.cluster.local:5432/iamguarded_keycloak?currentSchema=public"
```

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Keycloak image
image:
  registry: myregistry.example.com
  repository: mirrored/camunda-keycloak
  digest: sha256:... # Use specific digest instead of tag

# Keycloak Config CLI
keycloakConfigCli:
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication
Ensure proper pull credentials are configured through one of the following methods:

**Option 1: Using Helm values with `global.imagePullSecrets`**
```yaml
# values.yaml
global:
  imagePullSecrets:
    - name: chainguard-pull-secret
```

**Option 2: Create a Kubernetes pull secret**
```bash
# Step 1: Authenticate with chainctl and generate a pull token
chainctl auth login
chainctl auth configure-docker --pull-token --save --ttl=24h

# Step 2: Create the Kubernetes secret
kubectl create secret docker-registry chainguard-pull-secret \
  --docker-server=cgr.dev \
  --docker-username=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Username') \
  --docker-password=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Secret') \
  -n <your-namespace>

# Step 3: Reference the secret in your Helm installation
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "image.repository=$ORGANIZATION/camunda-keycloak" \  
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret"
```

**Option 3: Cluster node-scoped registry permissions** (cluster-dependent)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "image.repository=$ORGANIZATION/camunda-keycloak"     
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Camunda Keycloak installation is using standard Keycloak verification methods. The deployment functions as a standard Keycloak instance, so all typical Keycloak validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Keycloak IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Keycloak and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Configuration
Keycloak provides a mechanism to configure and customize the image. This process
is outlined in the [Keycloak image documentation](https://github.com/keycloak/keycloak/blob/main/docs/guides/server/containers.adoc).

There are subtle differences in the executable paths used in the Chainguard
image. Below is the example copied from the documentation, updated with the
correct paths:

```bash
FROM cgr.dev/chainguard/camunda-keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /usr/share/java/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /usr/share/java/keycloak/bin/kc.sh build

FROM cgr.dev/chainguard/camunda-keycloak:latest
COPY --from=builder /usr/share/java/keycloak/ /usr/share/java/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/usr/share/java/keycloak/bin/kc.sh"]
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pg-timetable

# pg-timetable
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pg-timetable` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pg-timetable/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An advanced standalone job scheduler for PostgreSQL, offering many advantages over traditional schedulers such as cron and others.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's pg_timetable image is comparable to the [cybertecpostgresql/pg_timetable image](https://hub.docker.com/r/cybertecpostgresql/pg_timetable) from Docker Hub. It is designed to be minimal and secure and is optimized for running inside a containerized environment. This image is designed to connect to a PostgreSQL instance with SSL/TLS enabled for secure database communications.

## Getting Started

Below is an example of how to deploy `pg_timetable` using Docker with a PostgreSQL database secured with TLS:

Start by creating a Docker Network: 
```shell
docker network create pg-timetable-net || true
```

Next, generate SSL certificates:

```shell
mkdir -p /tmp/certs
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out /tmp/certs/ca.key
openssl req -x509 -new -nodes -key /tmp/certs/ca.key -sha256 -days 1024 -out /tmp/certs/ca.crt -subj "/CN=localhost"

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out /tmp/certs/server.key
openssl req -new -key /tmp/certs/server.key -out /tmp/certs/server.csr -subj "/CN=localhost"
openssl x509 -req -in /tmp/certs/server.csr -CA /tmp/certs/ca.crt -CAkey /tmp/certs/ca.key -CAcreateserial -out /tmp/certs/server.crt -days 365
```

Be sure to change the owenrship of certs either to root or to the UID/GID of Postgres (for example, `70:70`) as that is a [hard requirement for Postgres in enabling TLS](https://www.postgresql.org/docs/current/ssl-tcp.html):

```shell
 sudo chown 70:70 /tmp/certs/server.key
 sudo chmod 600 /tmp/certs/server.key
 ```

Next, start PostgreSQL with SSL enabled:

```shell
docker run -d --network=pg-timetable-net --name=postgres \
  -e POSTGRES_DB=timetable \
  -e POSTGRES_USER=scheduler \
  -e POSTGRES_PASSWORD=scheduler \
  -v /tmp/certs:/certs:rw \
  cgr.dev/ORGANIZATION/postgres:latest \
  -c ssl=on \
  -c ssl_cert_file='/certs/server.crt' \
  -c ssl_key_file='/certs/server.key' \
  -c ssl_ca_file='/certs/ca.crt'
```

Following that, start pg_timetable:

```shell
docker run --rm -d --network=pg-timetable-net --name=pg-timetable \
  -p 8008:8008 \
  -e PGTT_URL="postgresql://scheduler:scheduler@postgres:5432/timetable?sslmode=verify-ca&sslrootcert=/certs/ca.crt" \
  -e PGTT_RESTPORT=8008 \
  -e PGTT_RESTHOST="0.0.0.0" \
  -v /tmp/certs:/certs \
  cgr.dev/ORGANIZATION/pg-timetable:latest \
  pg_timetable -c worker001
```

Verify that pg_timetable is ready:

```shell
until docker exec pg-timetable curl -s -o /dev/null -w "%{http_code}" http://0.0.0.0:8008/liveness | grep "200"; do
  sleep 2
done
echo "pg_timetable is ready."
```

You can then insert tasks like in the following example:

```shell
CHAIN_ID=$(docker exec postgres psql "sslmode=verify-ca sslrootcert=/certs/ca.crt" \
  -U scheduler -d timetable -t -A -c \
  "INSERT INTO timetable.chain (chain_name, live) VALUES ('Test Chain', TRUE) RETURNING json_build_object('chain_id', chain_id);" \
  | grep '{' | jq -r '.chain_id')

docker exec postgres psql "sslmode=verify-ca sslrootcert=/certs/ca.crt" \
  -U scheduler -d timetable -c \
  "INSERT INTO timetable.task (chain_id, task_order, kind, command) VALUES ($CHAIN_ID, 1, 'SQL', 'SELECT now();');"
```

And verify the logs:

```shell
2025-03-19 19:04:43.609 [INFO] [chain:1] Starting chain
2025-03-19 19:04:43.611 [INFO] [chain:1] [vxid:12884901926] Chain executed successfully
```

## Documentation and Resources
- [Official `pg_timetable` Documentation](https://www.cybertec-postgresql.com/en/products/pg_timetable)
- [Chainguard Secure Images](https://www.chainguard.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### psqlodbc-fips

# psqlodbc-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/psqlodbc-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/psqlodbc-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains psqlodbc drivers for use with unixODBC.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image contains the ANSI and Unicode `psqlodbc` drivers for use with unixODBC.

It also contains the `unixodbc` package and associated utilities.

The image is designed to run in FIPS environments.

## Getting Started

To use this image, ensure the `psqlodbc` drivers are registered in an `odbcinst.ini` file like the following:

```
[PostgreSQL Unicode]
Description=PostgreSQL ODBC Driver
Driver=/usr/lib/psqlodbcw.so
[PostgreSQL ANSI]
Description=PostgreSQL ODBC Driver
Driver=/usr/lib/psqlodbca.so
```

Next, configure an `odbc.ini` file with the drivers by adding their respective names on a `Driver = <name>` line like this:

```
[PostgreSQL-Unicode-DB]
Driver = PostgreSQL Unicode
Servername = ...
Database = ...
Username = ...
Password = ...
. . .
[PostgreSQL-ANSI-DB]
Driver = PostgreSQL ANSI
Servername = ...
Database = ...
Username = ...
Password = ...
. . .
```

To test that the drivers are working as intended, configure the rest of `odbc.ini` with the appropriate settings and credentials and then try connecting with `isql`:

```
isql -v PostgreSQL-TestDB-ANSI <schemaname>
```

If the connection is successful, you will receive output like the following:

```
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+
```

## Documentation and Resources

* For more information about `psqlodbc` visit the [ODBC project page on PostgreSQL's site](https://odbc.postgresql.org/)
* To learn more about `unixODBC` visit [https://www.unixodbc.org/](https://www.unixodbc.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-gcp-fips

# velero-plugin-for-gcp-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-gcp-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-gcp-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Velero plugin for Google Cloud Platform that provides backup and restore functionality for GCS and GCE Persistent Disk snapshots

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `velero-plugin-for-gcp-fips` image is a FIPS-compliant version fully compatible with the public [Velero plugin for GCP](https://github.com/vmware-tanzu/velero-plugin-for-gcp). This FIPS-compliant image includes both the VolumeSnapshotter and ObjectStore plugins required for Google Cloud integration:

* **VolumeSnapshotter**: Handles GCE Persistent Disk snapshots for persistent volume backups
* **ObjectStore**: Manages backups stored in Google Cloud Storage

The plugin is designed to be used as an init container with Velero deployments, following the standard Velero plugin architecture. This FIPS-compliant version uses validated cryptographic modules and algorithms that meet Federal Information Processing Standards requirements. There are no functional changes from the public implementation.

## Getting Started

The `velero-plugin-for-gcp-fips` image is designed to be used as an init container in Velero deployments. The image contains a `cp-plugin` command that copies the plugin binary to a shared volume where Velero can load it.

Here's an example of using this image with a Velero deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: velero
  namespace: velero
spec:
  template:
    spec:
      serviceAccountName: velero
      initContainers:
      - name: velero-plugin-for-gcp-fips
        image: cgr.dev/ORGANIZATION/velero-plugin-for-gcp-fips:latest
        volumeMounts:
        - mountPath: /target
          name: plugins
      containers:
      - name: velero
        image: cgr.dev/ORGANIZATION/velero:latest
        command:
        - /velero
        args:
        - server
        - --plugin-dir=/plugins
        volumeMounts:
        - name: plugins
          mountPath: /plugins
      volumes:
      - name: plugins
        emptyDir: {}
```

When the init container runs, it will copy the plugin binary to `/target/velero-plugin-for-gcp`, making it available to the Velero server in the `/plugins` directory.

You can also install Velero with this plugin using the official Velero CLI:

```sh
velero install \
  --provider gcp \
  --plugins cgr.dev/ORGANIZATION/velero-plugin-for-gcp-fips:latest \
  --bucket my-backup-bucket \
  --secret-file ./credentials-velero
```

## Configuration

To use this plugin, you'll need to configure Velero with GCP-specific settings. Create a `BackupStorageLocation` resource:

```yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: gcp
  namespace: velero
spec:
  provider: velero.io/gcp
  objectStorage:
    bucket: my-backup-bucket
    prefix: velero-backups
  config:
    project: my-gcp-project
```

For GCE Persistent Disk snapshots, create a `VolumeSnapshotLocation`:

```yaml
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
  name: gcp
  namespace: velero
spec:
  provider: velero.io/gcp
  config:
    project: my-gcp-project
```

You'll also need to provide GCP credentials to Velero. Create a secret with your GCP service account credentials:

```sh
kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-file cloud=path/to/gcp-service-account.json
```

## Documentation and Resources

* [Velero plugin for GCP documentation](https://github.com/vmware-tanzu/velero-plugin-for-gcp)
* [Velero supported providers documentation](https://velero.io/docs/supported-providers/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### logstash

# logstash
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/logstash` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/logstash/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Logstash is a server-side data processing pipeline that ingests data from multiple sources, transforms it, and sends it to your chosen destination

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `logstash` container image is comparable to the [upstream image](https://github.com/elastic/logstash), with the following differences:

* Like all other Chainguard Containers, `logstash` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting Started

### Create a simple config file

logstash.conf:
```
input {
  stdin { }
}

output {
  stdout { codec => rubydebug }
}
```

### Run the container
```
docker run --rm -it \
  -v $(pwd)/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
  cgr.dev/ORGANIZATION/logstash:latest

```

**Test Input**
```
Hello Wolfi!
```

**Expected Output**
```
{
    "message" => "Hello Wolfi!",
    "@version" => "1",
    "@timestamp" => "2025-07-03T05:10:15.123Z",
    "host" => "container-id"
}
```

## Documentation and Resources

- **[Official Documentation](https://www.elastic.co/guide/en/logstash/current/index.html)**
- **[GitHub Repository](https://github.com/elastic/logstash)**
- **[Overview & Download Page (Elastic)](https://www.elastic.co/logstash)**
- **[Documentation for OpenSearch](https://docs.opensearch.org/docs/latest/tools/logstash/index/)**
- **[Reference Guide (Elastic)](https://www.elastic.co/docs/reference/logstash)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-kubectl

# gitlab-kubectl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-kubectl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-kubectl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

kubectl is the official CLI tool for managing Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics-fips

# victoriametrics-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

VictoriaMetrics (Fips) can be deployed as a single node (all image tags without a "-cluster" suffix) or as a distributed cluster. See the github repository for reference: https://github.com/VictoriaMetrics/VictoriaMetrics/tree/master as well as their public facing documentation: https://docs.victoriametrics.com/

In clustered mode, the VictoriaMetrics application itself is broken into 3 different services:
* vmstorage - stores the raw data and returns the queried data on the given time range for the given label filters
* vminsert - accepts the ingested data and spreads it among vmstorage nodes according to consistent hashing over metric name and all its labels
* vmselect - performs incoming queries by fetching the needed data from all the configured vmstorage nodes

This image group also contains several standalone services (that DO vary between clustered and single mode):
* vmagent - A lightweight metrics collection agent.
* vmauth - A service that provides authentication and authorization for VictoriaMetrics services. It acts as HTTP proxy, which can authorize, route and load balance requests across VictoriaMetrics components or any other HTTP backends.

## Usage

You can install the VictoriaMetrics components using Helm. Below are the Helm install commands for each component:

### Install `vmagent`

```bash
helm install vmagent victoria-metrics-agent --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics \
  --set image.repository=cgr.dev/chainguard-private/victoriametrics-vmagent-fips \
  --set image.tag=latest
```

### Install `vmauth`

```bash
helm install vmauth victoria-metrics-auth --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics \
  --set image.repository=cgr.dev/chainguard-private/victoriametrics-vmauth-fips \
  --set image.tag=latest
```

Note: You will need to set the config and for sample testing purpose, you can take inspiration from this example:

```bash
cat <<YAML | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: vmauth-config
  namespace: victoriametrics
data:
  auth.yml: |
    users:
      - username: "user1"
        password: "pass1"
        url_prefix: "http://localhost:8428/"
      - username: "user2"
        password: "pass2"
        url_prefix: "http://localhost:8429/"
    unauthorized_user:
      url_prefix: "http://localhost:8428/"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vmauth
  namespace: victoriametrics
spec:
  selector:
    matchLabels:
      app: vmauth
  template:
    metadata:
      labels:
        app: vmauth
    spec:
      containers:
      - name: vmauth
        image: cgr.dev/chainguard-private/victoriametrics-vmauth-fips:latest
        args:
          - "-auth.config=/config/auth.yml"
        ports:
        - containerPort: 8427
        volumeMounts:
        - name: vmauth-config
          mountPath: /config
      volumes:
      - name: vmauth-config
        configMap:
          name: vmauth-config
YAML
```

### Install `vminsert`, `vmselect`, `vmstorage`

```bash
helm install vminsert victoria-metrics-cluster --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics-cluster \
  --set vminsert.image.repository=cgr.dev/chainguard-private/victoriametrics-vminsert-fips \
  --set vminsert.image.tag=latest \
  --set vminsert.image.variant="" \ 
  --set vmselect.image.repository=cgr.dev/chainguard-private/victoriametrics-vmselect-fips \
  --set vmselect.image.tag=latest \
  --set vmselect.image.variant="" \ 
  --set vmstorage.image.repository=cgr.dev/chainguard-private/victoriametrics-vmstorage-fips \
  --set vmstorage.image.tag=latest \
  --set vmstorage.image.variant="" 
```

Note: We use `vmstorage.image.variant=""` because our images are already coming with `cluster` suffix, so we no longer need to specify it. For further reference, refer to [official docs](https://docs.victoriametrics.com)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-auto-ready-fips

# crossplane-function-auto-ready-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-auto-ready-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-auto-ready-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This composition function automatically detects when composed resources are ready in Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-function-auto-ready-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/function-auto-ready](https://github.com/crossplane-contrib/function-auto-ready/pkgs/container/function-auto-ready) image.

### FIPS support

Chainguard's `crossplane-function-auto-ready-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Function

Deploy the function to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: function-auto-ready
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-auto-ready-fips:latest
```

Apply this configuration:
```bash
kubectl apply -f function.yaml
```

Verify the function is healthy:
```bash
kubectl get functions
```

### Using the Function

The function-auto-ready automatically detects when composed resources are ready. A resource is considered ready when:

1. Another function added the resource to the desired state
2. The resource exists in the observed state
3. The resource has a "Ready: True" status condition

Example Composition using the auto-ready function:

```yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: example-composition
spec:
  compositeTypeRef:
    apiVersion: example.io/v1alpha1
    kind: XDatabase
  mode: Pipeline
  pipeline:
  - step: auto-ready
    functionRef:
      name: function-auto-ready
```

For detailed usage examples and documentation, refer to the [upstream project](https://github.com/crossplane-contrib/function-auto-ready#function-auto-ready).

## Documentation and Resources
- [Crossplane Functions Documentation](https://docs.crossplane.io/v2.0/packages/functions/)
- [Upstream Project](https://github.com/crossplane-contrib/function-auto-ready)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-proportional-autoscaler-fips

# cluster-proportional-autoscaler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-proportional-autoscaler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-proportional-autoscaler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### regclient

# regclient
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/regclient` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/regclient/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

regclient is a client interface to OCI conformant registries and content shipped with the OCI Image Layout

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

These images are built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's images maintain functional parity with the upstream images:

- [`regctl`](https://hub.docker.com/r/regclient/regctl): A command-line tool for interacting with OCI registries.
- [`regbot`](https://hub.docker.com/r/regclient/regbot): A tool for automating interactions with OCI registries.
- [`regsync`](https://hub.docker.com/r/regclient/regsync): A tool for synchronizing content between OCI registries.

## Getting Started

### `regctl` - Registry Client CLI

The `regctl` command provides a CLI interface for interacting with OCI registries. Common usage patterns:

```shell
# View help and available commands
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl version

# Configure registry with disabled TLS (for testing)
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl registry set localhost:5000 --tls disabled --skip-check

# Pull and inspect image configurations
docker run --rm cgr.dev/ORGANIZATION/regclient-regctl image config registry.example.com/image:tag
```

### `regbot` - Registry Automation Bot

The `regbot` tool automates registry interactions and can run as a server daemon. Usage examples:

```shell
# View help
docker run --rm cgr.dev/ORGANIZATION/regclient-regbot --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regbot version

# Run server with configuration file (requires config volume mount)
docker run -d \
  -v /path/to/config.json:/config.json \
  -p 5000:5000 \
  cgr.dev/ORGANIZATION/regclient-regbot server -v=trace -c /config.json
```

The server typically listens on port 5000 and requires a configuration file specifying registry credentials and automation rules.

### `regsync` - Registry Synchronization

The `regsync` tool synchronizes content between OCI registries, supporting both one-time sync and continuous monitoring:

```shell
# View help
docker run --rm cgr.dev/ORGANIZATION/regclient-regsync --help

# Check version
docker run --rm cgr.dev/ORGANIZATION/regclient-regsync version

# Run one-time sync with configuration
docker run --rm \
  -v /path/to/sync-config.json:/config.json \
  cgr.dev/ORGANIZATION/regclient-regsync once -v=trace -c /config.json

# Run continuous sync server
docker run -d \
  -v /path/to/sync-config.json:/config.json \
  cgr.dev/ORGANIZATION/regclient-regsync server -v=trace -c /config.json
```

Example sync configuration file:
```json
{
  "version": 1,
  "creds": [{
    "registry": "target-registry:5000",
    "tls": "disabled"
  }],
  "sync": [{
    "type": "image",
    "source": "source-registry.com/image:latest",
    "target": "target-registry:5000/image:latest"
  }]
}
```

## Network Configuration

When running these tools in containerized environments, ensure proper network connectivity:

```shell
# Create a custom network for multi-container setups
docker network create regtest

# Run containers with network access
docker run --network regtest --rm cgr.dev/ORGANIZATION/regclient-regsync [commands]
```

## Documentation and Resources
- [Documentation](https://regclient.org)
- [Usage Guide](https://regclient.org/usage/)
- [Configuration Examples](https://github.com/regclient/regclient/tree/main/config/testdata)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-notation-aws

# kyverno-notation-aws
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-notation-aws` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-notation-aws/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kyverno extension service for Notation and the AWS signer

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the upstream Kyerno Notation AWS image from [Nirmata](https://github.com/nirmata/kyverno-notation-aws). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

There is an installation guide available to deploy Kyverno Notation AWS project in the [kyverno-notation-aws GitHub repository](https://github.com/nirmata/kyverno-notation-aws).

To run the Chainguard image, you can use the following command:

First, clone the project, as the Helm chart is not published outside of the repository:  

```bash
$ git clone https://github.com/nirmata/kyverno-notation-aws
$ cd charts/kyverno-notation-aws
```

Then, let's prepare the values:

```bash
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/kyverno-notation-aws
  tag: latest
EOF
```

Let's install the Helm chart:

```bash
helm install kyverno-notation-aws . -f values.yaml
```

## Documentation and Resources

* [Kyverno Notation AWS GitHub Repository](https://github.com/nirmata/kyverno-notation-aws)
* (Blog) [Announcing Container Image Signing with AWS Signer and Amazon EKS](https://aws.amazon.com/blogs/containers/announcing-container-image-signing-with-aws-signer-and-amazon-eks/)
* (Video) [Verify Container Images with Kyverno on Amazon EKS](https://www.youtube.com/watch?v=36ORCUw8nic)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rke2-cloud-provider

# rke2-cloud-provider
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rke2-cloud-provider` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rke2-cloud-provider/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

rke2-cloud-provider image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using the Chainguard RKE2 Cloud Provider

### Replacing the Default Cloud Provider

To use the Chainguard RKE2 cloud provider image instead of the default implementation, configure your RKE2 cluster to use the hardened image:

```yaml
# /etc/rancher/rke2/config.yaml
cloud-provider-name: external
kube-apiserver-arg:
  - cloud-provider=external
kube-controller-manager-arg:
  - cloud-provider=external
kubelet-arg:
  - cloud-provider=external
```

Then deploy the Chainguard cloud provider as a DaemonSet or deployment in your cluster:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: rke2-cloud-provider
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: rke2-cloud-provider
  template:
    metadata:
      labels:
        app: rke2-cloud-provider
    spec:
      containers:
      - name: rke2-cloud-provider
        image: cgr.dev/ORGANIZATION/rke2-cloud-provider:latest
        # Add necessary configuration and arguments
```

## Documentation and Resources

- [RKE2 Cloud Provider Configuration](https://rke.docs.rancher.com/config-options/cloud-providers/custom)
- [Rancher Cloud Provider Setup](https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/kubernetes-clusters-in-rancher-setup/set-up-cloud-providers)
- [Upstream Repository](https://github.com/rancher/image-build-rke2-cloud-provider)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hydra-fips

# hydra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hydra` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hydra/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ory Hydra is a hardened, OpenID Certified OAuth 2.0 Server and OpenID Connect Provider optimized for low-latency, high throughput, and low resource consumption.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Hydra Image is comparable to the official [Hydra Image from Docker Hub](https://hub.docker.com/r/oryd/hydra). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
Chainguard image can be used as a drop in replacement in the Helm charts offered by Hydra.
 
The following is an example `values.yaml` file. Be sure to change the image repository and tag placeholders:

```
hydra:
  dev: true
  automigration:
    enabled: true
  config:
    dsn: "postgres://hydrauser:securepassword@postgres-postgresql.default.svc.cluster.local:5432/hydradb?sslmode=disable"
    urls:
      self:
        public: "https://hydra.example.com/"
        admin: "https://admin.hydra.example.com/"
      login: "https://auth.example.com/login"
      consent: "https://auth.example.com/consent"
    secrets:
      system:
        - "MY_SUPER_SECURE_SECRET_KEY"
image:
  repository: cgr.dev/ORGANIZATION/hydra-fips
  tag: latest
```

Run helm install:
```
helm repo add ory https://k8s.ory.sh/helm/charts
helm install hydra ory/hydra --values values.yaml --wait
```
Following that, port forward the services:
```
kubectl port-forward -n default svc/hydra-admin 4445:4445 &
kubectl port-forward -n default svc/hydra-public 4444:4444 &
```
Next create a client:
```
CLIENT_INFO=$(kubectl exec -it $(kubectl get pods -n default -l app.kubernetes.io/name=hydra -o jsonpath='{.items[0].metadata.name}') -n default -- \
hydra create oauth2-client --endpoint http://127.0.0.1:4445 \
--name "my-client" \
--secret "my-secret" \
--grant-type client_credentials \
--response-type token \
--scope read,write \
--token-endpoint-auth-method client_secret_post --format json)
```

Extract Client ID from the JSON output:
```
CLIENT_ID=$(echo $CLIENT_INFO | jq -r '.client_id')
```

Check the clients with `kubectl`:
```
kubectl exec -it $(kubectl get pods -n default -l app.kubernetes.io/name=hydra -o jsonpath='{.items[0].metadata.name}') -n default -- \
hydra list oauth2-clients --endpoint http://127.0.0.1:4445
```

Finally, use the dynamically retrieved Client ID in the curl request to verify the token works:
```
curl -X POST \
-d "client_id=$CLIENT_ID" \
-d "client_secret=my-secret" \
-d "grant_type=client_credentials" \
-d "scope=read" \
http://127.0.0.1:4444/oauth2/token
```

## Documentation and Resources

For more information on working with Hydra, refer to the [official quickstart documentation](https://www.ory.sh/docs/hydra/self-hosted/quickstart).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promtail

# promtail
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promtail` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promtail/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `promtail` application for log aggregation. `promtail` is the log aggregator that ships logs to Loki and/or Prometheus. It runs as an agent and scrapes logs from files, containers, and hosts and ships them to a logging backend.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

The image can be run directly and sets the promtail binary as the entrypoint with a default configuration:

```
docker run cgr.dev/chainguard/promtail:latest
level=info ts=2023-09-02T14:01:20.497084554Z caller=promtail.go:133 msg="Reloading configuration file" md5sum=64f8f10a58e874375abaf4e9f7632b07
level=info ts=2023-09-02T14:01:20.497604554Z caller=server.go:323 http=[::]:9080 grpc=[::]:41909 msg="server listening on addresses"
level=info ts=2023-09-02T14:01:20.497705346Z caller=main.go:174 msg="Starting Promtail" version="(version=2.8.4, branch=HEAD, revision=89d282c)"
level=warn ts=2023-09-02T14:01:20.497754387Z caller=promtail.go:265 msg="enable watchConfig"
```

This image is a drop-in replacement for official image at grafana/promtail.
See documentation [there](https://github.com/grafana/loki/blob/main/clients/cmd/promtail/Dockerfile) for how to configure it.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-webhook-pdns

# cert-manager-webhook-pdns
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-webhook-pdns` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-webhook-pdns/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A PowerDNS webhook for cert-manager

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the Helm Chart with:

```shell
$ helm repo add cert-manager-webhook-pdns https://zachomedia.github.io/cert-manager-webhook-pdns
$ helm install cert-manager-webhook-pdns cert-manager-webhook-pdns/cert-manager-webhook-pdns \
    --set image.registry=cgr.dev/chainguard/cert-manager-webhook-pdns \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### git

# git
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/git` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/git/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Git image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Note that there is also glibc version of this Image available:

```
docker pull cgr.dev/chainguard/git:latest-glibc
```

## Upcoming Changes

On July 15, 2024 several images in this repository will move from a Alpine base to a Wolfi base,
in-line with all other images in our registry. We do not expect this to cause breakages, but
encourage all users to test and verify the new versions.

The affected tags are:

 - `latest`
 - `latest-root`
 - `latest-dev`
 - `latest-root-dev`

You can test today by migrating to one of the following images:

 - `latest-glibc`
 - `latest-glibc-root`
 - `latest-glibc-dev`
 - `latest-glibc-root-dev`

From July 15 the `glibc` tag and the corresponding tag without `glibc` will point to the same
images.

Full details are in [this blog post](https://www.chainguard.dev/unchained/changes-to-static-git-and-busybox-developer-images).

## Usage

Chainguard's Git Image allows you to run ordinary Git commands in CI/CD pipelines and also locally via Docker.

### Docker Setup

To make sure you have the latest version of the Image available, start by running a `docker pull` command:

```shell
docker pull cgr.dev/chainguard/git
```

Then, run the Image with the `--version` flag to make sure the Image is functional:

```shell
docker run -it --rm cgr.dev/chainguard/git --version
```

You will receive output similar to this:

```
git version 2.43.0
```

### Cloning a Repository Locally

Because your local system user's unique identifier might differ from that of the container, you'll need to set up special permissions for the target directory if you want to use this Image to clone repositories locally. Once you've configured these permissions, you'll be able to set up a volume and have the contents of the cloned repository replicated on your host machine.

First, create a target directory somewhere in your home folder and set the required permissions:

```shell
mkdir ~/workspace
chmod go+wrx ~/workspace
```

Now you can use `docker run` to execute the `git clone` command, using the directory you just set up as a volume shared between your local machine and the container Image:

```shell
docker run -it -v ~/workspace:/home/git --rm cgr.dev/chainguard/git clone https://github.com/chainguard-images/.github.git
```

Here, the volume is mounted to the `/home/git` directory in the container.

This will return output like the following:

```
Cloning into '.github'...
remote: Enumerating objects: 251, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 251 (delta 15), reused 22 (delta 10), pack-reused 218
Receiving objects: 100% (251/251), 216.59 KiB | 1.04 MiB/s, done.
Resolving deltas: 100% (88/88), done.
```

You can now check the contents of your `workspace` directory, where you will find the cloned repository:

```shell
ls -a ~/workspace/
```
```
.  ..  .github
```

If you do not want to make the destination directory world-writable, you can run the git executable inside the container with your UID, thus giving it access to the directory:

```shell
docker run -it -v ~/workspace:/home/git -u $(id -u) --rm cgr.dev/chainguard/git clone https://github.com/chainguard-images/.github.git
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gcp-compute-persistent-disk-csi-driver

# gcp-compute-persistent-disk-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gcp-compute-persistent-disk-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gcp-compute-persistent-disk-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Google Compute Engine Persistent Disk (GCE PD) Container Storage Interface (CSI) Storage Plugin.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### usage
The project officially [doesn't support](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver?tab=readme-ov-file#google-compute-engine-persistent-disk-csi-driver) manual deployment of this csi-driver to your cluster.

GKE clusters come with the driver pre-installed. If you're using a GKE standard cluster then you can also [enable it in the features section](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver#enabling_the_on_a_new_cluster) when creating a new cluster.

After the cluster is created, you can edit the pods backed by `pdcsi-node` daemonset to use this image. There are two containers in the pod, `csi-driver-registrar` and `gce-pd-driver`. You can update the image of the `gce-pd-driver` container to use our image `cgr.dev/chainguard/gcp-compute-persistent-disk-csi-driver:latest`.

Once the image is updated, we can create a storage class, persistent volume claim and a pod that uses the persistent volume claim to verify that the driver is working as expected.

The documentation to deploy a sample workload to test the driver can be found [here](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver#using_the_for_linux_clusters)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-fips

# tritonserver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image supports the [Python](https://github.com/triton-inference-server/python_backend), [ONNX Runtime](https://github.com/triton-inference-server/onnxruntime_backend), [OpenVINO](https://github.com/triton-inference-server/openvino_backend) and [TensorRT](https://github.com/triton-inference-server/tensorrt_backend) backends only.

### FIPS Support
The `tritonserver-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

You can test this image locally with `docker`:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v ${YOUR_MODELS_DIRECTORY:-$PWD}:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver-fips:latest \
 --model-repository=/models
```

If you wish to run the server on CPU only, omit the ` --gpus all` line.

### Examples

The following examples will use a shared repository for all the backends, you can get started by create a project directory and navigate into it:

```sh
mkdir -p ~/triton-examples && cd $_
```

Then download the example model server, client script, and configuration files:

```sh
curl https://codeload.github.com/chainguard-dev/triton-examples/tar.gz/main | \
 tar -xz --strip=1 triton-examples-main
```

After downloading these files, your folder structure should be as follows:

```
.
├── client.py
├── onnxruntime-backend
│   ├── fetch-model.sh
│   └── onnxruntime
│       ├── 1
│       │   └── model.onnx
│       └── config.pbtxt
├── openvino-backend
│   ├── fetch-model.sh
│   └── openvino
│       ├── 1
│       │   └── model.onnx
│       └── config.pbtxt
├── python-backend
│   └── python
│       ├── 1
│       │   └── model.py
│       └── config.pbtxt
├── README.md
└── tensorrt-backend
    ├── fetch-model.sh
    ├── model.onnx
    └── tensorrt
        ├── 1
        └── config.pbtxt
```

You can now connect to the server using a client for each of the examples. For simplicity, we will run a client script on the host machine, but client inference can be containerized using the [Python Chainguard Container Image](https://images.chainguard.dev/directory/image/python/overview) for inclusion in your orchestration setup.

Assuming that you have Python on your system's path as `python`, create a virtual environment:

```sh
python3 -m venv venv && source venv/bin/activate
```

Install the Triton client library using `pip`:

```sh
pip install 'tritonclient[grpc]'
```

The client now should be runnable under the current directory:

```bash
python3 ./client.py --help
```

```
usage: Tritonserver Client Tests [-h] [-s SERVER] model

Testing for Tritonserver

positional arguments:
  model                Model that will be used with the client

options:
  -h, --help           show this help message and exit
  -s, --server SERVER  Host that will be used for the GRPC client (e.g.: localhost:8001)
```

#### Python backend

The following example runs a variant of the [add_sub](https://github.com/triton-inference-server/python_backend/tree/main/examples/add_sub) example for the Triton Server Python backend.

Change your working directory to the `python-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/python-backend
```

Run the following command to mount the model repository and run the server specified in the `model.py` file:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver-fips:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `python` model:

```
+---------+---------+--------+
| Model   | Version | Status |
+---------+---------+--------+
| python  | 1       | READY  |
+---------+---------+--------+
```

Then run the client script:

```sh
python ../client.py python
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.5522413  0.64158934 0.19804768 0.87941355 0.5255043 ]\n [0.03742671 0.5047181  0.5687971  0.7528154  0.09557169]\n [0.8530532  0.3704309  0.11962368 0.2563551  0.7490047 ]\n [0.61212635 0.43093833 0.44432703 0.20261322 0.06146438]\n [0.24954486 0.0787174  0.1349516  0.717098   0.46025884]]"
        ],
        "expected": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "output": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed elementwise addition and subtraction operations on two sample vectors.

### ONNX Runtime backend

Change your working directory to the `onnxruntime-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/onnxruntime-backend
```

This model requires an `onnx` model that will be fetched from the internet, you can run the script on the current directory to fetch it to the model storage location for the onnxruntime model:

```bash
./fetch-model.sh
```
```
+ mkdir -p onnxruntime/1
+ curl -fSLo ./onnxruntime/1/model.onnx https://github.com/triton-inference-server/onnxruntime_backend/raw/604ee7ae2d75d0204ec756aaf7d7edf5317e7dcc/test/initializer_as_input/models/add_with_initializer/1/model.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   269  100   269    0     0   2402      0 --:--:-- --:--:-- --:--:--  2402
+ set +x
Model successfully fetched to onnxruntime/1/model.onnx
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver-fips:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `onnxruntime` model:

```
+-------------+---------+--------+
| Model       | Version | Status |
+-------------+---------+--------+
| onnxruntime | 1       | READY  |
+-------------+---------+--------+
```

Then run the client script:

```sh
python ../client.py onnxruntime
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.04237414 0.63609475 0.88362867 0.724177   0.240701  ]\n [0.358571   0.16024649 0.12010413 0.47096097 0.09345072]\n [0.6444194  0.61650777 0.6638608  0.49962732 0.3688811 ]\n [0.0204376  0.6174347  0.05064286 0.04272859 0.49577346]\n [0.68124044 0.77822125 0.6928203  0.50161165 0.25527555]]"
        ],
        "expected": "[[0.08474828 1.2721895  1.7672573  1.448354   0.481402  ]\n [0.717142   0.32049298 0.24020825 0.94192195 0.18690144]\n [1.2888387  1.2330155  1.3277216  0.99925464 0.7377622 ]\n [0.0408752  1.2348694  0.10128573 0.08545718 0.9915469 ]\n [1.3624809  1.5564425  1.3856406  1.0032233  0.5105511 ]]",
        "output": "[[0.08474828 1.2721895  1.7672573  1.448354   0.481402  ]\n [0.717142   0.32049298 0.24020825 0.94192195 0.18690144]\n [1.2888387  1.2330155  1.3277216  0.99925464 0.7377622 ]\n [0.0408752  1.2348694  0.10128573 0.08545718 0.9915469 ]\n [1.3624809  1.5564425  1.3856406  1.0032233  0.5105511 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed the scalar multiplication of a vector by the scalar 2.

### OpenVINO backend

Change your working directory to the `openvino-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/openvino-backend
```

This model can run using an `onnx` model which will be fetched from the internet, you can run the script on the current directory to fetch it to the model storage location for the openvino model:

```bash
./fetch-model.sh
```
```
+ mkdir -p openvino/1
+ curl -fSLo ./openvino/1/model.onnx https://github.com/onnx/models/raw/b1eeaa1ac722dcc1cd1a8284bde34393dab61c3d/validated/vision/classification/resnet/model/resnet50-caffe2-v1-9.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 97.7M  100 97.7M    0     0  5391k      0  0:00:18  0:00:18 --:--:-- 10.1M
+ set +x
Model successfully fetched to openvino/1/model.onnx
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver-fips:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `onnxruntime` model:

```
+----------+---------+--------+
| Model    | Version | Status |
+----------+---------+--------+
| openvino | 1       | READY  |
+----------+---------+--------+
```

Then run the client script:

```sh
python ../client.py openvino
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[[[0.76338285 0.46184912 0.92636037 ... 0.4257808  0.61404836\n    0.9067718 ]\n   [0.65512913 0.74693495 0.07375129 ... 0.37925065 0.4888047\n    0.04267222]\n   [0.04240799 0.08182416 0.69489807 ... 0.4103226  0.054923\n  0.0582601 ]\n   ...\n   [0.9834254  0.7005278  0.11914089 ... 0.29851222 0.14448294\n    0.65900624]\n   [0.154907760.6532571  0.8287187  ... 0.36543208 0.12733477\n    0.3147746 ]\n   [0.45976332 0.68108255 0.8520731  ... 0.99021596 0.9573471\n    0.7810805 ]]\n\n  [[0.0842445  0.3005944  0.3265607  ... 0.6121345  0.5080284\n    0.85021585]\n   [0.24282897 0.4927684  0.4689886  ... 0.99156994 0.75396144\n    0.4774928 ]\n   [0.80796444 0.00248269 0.13700046 ... 0.14362834 0.8269185\n    0.28405726]\n   ...\n   [0.8429374  0.13909613 0.65293604 ... 0.04426242 0.19225791\n    0.33422643]\n   [0.26046273 0.6121224  0.576417   ... 0.46340346 0.608027\n    0.39018032]\n   [0.7119001  0.4588718  0.15979071... 0.3650059  0.83611363\n    0.6298459 ]]\n\n  [[0.00699139 0.36632583 0.6074161  ... 0.08094972 0.55059016\n    0.0456534 ]\n   [0.3950255  0.6318781  0.43853968 ... 0.09412231 0.06041615\n    0.84371537]\n   [0.06924959 0.74535745 0.61118585 ... 0.07594369 0.4584373\n    0.41392347]\n   ...\n   [0.47875118 0.52679694 0.2972078  ... 0.40715238 0.58498055\n    0.6465085 ]\n   [0.31188497 0.51325756 0.22442417 ... 0.31170854 0.8710871\n    0.2910038 ]\n   [0.6793682  0.49418375 0.41446647 ... 0.6936627  0.9575656\n    0.14582857]]]]"
        ],
        "expected": "(1,1000)",
        "output": [
            1,
            1000
        ],
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed a translation of a vector to a specific 1 by 1000 matrix shape

### TensorRT backend

Change your working directory to the `tensorrt-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/tensorrt-backend
```

This model requires the translation of an `onnx` model into a `plan` TensorRT engine, first, fetch the `onnx` model from the internet with the following command:

```bash
./fetch-model.sh
```
```
+ curl -fSLo ./model.onnx https://raw.githubusercontent.com/triton-inference-server/onnxruntime_backend/refs/heads/main/test/initializer_as_input/models/add_with_initializer/1/model.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   269  100   269    0     0   1252      0 --:--:-- --:--:-- --:--:--  1257
+ set +x
Model successfully fetched to the current working directory
```

Then, translate the model to a `model.plan` file by using the next command, it will place the file in your current directory:

```bash
docker run \
  --gpus all \
  --rm -it \
  -u "$(id -u)" \
  -e "LD_LIBRARY_PATH=/usr/local/tensorrt/lib" \
  -v "${PWD}:/work" \
  -w "/work" \
  --entrypoint /usr/local/tensorrt/bin/trtexec \
  cgr.dev/ORGANIZATION/tritonserver-fips:latest \
  --onnx=model.onnx --saveEngine=model.plan --fp16
```

Move the model to the `tensorrt` model repository:

```bash
mv ./model.plan tensorrt/1/model.plan
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver-fips:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `tensorrt` model:

```
+----------+---------+--------+
| Model    | Version | Status |
+----------+---------+--------+
| tensorrt | 1       | READY  |
+----------+---------+--------+
```

Then run the client script:

```sh
python ../client.py tensorrt
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.5522413  0.64158934 0.19804768 0.87941355 0.5255043 ]\n [0.03742671 0.5047181  0.5687971  0.7528154  0.09557169]\n [0.8530532  0.3704309  0.11962368 0.2563551  0.7490047 ]\n [0.61212635 0.43093833 0.44432703 0.20261322 0.06146438]\n [0.24954486 0.0787174  0.1349516  0.717098   0.46025884]]"
        ],
        "expected": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "output": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed an element-wise addition of the scalar 1 to all elements on a random matrix

## Documentation and Resources

- [Triton Inference Server Python Backend](https://github.com/triton-inference-server/python_backend)
- [Triton Inference Server ONNX Runtime Backend](https://github.com/triton-inference-server/onnxruntime_backend)
- [Triton Inference Server OpenVINO Backend](https://github.com/triton-inference-server/openvino_backend)
- [Triton Inference Server Tensorrt Backend](https://github.com/triton-inference-server/tensorrt_backend)
- [Triton Inference Server Documentation](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx

# nginx
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based nginx HTTP, reverse proxy, mail proxy, and a generic TCP/UDP proxy server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `nginx` container image is comparable to both the `latest` and `alpine` versions of the [official nginx image](https://hub.docker.com/_/nginx) and, wherever possible, the Chainguard Container's configuration will align with the official image. However, Chainguard Images are built to be as minimal as possible, requiring a specific set of changes, which are outlined here.

Note: just as with the [official nginx image](https://hub.docker.com/_/nginx), the `latest` tag will always be an Nginx `mainline` rather than `stable` release.

### Users

The official Docker image starts as the root user and forks to a less privileged user. By contrast, the Chainguard `nginx` Container starts as a less privileged user named `nginx` and no forking is required. 

Also note that the default `nginx` configuration file includes a user directive that will run the `nginx` process as the `nginx` user. See the following section on custom server blocks for more information.

### Default port

The default port for the `nginx` Chainguard Container is `8080`, rather than `80`.

### IPv6 Support

The official nginx image checks for the existence of `/proc/net/if_inet6` and automatically listens on `[::]:80` if it exists. For simplicity, Chainguard's `nginx` container image only listens on IPv4, but you can add IPv6 support by mounting a configuration file with a section similar to the following:

```
server {
    listen       8080;
    listen  [::]:8080;
    ...

```

Note that the default configuration file in the Chainguard `nginx` Container includes the relevant section at `/etc/nginx/conf.d/default.conf`. 

### Environment Variable Substitution

The official nginx image has support for setting environment variables that get substituted into the config file. Currently we do not have support for this.

### User Directive Warning

Starting the container gives the following warning:

```shell
 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
```

This warning tells us that the container is already running as the user `nginx`, meaning that the directive has no effect because the default user is already `nginx`. If the container is run as root, it would switch to the `nginx` user to run the `nginx` process. We've included this directive in the default configuration for those running the container with a different user using the `--user` flag or equivalent.

### Entrypoint

The entrypoint for the `nginx` Chainguard Container is `/usr/sbin/nginx`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `nginx`.

## Getting Started

> [!NOTE]
> For a hands-on example of how to use the `nginx` container image, we encourage you to check out our guide on [Getting Started with the nginx Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/nginx/).

The `nginx` Chainguard Container provides a secure basis for serving static content, running a reverse proxy, or performing other common server tasks. To try out the image, run:

```shell
docker run -p 8080:8080 cgr.dev/chainguard/nginx:latest
```

After starting the container, navigate to `localhost:8080` in your web browser. You should find the default nginx welcome page.

You can also use the `nginx` Container to serve your own custom content. As an example, first create a folder to contain static HTML that will be served by nginx:

```shell
mkdir -p ~/html
```

Next, create a file called `index.html` in the `html` folder:

```shell
cat > ~/html/index.html <<EOF
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>nginx</title>
</head>
<body>
  <h2>Hello World from nginx!</h2>
</body>
</html>
EOF
```

You can then instruct the nginx Image to serve the `index.html` file:

```shell
docker run \
 -v $(pwd)/html:/usr/share/nginx/html \
 -p 8080:8080 \
 cgr.dev/chainguard/nginx:latest
```

If you navigate to `localhost:8080` in your web browser, it will return our custom HTML: `Hello World from nginx!`.

## Adding a Custom Server Block

The default nginx configuration file checks for custom server blocks as files with a `.conf` extension within the `/etc/nginx/conf.d` folder. As an example, let's create a minimal server block that will serve the `index.html` file in the `html` folder created above from a new location (`/www/data`) and from a new port (`4000`).

Create a folder to hold our block configuration:

```shell
mkdir -p ~/conf.d
```

Create a new server block configuration file within this folder:

```shell
cat > ~/conf.d/static.conf <<EOF
server {
  listen        4000;

  location / {
    autoindex on;
    root  /www/data;
  } 
}
EOF
```

The above is a server block that will be loaded within the default nginx configuration file. Static files will be served from the `/www/data` location at port `4000`.

The following command runs an nginx container, adding our `html` folder and the `conf.d` configuration folder as volumes

```shell
docker run -p 4000:4000 \
 -v $(pwd)/html:/www/data \
 -v $(pwd)/conf.d:/etc/nginx/conf.d \
 cgr.dev/chainguard/nginx:latest
```

The above will serve our HTML from the `/www/data` folder on port `4000` using the additional settings defined in the default `nginx.conf` file.

## Replacing the Default nginx Configuration

To replace the main nginx configuration file, you can mount a folder containing a configuration file named `nginx.conf` at `/etc/nginx/` within the container.

First create a folder to contain our replacement configuration:

```shell
mkdir -p nginx-conf
```

Create a configuration file inside this folder:

```shell
cat > ~/nginx-conf/nginx.conf <<EOF
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    default_type  application/octet-stream;

    sendfile        on;

    server {
      listen        4000;

        location / {
            autoindex on;
            root  /www/data;
  } 
}

}
EOF
```

Start a container with our created `html` and `nginx-config` folders as volumes.

```shell
docker run -p 4000:4000 \
 -v $(pwd)/html:/www/data \
 -v $(pwd)/nginx-conf:/etc/nginx \
 cgr.dev/chainguard/nginx:latest
```

You should be able to view the contents of the `index.html` file in the `html` folder at `localhost:4000`. For more on nginx configuration, refer to the [documentation at nginx.org](https://nginx.org/en/docs/example.html).

## Run in a read-only File System

If you want to serve files using a read-only filesystem, you will need to mount the `/var/run` and `/var/lib/nginx/tmp` directories. You can do this with the `--tmpfs` option:

```shell
docker run \
 --read-only \
 --tmpfs /var/lib/nginx/tmp/ --tmpfs /var/run/ \
 --cap-drop=ALL \
 -p 8080:8080 \
 cgr.dev/chainguard/nginx
```

You can also run the `nginx` container image in a read-only filesystem using Kubernetes. To do so, you could use a manifest like the following example:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
	matchLabels:
  	app: nginx
  template:
	metadata:
  	labels:
    	app: nginx
	spec:
  	containers:
  	- name: nginx
    	image: cgr.dev/chainguard/nginx:latest
    	ports:
    	- containerPort: 8080
    	securityContext:
      	readOnlyRootFilesystem: true
    	volumeMounts:
    	- name: run
      	mountPath: /var/run/
    	- name: tmp
      	mountPath: /var/lib/nginx/tmp/
  	volumes:
  	- name: run
    	emptyDir: {}
  	- name: tmp
    	emptyDir: {}
  	- name: conf
    	configMap:
      	name: nginx-conf
```

## Documentation and Resources

* [Official nginx Documentation](https://nginx.org/en/docs/)
* [Docker Hub: Official nginx Image](https://hub.docker.com/_/nginx)
* [Chainguard Academy: Getting Started with the nginx Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/nginx/)
* [Video: Getting Started with the nginx Chainguard Container](https://www.youtube.com/watch?v=KirTeDMzzxk)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### distribution-fips

# distribution-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/distribution-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/distribution-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-fips

# cluster-api-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Home for Cluster API, a subproject of sig-cluster-lifecycle

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Cluster-Api image is comparable to Kubernetes Sig  [Cluster-Api on Docker Hub](https://hub.docker.com/r/registryk8s). Chainguard's image contains only the minimum set of dependencies needed to run the different components.

## Getting Started

Start by creating a Kubernetes manifest that allows the Docker provider to access Docker on the host:

```yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: dual
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock
```
Next, apply this manifest above by creating a cluster. The following example will create a Kubernetes cluster with kind:
```
kind create cluster -config config.yaml
```

Next, initialize a management cluster against the host cluster:

```
docker run -d \
    cgr.dev/ORGANIZATION/cluster-api-fips-clusterctl:latest \
    clusterctl init \
    --kubeconfig <KUBECONFIG> \
    --infrastructure vcluster \
    --core cluster-api-fips \
    --bootstrap kubeadm \
    --control-plane kubeadm \
    --wait-providers=false
```

Generate a manifest for creating clusters:

```
docker run -d \
    cgr.dev/ORGANIZATION/cluster-api-fips-clusterctl:latest \
    clusterctl generate cluster ${CLUSTER_NAME} \
    --infrastructure vcluster \
    --kubernetes-version ${KUBERNETES_VERSION} \
    --target-namespace ${CLUSTER_NAMESPACE} > cluster-manifest.yaml
```

## Documentation and Resources

* [cluster-api GitHub Repository](https://github.com/kubernetes-sigs/cluster-api)
* [cluster-api Documentation](https://cluster-api.sigs.k8s.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jmx-exporter-iamguarded

# jmx-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jmx-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jmx-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

jmx-exporter-iamguarded image is a Prometheus metrics exporter for JMX (Java Management Extensions), enabling monitoring and observability for Java applications used by IAMguarded helm charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

JMX Exporter IAMGuarded is a Prometheus metrics exporter for JMX (Java Management Extensions), designed to export metrics from Java applications. This security-enhanced variant is used as a metrics sidecar component in IAMGuarded Helm charts for Java-based applications that expose JMX metrics.

JMX Exporter runs as an HTTP server and exposes Java runtime and application metrics in Prometheus format, enabling monitoring and observability for Java applications deployed in Kubernetes.

## Helm Chart Usage

The JMX Exporter IAMGuarded image does not have its own dedicated Helm chart. Instead, it is deployed as a metrics sidecar container in IAMGuarded Helm charts for Java applications that expose JMX metrics.

### Kafka IAMGuarded Chart

The most common usage is with the Kafka IAMGuarded Helm chart, delivered through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kafka
```

#### Installation with JMX Metrics Enabled

```bash
helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka \
  --set "global.org=$ORGANIZATION" \
  --set "metrics.jmx.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. JMX metrics are typically disabled by default and must be explicitly enabled.

#### Configuration Requirements

##### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

##### Registry Configuration
For users who mirror images to custom repositories, configure the JMX Exporter image in your `values.yaml`:

```yaml
metrics:
  jmx:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/jmx-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag
```

##### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: When using custom registries, always pin to specific image digests for reliable deployments.

2. **Enable Metrics Explicitly**: JMX metrics collection is typically opt-in. Review the chart's `values.yaml` to enable and configure the metrics endpoint.

3. **Configure JMX Rules**: The exporter uses configuration files to define which JMX metrics to expose. Consult the chart's documentation for customizing JMX scraping rules.

## Validation

After deployment with JMX metrics enabled, validate the exporter by checking that metrics are exposed on the configured port (typically 5556). You can verify metrics collection by:

1. Port-forwarding to the metrics pod:
   ```bash
   kubectl port-forward <pod-name> 5556:5556
   ```

2. Accessing the metrics endpoint:
   ```bash
   curl http://localhost:5556/metrics
   ```

3. Confirming Prometheus is scraping the JMX metrics (if Prometheus integration is configured).

## Other Compatible Charts

While Kafka is the primary use case, this image can be used with any IAMGuarded Helm chart for Java applications that support JMX metrics collection. Consult individual chart documentation for specific configuration requirements.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-messaging-topology-operator

# rabbitmq-messaging-topology-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-messaging-topology-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-messaging-topology-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ messaging topology operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation
For detailed instructions on how to install the operator, please refer to the [upstream documentation](https://www.rabbitmq.com/kubernetes/operator/install-topology-operator).

Should cert-manager be required as a pre-requisite, there are [instructions here](https://images.chainguard.dev/directory/image/cert-manager-controller/overview) for deploying with Chainguard images.

The [upstream documentation](https://www.rabbitmq.com/kubernetes/operator/install-topology-operator), provides a manifest based deployment for the operator:

```
https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml
```

To use the manifest, you'll need to create a modified version, overriding the
'image' property to use the Chainguard image. For example, updating the
following:

```bash
# Before
image: rabbitmqoperator/messaging-topology-operator:1.16.0

# After
image: cgr.dev/ORGANIZATION/rabbitmq-messaging-topology-operator:latest
```

Deploy the updated manifest:

```bash
kubectl apply -f local/path/to/modified/messaging-topology-operator-with-certmanager.yaml
```

Alternatively, if you want to dynamically update the manifest configuration,
consider using [kustomize](https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization).

For example:

```bash
LATEST=$(curl -s "https://api.github.com/repos/rabbitmq/messaging-topology-operator/releases/latest" | jq -r '.tag_name')

cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - "https://github.com/rabbitmq/messaging-topology-operator/releases/download/${LATEST}/messaging-topology-operator.yaml"
patches:
  - patch: |
      - op: replace
        path: /spec/template/spec/containers/0/image
        value: cgr.dev/chainguard/rabbitmq-messaging-topology-operator:latest
    target:
      version: v1
      kind: Deployment
      name:  messaging-topology-operator
      namespace: rabbitmq-system
EOF

kubectl apply -f .
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mesosphere-vsphere-csi-driver

# mesosphere-vsphere-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mesosphere-vsphere-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mesosphere-vsphere-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream **vSphere CSI Driver** container (`csi-vsphere/driver`).  

Follow the Broadcom/VMware deployment documentation for vSphere Container Storage Plug-in (vSphere CSI) 3.x, substituting the image reference for the driver container only. All other sidecars and supporting containers (syncer, provisioner, attacher, resizer, node-driver-registrar, liveness-probe, snapshotter, etc.) should remain as documented.

> **Namespace**: The vSphere CSI stack should run in the `vmware-system-csi` namespace — do not install into `kube-system`.

> **Versioning**: Select a driver version compatible with your vSphere and Kubernetes versions using the official compatibility matrix.

## Prerequisites

- Supported vCenter Server and ESXi environment.
- Supported Kubernetes version for the driver release you choose.
- vSphere CPI (out-of-tree cloud provider) installed and configured in the cluster.
- vCenter user account with the required privileges as defined in the upstream docs.
- Network/DNS reachability from all cluster nodes to vCenter.

## Usage

## Prepare the Namespace

```bash
# Create the namespace for vSphere CSI components
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v3.0.0/manifests/vanilla/namespace.yaml
```

### Create the vSphere Config Secret

Prepare a configuration file named `csi-vsphere.conf`:

```ini
[Global]
cluster-id = "your-unique-cluster-id"
cluster-distribution = "native"

[VirtualCenter "vcenter.example.com"]
user = "administrator@vsphere.local"
password = "REDACTED"
port = "443"
datacenters = "DC1"
insecure-flag = "1"
# thumbprint = "AA:BB:CC:...:ZZ"
```

Create the Kubernetes Secret in the `vmware-system-csi` namespace:

```bash
kubectl -n vmware-system-csi create secret generic vsphere-config-secret \
  --from-file=csi-vsphere.conf
```

### Deploy the vSphere CSI Driver

Follow the upstream deployment manifests for your environment.
When editing the controller `Deployment` and node `DaemonSet`, replace the driver and/or syncer container images only.

Example - Controller Deployment snippet:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vsphere-csi-controller
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following containers
      - name: vsphere-csi-controller
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver
      - name: vsphere-syncer
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-syncer
      # other containers and rest of containers above should remain unchanged
```

Example - Node DaemonSet snippet:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: vsphere-csi-node
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following container    
      - name: vsphere-csi-node
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver
      # other containers and rest of container above should remain unchanged
```

This can be changed either in the manifests before applying them, or using `kubectl edit` to change existing deployments.

### Verify the Installation

```bash
kubectl get deployment -n vmware-system-csi vsphere-csi-controller
kubectl get daemonset -n vmware-system-csi vsphere-csi-node
```

Both should show pods in the `READY` state across control-plane and worker nodes as appropriate.

Another way to check it is to use `kubectl wait` and `kbuectl rollout status` commands to wait for Deployment and DaemonSet accordingly - such as:

```bash
kubectl wait --for=condition=Available -n vmware-system-csi deployment/vsphere-csi-controller --timeout=120s

kubectl rollout status daemonset -n vmware-system-csi vsphere-csi-node
```

### Verify

Create a `StorageClass` using the upstream example.

Create a `PersistentVolumeClaim` that uses this `StorageClass`.

Attach the PVC to a test Pod and verify provisioning works.

References:

* [Upstream Mesosphere vSphere CSI Driver repository](https://github.com/mesosphere/vsphere-csi-driver)
* [Kubernetes-sigs vSphere CSI Driver repository](https://github.com/kubernetes-sigs/vsphere-csi-driver)
* [VMware vSphere Container Storage Plug-in Deployment Docs](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/container-storage-plugin/3-0/getting-started-with-vmware-vsphere-container-storage-plug-in-3-0/vsphere-container-storage-plug-in-deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-alloy

# grafana-alloy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-alloy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-alloy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenTelemetry Collector distribution with programmable pipelines

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using the Image
Our image comes with an example configuration file so to get started with using the image after pulling, you can run
```
docker run \
  -p 12345:12345 \
  cgr.dev/chainguard/grafana-alloy:latest \
    run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data \
    /etc/alloy/config.alloy
```
You will be able to go to `localhost:12345` after running the container to see an interactive debugging UI for grafana-alloy.

For a more in depth guide for getting up and running with your own configuration for grafana-alloy, you can continue with their documentation [here](https://grafana.com/docs/alloy/latest/get-started/)

In case you want to run Grafana Alloy on Kubernetes, there is a Helm chart available in the official Grafana Helm repository where you can find the instructions to deploy Grafana Alloy on Kubernetes using that Helm chart, [here](https://grafana.com/docs/alloy/latest/set-up/install/kubernetes/).

But for a quick start, you can run the following command to deploy Grafana Alloy on Kubernetes:
```
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo update
$ helm install grafana-alloy grafana/alloy \
    --set image.registry=cgr.dev \
    --set image.repository=chainguard/grafana-alloy \
    --set image.tag=latest
```

This will deploy Grafana Alloy on your Kubernetes cluster with the default configuration.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-operator-fips

# redis-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant redis-operator image that automates Redis cluster deployment, scaling, and management in Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image for redis-operator-fips is comparable to the original Redis operator images.

Our user defaults to running as user 65532, the original image also runs as 65532.
In both cases these are non-root users. Similar to the upstream image, our image
does not contain a shell or a package manager, and only the minimum set of tools
and dependencies needed to function.

## Getting Started

The Chainguard redis-operator-fips image can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/redis-operator/redis-operator).

Add the helm repository:

```bash
helm repo add redis-operator https://ot-container-kit.github.io/helm-charts/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:
```yaml
# values.yaml
redisOperator:
  imageName: cgr.dev/ORGANIZATION/redis-operator-fips
  imageTag: latest
  imagePullPolicy: Always

```

Deploy using helm:

```bash
helm install redis-operator-fips redis-operator/redis-operator -f values.yaml
```

A few minutes after successful deployment, you should see the operator managing Redis instances.

## Documentation and Resources
For more information on how to deploy and configure redis-operator-fips, please
refer to the [GitHub project documentation](https://github.com/OT-CONTAINER-KIT/redis-operator).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dcgm-fips

# dcgm-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dcgm-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dcgm-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NVIDIA Data Center GPU Manager (DCGM) is a project for gathering telemetry and measuring the health of NVIDIA GPUs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `DCGM FIPS` image comparable to [NVIDIA's DCGM image on Docker Hub](https://hub.docker.com/r/nvidia/dcgm).

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it \
  -p 5555:5555 \
  --gpus all \
  cgr.dev/ORGANIZATION/dcgm-fips:latest
```

Then you can interact with it via the [DCGMI CLI](https://docs.nvidia.com/datacenter/dcgm/latest/user-guide/getting-started.html#dcgm-cli-tool) in order to query GPU usage and health statistics

```shell
docker run --rm -it \
  --network host \
  --entrypoint /usr/bin/dcgmi \
  cgr.dev/ORGANIZATION/dcgm-fips:latest group -l
```
```
1 group found.
+----------------------------------------------------------------------------+
| GROUPS                                                                     |
+============+===============================================================+
| Group ID   | 1                                                             |
| Group Name | GPU_Group                                                     |
| GPU ID(s)  | None                                                          |
+------------+---------------------------------------------------------------+
```

## Documentation and Resources
- [DCGM documentation](https://docs.nvidia.com/datacenter/dcgm/latest/contents.html)
- [DCGM C API reference](https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### stunnel

# stunnel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/stunnel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/stunnel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [stunnel](https://www.stunnel.org/) networking tool

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This tool can be used to encrypt network connections between a client and server, without changing those programs.

`stunnel` requires a configuration file to run.
This image does not include a default configuration file.
You will need to provide your own configuration file and set it using the  at `/etc/conf/stunnel.conf` when running the container.
Note: this location can be overridden with the positional command line argument.

## Use It!

The image can be run directly and sets the `stunnel` binary as the entrypoint.

```
$ docker run cgr.dev/chainguard/stunnel:latest
Initializing inetd mode configuration
stunnel 5.70 on aarch64-unknown-linux-gnu platform
Compiled with OpenSSL 3.1.1 30 May 2023
Running  with OpenSSL 3.1.2 1 Aug 2023
Threading:PTHREAD Sockets:POLL,IPv6 TLS:ENGINE,OCSP,PSK,SNI

Global options:
chroot                 = directory to chroot stunnel process
EGD                    = path to Entropy Gathering Daemon socket
engine                 = auto|engine_id
engineCtrl             = cmd[:arg]
engineDefault          = TASK_LIST
foreground             = yes|quiet|no foreground mode (don't fork, log to stderr)
log                    = append|overwrite log file
output                 = file to append log messages
pid                    = pid file
RNDbytes               = bytes to read from random seed files
RNDfile                = path to file with random seed data
RNDoverwrite           = yes|no overwrite seed datafiles with new random data
syslog                 = yes|no send logging messages to syslog

Service-level options:
accept                 = [host:]port accept connections on specified host:port
CAengine               = engine-specific CA certificate identifier for 'verify' option
CApath                 = CA certificate directory for 'verify' option
CAfile                 = CA certificate file for 'verify' option
cert                   = certificate chain
checkEmail             = peer certificate email address
checkHost              = peer certificate host name pattern
checkIP                = peer certificate IP address
ciphers                = permitted ciphers for TLS 1.2 or older
ciphersuites           = permitted ciphersuites for TLS 1.3
client                 = yes|no client mode (remote service uses TLS)
config                 = command[:parameter] to execute
connect                = [host:]port to connect
CRLpath                = CRL directory
CRLfile                = CRL file
curves                 = ECDH curve names
debug                  = [facility].level (e.g. daemon.info)
delay                  = yes|no delay DNS lookup for 'connect' option
engineId               = ID of engine to read the key from
engineNum              = number of engine to read the key from
exec                   = file execute local inetd-type program
execArgs               = arguments for 'exec' (including $0)
failover               = rr|prio failover strategy
ident                  = username for IDENT (RFC 1413) checking
include                = directory with configuration file snippets
key                    = certificate private key
local                  = IP address to be used as source for remote connections
logId                  = connection identifier type
OCSP                   = OCSP responder URL
...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opencv

# images/opencv
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/opencv` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/opencv/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenCV is a C++ computer vision and machine learning software library for image/video processing, object detection, face recognition, and more.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `opencv` container image provides OpenCV C++ libraries for computer vision and machine learning applications, along with all necessary build tools and dependencies for developing and compiling OpenCV-based applications.

## Getting Started

### Verify OpenCV Installation

Check the installed OpenCV version:

```shell
docker run --rm cgr.dev/ORGANIZATION/opencv:latest pkgconf --modversion opencv4
```

Discover available OpenCV modules and build configuration:

```shell
# List all available OpenCV libraries
docker run --rm cgr.dev/ORGANIZATION/opencv:latest pkgconf --libs opencv4

# Get compiler flags needed for building with OpenCV
docker run --rm cgr.dev/ORGANIZATION/opencv:latest pkgconf --cflags opencv4

# Show complete build configuration (compiler and linker flags)
docker run --rm cgr.dev/ORGANIZATION/opencv:latest sh -c "pkgconf --cflags --libs opencv4"
```

The image includes both core OpenCV modules (core, imgproc, imgcodecs, features2d, calib3d, etc.) and opencv_contrib modules for extended functionality.

### Building OpenCV Applications

Create a simple OpenCV application (`image_processing.cpp`):

```cpp
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // Create a 200x200 image with blue background
    cv::Mat image(200, 200, CV_8UC3, cv::Scalar(255, 0, 0));
    
    // Draw a green circle
    cv::circle(image, cv::Point(100, 100), 50, cv::Scalar(0, 255, 0), -1);
    
    // Convert to grayscale
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    
    // Apply Gaussian blur
    cv::Mat blurred;
    cv::GaussianBlur(gray, blurred, cv::Size(15, 15), 0);
    
    std::cout << "Image processing complete!" << std::endl;
    std::cout << "Image dimensions: " << image.cols << "x" << image.rows << std::endl;
    std::cout << "Channels: " << image.channels() << std::endl;
    
    return 0;
}
```

Compile and run the application:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace \
  cgr.dev/ORGANIZATION/opencv:latest \
  sh -c "g++ -std=c++14 image_processing.cpp -o app \$(pkg-config --cflags --libs opencv4) && ./app"
```

### Feature Detection Example

Create a feature detection application (`features.cpp`):

```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <iostream>

int main() {
    // Create synthetic image with corner features
    cv::Mat image = cv::Mat::zeros(300, 300, CV_8UC1);
    
    // Draw multiple rectangles to create corner features
    cv::rectangle(image, cv::Point(50, 50), cv::Point(150, 150), cv::Scalar(255), 2);
    cv::rectangle(image, cv::Point(200, 100), cv::Point(250, 200), cv::Scalar(255), 2);
    
    // Add circles for additional features
    cv::circle(image, cv::Point(100, 250), 20, cv::Scalar(255), 2);
    
    // Detect FAST keypoints
    std::vector<cv::KeyPoint> keypoints;
    cv::Ptr<cv::FastFeatureDetector> detector = cv::FastFeatureDetector::create(20);
    detector->detect(image, keypoints);
    
    std::cout << "Detected " << keypoints.size() << " keypoints" << std::endl;
    return 0;
}
```

Run the feature detection:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace \
  cgr.dev/ORGANIZATION/opencv:latest \
  sh -c "g++ -std=c++11 features.cpp -o features \$(pkg-config --cflags --libs opencv4) && ./features"
```

## Documentation and Resources

- [OpenCV Project](https://opencv.org)
- [OpenCV GitHub Repository](https://github.com/opencv/opencv)
- [OpenCV Documentation](https://docs.opencv.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### knative-net-istio-webhook

# knative-net-istio-webhook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/knative-net-istio-webhook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/knative-net-istio-webhook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Istio uses webhook for validating Istio configuration (ValidatingAdmissionWebhooks) and automatically injecting the sidecar proxy into user pods (MutatingAdmissionWebhooks).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is based on the upstream [knative-net-istio-webhook](gcr.io/knative-releases/knative.dev/net-istio/cmd/webhook:latest) image, with the following differences:

* Like all other Chainguard Containers, `knative-net-istio-webhook` features a stripped down, minimal design container image
* It has few-to-zero CVEs

## Prerequisites
To run Knative Net Istio successfully, the environment must provide the following:
- A Kubernetes cluster created.
- istioctl installed.
- Knative Serving installed.

## Getting Started

Deploying Knative's Net Istio with Chainguard's images is straightforward, following the official [documentation](https://knative.dev/docs/install/installing-istio/).

```bash
# Install Istio and integrate it with Knative Serving
istioctl install -y
wget https://github.com/knative/net-istio/releases/latest/download/net-istio.yaml
# Replace webhook image with chainguard's image
sed -i "s#gcr.io/knative-releases/knative.dev/net-istio/cmd/webhook@sha256:[a-f0-9]*#cgr.dev/ORGANIZATION/knative-net-istio-webhook:latest#g" net-istio.yaml
kubectl apply -f net-istio.yaml
```

You should now see your webhook in action:
```bash
# For mutating webhook
cat <<'EOF' | kubectl apply --dry-run=server -f - -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webhook-test
  namespace: default
  labels:
    serving.knative.dev/configuration: "dummy"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webhook-test
  template:
    metadata:
      labels:
        app: webhook-test
        serving.knative.dev/configuration: "dummy"
    spec:
      containers:
      - name: helloworld
        image: ghcr.io/knative/helloworld-go:latest
EOF

# Check webhook logs
kubectl logs -n knative-serving deploy/net-istio-webhook -f
# You should see here logs including a PatchBytes JSON Patch, which represents the operations applied to the resource

# For validating webook
cat <<'EOF' | kubectl apply --dry-run=server -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: net-istio-webhook-test
  namespace: knative-serving
  labels:
    app.kubernetes.io/component: net-istio
    app.kubernetes.io/name: knative-serving
data:
  foo: bar
EOF

# Check webhook logs
kubectl logs -n knative-serving deploy/net-istio-webhook -f
# You should see here logs showing the incoming admission request to the /config-vaslidation endpoint and the resulting admission decision
```

## Documentation and Resources

For more information about Knative's Net-Istio, please refer to the [official documentation](https://knative.dev/docs/install/installing-istio/) or to the [official repository](https://github.com/knative-extensions/net-istio).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-cloudwatch-agent-operator

# amazon-cloudwatch-agent-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-cloudwatch-agent-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-cloudwatch-agent-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Amazon CloudWatch Agent Operator is software developed to manage the CloudWatch Agent on kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For detailed instructions on the Amazon CloudWatch Agent Operator, refer to the [official documentation](https://docs.aws.amazon.com/cloudwatch/). Ensure that you have appropriate permissions set up to allow CloudWatch to collect and send metrics and logs.

The source code and instructions for contributing to the operator can be found on [GitHub](https://github.com/aws/amazon-cloudwatch-agent-operator).

## Installation
There are several methods to install and configure the Amazon CloudWatch Agent Operator:

### 1. Using Helm Chart
To deploy the operator using Helm charts, you can use the following command. This command overrides the default image to use the Chainguard image
```bash
helm repo add aws-observability https://aws-observability.github.io/helm-charts
helm repo update aws-observability
helm install amazon-cloudwatch-agent-operator aws-observability/amazon-cloudwatch-observability \
  --create-namespace \
  --namespace amazon-cloudwatch-operator \
  --set clusterName=my-cluster-name \
  --set region=my-cluster-region \
  --set manager.image.repositoryDomainMap.public=cgr.dev/chainguard \
  --set manager.image.repository=amazon-cloudwatch-agent-operator \
  --set manager.image.tag=latest
```

Refer to the [values.yaml](https://github.com/aws-observability/helm-charts/blob/main/charts/amazon-cloudwatch-observability/values.yaml) file for more configuration options.

### 2. Using k8s Manifests
You can deploy cloudwatch agent and its operator using k8s manifests by following the steps outlined in the [CloudWatch Setup Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-metrics.html). 

You can replace the default amazon-cloudwatch-agent-operator image with the Chainguard image by modifying the amazon-cloudwatch-observability-controller-manager deployment by replacing the manager image with the Chainguard image.

```
    spec:
      containers:
        command:
        - /manager
        image: cgr.dev/chainguard/amazon-cloudwatch-agent-operator:latest
```

### 3. GitHub Deployment
An easier way is setting up the deployment referring their [GitHub](https://github.com/aws/amazon-cloudwatch-agent-operator), Running `make deploy` creates all the k8s resources.

```
git clone https://github.com/aws/amazon-cloudwatch-agent-operator.git
cd amazon-cloudwatch-agent-operator
make deploy
```
This command will create all necessary resources, and you can customize the deployment by modifying your CloudWatch configuration in resource definition. More details can be found in the repository [README](https://github.com/aws/amazon-cloudwatch-agent-operator/blob/main/README.md).

## Additional Resources
- [Amazon CloudWatch Documentation](https://docs.aws.amazon.com/cloudwatch/)
- [Helm Chart Documentation](https://github.com/aws-observability/helm-charts/tree/main)
- [CloudWatch Agent Operator GitHub Repository](https://github.com/aws/amazon-cloudwatch-agent-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pypiserver

# pypiserver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pypiserver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pypiserver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal PyPI server for uploading & downloading packages with pip/easy_install

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Pypiserver image is meant to serve as a drop-in replacement for [the official Pypiserver image](https://github.com/pypiserver/pypiserver). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Documentation and Resources

For more information, please refer to the official [Pypiserver documentation](https://github.com/pypiserver/pypiserver).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tetragon-fips

# tetragon-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tetragon-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tetragon-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-Complaint Images for Tetragon. eBPF-based Security Observability and Runtime Enforcement

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Tetragon FIPS is comprised of 2 images:
- `cgr.dev/ORGANIZATION/tetragon-fips`
- `cgr.dev/ORGANIZATION/tetragon-operator-fips`

The Chainguard images usually do not run as the root user and contain only the minimum set of tools and dependencies needed to function. This means they do not include utilities such as a shell or a package manager.

The Chainguard's `tetragon-fips` image is still configured to run as `root` because it requires elevated kernel capabilities in order to:
- Load and attach eBPF programs.
- Access host namespaces.
- Perform other privileged operations.
In practice, this functionality requires running as a privileged container on Kubernetes, which inherently implies root access inside the container.

The Chainguard's `tetragon-operator-fips` image, however, is configured to run as `nonroot`. Its functionality has been validated under these restrictions, ensuring that it maintains Chainguard’s security standards without requiring elevated privileges.

### FIPS Support
The Tetragon FIPS Chainguard Images is shipped with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on FIPS-enabled Chainguard Images on Chainguard Academy

## Getting Started
There are multiple ways of deploying Tetragon but the recommended way is to use the official [Helm Chart for Tetragon](https://tetragon.io/docs/reference/helm-chart/).

### Deployment using Helm Chart

To deploy Tetragon, run the following instructions:
Start by adding a `values.yaml` file to override with Chainguard's image:
```shell
# values.yaml
tetragon
  image:
    repository: cgr.dev/ORGANIZATION/tetragon-fips
    tag: latest
tetragonOperator:
  image:
    repository: cgr.dev/ORGANIZATION/tetragon-operator-fips
    tag: latest
```
Deploy Tetragon with Helm:
```shell
helm repo add cilium https://helm.cilium.io
helm repo update
helm install tetragon cilium/tetragon -n kube-system -f values.yaml
kubectl rollout status -n kube-system ds/tetragon -w
```
Once Tetragon and Tetragon-Operator have been deployed successfully, you can deploy a demo application to have sample workload:
```
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/main/examples/minikube/http-sw-app.yaml
```
Once the demo application related pods are up, you can observe Tetragon execution events:
```
kubectl exec -it -n kube-system ds/tetragon -c tetragon -- tetra getevents -o compact --pods xwing
```

You are now up and running with Chainguard's Tetragon images!

## Documentation and Resources

- [Getting Started](https://tetragon.io/docs/getting-started/)
- [Tetragon Events](https://tetragon.io/docs/concepts/events/)
- [Tracing Policy](https://tetragon.io/docs/concepts/tracing-policy/)
- [Tetragon Runtime Hooks](https://tetragon.io/docs/concepts/runtime-hooks/)
- [Documentation for Tetragon enforcement system](https://tetragon.io/docs/concepts/enforcement/)
- [Policy Library](https://tetragon.io/docs/policy-library/observability/)
- [Use Cases](https://tetragon.io/docs/use-cases/)
- [Low level reference documentation for Tetragon](https://tetragon.io/docs/reference/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow-katib

# kubeflow-katib
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow-katib` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow-katib/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Kubeflow Katib Images

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-state-metrics-iamguarded

# kube-state-metrics-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-state-metrics-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-state-metrics-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kube-state-metrics generates Prometheus metrics about Kubernetes objects

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Kube-state-metrics IAMGuarded is a security-enhanced variant of kube-state-metrics designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard kube-state-metrics deployments.

## Helm Chart Installation

The Kube-state-metrics IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kube-state-metrics oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main kube-state-metrics image
image:
  registry: myregistry.example.com
  repository: mirrored/kube-state-metrics-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kube-state-metrics oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kube-state-metrics:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kube-state-metrics IAMGuarded installation by checking that metrics are being exposed correctly. The deployment functions as a standard kube-state-metrics instance, so all typical kube-state-metrics validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kube-state-metrics IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both kube-state-metrics and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Kube State Metrics Configuration

When using the Kube-Prometheus chart, you can override the Kube State Metrics image under the `kube-state-metrics` section in your `values.yaml`:

```yaml
"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyterhub-k8s-image-awaiter-fips

# jupyterhub-k8s-image-awaiter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyterhub-k8s-image-awaiter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyterhub-k8s-image-awaiter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

JupyterHub Kubernetes Image Awaiter - ensures images are pre-pulled before deployment

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `jupyterhub-k8s-image-awaiter-fips` image is designed to be a drop-in replacement for the upstream `jupyterhub/k8s-image-awaiter` image.

## Getting Started

### JupyterHub Deployment

The jupyterhub-k8s-image-awaiter image is typically deployed as part of JupyterHub's Helm chart pre-install hooks. It ensures container images are pre-pulled across all Kubernetes nodes before JupyterHub deployment proceeds.

Configure in your JupyterHub `values.yaml`:

```yaml
prePuller:
  hook:
    enabled: true
    image:
      name: cgr.dev/ORGANIZATION/jupyterhub-k8s-image-awaiter
      tag: latest
```

Then install JupyterHub with the custom image:
```bash
helm repo add jupyterhub https://hub.jupyter.org/helm-chart
helm install jupyterhub jupyterhub/jupyterhub \
  --namespace jupyterhub \
  --create-namespace \
  --values values.yaml
```

For deployment examples and configurations, please refer to the [upstream JupyterHub documentation](https://github.com/jupyterhub/zero-to-jupyterhub-k8s/tree/main/jupyterhub).

## Documentation and Resources

- [JupyterHub Kubernetes Image Awaiter](https://github.com/jupyterhub/zero-to-jupyterhub-k8s/tree/main/images/image-awaiter)
- [JupyterHub Helm Chart](https://hub.jupyter.org/helm-chart/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres

# postgres
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image for PostgreSQL, an advanced object-relational database management system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `postgres` container image is comparable [the official PostgreSQL Image from Docker Hub](https://hub.docker.com/_/postgres). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager. Unlike many other Chainguard images, though, the `postgres` image does include a shell, allowing you to manage databases interactively.

### Migrating to the Chainguard postgresql container image

When migrating an existing PostgreSQL database to use the Chainguard `postgres` image it is likely that the collation version in the Chainguard container image will be different from the collation version in the original image that created the database.  This may be due to different glibc versions, use of a different implementation of the C standard library (musl in Alpine for example), or the use of different locale configuration.

Chainguard recommends that you [re-index and refresh the collation version](https://wiki.postgresql.org/wiki/Locale_data_changes) when migrating to this image before the database is put back into production.

## Getting Started

This section provides a high-level overview of how you can use Chainguard's `postgres` image. For a more in-depth walkthrough of how you can use the image in practice, please refer to our guide on [getting started with the PostgreSQL Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/getting-started-postgres/). This getting started guide outlines how to set up and run a PHP application that stores its data in a PostgreSQL database running within a containerized environment.

You can test the `postgres` image by running the following command:

```sh
docker run --rm -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest
```

Note that the only mandatory environment variable needed by the `postgres` image is `POSTGRES_PASSWORD`. 

This command will run the container image, but no data within the PostgreSQL database will persist after the Image stops running. To persist PostgreSQL data you can mount a volume mapped to the container's data folder:

```sh
docker run --rm -d -v $PWD/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest
```

This command includes the `-d` flag, which causes the container to run in the background and keeps it from taking over your terminal like the previous example.

Following that you can `exec` into the running container:

```sh
docker exec -ti postgres-test bash
```

Then switch to using the `postgres` user:

```sh
su postgres
```

As the `postgres` user, run the `createdb` wrapper to create a test database:

```sh
createdb test
```

Then use the PostgreSQL client to Connect to the new database: 

```sh
psql test
```

From there you can interact with the database as you would with any other PostgreSQL database. For instance, you can create a sample table:

```sh
CREATE TABLE accounts (
	user_id serial PRIMARY KEY,
	username VARCHAR ( 50 ) UNIQUE NOT NULL,
	password VARCHAR ( 50 ) NOT NULL,
	email VARCHAR ( 255 ) UNIQUE NOT NULL,
	created_on TIMESTAMP NOT NULL,
	last_login TIMESTAMP
);
```

With the table created you can then insert data into it:

```sh
INSERT INTO accounts (username, password, email, created_on, last_login)
VALUES (
'Linky',
'p@$$w0rD',
'linky@example.com',
'2017-07-23',
'2017-07-23'
);
```

You can also use all of PostgreSQL's internal meta-commands. For example, `\dt` will list all the tables stored within the database:

```sh
\dt
```
```
          List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+----------
 public | accounts | table | postgres
(1 row)
```

### Customizing PostgreSQL with environment variables

You can extend Chainguard's Postgres image with environment variables. Chainguard's Postgres image is compatible with the environment variables available in the official PostgreSQL image, including the following:

* `PGDATA`: This variable allows you to define another location for database files. The default data directory is `/var/lib/postgresql/data`.
* `POSTGRES_PASSWORD`: This environment variable sets the superuser password for PostgreSQL. This variable is required to use the Postgres image.
* `POSTGRES_USER`: This is used with the `POSTGRES_PASSWORD` variable to set a superuser for the database and its password. If not specified, you can use the default `postgres` user.
*  `POSTGRES_DB`: Using this variable allows you to set a different name for the default database. If not specified, the default database will be `postgres` or the value set by `POSTGRES_USER`.
* `POSTGRES_INITDB_ARGS`: This variable allows you to send arguments to `postgres initdb`.
* `POSTGRES_INITDB_WALDIR`: You can set this variable to define the location for the PostgreSQL transaction log. By default, the transaction log is stored in a subdirectory of the main postgresql data folder, which you can define with `PGDATA`.
* `POSTGRES_HOST_AUTH_METHOD`: This variable allows you to control the `auth-method` used to authenticate when connecting to the database.

Note that if you set the `POSTGRES_HOST_AUTH_METHOD` variable to `trust`, then the `POSTGRES_PASSWORD` variable is no longer required:

```sh
docker run --rm -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=linky -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest
```

Additionally, be aware that the Docker specific variables will only have an effect if you start the container with an empty data directory; pre-existing databases won't be affected on container startup.

### Running PostgreSQL with a custom configuration file

You can also run the Chainguard `postgres` image with a custom configuration file. The following example will mount a PostgreSQL configuration file named `my-postgres.conf` to the container. 

```sh
docker run --rm -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres:latest -c 'config_file=/etc/postgresql/postgresql.conf'
```

This command also uses the PostgreSQL server's `-c` flag to set the `config_file` runtime parameter.

### Initial SQL script

The path for initial load sql script should be same as per application docs `/docker-entrypoint-initdb.d/init.sql` except for PostgreSQL 14 which needs to be mounted at `/var/lib/postgres/initdb/init.sql`.

## Documentation and Resources

* [Getting Started with the PostgreSQL Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/postgres/)
* [Vulnerability Comparison: postgres](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/postgres/)
* [Blog: How to Use the Postgres Docker Official Image](https://www.docker.com/blog/how-to-use-the-postgres-docker-official-image/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nvidia-device-plugin

# nvidia-device-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nvidia-device-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nvidia-device-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [nvidia-device-plugin](https://github.com/NVIDIA/k8s-device-plugin) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Pre-requisites
Ensure your environment satisfies the [prerequisites](https://github.com/NVIDIA/k8s-device-plugin#prerequisites).

Jump to [Quick Start](https://github.com/NVIDIA/k8s-device-plugin#quick-start)
to learn more.

## Deploy via helm
To use the Chainguard Image, override the values below in your
`values.yaml` to use with [Helm](https://github.com/NVIDIA/k8s-device-plugin#deployment-via-helm):

```yaml
image:
  repository: cgr.dev/ORGANIZATION/nvidia-device-plugin
  tag: latest
```

When using this image with the `nvidia/gpu-operator` [helm chart](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/23.9.0/index.html) `bash` is required to run the mounted `/bin/entrypoint.sh` script.

For this you should use the `latest-dev` variant.

```
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

helm install --wait gpu  -n gpu-operator --create-namespace nvidia/gpu-operator
```
Values:
```yaml
driver:
   enabled: false
devicePlugin:
  repository: cgr.dev/ORGANIZATION
  image: nvidia-device-plugin
  tag: latest-dev
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-image-updater

# argocd-image-updater
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-image-updater` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-image-updater/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automatic container image update for Argo CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [argocd-image-updater](https://quay.io/repository/argoprojlabs/argocd-image-updater) image. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install Chainguard's argocd-image-updater image on your Kubernetes cluster, you can use the official image's [Helm chart](https://github.com/argoproj/argo-helm/tree/main/charts/argocd-image-updater).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/argocd-image-updater
  tag: latest
```

You can also invoke the following command to install argocd-image-updater in your cluster.

```shell
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd-image-updater argo/argocd-image-updater -f values.yaml
```

## Documentation and Resources
For more information, please refer to [the official documentation for argocd-image-updater](https://argocd-image-updater.readthedocs.io/en/stable/). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cfssl-self-sign

# cfssl-self-sign
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cfssl-self-sign` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cfssl-self-sign/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image outputs the generated certificates to the `/output` directory. You can mount a volume to this directory to access the generated certificates.

```bash
$ docker container run -v $(pwd):/output cgr.dev/chainguard-private/cfssl-self-sign

$ ls
...
ca-config.json
ca-csr.json
ca-key.pem
ca.csr
ca.pem
wildcard-csr.json
wildcard-key.pem
wildcard.csr
wildcard.pem
...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tiktoken

# tiktoken
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tiktoken` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tiktoken/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

tiktoken is a fast BPE tokeniser for use with OpenAI's models

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `tiktoken` container provides the core functionality of OpenAI's tiktoken library with the following differences:

* Unlike the upstream Python package installation, this container image provides tiktoken as a ready-to-use Python environment
* The container includes the latest python and the tiktoken library pre-installed, eliminating the need for separate package management
* It uses Chainguard's minimal base image for enhanced security and reduced attack surface

The container maintains full compatibility with the upstream tiktoken API and functionality.

## Getting Started

The `tiktoken` container runs Python as its entrypoint, allowing you to use tiktoken directly in your Python applications. You can run interactive Python sessions or execute Python scripts that use tiktoken.

### Basic Usage

Run an interactive Python session with tiktoken:

```sh
docker run -it cgr.dev/ORGANIZATION/tiktoken
```
```
Python 3.13.x (main, ...) 
>>> import tiktoken
>>> enc = tiktoken.get_encoding("o200k_base")
>>> enc.encode("hello world")
[15339, 1917]
>>> enc.decode([15339, 1917])
'hello world'
```

### Text Tokenization

You can tokenize text using different encoding models:

```sh
docker run cgr.dev/ORGANIZATION/tiktoken python3 -c "
import tiktoken

# Get encoding for GPT-4o
enc = tiktoken.encoding_for_model('gpt-4o')
text = 'tiktoken is great!'
tokens = enc.encode(text)
print(f'Text: {text}')
print(f'Tokens: {tokens}')
print(f'Token count: {len(tokens)}')
print(f'Decoded: {enc.decode(tokens)}')
"
```
```
Text: tiktoken is great!
Tokens: [83, 1609, 5963, 374, 2294, 0]
Token count: 6
Decoded: tiktoken is great!
```

### Token Counting for Cost Estimation

Use tiktoken to count tokens before making OpenAI API calls:

```sh
docker run cgr.dev/ORGANIZATION/tiktoken python3 -c "
import tiktoken

def count_tokens(text, model='gpt-4o'):
    enc = tiktoken.encoding_for_model(model)
    return len(enc.encode(text))

text = 'This is a sample text for token counting.'
tokens = count_tokens(text)
print(f'Text: {text}')
print(f'Token count: {tokens}')
"
```
```
Text: This is a sample text for token counting.
Token count: 9
```

## Documentation and Resources

* [OpenAI tiktoken GitHub Repository](https://github.com/openai/tiktoken) - Official source code and documentation
* [OpenAI Cookbook: How to count tokens with tiktoken](https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken) - Comprehensive examples and use cases
* [OpenAI Tokenizer](https://platform.openai.com/tokenizer) - Interactive web tool for testing tokenization
* [OpenAI API Documentation](https://platform.openai.com/docs) - Official API documentation
* [Chainguard Academy: Python](https://edu.chainguard.dev/chainguard/chainguard-images/reference/python/) - Working with Python in Chainguard containers

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubewatch

# kubewatch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubewatch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubewatch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[kubewatch](https://github.com/robusta-dev/kubewatch) is a Kubernetes watcher that publishes notification to available collaboration hubs/notification channels. Run it in your k8s cluster, and you will get event notifications through webhooks.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using kubewatch

This image is a drop-in replacement for the upstream image.
You can run it using the official helm chart with:

```shell
$ helm repo add robusta https://robusta-charts.storage.googleapis.com
$ helm repo update
$ helm install kubewatch robusta/kubewatch \
    --set image.repository=cgr.dev/chainguard/kubewatch \
    --set image.tag=latest
    <other configuration parameters here>
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fulcio-fips

# fulcio-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fulcio-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fulcio-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `fulcio-fips` image is based on the [sigstore/fulcio](https://github.com/sigstore/fulcio) project and is comparable to container images built from the sigstore/fulcio repository. Fulcio is Sigstore's certificate authority for issuing short-lived code signing certificates based on OIDC identity.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult our [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Prerequisites

Fulcio requires OIDC provider configuration for certificate issuance and certificate chains for key management setup. Refer to the [Fulcio setup documentation](https://docs.sigstore.dev/certificate_authority/overview/) for detailed configuration requirements.

## Getting Started

### Testing the Image

You can verify the `fulcio-fips` image works with the following command:

```shell
docker run --rm cgr.dev/ORGANIZATION/fulcio-fips:latest version
```

Check available commands:

```shell
docker run --rm cgr.dev/ORGANIZATION/fulcio-fips:latest --help
```

### Running Fulcio Server

To start the Fulcio server with minimal testing configuration:

```shell
docker run --rm -p 8080:8080 cgr.dev/ORGANIZATION/fulcio-fips:latest serve --ca ephemeralca
```

This example uses an ephemeral certificate authority (CA) for testing purposes. Production deployments require proper OIDC configuration, certificate chains, and key management setup as detailed in the Sigstore documentation.

## Documentation and Resources

- [Sigstore Fulcio Documentation](https://docs.sigstore.dev/certificate_authority/overview/)
- [Fulcio GitHub Repository](https://github.com/sigstore/fulcio)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tesseract-fips

# tesseract-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tesseract-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tesseract-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### haproxy-iamguarded-fips

# haproxy-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/haproxy-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/haproxy-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal [haproxy](https://www.haproxy.org/) base image rebuilt every night from source.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

HAProxy IAMGuarded is a security-enhanced variant of HAProxy designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard HAProxy deployments.

## Helm Chart Installation

The HAProxy IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install haproxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
image:
  repository: $ORGANIZATION/haproxy-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/haproxy-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install haproxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/haproxy:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your HAProxy IAMGuarded installation by checking that metrics are being exposed correctly. The deployment functions as a standard haproxy instance, so all typical haproxy validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-go-templating

# crossplane-function-go-templating
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-go-templating` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-go-templating/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This composition function allows you to compose Crossplane resources using Go templates.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-function-go-templating` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/function-go-templating](https://github.com/crossplane-contrib/function-go-templating/pkgs/container/function-go-templating) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Function

Deploy the function to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: function-go-templating
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-go-templating:latest
```

Apply this configuration:
```bash
kubectl apply -f function.yaml
```

Verify the function is healthy:
```bash
kubectl get functions
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/function-go-templating?tab=readme-ov-file#function-go-templating).

## Documentation and Resources
- [Crossplane Functions Documentation](https://docs.crossplane.io/v2.0/packages/functions/)
- [Upstream Project](https://github.com/crossplane-contrib/function-go-templating)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### erlang

# erlang
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/erlang` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/erlang/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Erlang applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The image can be used to run the `erl` tool, or to compile and run Erlang scripts.

For example, a simple Hello World script in Erlang, `hello.erl`:

```
-module(hello).
-export([hello_world/0]).

hello_world() -> io:fwrite("hello, world\n").
```

can be compiled in Docker with:

```
FROM cgr.dev/chainguard/erlang
COPY . .
RUN erlc hello-world.erl
ENTRYPOINT [ "erl" ]
CMD [ "-noshell", "-eval", "hello:hello_world().", "-s", "init", "stop" ]
```

Running this image should output `hello, world`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-service-operator

# azure-service-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-service-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-service-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Instead of deploying and managing your Azure resources separately from your Kubernetes application, ASO allows you to manage them together, automatically configuring your application as needed. For example, ASO can set up your Redis Cache or PostgreSQL database server and then configure your Kubernetes application to use them.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation and usage

Please refer to the official [Installation](https://azure.github.io/azure-service-operator/#installation) guide.
The official way of managing the installation of the Azure Service Operator is via the official Helm chart, as explained in the guide linked above.

Another way of installing it is via Kubernetes manifests, as documented in the [Installation: From YAML](https://azure.github.io/azure-service-operator/guide/installing-from-yaml/) official guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-reflector-fips

# kubernetes-reflector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-reflector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-reflector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller for reflecting ConfigMaps, Secrets, and Certificates across namespaces

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the [emberstack/kubernetes-reflector](https://github.com/emberstack/kubernetes-reflector) image. The main differences are:

* Our entrypoint is `/usr/bin/kubernetes-reflector` instead of `dotnet ES.Kubernetes.Reflector.dll`
* Our image includes a compatibility layer to ensure it works with the same environment variables and paths
* Our image runs a self-contained binary and does not have dotnet or aspnet packages installed

These changes should not affect normal operation, and the image should be a drop-in replacement for the upstream image in most configurations.

## Overview

Kubernetes Reflector is a Kubernetes controller created by Emberstack that can be used to automatically replicate resources across namespaces. This tool is particularly useful for:

* Replicating ConfigMaps and Secrets to multiple namespaces
* Working with cert-manager certificates and automatically reflecting the generated TLS Secrets to other namespaces
* Sharing common configuration across multiple namespaces

## Getting Started

The reflector can be deployed using the Helm chart from the Emberstack repository:

```shell
# Add the Emberstack Helm repository
helm repo add emberstack https://emberstack.github.io/helm-charts

# Update the Helm repositories
helm repo update

# Install the Helm chart with Chainguard's image
helm upgrade --install reflector emberstack/reflector \
  --namespace reflector \
  --create-namespace \
  --set image.repository=cgr.dev/ORGANIZATION/kubernetes-reflector-fips \
  --set image.tag=latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage Examples

### Configuring Resources for Reflection

To reflect a resource, add the appropriate annotations to the source resource:

#### Reflect a ConfigMap

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  annotations:
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
data:
  key1: value1
```

#### Reflect a Secret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  annotations:
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
type: Opaque
data:
  username: dXNlcm5hbWU=  # username
  password: cGFzc3dvcmQ=  # password
```

## Configuration

### Environment Variables

The kubernetes-reflector image supports several environment variables to configure its behavior:

* `ASPNETCORE_HTTP_PORTS`: The port to listen on (default: 8080)
* `ES_Serilog__MinimumLevel__Default`: Log level (Verbose, Debug, Information, etc.)
* `ES_KubernetesClientConfiguration__VerifyConnection`: Whether to verify connection to Kubernetes API (true/false)
* `ES_KubernetesClientConfiguration__SkipTlsVerify`: Whether to skip TLS verification (true/false)
* `ES_KubernetesClientConfiguration__WatchReconnectTimeoutSeconds`: Timeout for reconnecting watches
* `ES_KubernetesClientConfiguration__ConnectionRetryIntervalMs`: Retry interval for connections

Example helm value overrides:

```yaml
env:
  - name: ES_Serilog__MinimumLevel__Default
    value: "Information"
  - name: ES_KubernetesClientConfiguration__SkipTlsVerify
    value: "false"
```

## Documentation and Resources

For more detailed information about kubernetes-reflector, please refer to:

* [GitHub Repository](https://github.com/emberstack/kubernetes-reflector)
* [Helm Chart Repository](https://artifacthub.io/packages/helm/emberstack/reflector)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### php-fips

# php-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/php-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/php-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elixir

# elixir
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elixir` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elixir/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elixir is a dynamic, functional language for building scalable and maintainable applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's elixir image is comparable to the [upstream elixir image](https://hub.docker.com/_/elixir). Switching to the Chainguard image should not require any changes to your existing setup. 

By default, the `elixir` Chainguard Image runs as a non-root user. You may need to use `USER root` to perform tasks requiring elevated privileges.

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it cgr.dev/ORGANIZATION/elixir:latest
```

You can also use it for development by using the `-dev` variant, which includes [rebar3](https://github.com/erlang/rebar3).

```Dockerfile
FROM cgr.dev/ORGANIZATION/elixir:latest-dev

RUN tee /usr/local/bin/app.exs <<EOF
IO.puts("Hello, World!")
EOF

ENTRYPOINT [ "elixir" ]
CMD [ "/usr/local/bin/app.exs" ]
```

## Documentation References

- [Elixir documentation](https://elixir-lang.org/docs.html)
- [Phoenix framework documentation](https://hexdocs.pm/phoenix/up_and_running.html)
- [Erlang documentation](https://www.erlang.org/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-vllm-backend

# tritonserver-vllm-backend
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-vllm-backend` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-vllm-backend/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution with vllm backend

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting started
The Triton Server with vLLM backend container provides GPU-accelerated large language model inference through NVIDIA's Triton Inference Server with the vLLM backend for optimized performance.

### Basic vLLM Model Serving

Set up a simple vLLM model repository and serve the `facebook/opt-125m` model:

```bash
# Create model repository structure
mkdir -p model_repository/vllm_model/1

# Download model configuration
wget -P model_repository/vllm_model/1 https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/model_repository/vllm_model/1/model.json
wget -P model_repository/vllm_model https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/model_repository/vllm_model/config.pbtxt

# Start Triton server with vLLM backend
docker run --gpus all -d \
  --name triton-vllm \
  -p 8000:8000 -p 8001:8001 -p 8002:8002 \
  --shm-size=1G --ulimit memlock=-1 --ulimit stack=67108864 \
  -v $(pwd):/workspace -w /workspace \
  cgr.dev/ORGANIZATION/tritonserver-vllm-backend:latest \
  --model-repository ./model_repository
```

The server will take 2-5 minutes to initialize as it downloads and loads the model.

### Health Check and Model Status

Check if the server and model are ready:

```bash
# Check server health
curl http://localhost:8000/v2/health/ready

# Check model status
curl http://localhost:8000/v2/models/vllm_model/ready

# Get model metadata
curl http://localhost:8000/v2/models/vllm_model
```

### gRPC Client Inference

Test text generation using the gRPC interface:

```bash
# Download sample client and prompts
wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/client.py
wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/prompts.txt

# Run client (requires tritonclient[grpc])
docker run --rm --net=host \
  -v $(pwd):/workspace -w /workspace \
  --entrypoint python3 \
  python:3.12-slim \
  -c "pip install tritonclient[grpc] && python3 client.py -u localhost:8001"
```

Refer to the [vLLM documentation](https://docs.vllm.ai/) for detailed configuration options.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5548

# request-5548
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5548` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5548/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tetragon

# tetragon
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tetragon` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tetragon/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

eBPF-based Security Observability and Runtime Enforcement

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Tetragon is comprised of 2 images:
- `cgr.dev/ORGANIZATION/tetragon`
- `cgr.dev/ORGANIZATION/tetragon-operator`

The Chainguard images usually do not run as the root user and contain only the minimum set of tools and dependencies needed to function. This means they do not include utilities such as a shell or a package manager.

The Chainguard's `tetragon` image is still configured to run as `root` because it requires elevated kernel capabilities in order to:
- Load and attach eBPF programs.
- Access host namespaces.
- Perform other privileged operations.
In practice, this functionality requires running as a privileged container on Kubernetes, which inherently implies root access inside the container.

The Chainguard's `tetragon-operator` image, however, is configured to run as `nonroot`. Its functionality has been validated under these restrictions, ensuring that it maintains Chainguard’s security standards without requiring elevated privileges.

## Getting Started
There are multiple ways of deploying Tetragon but the recommended way is to use the official [Helm Chart for Tetragon](https://tetragon.io/docs/reference/helm-chart/).

### Deployment using Helm Chart

To deploy Tetragon, run the following instructions:
Start by adding a `values.yaml` file to override with Chainguard's image:
```shell
# values.yaml
tetragon
  image:
    repository: cgr.dev/ORGANIZATION/tetragon
    tag: latest
tetragonOperator:
  image:
    repository: cgr.dev/ORGANIZATION/tetragon-operator
    tag: latest
```
Deploy Tetragon with Helm:
```shell
helm repo add cilium https://helm.cilium.io
helm repo update
helm install tetragon cilium/tetragon -n kube-system -f values.yaml
kubectl rollout status -n kube-system ds/tetragon -w
```
Once Tetragon and Tetragon-Operator have been deployed successfully, you can deploy a demo application to have sample workload:
```
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/main/examples/minikube/http-sw-app.yaml
```
Once the demo application related pods are up, you can observe Tetragon execution events:
```
kubectl exec -it -n kube-system ds/tetragon -c tetragon -- tetra getevents -o compact --pods xwing
```

You are now up and running with Chainguard's Tetragon images!

## Documentation and Resources

- [Getting Started](https://tetragon.io/docs/getting-started/)
- [Tetragon Events](https://tetragon.io/docs/concepts/events/)
- [Tracing Policy](https://tetragon.io/docs/concepts/tracing-policy/)
- [Tetragon Runtime Hooks](https://tetragon.io/docs/concepts/runtime-hooks/)
- [Documentation for Tetragon enforcement system](https://tetragon.io/docs/concepts/enforcement/)
- [Policy Library](https://tetragon.io/docs/policy-library/observability/)
- [Use Cases](https://tetragon.io/docs/use-cases/)
- [Low level reference documentation for Tetragon](https://tetragon.io/docs/reference/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pytorch

# pytorch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pytorch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pytorch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for pytorch, a Python package that provides two high-level features: Tensor computation with strong GPU acceleration and Deep neural networks built on a tape-based autograd system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s PyTorch image is similar to the [pytorch/pytorch image](https://hub.docker.com/r/pytorch/pytorch), with several key differences:

* Chainguard images are using Wolfi Linux distribution, the `pytorch/pytorch` images are based on Ubuntu 22.04
* Chainguard images are running as `nonroot` user with home in `/home/nonroot` directory, while the `pytorch/pytorch` images are running as root user
* Chainguard images do not ship a full shell by default and it's entrypoint is Python, while `pytorch/pytorch` uses Bash as entrypoint
  (**NOTE**: Chainguard also provides a `-dev` images that have a full shell and entrypoint can be set to `/bin/sh` or `/bin/bash` for such images)

### Compatibility Package

If you're running an older version of CUDA not supported by the container, you have the option to install CUDA compatibility packages.

First, install the compatibility package for your specific host OS using the NVIDIA package repository. Make sure to install the package specific to your current version of CUDA.

Once the compatibility package has been installed, you can run the container in compatibility mode:

```sh
docker run --rm -it \
 -e LD_LIBRARY_PATH="/usr/local/cuda-12.4/compat" \
 cgr.dev/chainguard/pytorch
```

## Running pytorch

PyTorch has some prerequisites which need to be configured in the environment
prior to running with GPUs. For examples, please refer to [TESTING.md](https://github.com/chainguard-images/images/blob/main/images/pytorch/TESTING.md).

Additionally, please refer to the [upstream documentation](https://github.com/pytorch/pytorch)
for more information on configuring and using PyTorch.

Assuming the environment prerequisites have been met, below demonstrates how
to launch the container:

```bash
docker run --rm -i -t \
    --privileged \
    --gpus all \
    cgr.dev/chainguard/pytorch:latest
```

## Testing GPU Access

If your environment has connected GPUs, you can check that PyTorch has access with the following:

```bash
docker run --rm -it --gpus all cgr.dev/chainguard/pytorch:latest
Python 3.11.9 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

### Adjusting LD_LIBRARY_PATH

If `torch` is unable to access connected GPUs, you may need to adjust your
`LD_LIBRARY_PATH` environment variable before launching Python. CUDA libraries
injected into your runtime environment are often not found where Chainguard
images expect them.

For example, if you've got CUDA 12.8 libraries installed through non-Chainguard
packages:

```sh
LD_LIBRARY_PATH=/usr/local/cuda-12.8/lib64:/usr/local/nvidia/lib64:/usr/lib/x86_64-linux-gnu
```

Chainguard's libraries install to `/usr/lib`, so anything outside of that will
need to be added to the `LD_LIBRARY_PATH`.

## Testing PyTorch

As a quick intro, we will use PyTorch to create a very simple deep learning model with two linear layers and an activation function. We’ll create an instance of it and ask it to report on its parameters. Running the below will fetch a [model_builder.py](https://github.com/chainguard-dev/pytorch-getting-started/blob/main/model_builder.py) script from the Chainguard Images repository, place it in a folder on your host machine, and run the script in a pytorch container from a volume.

```bash
mkdir -p pytorch-test &&\
 curl https://raw.githubusercontent.com/chainguard-dev/pytorch-getting-started/refs/heads/main/model_builder.py > pytorch-test/model_builder.py &&\
 docker run --rm -it -v "$PWD/pytorch-test:/tmp/pytorch-test" cgr.dev/chainguard/pytorch:latest /tmp/pytorch-test/model_builder.py
```

You may also consider running this [quickstart script](https://github.com/chainguard-images/images/blob/main/images/pytorch/tests/quickstart.py) based on the [official PyTorch quickstart tutorial](https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html) using the same approach as above.

### Using Helm charts

As a place to get started, you may also use this Helm chart to get PyTorch running
```bash
  helm install pytorch \
  --namespace pytorch-space --create-namespace  \
  --set image.registry="cgr.dev" \
  --set image.repository="chainguard/pytorch" \
  --set image.tag=latest \
  --set containerSecurityContext.runAsUser=0 \
  --set containerSecurityContext.runAsNonRoot=false \
  --set containerSecurityContext.allowPrivilegeEscalation=true \
  --wait oci://registry-1.docker.io/bitnamicharts/pytorch
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-source-watcher-fips

# flux-source-watcher-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-source-watcher-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-source-watcher-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-validated Flux Source Watcher extends Flux CD with ArtifactGenerator CRD for source composition

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `flux-source-watcher-fips` container image is designed to be a drop-in replacement for the upstream [flux-source-watcher image](https://github.com/fluxcd/source-watcher).

## Getting Started

### Kustomize

Deploy source-watcher using kustomize with the upstream configuration:

```yaml
cat > kustomization.yaml <<EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/fluxcd/source-watcher/config/default
images:
  - name: fluxcd/source-watcher
    newName: cgr.dev/ORGANIZATION/flux-source-watcher-fips
    newTag: latest
EOF
```

Apply the configuration:

```shell
kubectl apply -k .
```

## FIPS Support

The `flux-source-watcher-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Documentation and Resources

- [Flux Source Watcher GitHub](https://github.com/fluxcd/source-watcher)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra-medusa

# cassandra-medusa
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra-medusa` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra-medusa/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[cassandra-medusa](https://github.com/thelastpickle/cassandra-medusa), is a Apache Cassandra Backup and Restore Tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
Medusa for Apache Cassandra® is deployed by a K8ssandra Operator install, based on the Medusa Custom Resource Definition (CRD). Once K8ssandra Operator is deployed, you can refer to the [official documentation](https://docs.k8ssandra.io/tasks/backup-restore/) for further usage of Medusa 

To use our minimal, wolfi-based image with this Helm chart you'll need to override the image used by the official helm chart and specify the chainguard image as per below example:

```shell
kubectl create ns cassandra-medusa

helm repo add k8ssandra https://helm.k8ssandra.io/stable
helm repo update

helm install cassandra-medusa k8ssandra/k8ssandra-operator -n cassandra-medusa

# create a secret, needed for medusa
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
 name: medusa-bucket-key
 namespace: cassandra-medusa
type: Opaque
stringData:
 # Note that this currently has to be set to credentials!
 credentials: |-
   [default]
   aws_access_key_id = k8ssandra
   aws_secret_access_key = k8ssandra
EOF

# create a K8ssandraCluster using Chainguard's cassandra-medusa image
cat <<EOF | kubectl apply -n ${NAMESPACE} -f -
apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
  name: demo
  namespace: "${NAMESPACE}"
spec:
  cassandra:
    serverVersion: "4.0.1"
    datacenters:
      - metadata:
          name: dc1
        size: 1
        storageConfig:
          cassandraDataVolumeClaimSpec:
            storageClassName: standard
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 5Gi
        config:
          jvmOptions:
            heapSize: 512M
        stargate:
          size: 1
          heapSize: 256M
  medusa:
    containerImage:
      registry: cgr.dev
      repository:chainguard
      name: cassandra-medusa
      tag: latest
      pullPolicy: Always
    storageProperties:
    #   storageProvider: s3_compatible
      bucketName: k8ssandra-medusa
      prefix: test
      storageSecretRef:
        name: medusa-bucket-key
    #   host: minio-service.minio.svc.cluster.local
    #   port: 9000
      secure: false
EOF
```

For further checks and operations on backup and restore with Medusa, please refer to this [official documentation](https://docs.k8ssandra.io/tasks/backup-restore/)

As per [project documentation](https://github.com/k8ssandra/k8ssandra-operator/blob/main/docs/content/en/install/local/single-cluster-helm/_index.md#deploy-cert-manager), by default, the Helm installation requires cert-manager to be present in the Kubernetes installation. If you do not have cert-manager installed, follow the steps at (https://cert-manager.io/docs/installation/helm/)[cert-manager's] documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyterhub-k8s-image-awaiter

# jupyterhub-k8s-image-awaiter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyterhub-k8s-image-awaiter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyterhub-k8s-image-awaiter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

JupyterHub Kubernetes Image Awaiter - ensures images are pre-pulled before deployment

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `jupyterhub-k8s-image-awaiter` image is designed to be a drop-in replacement for the upstream `jupyterhub/k8s-image-awaiter` image.

## Getting Started

### JupyterHub Deployment

The jupyterhub-k8s-image-awaiter image is typically deployed as part of JupyterHub's Helm chart pre-install hooks. It ensures container images are pre-pulled across all Kubernetes nodes before JupyterHub deployment proceeds.

Configure in your JupyterHub `values.yaml`:

```yaml
prePuller:
  hook:
    enabled: true
    image:
      name: cgr.dev/ORGANIZATION/jupyterhub-k8s-image-awaiter
      tag: latest
```

Then install JupyterHub with the custom image:
```bash
helm repo add jupyterhub https://hub.jupyter.org/helm-chart
helm install jupyterhub jupyterhub/jupyterhub \
  --namespace jupyterhub \
  --create-namespace \
  --values values.yaml
```

For deployment examples and configurations, please refer to the [upstream JupyterHub documentation](https://github.com/jupyterhub/zero-to-jupyterhub-k8s/tree/main/jupyterhub).

## Documentation and Resources

- [JupyterHub Kubernetes Image Awaiter](https://github.com/jupyterhub/zero-to-jupyterhub-k8s/tree/main/images/image-awaiter)
- [JupyterHub Helm Chart](https://hub.jupyter.org/helm-chart/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux

# flux
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

`flux` cli to interact with the [Flux](https://fluxcd.io/) gitops toolkit components in a running cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using `flux`

Note that many `flux` commands assume a `kubectl` context, which isn't usually the case when running through Docker.

```bash
# Install the Flux GitOps Toolkit using Chainguard Containers
docker run cgr.dev/ORGANIZATION/flux export --registry cgr.dev/chainguard | kubectl apply -f -
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-beam-python-sdk

# apache-beam-python-sdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-beam-python-sdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-beam-python-sdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Beam is a unified programming model for Batch and Streaming data processing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Get started with the Beam Python SDK quickstart to set up your Python development environment, get the Beam SDK for Python, and run an example pipeline.

To get you quickly started, we are giving you an example that uses `DirectRunner`. The Apache Beam examples directory has many examples. All examples can be run locally by passing the required arguments described in the example script.

For example, run wordcount.py with the following command:

```bash
container_id=$(docker run -d \
    --entrypoint bash \
    "cgr.dev/chainguard/apache-beam-python-sdk:py3.11-v2.58" \
    -c "
      echo 'Running Apache Beam wordcount with DirectRunner...';
      python -m apache_beam.examples.wordcount \
        --input=/etc/profile \
        --output=/output/part \
        --runner=DirectRunner;
      echo 'Listing /output inside container:';
      ls -l /output;
    ")
``
Once the container process is over, copy the output file from the container to the local system

```bash
docker cp "${container_id}:/output/" "${OUTPUT_DIR}"
```
Here ${OUTPUT_DIR} is any directory you want the output to be copied at, the output would be of format `${OUTPUT_DIR}/part-00000-of-00001`, you can ls the content of the output and that will show you the word count map of each word and how many times it occurred in that input file.

We have another example of using `PortableRunner` documented in our `TESTING.md`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### httpd-fips

# httpd-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/httpd-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/httpd-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`httpd-fips` is comparable to the upstream [httpd](https://hub.docker.com/_/httpd) image, with the following differences:

- Like all other Chainguard Images, `httpd-fips` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user

Most importantly, the `httpd-fips` image contains the OpenSSL FIPS Provider Module. For more information, refer to our [FIPS image documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/)

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

To try out the image, run:

```sh
docker run -d -p 8080:80 cgr.dev/ORGANIZATION/httpd-fips
```

After starting the container, navigate to `localhost:8080` in your web browser. You should find the default httpd (apache2) `It works`! page.

You can also try the image by serving a local filesystem path (e.g. "$PWD"). For this run:

```sh
docker run -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs cgr.dev/ORGANIZATION/httpd-fips
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-vip-cloud-provider

# kube-vip-cloud-provider
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-vip-cloud-provider` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-vip-cloud-provider/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A general purpose cloud provider for kube-vip

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kube-vip-cloud-provider` image contains only the minimum set of tools and dependencies needed to function. It is comparable to the [official kube-vip-cloud-provider image](https://ghcr.io/kube-vip/kube-vip-cloud-provider) from kube-vip.

## Getting Started

You can install Chainguard's `kube-vip-cloud-provider` image using the kube-vip Helm chart:

Create a `values.yaml` file for helm installation. 
```
cat > values.yaml <<EOF
image:
repository: cgr.dev/ORGANIZATION/kube-vip-cloud-provider
tag: <tag>
EOF
```

Make sure to replace `ORGANIZATION` with the name of your Chainguard organization. Additionally, replace `<tag>` with your desired container image tag.

Install the Chainguard's `kube-vip-cloud-provider` image using helm chart:

```
helm repo add kube-vip https://kube-vip.github.io/helm-charts

helm install kube-vip-cloud-provider kube-vip/kube-vip-cloud-provider \
--namespace kube-system --create-namespace \
--values values.yaml --wait
```

Next, define address pools in a ConfigMap:

```
kubectl -n kube-system create configmap kube-vip-cloud-provider \
--from-literal=cidr-global=<GLOBAL_POOL_CIDR> \
--from-literal=cidr-development=<DEV_POOL_CIDR>
```

Be sure to replace `GLOBAL_POOL_CIDR` and `DEV_POOL_CIDR` with your desired address pools.

Then create an `nginx` service which will be watched by the cloud provider:

```
cat <<EOF | kubectl apply -n lb-test -f -
apiVersion: apps/v1
kind: Deployment
metadata: { name: nginx }
spec:
replicas: 1
selector: { matchLabels: { app: nginx } }
template:
    metadata: { labels: { app: nginx } }
    spec:
    containers:
    - name: nginx
        image: nginx:1.25.4
        ports: [{ containerPort: 80 }]
---
apiVersion: v1
kind: Service
metadata: { name: nginx }
spec:
type: LoadBalancer
selector: { app: nginx }
ports: [{ port: 80 }]
EOF
```

Finally, verify the address assignment:

```
kubectl -n lb-test get svc nginx \
-o jsonpath='{.metadata.annotations.kube-vip\.io/loadbalancerIPs}'
```

The resulting address should be in between the address pools you defined.

## Documentation and Resources

For more information, refer to [the `kube-vip-cloud-provider` usage documentation](https://github.com/kube-vip/kube-vip-cloud-provider?tab=readme-ov-file#global-and-namespace-pools)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spire

# spire
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spire` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spire/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based `spire` images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

**Note**: Unlike most other Chainguard images, the `spire-agent` image must run as root.
This is due to a constraint in the way it is typically deployed into Kubernetes clusters.
See https://github.com/spiffe/spire/issues/1862 for more context.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-pyroscope

# grafana-pyroscope
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-pyroscope` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-pyroscope/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Grafana Pyroscope](https://grafana.com/oss/pyroscope/) is a continuous profiling platform that allows you to debug performance issues down to a single line of code.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard version of [Grafana Pyroscope](https://hub.docker.com/r/grafana/pyroscope) is a minimal, secure, and regularly updated container image designed to run Java applications. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

For production scenarios, it's recommended you follow Grafana's guide on [deploying Pyroscope using the official Helm chart](https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/).

Otherwise, here is an example of how to deploy Grafana Pyroscope locally:

```bash
cat <<EOF > values.yaml
pyroscope:
  image:
    repository: cgr.dev/ORGANIZATION/grafana-pyroscope
    tag: latest
EOF
```

Then add the repository for Grafana:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```

Finally, install the Helm chart for Grafana Pyroscope:

```bash
helm install pyroscope grafana/pyroscope
```

This will deploy Grafana Pyroscope on your local Kubernetes cluster. You can port-forward it via the following command:

```bash
kubectl port-forward service/grafana-pyroscope-headless 4040
```

You can now access the UI at `http://localhost:4040`.

## Documentation and Resources
- [Grafana Pyroscope Helm Charts](https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/)
- [Official Grafana Pyroscope documentation](https://grafana.com/oss/pyroscope/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tflint-fips

# tflint-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tflint-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tflint-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Pluggable Terraform Linter

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `tflint-fips` image is comparable to the [official TFLint image on GHCR](https://github.com/terraform-linters/tflint/pkgs/container/tflint).

### FIPS Support

The `tflint-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it \
  -v "${PWD}:/data" \
  -t cgr.dev/ORGANIZATION/tflint-fips:latest
```

```shell
# (Example output:)
1 issue(s) found:

Warning: terraform "required_version" attribute is required (terraform_required_version)

  on main.tf line 1:

Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.13.0/docs/rules/terraform_required_version.md
```

To download plugins and initialize your environment, you can run the image with `--init` as an argument:

```shell
docker run --rm -it \
  -v "${PWD}:/data" \
  cgr.dev/ORGANIZATION/tflint-fips:latest \
  --init
```
```
All plugins are already installed
```

## Documentation and Resources
- [TFLint documentation](https://github.com/terraform-linters/tflint#getting-started)
- [Terraform documentation](https://developer.hashicorp.com/terraform/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-fluent-bit-output-fips

# newrelic-fluent-bit-output-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-fluent-bit-output-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-fluent-bit-output-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-fluent-bit-output](https://github.com/newrelic/newrelic-fluent-bit-output) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `newrelic-fluent-bit-output-fips` container image is comparable to [the newrelic-fluent-bit-output-fips image maintained by Newrelic](https://hub.docker.com/r/newrelic/newrelic-fluentbit-output). Like most other Chainguard container images, the newrelic-fluent-bit-output-fips image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## FIPS Support

The `newrelic-fluent-bit-output-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output-fips
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-gcp-cloud-controller-manager

# cloud-provider-gcp-cloud-controller-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-gcp-cloud-controller-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-gcp-cloud-controller-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes cloud controller manager for Google Cloud Platform (GCP), managing cloud-specific resources and integrations.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cloud-provider-gcp-cloud-controller-manager image is compatible with the upstream [Cloud Provider GCP](https://github.com/kubernetes/cloud-provider-gcp) `cloud-controller-manager` image. This image contains only the minimum set of dependencies needed to run the Cloud Provider GCP Cloud Controller Manager.

## Usage

The GCP cloud controller manager is a Kubernetes controller that interfaces with Google Cloud Platform APIs to manage cloud-specific resources such as load balancers, persistent volumes, and node management.

You can use the `cloud-provider-gcp-cloud-controller-manager` as drop-in replacement for upstream image.

### Required Fields in `service-account.json`

Ensure your service account file contains the following fields:
`type`, `project_id`, `private_key_id`, `private_key`, `client_email`, `client_id`, `auth_uri`, `token_uri`.

### Create Configuration

```bash
kubectl create secret generic gcp-ccm-config \
  -n kube-system \
  --from-file=credentials.json=/path/to/service-account.json \
  --from-file=gce.conf=/path/to/gce.conf
```

### Deploy Cloud Controller Manager

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gcp-cloud-controller-manager
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gcp-ccm
  template:
    metadata:
      labels:
        app: gcp-ccm
    spec:
      containers:
        - name: cloud-controller-manager
          image: cgr.dev/ORGANIZATION/cloud-provider-gcp-cloud-controller-manager
          command: ["/cloud-controller-manager"]
          args:
            - --cloud-provider=gce
            - --cloud-config=/etc/gcp/config/gce.conf
          env:
            - name: GOOGLE_APPLICATION_CREDENTIALS
              value: /etc/gcp/config/credentials.json
          volumeMounts:
            - name: gcp-config
              mountPath: /etc/gcp/config
              readOnly: true
      volumes:
        - name: gcp-config
          secret:
            secretName: gcp-ccm-config
```

```bash
kubectl apply -f gcp-cloud-controller-manager.yaml
```

### Test LoadBalancer Service

```yaml
apiVersion: v1
kind: Service
metadata:
  name: test-lb
spec:
  type: LoadBalancer
  selector:
    app: test-app
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
        - name: app
          image: nginx:alpine
          ports:
            - containerPort: 8080
```

```bash
kubectl apply -f test-lb-app.yaml
```

### Verify

```bash
kubectl get pods -n kube-system -l app=gcp-ccm
```

**Expected Output**:

```bash
NAME                                               READY   STATUS    RESTARTS   AGE
gcp-cloud-controller-manager-d6b768dd9-abcde       1/1     Running   0          2m
```

```bash
kubectl get svc test-lb
```

**Expected Output**:

```bash
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
test-lb   LoadBalancer   10.106.37.54   34.123.45.67    80:30190/TCP   3m
```

## Documentation and Resources

* [Upstream repository: https://github.com/kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp)
* [Kubernetes Cloud Controller Manager Documentation](https://kubernetes.io/docs/concepts/architecture/cloud-controller/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### netcat

# netcat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/netcat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/netcat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image for Debian port of OpenBSD's netcat.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

```
docker run --rm -ti cgr.dev/chainguard/netcat -zv google.com 443
```

See [here](https://manpages.debian.org/unstable/netcat-openbsd/nc.1.en.html) for more invocation details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### infinispan

# infinispan
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/infinispan` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/infinispan/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Infinispan is a distributed cache [1] and key-value NoSQL in-memory database

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Infinispan image is designed to be a drop-in replacement for the [upstream infinispan/server](https://hub.docker.com/r/infinispan/server). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

## Getting Started

### Installation with Helm

Create a [`values.yaml`](https://github.com/infinispan/infinispan-helm-charts/blob/main/values.yaml) file that defines the Infinispan cluster configuration:

```yaml
images:
  server: cgr.dev/ORGANIZATION/infinispan:latest
```

Then, install the Infinispan Helm chart using the following command:

```shell
helm repo add infinispan https://charts.openshift.io/
helm install infinispan infinispan/infinispan -f values.yaml
```

### Running Infinispan with Docker

To run Infinispan using Docker, you can use the following command:

```shell
docker run -d \
    --name "infinispan" \
    -p 57800:57800 \
    -p 11222:11222 \
    -e USER=<USER> \
    -e PASS=<PASS> \
    cgr.dev/ORGANIZATION/infinispan:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the following below resources for further usage details.

## Resources
- [Getting Started with Infinispan](https://infinispan.org/get-started/)
- [Infinispan Configuration Guide](https://infinispan.org/docs/stable/titles/configuring/configuring.html)
- [Building and deploying Infinispan clusters with Helm](https://infinispan.org/docs/helm-chart/main/helm-chart.html)
- [infinispan-helm-charts](https://github.com/infinispan/infinispan-helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pytorch-fips

# pytorch-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pytorch-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pytorch-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based FIPS compliant image for pytorch, a Python package that provides two high-level features: Tensor computation with strong GPU acceleration and Deep neural networks built on a tape-based autograd system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s PyTorch FIPS container is a FIPS-enabled container image similar to the [pytorch/pytorch image](https://hub.docker.com/r/pytorch/pytorch), with several key differences:

* Chainguard images are using Wolfi Linux distribution, the `pytorch/pytorch` images are based on Ubuntu 22.04
* Chainguard images are running as `nonroot` user with home in `/home/nonroot` directory, while the `pytorch/pytorch` images are running as root user
* Chainguard images do not ship a full shell by default and their entrypoint is Python, while `pytorch/pytorch` uses Bash as the entrypoint
  (**NOTE**: Chainguard also provides `-dev` images that have a full shell and entrypoint can be set to `/bin/sh` or `/bin/bash` for such images)

### Compatibility Package

If you're running an older version of CUDA not supported by the container, you have the option to install [CUDA compatibility packages](https://docs.nvidia.com/deploy/cuda-compatibility/index.html).

First, install the compatibility package for your specific host OS using the NVIDIA package repository. Make sure to [install the package specific to your current version of CUDA](https://docs.nvidia.com/deploy/cuda-compatibility/index.html#installing-the-cuda-forward-compatibility-package).

Once the compatibility package has been installed, you can run the container in compatibility mode:

```sh
docker run --rm -it \
 -e LD_LIBRARY_PATH="/usr/local/cuda-12.9/compat" \
 cgr.dev/$ORGANIZATION/pytorch-fips
```

## Running pytorch

PyTorch has some prerequisites which need to be configured in the environment
prior to running with GPUs. For examples, please refer to [TESTING.md](https://github.com/chainguard-images/images/blob/main/images/pytorch/TESTING.md).

Additionally, please refer to the [upstream documentation](https://github.com/pytorch/pytorch)
for more information on configuring and using PyTorch.

Assuming the environment prerequisites have been met, below demonstrates how
to launch the container:

Set the following environment variable to the name of your organization or manually replace $ORGANIZATION in the following command:

```sh
ORGANIZATION=my-organization
```

```sh
docker run --rm -i -t \
    --privileged \
    --gpus all \
    cgr.dev/$ORGANIZATION/pytorch-fips:latest
```

## Testing GPU Access

If your environment has connected GPUs, you can check that PyTorch has access. First, set the following environment variable to the name of your organization or manually replace $ORGANIZATION in the following command:

```sh
ORGANIZATION=my-organization
```

```sh
docker run --rm -it --gpus all cgr.dev/$ORGANIZATION/pytorch-fips:latest
```

```
Python 3.11.9 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

### Adjusting LD_LIBRARY_PATH

If `torch` is unable to access connected GPUs, you may need to adjust your
`LD_LIBRARY_PATH` environment variable before launching Python. CUDA libraries
injected into your runtime environment are often not found where Chainguard
images expect them.

For example, if you've got CUDA 12.8 libraries installed through non-Chainguard
packages:

```sh
LD_LIBRARY_PATH=/usr/local/cuda-12.8/lib64:/usr/local/nvidia/lib64:/usr/lib/x86_64-linux-gnu
```

Chainguard's libraries install to `/usr/lib`, so anything outside of that will
need to be added to the `LD_LIBRARY_PATH`.

## Testing PyTorch

As a quick intro, we will use PyTorch to create a very simple deep learning model with two linear layers and an activation function. We’ll create an instance of it and ask it to report on its parameters. Running the below will fetch a [model_builder.py](https://github.com/chainguard-dev/pytorch-getting-started/blob/main/model_builder.py) script, place it in a folder on your host machine, and run the script in a PyTorch FIPS container from a volume.

First, set the following environment variable to the name of your organization or manually replace $ORGANIZATION in the following command:

```sh
ORGANIZATION=my-organization
```

```sh
mkdir -p pytorch-test &&\
 curl https://raw.githubusercontent.com/chainguard-dev/pytorch-getting-started/refs/heads/main/model_builder.py > pytorch-test/model_builder.py &&\
 docker run --rm -it -v "$PWD/pytorch-test:/tmp/pytorch-test" cgr.dev/$ORGANIZATION/pytorch-fips:latest /tmp/pytorch-test/model_builder.py
```

You may also consider running this [quickstart script](https://github.com/chainguard-images/images/blob/main/images/pytorch/tests/quickstart.py) based on the [official PyTorch quickstart tutorial](https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html) using the same approach as above.

### Using Helm charts

As a place to get started, you may also use this Helm chart to get PyTorch running

```sh
ORGANIZATION=my-organization
```

```sh
helm install pytorch \
  --namespace pytorch-space --create-namespace  \
  --set image.registry="cgr.dev" \
  --set image.repository="$ORGANIZATION/pytorch-fips" \
  --set image.tag=latest \
  --set containerSecurityContext.runAsUser=0 \
  --set containerSecurityContext.runAsNonRoot=false \
  --set containerSecurityContext.allowPrivilegeEscalation=true \
  --wait oci://registry-1.docker.io/bitnamicharts/pytorch
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-state-metrics-iamguarded-fips

# kube-state-metrics-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-state-metrics-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-state-metrics-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kube-state-metrics generates Prometheus metrics about Kubernetes objects

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `kube-state-metrics-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Kube-state-metrics IAMGuarded is a security-enhanced variant of kube-state-metrics designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard kube-state-metrics deployments.

## Helm Chart Installation

The Kube-state-metrics IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kube-state-metrics oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main kube-state-metrics image
image:
  registry: myregistry.example.com
  repository: mirrored/kube-state-metrics-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kube-state-metrics oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-state-metrics
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kube-state-metrics:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kube-state-metrics IAMGuarded installation by checking that metrics are being exposed correctly. The deployment functions as a standard kube-state-metrics instance, so all typical kube-state-metrics validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kube-state-metrics IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both kube-state-metrics and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Kube State Metrics Configuration

When using the Kube-Prometheus chart, you can override the Kube State Metrics image under the `kube-state-metrics` section in your `values.yaml`:

```yaml
"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### calico

# calico
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/calico` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/calico/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Calico](https://projectcalico.docs.tigera.io/) is a networking and security solution that enables Kubernetes workloads and non-Kubernetes/legacy workloads to communicate seamlessly and securely.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation

There are several ways you can install Calico onto a Kubernetes cluster. This document follows method recommended in the [official Calico documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart#install-calico) which involves using the Tigera Calico operator. 

#### Install Tigera Operator

```yaml
helm repo add projectcalico https://projectcalico.docs.tigera.io/charts
helm repo update

helm install calico projectcalico/tigera-operator \
    --namespace tigera-operator \
    --create-namespace \
    --set autoDiscovery.clusterName=foo \
    --set tigeraOperator.registry=cgr.dev \
    --set tigeraOperator.image=chainguard/tigera-operator \
    --set tigeraOperator.version=latest
```

After setting up and connecting to the Kubernetes cluster where you want to install Calico, install the Tigera Calico operator and custom resource definitions (CRDs).

#### Create ImageSet 

> For Calico versions < 3.28, omit `calico/key-cert-provisioner` in the example
> below, as this was only introduced in v3.28.

ImageSet is a CRD provided by the Tigera operator. It is required to define
which images are used for Calico deployments.

Note, we do not pass the registry or image names here, only the image digests.
The registry is passed when creating a Calico cluster.

```yaml
apiVersion: operator.tigera.io/v1
kind: ImageSet
metadata:
  name: calico-v3.26.1
spec:
  images:
    - image: calico/node
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-node:latest)
    - image: calico/cni
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-cni:latest)
    - image: calico/kube-controllers
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-kube-controllers:latest)
    - image: calico/pod2daemon-flexvol
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-pod2daemon-flexvol:latest)
    - image: calico/csi
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-csi:latest)
    - image: calico/typha
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-typha:latest)
    - image: calico/node-driver-registrar
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-node-driver-registrar:latest)
    - image: calico/key-cert-provisioner
      digest: ... # Replace with $(crane digest cgr.dev/chainguard/calico-key-cert-provisioner:latest)
    # This isn't used on Linux, but it needs to have a value containing a valid digest.
    - image: calico/windows-upgrade
      digest: sha256:0000000000000000000000000000000000000000000000000000000000000000
```

#### Using different image names

Providing an ImageSet allows you to specify alternative image digests, but it
does not allow you to swap in custom image names. If you wish to use images that
are named differently, you'll need to first re-tag them.

For example, `/some/registry/node-fips:` would need to be re-tagged to
`/some/registry/node:`. The digest would be the same for both image tags.

#### Create Calico installation

Once the ImageSet is completed, specify the image registry and the image prefix
to use.

Our images follow `calico-` naming format, i.e `calico-node`, do we define an
`imagePrefix`.

```yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  variant: Calico
  registry: cgr.dev
  imagePath: chainguard
  imagePrefix: calico-
```

The combination of these `ImageSet` and `Installation` CRDs serve as a drop in replacement for [Step 2 of the upstream documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart#install-calico). Together, these correctly rename the Calico images to their `cgr.dev` variants.

After creating the CRDs, you can ensure that the pods are running with a command like the following.

```shell
kubectl get pods -n calico-system
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kibana-fips

# kibana-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kibana-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kibana-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Notes

This build of Kibana is configured to run in FIPS mode with Node.js FIPS support enabled.

The `kibana-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Elastic license is required to use this image!

To run Kibana in FIPS mode, you will need to provide a license key. To obtain a license for Kibana/Elasticsearch, see their subscriptions page [here](https://www.elastic.co/subscriptions).

Chainguard recommends Platinum license.

## FIPS Mode Configuration Required

This image has FIPS mode enabled by default at the Node.js environment level. When deploying Kibana, you **must** configure it to run in FIPS mode by setting:

```yaml
xpack.security.fipsMode.enabled: true
```

Failure to set this configuration will result in a configuration mismatch error:
```
Configuration mismatch error. xpack.security.fipsMode.enabled is set to false and the configured Node.js environment has FIPS enabled
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-webhook

# rancher-webhook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-webhook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-webhook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Rancher Webhook

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. You can update the Rancher config setting to use this image.

For example:
```
cat > rancher-webhook.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: rancher-config
  namespace: cattle-system
data:
 "rancher-webhook": |
   image:
     repository: cgr.dev/${repo}/rancher-webhook 
     tag: ${webhook-version} 
EOF
kubectl apply -f rancher-webhook.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### authservice-fips

# authservice-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/authservice-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/authservice-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-dind-fips

# docker-dind-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-dind-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-dind-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for Docker in Docker (DinD), allowing you to run Docker within a container.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Docker FIPS Image is comparable to [the official Docker Image from Docker Hub](https://hub.docker.com/_/docker). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Support
The `docker-dind-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

To use the image you can either run in privileged mode after mounting sock path or run the image with --privileged flag
As an example of how you can use this image, run the container in detached mode by passing the `-d` argument and bind the Docker socket:

```shell
docker run --rm -it -d -v /var/run/docker.sock:/var/run/docker.sock --name my-dind cgr.dev/chainguard/docker-dind-fips sh
```

Following that, you can interact with the container using `docker exec`:

```shell
docker exec -it my-dind docker info
docker exec -it my-dind docker version
docker exec -it my-dind docker images
docker exec -it my-dind docker run --rm cgr.dev/chainguard/busybox echo "Hello from BusyBox"
```
Another example of how you can use this image, run the container in privileged mode by passing the `--privileged` flag:

```shell
docker run --name my-privileged-dind --rm --privileged -d cgr.dev/chainguard/docker-dind-fips
```

Following that, you can interact with the container using `docker exec`:

```shell
docker exec -it my-dind docker info
docker exec -it my-dind docker version
docker exec -it my-dind docker images
docker exec -it my-dind docker run --rm cgr.dev/chainguard/busybox echo "Hello from BusyBox"
```

## Documentation and Resources
- [Docker in Docker usage docs](https://hub.docker.com/_/docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hydra

# hydra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hydra` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hydra/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ory Hydra is a hardened, OpenID Certified OAuth 2.0 Server and OpenID Connect Provider optimized for low-latency, high throughput, and low resource consumption.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Hydra Image is comparable to the official [Hydra Image from Docker Hub](https://hub.docker.com/r/oryd/hydra). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
Chainguard image can be used as a drop in replacement in the Helm charts offered by Hydra.
 
The following is an example `values.yaml` file. Be sure to change the image repository and tag placeholders:

```
hydra:
  dev: true
  automigration:
    enabled: true
  config:
    dsn: "postgres://hydrauser:securepassword@postgres-postgresql.default.svc.cluster.local:5432/hydradb?sslmode=disable"
    urls:
      self:
        public: "https://hydra.example.com/"
        admin: "https://admin.hydra.example.com/"
      login: "https://auth.example.com/login"
      consent: "https://auth.example.com/consent"
    secrets:
      system:
        - "MY_SUPER_SECURE_SECRET_KEY"
image:
  repository: cgr.dev/ORGANIZATION/hydra
  tag: latest
```

Run helm install:
```
helm repo add ory https://k8s.ory.sh/helm/charts
helm install hydra ory/hydra --values values.yaml --wait
```
Following that, port forward the services:
```
kubectl port-forward -n default svc/hydra-admin 4445:4445 &
kubectl port-forward -n default svc/hydra-public 4444:4444 &
```
Next create a client:
```
CLIENT_INFO=$(kubectl exec -it $(kubectl get pods -n default -l app.kubernetes.io/name=hydra -o jsonpath='{.items[0].metadata.name}') -n default -- \
hydra create oauth2-client --endpoint http://127.0.0.1:4445 \
--name "my-client" \
--secret "my-secret" \
--grant-type client_credentials \
--response-type token \
--scope read,write \
--token-endpoint-auth-method client_secret_post --format json)
```

Extract Client ID from the JSON output:
```
CLIENT_ID=$(echo $CLIENT_INFO | jq -r '.client_id')
```

Check the clients with `kubectl`:
```
kubectl exec -it $(kubectl get pods -n default -l app.kubernetes.io/name=hydra -o jsonpath='{.items[0].metadata.name}') -n default -- \
hydra list oauth2-clients --endpoint http://127.0.0.1:4445
```

Finally, use the dynamically retrieved Client ID in the curl request to verify the token works:
```
curl -X POST \
-d "client_id=$CLIENT_ID" \
-d "client_secret=my-secret" \
-d "grant_type=client_credentials" \
-d "scope=read" \
http://127.0.0.1:4444/oauth2/token
```

## Documentation and Resources
- [Hydra quickstart documentation](https://www.ory.sh/docs/hydra/self-hosted/quickstart)
- [Hydra official helm chart](https://github.com/ory/k8s/tree/master/helm/charts/hydra)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nfs-subdir-external-provisioner

# nfs-subdir-external-provisioner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nfs-subdir-external-provisioner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nfs-subdir-external-provisioner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dynamic sub-dir volume provisioner on a remote NFS server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Testing

The NFS subdir external provisioner is an automatic provisioner for Kubernetes that uses your already configured NFS server, automatically creating Persistent Volumes.

To get more information about the nfs-subdir-external-provisioner, visit the [GitHub repository](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner).

There is a Helm chart available for the nfs-subdir-external-provisioner. To install it, run:

```
$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

$ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set image.repository=cgr.dev/chainguard/nfs-subdir-external-provisioner \
    --set image.tag=latest \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/exported/path
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3503

# request-3503
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3503` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3503/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### node-feature-discovery

# node-feature-discovery
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/node-feature-discovery` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/node-feature-discovery/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal wolfi-based image for node-feature-discovery, Node feature discovery for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `node-feature-discovery` container image is comparable to the official [upstream Node Feature Discovery (NFD) image](https://github.com/kubernetes-sigs/node-feature-discovery). Like other Chainguard Containers, `node-feature-discovery` was designed with minimalism in mind, and does not include tools such as a shell or package manager.

`node-feature-discovery` also has the following differences from the upstream image:

- **Paths and Configuration**: The image expects the NFD worker configuration file to be located at `/etc/kubernetes/node-feature-discovery/nfd-worker.conf` by default. You may need to map custom paths depending on your environment.
- **Compatibility with gRPC**: The Chainguard NFD image is designed with modern Kubernetes APIs in mind, so it might not support older, deprecated gRPC configurations that are available in upstream images. This aligns with best practices in Kubernetes, but may be a consideration for legacy systems.

## Getting Started

`node-feature-discovery` can be deployed using the [upstream Helm chart](https://artifacthub.io/packages/helm/node-feature-discovery/node-feature-discovery). Note that you will need to override the default image and tag used, replacing them with the Chainguard image, as with the following example `values.yaml` file:

```shell
image:
  repository: cgr.dev/ORGANIZATION/node-feature-discovery
  tag: latest
```

Use this values file to deploy `node-feature-discovery`:

```bash
helm repo add node-feature-discovery https://kubernetes-sigs.github.io/node-feature-discovery/charts
helm repo update

export NFD_NS=node-feature-discovery
helm install node-feature-discovery node-feature-discovery/node-feature-discovery \
  --namespace $NFD_NS --create-namespace \
  -f values.yaml
```

Refer to the [Helm chart documentation](https://artifacthub.io/packages/helm/node-feature-discovery/node-feature-discovery) for full instructions on how to use the Helm chart.

> [!NOTE]
> NFD is recommended to be run in a **Linux** environment for seamless integration. While it is possible to run this on **macOS**, additional configuration may be required (such as handling file system mounts and port exposure) due to Docker running inside a VM.

You can apply NFD resources using `kubectl`:

```shell
kubectl apply -k "https://github.com/kubernetes-sigs/node-feature-discovery/deployment/overlays/default?ref=master"
```

You can also check the status of pods:

```shell
kubectl -n node-feature-discovery get all
```
```
NAME                              READY   STATUS    RESTARTS   AGE
pod/nfd-gc-565fc85d9b-94jpj       1/1     Running   0          18s
pod/nfd-master-6796d89d7b-qccrq   1/1     Running   0          18s
pod/nfd-worker-nwdp6              1/1     Running   0          18s
...
```

## Documentation and Resources
- [Node Feature Discovery Documentation](https://kubernetes-sigs.github.io/node-feature-discovery/stable/get-started/index.html)
- [Node Feature Discovery GitHub Repository](https://github.com/kubernetes-sigs/node-feature-discovery)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openldap

# openldap
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openldap` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openldap/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenLDAP is a free, open-source implementation of the Lightweight Directory Access Protocol (LDAP) developed by the OpenLDAP Project.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-gateway-controller

# aws-gateway-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-gateway-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-gateway-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

AWS Application Networking is an implementation of the Kubernetes Gateway API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started
For initial setup and deployment of the AWS Gateway Controller, refer to the [official installation documentation](https://www.gateway-api-controller.eks.aws.dev/dev/guides/deploy/).

You can install the controller by either using a helm chart or using `kubectl`.
If you plan to use helm for installing, use the following flags to use the Chainguard's `aws-gateway-controller` image:
```
--set=image.repository= cgr.dev/ORGANIZATION/aws-gateway-controller \
--set=image.tag=latest
```

If you plan to apply the manifest using `kubectl`, ensure you replace the image reference `public.ecr.aws/aws-application-networking-k8s/aws-gateway-controller` with `cgr.dev/ORGANIZATION/aws-gateway-controller`.

Please refer to the [official installation guide](https://www.gateway-api-controller.eks.aws.dev/dev/guides/deploy/#install-the-controller) for the installation commands.

## Documentation and Resources
* [Official AWS Gateway API Controller documentation ](https://www.gateway-api-controller.eks.aws.dev/latest/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow-pipelines-visualization-server

# kubeflow-pipelines-visualization-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow-pipelines-visualization-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow-pipelines-visualization-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [ml-pipeline/visualization-server](https://github.com/kubeflow/pipelines/tree/master/backend/src/apiserver/visualization).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream `ml-pipeline/visualization-server` image.

To try it out, follow the [official installation
instructions](https://github.com/kubeflow/pipelines/tree/master/backend/src/apiserver/visualization#how-to-create-predefined-visualizations).

Please also notice the [known limitations](https://github.com/kubeflow/pipelines/tree/master/backend/src/apiserver/visualization#known-limitations) as described in the upstream documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dogstatsd

# dogstatsd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dogstatsd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dogstatsd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Standalone DogStatsD image for custom metrics collection

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's DogStatsD container image is comparable to [the DogStatsD image maintained by Datadog](https://hub.docker.com/r/datadog/dogstatsd). Like most other Chainguard container images, the DogStatsD image contains only the dependencies it needs to function, and doesn't run as root or include things like a package manager.

## Getting started

You can deploy a standalone DogStatsD instance that connects to Datadog using a daemonset like the following:
```
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dogstatsd
spec:
  selector:
    matchLabels:
      app: dogstatsd
  template:
    metadata:
      labels:
        app: dogstatsd
      name: dogstatsd
    spec:
      containers:
      - image: cgr.dev/ORGANIZATION/dogstatsd:latest
        imagePullPolicy: Always
        name: dogstatsd
        env:
          - name: DD_API_KEY
            value: ___value___
          - name: DD_DOGSTATSD_SOCKET
            value: "/socket/statsd.socket"
          - name: DD_ENABLE_METADATA_COLLECTION
            value: "false"
          - name: DD_HOSTNAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
        volumeMounts:
          - name: dsdsocket
            mountPath: /socket
      volumes:
        - hostPath:
            path: /var/run/dogstatsd
          name: dsdsocket
```
You will need to set env variables like `DD_API_KEY` and `DD_DD_URL` (for the Datadog intake URL). You can refer to the [DogStatsD documentation](https://github.com/DataDog/datadog-agent/tree/main/Dockerfiles/dogstatsd/alpine#how-to-run-it) for more information.

NOTE: If you face issues [connecting](https://github.com/DataDog/datadog-agent/issues/2480) to kubelet, you will need the right RBAC permissions along with this `env`:
```
- name: DD_KUBERNETES_KUBELET_HOST
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP
```

## Documentation and resources
- [Upstream Documentation](https://docs.datadoghq.com/developers/dogstatsd/?tab=hostagent#dogstatsd-client)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-messaging-topology-operator-iamguarded-fips

# rabbitmq-messaging-topology-operator-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-messaging-topology-operator-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-messaging-topology-operator-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ messaging topology operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `rabbitmq-messaging-topology-operator-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

RabbitMQ Messaging Topology Operator IAMGuarded is a security-enhanced component of the RabbitMQ Cluster Operator deployment. This image is designed to be deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, providing declarative management of RabbitMQ messaging topology (exchanges, queues, bindings, users, etc.) with additional security benefits.

## Helm Chart Installation

The RabbitMQ Messaging Topology Operator IAMGuarded image is deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION" \
  --set "msgTopologyOperator.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization. Note that the Messaging Topology Operator is enabled by default.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator (this image)
msgTopologyOperator:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "msgTopologyOperator.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ Messaging Topology Operator IAMGuarded installation by checking the operator pod status and creating sample RabbitMQ topology resources. The operator should be able to successfully manage exchanges, queues, bindings, users, and other RabbitMQ resources through custom resource definitions.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Messaging Topology Operator IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. This component ensures secure management of RabbitMQ messaging topology. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats-server-config-reloader-fips

# nats-server-config-reloader-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats-server-config-reloader-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats-server-config-reloader-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Monitors NATS configuration files and triggers reloads without restarting the server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides a secure, minimal environment for hot-reloading NATS server configurations. It maintains functional parity with the upstream [nats-server-config-reloader image](https://hub.docker.com/r/natsio/nats-server-config-reloader) and is compatible with NATS Server. Switching to the Chainguard image should not require changes to your existing Kubernetes setup, provided the config and PID file paths are correctly mounted.

### FIPS Support

The `nats-server-config-reloader-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The easiest way to deploy this image is with the [NATS Helm Chart](https://github.com/nats-io/k8s/tree/main/helm/charts/nats).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
 reloader:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/nats-server-config-reloader-fips
    tag: latest
    pullPolicy: IfNotPresent
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the nats with reloader enabled:

```shell
helm install nats nats/nats -f values.yaml --namespace default
```

Check that the pods are running:
```shell
kubectl get pods -n default
NAME                        READY   STATUS    RESTARTS   AGE
nats-0                      2/2     Running   0          2m
nats-box-xxx-yyy            1/1     Running   0          2m
```

Also you can check the container logs:
```shell
kubectl logs nats-0 -c reloader
2025/03/14 06:41:44 Starting NATS Server Reloader v
2025/03/14 06:41:44 Watching file: /etc/nats-config/nats.conf
2025/03/14 06:41:44 Live, ready to kick pid 7 on config changes (files=1)
```

## Documentation and Resources:

For more information, please refer to [the official documentation for nats project](https://docs.nats.io/).
- [Nats Server Config Reloader Github Repository](https://github.com/nats-io/nack)
- [NATS Helm Chart](https://github.com/nats-io/k8s/tree/main/helm/charts/nats)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### awx

# awx
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/awx` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/awx/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for AWX. Built on top of Ansible, AWX  is an automation controller that provides a web based interface, REST API, and task engine.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's AWX image is meant to serve as a drop-in replacement for the official AWX image. There is, however, a warning that can come up when using our image as non-root:

```shell
/usr/bin/launch_awx_task.sh: line 4: /etc/passwd: Permission denied
```

This originates from a known [open issue](https://github.com/ansible/awx/issues/13951) with AWX, although it does not affect the functionality of the image. Chainguard's image already configures the awx user with the permissions they later set dynamically. For further reference, take a look at the explanation from the upstream project [here](https://github.com/ansible/ansible-builder/blob/77f54f067a8f23361ae4e061876ad6705965604b/src/ansible_builder/_target_scripts/entrypoint#L6-L26).The [entrypoint script](https://github.com/ansible/awx/blob/14808cb99b54147f08ab37dc822c78ca94adbefc/tools/ansible/roles/dockerfile/files/launch_awx_task.sh#L3) dynamically checks and adds the user to `/etc/passwd` only if the `UID ≥ 500` and not already present. Although it's not generally recommended, you can run the Chainguard image as root to avoid this warning until the problem is fixed.

## Prerequisites

In order to follow the example in this overview, you will need to have the following in place.

* A **Kubernetes cluster**. 
* **kubectl** installed and configured to access the Kubernetes cluster.
* **Helm**: Installed and configured.
* An **Ansible playbook** If you are using outside of the AWX Operator environment

## Getting Started

Before getting started with AWX, we'll need to deploy the operator. To deploy the AWX operator, [follow the steps outlined by upstream here](https://github.com/ansible/awx-operator/blob/devel/docs/installation/basic-install.md). 

If you are unsure of how to deploy Chainguard's AWX Image, use this manifest as a reference, and modify for your use. Apply the manifest after the operator has been successfully deployed, and is in a ready state. 

```shell
cat <<EOF | kubectl -n awx apply -f -
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  image: cgr.dev/ORGANIZATION/awx
  image_version: latest
  image_pull_policy: Always
EOF
```

## Documentation and Resources
You can learn more about AWX by following the [official documentation](https://ansible.readthedocs.io/projects/awx/en/latest/). Additionally, you may ifnd [the API reference](https://ansible.readthedocs.io/projects/awx/en/latest/rest_api/index.html) to be of interest.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-kubeseal-fips

# sealed-secrets-kubeseal-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-kubeseal-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-kubeseal-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Kubeseal is used to for one-way encryption of secrets. While not intended to be deployed via a Helm chart, it is typically used in conjunction with Sealed Secrets to enable a GitOps-friendly workflow.

## FIPS Compliance
This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Encrypting Secrets with Docker

The `sealed-secrets-kubeseal-fips` image can be used to encrypt and/or validate the sealed secrets.

To seal a secret, run the image and mount the Kubernetes config file - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-fips \
  -o yaml \
  <secret.yaml >sealed-secret.yaml
```

This will encrypt contents of `secret.yaml` as `sealed-secret.yaml`.

It's also possible to validate a sealed secret using the `--validate` flag to make sure the sealed secret is correct - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-fips \
  --validate \
  <sealed-secret.yaml
```

### Applying Sealed Secrets

Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f sealed-secret.yaml
```

Sealed secrets controller needs to be running in the cluster for this to work. The `sealed-secrets-controller` Chainguard image can be used for this purpose.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4334

# request-4334
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4334` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4334/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-220

# request-220
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-220` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-220/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apko

# apko
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apko` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apko/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for running [apko](https://github.com/chainguard-dev/apko) container builds.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The [apko documentation](https://edu.chainguard.dev/open-source/apko/) can be found on Chainguard Academy. We encourage you to check out our guide on [getting started with apko](https://edu.chainguard.dev/open-source/apko/getting-started-with-apko/) which demonstrates how you can use Chainguard's apko image to build a base Wolfi image. 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### terragrunt-fips

# terragrunt-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/terragrunt-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/terragrunt-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A cloud infrastructure orchestration tool that supports OpenTofu/Terraform.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

**Note on Terraform/OpenTofu Support**: The Terragrunt maintainers [do not maintain the Docker images](https://github.com/gruntwork-io/terragrunt/issues/5271) and actively recommend OpenTofu over Terraform. We provide both options as separate image tags, to meet different organizational requirements: OpenTofu variants for open-source licensing needs (MPL-2.0) and Terraform variants for teams accepting BUSL-1.1 terms.

### FIPS Support

The `terragrunt-fips` Chainguard Image ships with FIPS-validated cryptographic modules. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Image Variants and Tags

Terragrunt requires either Terraform (BUSL-1.1 licensed) or OpenTofu (MPL-2.0 licensed) as a runtime dependency to operate. The Chainguard FIPS image provides these as separate image tags with FIPS-validated binaries, documented below:

### FIPS-Enabled Variants

1. **Base Terragrunt FIPS**
   - Tag: `latest-fips`
   - FIPS-validated Terragrunt without Terraform or OpenTofu
   - For building custom images or adding your own FIPS-validated IaC tool version
   - Example: `cgr.dev/ORGANIZATION/terragrunt:latest-fips`

2. **Terragrunt with Terraform FIPS**
   - Tags: `X.Y.Z-fips` (version number) or `tfX.Y.Z-fips` (explicit prefix)
   - FIPS-validated Terragrunt + FIPS-validated Terraform X.Y.Z
   - **Important**: Terraform is BUSL-1.1 licensed with commercial use restrictions
   - Example: `cgr.dev/ORGANIZATION/terragrunt:X.Y.Z-fips` or `cgr.dev/ORGANIZATION/terragrunt:tfX.Y.Z-fips`

3. **Terragrunt with OpenTofu FIPS**
   - Tags: `otfX.Y.Z-fips`
   - FIPS-validated Terragrunt + FIPS-validated OpenTofu X.Y.Z
   - OpenTofu is MPL-2.0 licensed with no commercial restrictions
   - Example: `cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z-fips`

### Tag Format
- `latest-fips` - Base Terragrunt only with FIPS validation
- `X.Y.Z-fips` - Terragrunt with Terraform X.Y.Z FIPS
- `tfX.Y.Z-fips` - Terragrunt with Terraform X.Y.Z FIPS, explicit prefix
- `otfX.Y.Z-fips` - Terragrunt with OpenTofu X.Y.Z FIPS

### Choosing the Right Variant

- **Choose `latest-fips`** if you're building a custom image with specific tool versions or using Terragrunt standalone with FIPS compliance
- **Choose Terraform FIPS tags (`X.Y.Z-fips` or `tfX.Y.Z-fips`)** if you need Terraform with FIPS validation, accept BUSL-1.1 licensing terms and are okay with the Terraform version rolling forward with image updates
- **Choose OpenTofu FIPS tags (`otfX.Y.Z-fips`)** if you need open-source licensing (MPL-2.0) with FIPS compliance and are okay with the OpenTofu version rolling forward with image updates

## Getting Started

Terragrunt is a thin wrapper for Terraform/OpenTofu that provides extra tools for keeping configurations DRY, working with multiple modules, and managing remote state.

### Basic Usage

Mount the local volume containing your Terragrunt project and terragrunt.hcl:

```sh
# Using base FIPS variant (Terragrunt only)
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:latest-fips --version

# Using Terraform FIPS variant
# Preview changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:X.Y.Z-fips plan
# Apply changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:X.Y.Z-fips apply

# Or with explicit prefix
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:tfX.Y.Z-fips plan

# Using OpenTofu FIPS variant (recommended for open-source)
# Preview changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z-fips plan
# Apply changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z-fips apply
```

### Using in Kubernetes

Terragrunt does not provide a Helm Chart or Kubernetes Operator. Their documentation suggests running a batch Job for scheduling:

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: infrastructure-deploy
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: terragrunt
        image: cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z-fips
        command: ["terragrunt"]
        args: ["apply", "-auto-approve"]
        workingDir: /apps
        volumeMounts:
        - name: terraform-code
          mountPath: /apps
      volumes:
      - name: terraform-code
        configMap:
          name: terraform-code
```

## Documentation and Resources

For more information about Terragrunt, refer to:

- [Terragrunt Official Documentation](https://terragrunt.gruntwork.io/docs/)
- [Terragrunt Quick Start Guide](https://terragrunt.gruntwork.io/docs/getting-started/quick-start/)
- [GitHub Repository](https://github.com/gruntwork-io/terragrunt)

For OpenTofu migration and documentation:
- [OpenTofu Documentation](https://opentofu.org/docs/)
- [Migration Guide](https://opentofu.org/docs/intro/migration/)

For FIPS compliance information:
- [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [NIST FIPS 140-2 Standards](https://csrc.nist.gov/publications/detail/fips/140/2/final)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5519

# request-5519
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5519` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5519/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Custom Kubernetes ingress controller implementation for HAProxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Use It!

You can use this image with the `haproxy-ingress` project's [Helm chart](https://artifacthub.io/packages/helm/haproxy-ingress/haproxy-ingress). To begin, add the Helm chart's repository.

```shell
helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
```

Then run the following command to retrieve the latest information about the charts in the repository you just added.

```shell
helm repo update
```

Then install `haproxy-ingress` with the following command. This command directs Helm to install it using Chainguard's `haprox-ingress:latest` image.

```shell
helm install ingress haproxy-ingress/haproxy-ingress \
  --set controller.image.repository="cgr.dev/ORGANIZATION/request-5519" \
  --set controller.image.tag="latest"
```

Run the following command to confirm that the Pod is running and ready to use.

```shell
kubectl wait --for=condition=ready pod --selector "app.kubernetes.io/name=haproxy-ingress" --timeout=120s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-process-exporter

# prometheus-process-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-process-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-process-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

process-exporter is an agent that collects process-specific metrics from a system and exposes them in a format that can be ingested by Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `prometheus-process-exporter` container image is comparable to the [ncabatoff/process-exporter](https://github.com/ncabatoff/process-exporter) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `prometheus-process-exporter` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting started

To get started, pull down the image with Docker:
```bash
docker pull cgr.dev/ORGANIZATION/prometheus-process-exporter
```

Now, you can run the image:
```bash
docker run --rm -p 9256:9256 cgr.dev/ORGANIZATION/prometheus-process-exporter:latest
```
This exposes metrics at `http://localhost:9256/metrics`.

### Kubernetes

Create a Deployment:

`deployment.yaml`:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-process-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-process-exporter
  template:
    metadata:
      labels:
        app: prometheus-process-exporter
    spec:
      containers:
      - name: prometheus-process-exporter
        image: cgr.dev/ORGANIZATION/prometheus-process-exporter:latest
        ports:
        - containerPort: 9256
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-process-exporter
spec:
  selector:
    app: prometheus-process-exporter
  ports:
    - protocol: TCP
      port: 9256
      targetPort: 9256
  type: ClusterIP
```

Apply the YAML:

```bash
kubectl apply -f deployment.yaml
```

Access metrics:

```bash
kubectl port-forward svc/prometheus-process-exporter 9256:9256
```

Now, you can access metrics at `http://localhost:9256/metrics`

## Documentation and Resources

- **[Official Documentation](https://github.com/ncabatoff/process-exporter#readme)**
- **[GitHub Repository](https://github.com/ncabatoff/process-exporter)**
- **[Grafana Alloy Process Exporter Integration](https://grafana.com/docs/alloy/latest/reference/components/prometheus/prometheus.exporter.process/)**
- **[Grafana Agent process_exporter_config](https://grafana.com/docs/agent/latest/static/configuration/integrations/process-exporter-config/)**
- **[Prometheus Exporters Overview](https://prometheus.io/docs/instrumenting/exporters/)**
- **[Process Exporter Dashboard for Grafana](https://grafana.com/grafana/dashboards/22161-process-exporter-dashboard/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-fips

# memcached-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Memcached](https://memcached.org/) is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `memcached-fips` container image is comparable to the [memcached image](https://hub.docker.com/_/memcached) with these differences:

- Runs as user `memcached` (uid `65532`) instead of `memcache` (uid `11211`)

### FIPS Support

This Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started

The default memcached port is 11211. To run with Docker using default configuration:

```shell
docker run -p 11211:11211 --rm cgr.dev/ORGANIZATION/memcached-fips:latest
```

Test the connection:

```shell
echo -e 'stats\nquit' | nc localhost 11211
```

## Documentation and Resources

- [Memcached Documentation](https://memcached.org/)
- [Memcached GitHub Repository](https://github.com/memcached/memcached)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-volume-node-cleanup

# local-volume-node-cleanup
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-volume-node-cleanup` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-volume-node-cleanup/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The local volume node cleanup controller removes PersistentVolumes and PersistentVolumeClaims that reference deleted Nodes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is an example of how to deploy the local volume node cleanup controller in the [official documentation](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/node-cleanup-controller.md#usage), but here is a quick guide:

```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/node-cleanup-controller/rbac.yaml

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/node-cleanup-controller/deployment.yaml
        
kubectl set image deployment/local-volume-node-cleanup-controller local-volume-node-cleanup-controller="cgr.dev/chainguard/local-volume-node-cleanup:latest"
```

Do not forget to change the arguments in the deployment file to match your environment. Because in the documentation, they mentinoded that these are the (optional) important arguments that are highly recommended to be used: https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/node-cleanup-controller.md#important-optional-arguments-that-are-highly-recommended-to-be-used

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-bit-watcher

# fluent-bit-watcher
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-bit-watcher` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-bit-watcher/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The `fluent-bit-watcher` image is a wrapper around the `fluent-bit` image. It watches the `watch-path` for changes and restarts `fluent-bit` whenever a change is detected.

You can use Helm to deploy `fluent-bit-watcher` with the following steps:

Add the `fluent` Helm repository:

```shell
helm repo add fluent https://fluent.github.io/helm-charts
```
Add the following to your `values.yaml` file:

```yaml
image:
  repository: cgr.dev/chainguard-private/fluent-bit-watcher
  tag: latest
command: "/fluent-bit/bin/fluent-watcher"
args:
- "-c=/fluent-bit/etc/conf/fluent-bit.conf"
- "-watch-path=/fluent-bit/etc/conf"
```

Then install the chart:

```shell
helm upgrade --install fluent-bit \
    -f values.yaml \
    fluent/fluent-bit
``` 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falcoctl-fips

# falcoctl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falcoctl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falcoctl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-exporter-fips

# cert-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal FIPS image for cert-exporter: an application that exports certificate expiration metrics from disk, Kubernetes, and AWS Secrets Manager to Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cert-exporter-fips` image is a drop-in replacement for the upstream [joe-elliott/cert-exporter](https://hub.docker.com/r/joeelliott/cert-exporter) container image. It is fully compatible with the official [cert-exporter Helm chart](https://joe-elliott.github.io/cert-exporter/) and supports all core functionality, including scanning certificates from disk, Kubernetes secrets, and exporting expiration metrics to Prometheus. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `cert-exporter-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [cert-exporter Helm chart](https://github.com/joe-elliott/cert-exporter/tree/master/helm/cert-exporter). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cert-exporter-fips
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `cert-exporter` helm chart

```shell
helm repo add cert-exporter https://joe-elliott.github.io/cert-exporter/
helm repo update
helm install cert-exporter cert-exporter/cert-exporter --namespace monitoring --create-namespace -f values.yaml --wait
```

## Documentation
- [Cert-Exporter Github Repository](https://github.com/joe-elliott/cert-exporter/tree/master)
- [Cert-Exporter Helm Chart](https://joe-elliott.github.io/cert-exporter/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-iamguarded-fips

# memcached-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Memcached](https://memcached.org/) is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `memcached-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Memcached IAMGuarded is a security-enhanced variant of Memcached designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Memcached deployments.

## Helm Chart Installation

The Memcached IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Memcached image
image:
  registry: myregistry.example.com
  repository: mirrored/memcached-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/memcached-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/memcached:1.6.38
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Memcached IAMGuarded installation using standard Memcached verification methods. The deployment functions as a standard Memcached instance, so all typical Memcached validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Memcached IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Memcached and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5948

# request-5948
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5948` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5948/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A custom build of dcgm-exporter-fips without setcap SYS_ADMIN

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

DCGM-Exporter is a tool based on the Go APIs to NVIDIA DCGM that allows users to gather GPU metrics and understand workload behavior or monitor GPUs in clusters. DCGM Exporter is written in Go and exposes GPU metrics at an HTTP endpoint (/metrics) for monitoring solutions such as Prometheus.

To test the functionality of NVIDIA DCGM Exporter Image, it requires an environment with connected GPUs. If you have connected GPUs, here's one way to use this image:

### Using Docker 

#### Run Image

Install [Docker Engine](https://docs.docker.com/engine/install/ubuntu/) and configure it with your credentials to pull image

Run the image:

```bash
docker run -d --rm \
   --gpus all \
   --net host \
   cgr.dev/ORGANIZATION/request-5948:latest \
   -f /etc/dcgm-exporter/dcp-metrics-included.csv
```

### Helm Installation 

Step 1: Add and Update Helm Repository
Add the NVIDIA  DCGM Exporter repository and update it to ensure you have access to the latest charts.

```shell
$ helm repo add gpu-helm-charts \
   https://nvidia.github.io/dcgm-exporter/helm-charts

$ helm repo update
```

Step 2: Install NVIDIA DCGM Exporter

Install NVIDIA DCGM Exporter using Helm with the specified version, namespace, and optional configuration settings.

```shell
$ helm install \
  --generate-name \
  gpu-helm-charts/dcgm-exporter \
  --set image.repository=cgr.cgr.dev/ORGANIZATION/request-5948 \
  --set image.tag=latest
```

For more information and setting it up with prometheus stack, refer to the official documentation:
- [Helm Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/latest/kube-prometheus.html#setting-up-prometheus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager

# cert-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wolfi-based images for [cert-manager](https://cert-manager.io), a tool for provisioning and managing TLS certificates in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cert-manager images are comparable to the official cert-manager tools found in [the project's official GitHub repository](https://github.com/cert-manager/cert-manager).  

## Getting Started

cert-manager is composed of multiple container images:

```shell
cgr.dev/$ORGANIZATION/cert-manager-controller:latest
cgr.dev/$ORGANIZATION/cert-manager-cainjector:latest
cgr.dev/$ORGANIZATION/cert-manager-acmesolver:latest
cgr.dev/$ORGANIZATION/cert-manager-webhook:latest
```

These can be deployed separately, but are typically deployed together leveraging the official [cert-manager Helm chart](https://cert-manager.io/docs/installation/helm/).

The following is an example of how to use Chainguard's cert-manager images with the official Helm chart:

```shell
# Replace `--version` accordingly, refer to Helm chart documentation.
helm install \
  cert-manager jetstack/cert-manager \
	--namespace cert-manager \
	--create-namespace \
	--version v1.13.3 \
	--set image.repository=cgr.dev/$ORGANIZATION/cert-manager-controller \
	--set image.tag=latest \
	--set cainjector.image.repository=cgr.dev/$ORGANIZATION/cert-manager-cainjector \
	--set cainjector.image.tag=latest \
	--set acmesolver.image.repository=cgr.dev/$ORGANIZATION/cert-manager-acmesolver \
	--set acmesolver.image.tag=latest \
	--set webhook.image.repository=cgr.dev/$ORGANIZATION/cert-manager-webhook \
	--set webhook.image.tag=latest \
	--set installCRDs=true
```

Be sure to replace `$ORGANIZATION` with the name used for your organization's private repository within the Chainguard registry. Additionally, please note that if the required CRDs are not available in the cluster, the Helm chart will fail if `--set installCRDs=true` is omitted.

## Documentation and Resources

Please refer to the [upstream documentation](https://cert-manager.io/docs/installation/helm/) for full instructions on how to use and deploy cert-manager with Helm.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-issuer-fips

# step-issuer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-issuer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-issuer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS image of [step-issuer](https://smallstep.com/docs/platform/), a certificate issuer for cert-manager using step-ca as a backend CA.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `step-issuer-fips` image is a minimal drop-in replacement for the upstream [smallstep/step-issuer](https://hub.docker.com/r/smallstep/step-issuer/tags). It is fully compatible with the [cert-manager](https://cert-manager.io/) framework and the official [Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer), enabling the issuance of X.509 certificates using a [step-ca](https://smallstep.com/docs/step-ca/) instance as the backend Certificate Authority. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `step-issuer-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [step-issuer Helm chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/step-issuer-fips
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `step-issuer` helm chart.

```shell
helm repo add smallstep https://smallstep.github.io/helm-charts
helm repo update
helm install step-issuer smallstep/step-issuer --namespace step-system --create-namespace --values values.yaml --wait
```

### Using the StepIssuer

Once installed, `step-issuer` allows cert-manager to request certificates from a `step-ca` instance.

Here is an example of how to configure a StepClusterIssuer and request a certificate:

1. Create a `StepIssuer`

```yaml
apiVersion: cert-manager.step.sm/v1beta1
kind: StepIssuer
metadata:
  name: step-issuer
spec:
  provisioner:
    name: admin
    passwordRef:
      name: step-ca-provisioner-password
      key: password
  caBundle: |
    -----BEGIN CERTIFICATE-----
    MIIB...
    -----END CERTIFICATE-----
  url: https://step-ca.step-system.svc.cluster.local
```

Note: The `caBundle` should contain the PEM-encoded root certificate from your step-ca.
You can extract it using:
```bash
kubectl get configmap step-ca-step-certificates-certs -n step-system -o jsonpath="{.data['root_ca.crt']}"
```

The `StepIssuer` is a custom resource provided by step-issuer that integrates with cert-manager. It defines how cert-manager should connect to your step-ca Certificate Authority to request and renew certificates.

2. Request a Certificate using cert-manager

```yaml
apiVersion: cert-manager.io/v1
kind: CertificateRequest
metadata:
  name: test-cert
  namespace: step-system
spec:
  request: <BASE64_ENCODED_CSR>
  duration: 24h
  issuerRef:
    name: step-issuer
    kind: StepIssuer
    group: cert-manager.step.sm
```

Note: The `request` field must be a base64-encoded CSR in DER format. You can generate a CSR using OpenSSL or step CLI, then base64-encode it before pasting.

The above resource will submits the CSR to the `step-issuer`, which will request a signed certificate from the step-ca. Once approved, the signed certificate will be returned in the `status.certificate` field of the CertificateRequest resource.

## Documentation and Resources
- [Step-issuer Github Repository](https://github.com/smallstep/step-issuer)
- [Step-issuer Helm Chart](https://github.com/smallstep/helm-charts/tree/master/step-issuer)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elixir-fips

# elixir-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elixir-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elixir-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Elixir applications with FIPS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's elixir image is comparable to the [upstream elixir image](https://hub.docker.com/_/elixir). Switching to the Chainguard image should not require any changes to your existing setup. 

By default, the `elixir-fips` Chainguard Image runs as a non-root user. You may need to use `USER root` to perform tasks requiring elevated privileges.

### FIPS Support

The `elixir-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it cgr.dev/ORGANIZATION/elixir-fips:latest
```

You can also use it for development by using the `-dev` variant, which includes [rebar3](https://github.com/erlang/rebar3).

```Dockerfile
FROM cgr.dev/ORGANIZATION/elixir-fips:latest-dev

RUN tee /usr/local/bin/app.exs <<EOF
IO.puts("Hello, World!")
EOF

ENTRYPOINT [ "elixir" ]
CMD [ "/usr/local/bin/app.exs" ]
```

## Documentation References

- [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [Elixir documentation](https://elixir-lang.org/docs.html)
- [Phoenix framework documentation](https://hexdocs.pm/phoenix/up_and_running.html)
- [Erlang documentation](https://www.erlang.org/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gogatekeeper

# gogatekeeper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gogatekeeper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gogatekeeper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image of Gatekeeper, an OpenID / Proxy service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard GoGatekeeper Image is comparable to the [official GoGatekeeper Image from Quay.io](https://quay.io/repository/gogatekeeper/gatekeeper?tab=tags&tag=latest). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

To get started with Chainguard's GoGatekeeper Image, an instance of Keycloak must be running.
There are various ways to run Keycloak such as using [Docker](https://www.keycloak.org/getting-started/getting-started-docker), [Kubernetes](https://www.keycloak.org/getting-started/getting-started-kube), or using a playground environment like [Keycloakkit](https://keycloakkit.com).

> **NOTE**: Chainguard already provides an image for Keycloak, which can be found [here](https://images.chainguard.dev/directory/image/keycloak/versions).

For this example, we will be examining the Keycloakkit playground environment. Once you setup your Keycloak realm with Keycloakkit, you will have realms, users and predefined roles so we will have all the necessary information to test the GoGatekeeper image.

In this example, we will verify that an admin user can access the web console and a regular user cannot. To do that we will be deploying a web application right alongside the GoGatekeeper container.

First, we have to create a configuration file for GoGatekeeper. This file will contain the configuration for the GoGatekeeper container and the web application and will be deployed as a ConfigMap in Kubernetes.

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: gatekeeper-config
data:
  keycloak-gatekeeper.conf: |+
    discovery-url: https://auth.keycloakkit.com/realms/<your-realm> # this should be the URL of your Keycloak realm
    enable-default-deny: false
    secure-cookie: false
    client-id: <your-client-id>
    client-secret: <your-client-secret>
    listen: :3000
    encryption-key: AgXa7xRcoClDEU0ZDSH4X0XhL5Qy2Z2j # dummy encryption key
    upstream-url: http://127.0.0.1:80
    resources:
    - uri: /*
      roles:
        - default-roles-<your-realm>
    - uri: /public/*
      white-listed: true
    - uri: /favicon
      white-listed: true
    - uri: /css/*
      white-listed: true
    - uri: /img/*
      white-listed: true
```

This configuration file will be used to configure the GoGatekeeper container. The `discovery-url` field should point to the Keycloak realm created in Keycloakkit. The `client-id` and `client-secret` fields should be set to the client ID and secret created in Keycloakkit.

Now we can deploy the GoGatekeeper container and the web application.

```yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: api-test
  name: api-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-test
  template:
    metadata:
      labels:
        app: api-test
    spec:
      containers:
        - name: api-test
          image: yeasy/simple-web:latest
        - name: gatekeeper
          image: cgr.dev/ORGANIZATION/gogatekeeper:latest
          args:
            - --config=/etc/keycloak-gatekeeper.conf
          ports:
            - containerPort: 3000
          volumeMounts:
            - name: gatekeeper-config
              mountPath: /etc/keycloak-gatekeeper.conf
              subPath: keycloak-gatekeeper.conf
      volumes:
        - name: gatekeeper-config
          configMap:
            name: gatekeeper-config
```

Then:

```bash
kubectl port-forward deployment/api-test 3000:3000
```

Now, we should be able to access the web application at http://localhost:3000. When we try to access the web application, we will be redirected to the Keycloak login page. After logging in with an admin user, we should be able to access the web application.

## Documentation and Resources

- [GoGatekeeper Documentation](https://gogatekeeper.github.io/gatekeeper/)
- [GoGatekeeper GitHub Repository](https://github.com/gogatekeeper/gatekeeper)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-agent-operator

# grafana-agent-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-agent-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-agent-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-aws

# cloud-provider-aws
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-aws` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-aws/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cloud provider for AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is an Helm chart where you could use to deploy the cloud-provider-aws in your Kubernetes cluster. You can find the chart [here](https://cloud-provider-aws.sigs.k8s.io).

But please make sure that you read the prerequisites here: [https://cloud-provider-aws.sigs.k8s.io/prerequisites/)

Here is the command to install the cloud-provider-aws's Helm chart:

```bash
helm repo add aws-cloud-controller-manager https://kubernetes.github.io/cloud-provider-aws
helm repo update

helm upgrade --install aws-cloud-controller-manager aws-cloud-controller-manager/aws-cloud-controller-manager \
  --set image.repository=cgr.dev/ORGANIZATION/cloud-provider-aws \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-startupapicheck

# cert-manager-startupapicheck
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-startupapicheck` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-startupapicheck/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automatically provision and manage TLS certificates in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the upstream Startup API Check image from [cert-manager](https://github.com/cert-manager/cert-manager). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

To configure Chainguard's cert-manager Startup API Check image, you can run a command like the following:

```shell
helm upgrade cert-manager jetstack/cert-manager \
  --install \
  --namespace cert-manager \
  --wait \
  --set startupapicheck.image.repository=cgr.dev/ORGANIZATION/cert-manager-startupapicheck \
  --set startupapicheck.image.tag=latest
```

## Documentation and Resources
* [cert-manager Startup API Check Documentation](https://artifacthub.io/packages/helm/cert-manager/cert-manager/#startup-api-check)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-exporter-fips

# memcached-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A memcached exporter for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is the FIPS version of Chainguard's Memcached Exporter image, which is itself a drop-in replacement for the [prom/memcached-exporter](https://hub.docker.com/r/prom/memcached-exporter/tags) image. 

By default this image runs as a non-root user named `nonroot` with a UID of `65532`.

## Getting Stasrted

By default the memcached-exporter serves on port 0.0.0.0:9150 at /metrics:

```sh
docker run -p 9150:9150 cgr.dev/chainguard/memcached-exporter-fips:latest
```
```
time=2024-11-22T07:33:29.920Z level=INFO source=main.go:62 msg="Starting memcached_exporter" version="(version=, branch=, revision=ceb946ecae3aace775a0becb8233ca3890a829c3-modified)"
time=2024-11-22T07:33:29.920Z level=INFO source=main.go:63 msg="Build context" context="(go=go1.23.3 X:systemcrypto, platform=linux/amd64, user=, date=, tags=netgo,osusergo)"
time=2024-11-22T07:33:29.921Z level=INFO source=tls_config.go:347 msg="Listening on" address=[::]:9150
time=2024-11-22T07:33:29.921Z level=INFO source=tls_config.go:350 msg="TLS is disabled." http2=false address=[::]:9150
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bash

# bash
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bash` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bash/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image with only Bash and libc. Suitable for running any small scripts or binaries that need Bash instead of the BusyBox shell.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Bash image is meant to serve as a drop-in replacement for the official Bash image from Docker Hub. One notable difference between the Docker Hub image and Chainguard's Bash image is the location where `bash` is installed in the container. The Bash Image from Docker Hub has `bash` installed at `/usr/local/bin/bash` while Chainguard's has it installed at the standard `/bin/bash`.

Like most of Chainguard's images, the Bash image does not operate as the root user and includes only the minimum packages needed to function. 

## Getting Started

To open up an interactive shell in the Bash Image you could run a command like the following:

```sh
docker run -it cgr.dev/chainguard/bash:latest /bin/bash
```

To test scripts from your local machine on the Bash image, you can use a [bind mount](https://docs.docker.com/engine/storage/bind-mounts/). The following example references a local script named `local-script.sh`, binds it to the container while renaming it `container-script.sh`, and then runs the script:

```sh
docker run -v /path/to/local-script.sh:/container-script.sh cgr.dev/chainguard/bash:latest /container-script.sh
```

You can also test scripts on the Bash image using a Dockerfile. The following example Dockerfile references a Bash script named `test-script.sh`:

```
FROM cgr.dev/chainguard/bash:latest

COPY test-script.sh /

CMD ["bash", "/test-script.sh"]
```

You could then build an image based off this Dockerfile:

```sh
docker build -t my-bash-app .
```

And then run the new image to test the script:

```sh
docker run -it --rm --name my-running-app my-bash-app
```

## Documentation and Resources

* [Vulnerability Comparison: bash](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/bash/)
* (Tutorial) [An Introduction to Shell Scripting](https://www.digitalocean.com/community/tutorial-series/an-introduction-to-shell-scripting)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mlflow-iamguarded

# mlflow-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mlflow-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mlflow-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MLflow IAMGuarded is a security-enhanced variant of MLflow designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides a complete MLflow deployment with tracking server, artifact storage, and database backend, all with additional security benefits over standard MLflow deployments.

## Helm Chart Installation

The MLflow IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mlflow
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mlflow oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mlflow \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MLflow image
image:
  registry: myregistry.example.com
  repository: mirrored/mlflow-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Git image for repository integrations
gitImage:
  image:
    registry: myregistry.example.com
    repository: mirrored/git-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Wait container image for initialization
waitContainer:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mlflow oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mlflow@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mlflow
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mlflow:2.0.0
   Digest: sha256:61485fe902828b2859684d8d99df394878131eb6590f738bfa7f6f1f43eb8174
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MLflow IAMGuarded installation by accessing the MLflow UI through the service endpoint. The deployment functions as a standard MLflow tracking server, so all typical MLflow validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MLflow IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MLflow and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### splunk-otel-collector-fips

# splunk-otel-collector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/splunk-otel-collector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/splunk-otel-collector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Splunk OpenTelemetry Collector is a distribution of the OpenTelemetry Collector. It provides a unified way to receive, process, and export metric, trace, and log data for Splunk Observability Cloud

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`splunk-otel-collector-fips` is built using this guide https://github.com/signalfx/splunk-otel-collector/blob/main/cmd/otelcol/fips/Dockerfile as reference to ensure compatibility with projects running this version of the application as a docker image, with the following differences:

- Like all other Chainguard Images, `splunk-otel-collector-fips` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user

Most importantly, the `splunk-otel-collector-fips` image contains the OpenSSL FIPS Provider Module (CMVP [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282)).

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

Splunk OpenTelemetry Collector is a distribution of the OpenTelemetry Collector. It provides a unified way to receive, process, and export metric, trace, and log data for Splunk Observability Cloud. Here is an example setup of the collector to ingest metrics from a Redis server.

### Requirements

1. Configuration for the OpenTelemetry Collector deployed with a configMap
2. Configuration for the Redis server deployed with a configMap

The following is an example `otel-collector.yaml` configuration file:

```
apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-config
  namespace: splunk
data:
  otel-collector-config.yaml: |
    receivers:
      redis:
        endpoint: "localhost:6379"
        collection_interval: 10s
        password: $REDIS_PASSWORD
        metrics:
          redis.role:
            enabled: true
          redis.cmd.calls:
            enabled: true
    extensions:
      health_check:
        endpoint: 0.0.0.0:13133
      zpages:
        endpoint: 0.0.0.0:55679
    processors:
      batch:
    exporters:
      signalfx:
        access_token: "token"
        realm: "us0"
      debug:
        verbosity: detailed
    service:
      telemetry:
        metrics:
          address: ":8888"
      pipelines:
        metrics/sfx:
          receivers: [redis]
          processors: [batch]
          exporters: [signalfx]
        metrics/logging:
          receivers: [redis]
          processors: [batch]
          exporters: [debug]

```

More information can be found in the [Otel collector examples folder](https://github.com/signalfx/splunk-otel-collector/tree/main/examples).

To test out this image, deploy an `otel-collector` pod in a Kubernetes cluster:

```
apiVersion: v1
kind: Pod
metadata:
  name: redis-otel-pod
  namespace: splunk
spec:
  serviceAccount: default
  containers:
    - name: redis-db
      image: redis:latest
      command: ["redis-server", "/etc/redis/redis.conf"]
      ports:
        - containerPort: 6379
        - containerPort: 6329
      volumeMounts:
        - name: redis-config
          mountPath: /etc/redis/redis.conf
          subPath: redis.conf

    - name: otelcollector
      image: ${local.parsed.registry}/${local.parsed.repo}:${local.parsed.pseudo_tag}
      args:
        - "--config=/etc/otel-collector-config.yaml"
        - "--set=service.telemetry.logs.level=debug"
      env:
        - name: SPLUNK_ACCESS_TOKEN
          value: "token"
        - name: SPLUNK_REALM
          value: "us0"
        - name: REDIS_PASSWORD
          value: "changeme"
      ports:
        - containerPort: 8088
          name: otel-http
        - containerPort: 8888
          name: otel-grpc
      volumeMounts:
        - name: otel-config
          mountPath: /etc/otel-collector-config.yaml
          subPath: otel-collector-config.yaml

  volumes:
    - name: otel-config
      configMap:
        name: otel-config
    - name: redis-config
      configMap:
        name: otel-config
```

Ensure that the container is up and running and ensure that the metric counts have been ingested by the collector

```
kubectl -n splunk logs redis-otel-pod -c otelcollector 2>&1 | \
  grep "Metrics" | head -n 1 | jq -R 'split(",") | \
  map(select(contains("\"metrics\":"))) | map(split(": ")[1] | tonumber) | .[0] > 10'

```

The test above is to validate that metrics, in the case from a redis container are been collected by the otel collector service.

## Documentation and Resources

1. https://github.com/signalfx/splunk-otel-collector - Main project repository
2. https://github.com/signalfx/splunk-otel-collector/tree/main/examples - Deployment scenarios
3. https://github.com/signalfx/splunk-otel-collector-chart - Helm chart
4. https://docs.splunk.com/observability/en/gdi/opentelemetry/opentelemetry.html

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### malcontent

# malcontent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/malcontent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/malcontent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Enumerate binary capabilities, including malicious behaviors.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard's `malcontent` image provides the official containerized distribution of [`malcontent`](https://github.com/chainguard-dev/malcontent), a tool developed and maintained by Chainguard to analyze ELF binaries and container images for malicious behavior and risky capabilities. It runs as a non-root user by default and adheres to Chainguard's security-focused best practices.

## Getting Started

You can use the official `malcontent` image to analyze local binaries or container images with ease:

To analyze a local binary file:
```bash
docker run --rm \
    -v $(pwd)/target:/scan \
    cgr.dev/ORGANIZATION/malcontent analyze /scan/binary
```

To scan a container image for potentially malicious behaviors:
```bash
docker run --rm cgr.dev/ORGANIZATION/malcontent --image alpine:latest
```

To perform a diff between two binaries:
```bash
docker run --rm -v $(pwd):/work cgr.dev/ORGANIZATION/malcontent diff /work/binary1 /work/binary2

```
## Documentation and Resources
For more details about malcontent, visit the upstream project’s GitHub repository: [malcontent](https://github.com/chainguard-dev/malcontent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-server-iamguarded-fips

# metrics-server-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-server-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-server-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Metrics Server is a Kubernetes component that collects and provides resource usage metrics (CPU, memory) for nodes and pods

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Metrics Server IAMGuarded FIPS is a security-enhanced, FIPS-compliant variant of metrics-server designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard metrics-server deployments, with FIPS 140-2 cryptographic compliance.

## Helm Chart Installation

The Metrics Server IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install metrics-server oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server \
  --set "global.org=$ORGANIZATION" \
  --set "image.repository=metrics-server-iamguarded-fips"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### FIPS Image Configuration
To use the FIPS variant, you must override the default image repository:
- Set `image.repository=metrics-server-iamguarded-fips` to use the FIPS-compliant image
- Alternatively, configure via `values.yaml`:

```yaml
image:
  repository: metrics-server-iamguarded-fips
```

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main metrics-server FIPS image
image:
  registry: myregistry.example.com
  repository: mirrored/metrics-server-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install metrics-server oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "image.repository=metrics-server-iamguarded-fips"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/metrics-server
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/metrics-server:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Metrics Server IAMGuarded FIPS installation by checking that metrics are being exposed correctly:

```bash
# Check if metrics-server is running
kubectl get pods -n kube-system | grep metrics-server

# Test metrics API
kubectl top nodes
kubectl top pods --all-namespaces
```

The deployment functions as a standard metrics-server instance, so all typical metrics-server validation procedures apply.

## FIPS Compliance

This image is built with FIPS 140-2 validated cryptographic modules, making it suitable for environments that require FIPS compliance. The FIPS-validated cryptographic libraries ensure that all cryptographic operations meet federal security standards.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Metrics Server IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both metrics-server and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-startupapicheck-fips

# cert-manager-startupapicheck-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-startupapicheck-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-startupapicheck-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automatically provision and manage TLS certificates in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`cert-manager-startupapicheck-fips` is the FIPS version of our cert-manager-startupapicheck image.

## Getting Started

To configure Chainguard's cert-manager Startup API Check image, you can run a command like the following:

```shell
helm upgrade cert-manager jetstack/cert-manager \
  --install \
  --namespace cert-manager \
  --wait \
  --set startupapicheck.image.repository=cgr.dev/ORGANIZATION/cert-manager-startupapicheck-fips \
  --set startupapicheck.image.tag=latest
```

## Documentation and Resources
* [cert-manager Startup API Check Documentation](https://artifacthub.io/packages/helm/cert-manager/cert-manager/#startup-api-check)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton

# tekton
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

[Tekton Chains](https://tekton.dev/docs/chains/) provides additional supply chain security features.

The [Tekton CLI](https://tekton.dev/docs/cli/) is a command-line interface for Tekton.

## Usage

These images a drop-in replacement for the upstream images.

You can use an [upstream release](https://github.com/tektoncd/pipeline/releases) and replace the released images with those from Chainguard.

```shell
curl -sL https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-controller|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-entrypoint|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/events[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-events|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/nop[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-nop|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/resolvers[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-resolvers|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/sidecarlogresults[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-sidecarlogresults|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/webhook[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-webhook|g" | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/workingdirinit[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-workingdirinit|g" | \
    kubectl apply -f -
```

For Tekton Chains:

```shell
curl -sL https://storage.googleapis.com/tekton-releases/chains/latest/release.yaml | \
    sed "s|gcr.io/tekton-releases/github.com/tektoncd/chains/cmd/controller[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-chains|g" | \
    kubectl apply -f -
```

For Tekton CLI:

```
docker run cgr.dev/chainguard/tekton-cli version
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6336

# request-6336
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6336` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6336/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Custom Base image on top of Chainguard glibc-openssl image (glibc base image bundled with OpenSSL)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is customized on top of Chainguard's standard `glibc-openssl` container image and is meant to be used as just a base image only. It does not contain any programs that can be run, other than `/sbin/ldconfig` and `openssl` which you can run. This image also includes `libstdc++`, the GNU C++ standard library implementation.
Unlike Chainguard's standard `glibc-openssl` container image, this image is configured with a custom working directory at `/app` with owned by the `appuser` (default user) (uid `1000`, gid `1000`) and set with `755` permissions to allow standard read/execute access.

You must bring your own artifacts to use this image, such as with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

## Getting Started

To illustrate how you can use Chainguard's Custom `glibc-openssl` container image, start by creating the following Go program:

```go
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```
This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require glibc.
Next, create a Dockerfile that uses the  custom `glibc-openssl` container image as a base image:

```Dockerfile
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/ORGANIZATION/request-6336
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Note that this example Dockerfile uses the public Chainguard `go` image and the custom `glibc-openssl` image. You will need to change `ORGANIZATION` to reflect your organization's private repository within the Chainguard registry.

Using this Dockerfile, build an image:
```bash
docker build -t custom-glibc-openssl .
```
Then run the newly-built image:
```shell
docker run --rm custom-glibc-openssl
```

This will return the following output, indicating the program was run successfully and the custom `glibc-openssl` base image worked as expected:
```
Hello, world!
```

### Testing OpenSSL 

As mentioned previously, the custom `glibc-openssl` image comes with OpenSSL. To test this out, first create a sample file:

```bash
echo "sample text" > sample.txt
```

Then mount this file to the customer`glibc-openssl` container and use the `sha512` digest function to output the digest of the sample file:

```bash
docker run -v $(pwd):/tmp cgr.dev/ORGANIZATION/request-6336 openssl sha512 /tmp/sample.txt
```
```bash
SHA2-512(stdin)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)
* [OpenSSL Documentation](https://docs.openssl.org/master/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubescape-operator

# kubescape-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubescape-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubescape-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubescape-Operator is an in-cluster component of the Kubescape security platform that orchestrates security scanning and policy enforcement.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `kubescape-operator` container image is a drop-in replacement for the upstream [kubescape/operator](https://oci.dag.dev/?image=quay.io/kubescape/operator:v0.2.69) container image. It is fully compatible with the official [Kubescape-Operator Helm chart](https://github.com/kubescape/helm-charts/tree/main/charts/kubescape-operator) and supports all standard functionality, including security scanning, policy enforcement and vulnerability assessment. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the official [Kubescape-Operator Helm chart](https://github.com/kubescape/helm-charts/tree/main/charts/kubescape-operator). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
operator:
  image:
    repository: cgr.dev/ORGANIZATION/kubescape-operator
    tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kubescape-operator` helm chart

```shell
helm repo add kubescape https://kubescape.github.io/helm-charts/
helm repo update
helm install kubescape kubescape/kubescape-operator --namespace=kubescape --create-namespace --set clusterName=`kubectl config current-context` -f values.yaml --wait
```

## Documentation and Resources
- [Kubescape-Operator Github Repository](https://github.com/kubescape/operator)
- [Kubescape-Operator Helm Charts](https://github.com/kubescape/helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubectl-iamguarded

# kubectl-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubectl-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubectl-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with kubectl binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Kubectl IAMGuarded is a container image that provides the kubectl command-line tool for interacting with Kubernetes clusters. This image is specifically tailored for use with IAMGuarded Helm Charts, and tools needed for Kubernetes operations.

## Helm Chart Installation

It is not needed to specify the image when using Helm Charts with Chainguard's registry.
Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for IAMGuarded charts that use kubectl for operations:

```yaml
# Kubectl image for Kubernetes operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### loki-fips

# loki-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/loki-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/loki-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `loki` application for log aggregation. `loki` can be used to stream, aggregate, and query logs from apps and infrastructure.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Loki is comprised of 2 images:

cgr.dev/ORGANIZATION/loki-fips
cgr.dev/ORGANIZATION/loki-canary-fips

The Chainguard images usually do not run as the root user and contain only the minimum set of tools and dependencies needed to function. This means they do not include utilities such as a shell or a package manager.

### FIPS Support

The loki-fips Chainguard Image Group ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
We can use helm charts for testing dapr images. We can create a values.yaml that'll override upstream images with Chainguard images.

```yaml
loki:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/loki
    tag: latest

lokiCanary:
    image:
        registry: cgr.dev
        repository: ORGANIZATION/loki-canary
        tag: latest
```

After that we can do the following to install the chart in our cluster.
```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki -f values.yaml --wait
```

We can then validate if the `loki` and `loki-canary` pods are up using the following command:

```
kubectl get pods -n loki-system
```

You should see the `loki` and `loki-canary` pods up and running:
```
/ # kubectl get pods -n loki-system

NAME                            READY   STATUS    RESTARTS   AGE
loki-0                          2/2     Running   0          45h
loki-canary-5crfb               1/1     Running   0          45h
loki-gateway-6c9dc9b78c-2tqmq   1/1     Running   0          45h
loki-results-cache-0            2/2     Running   0          45h
```

## Documentation and Resources

* [Upstream Installation Guide](https://grafana.com/docs/loki/latest/setup/install/helm/)
* [Upstream Documentation](https://grafana.com/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-default-user-credential-updater-iamguarded

# rabbitmq-default-user-credential-updater-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-default-user-credential-updater-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-default-user-credential-updater-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Image with [default-user-credential-updater](https://github.com/rabbitmq/default-user-credential-updater)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

RabbitMQ Default User Credential Updater IAMGuarded is a security-enhanced component of the RabbitMQ Cluster Operator deployment. This image is designed to be deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, providing secure credential management for RabbitMQ clusters with additional security benefits.

## Helm Chart Installation

The RabbitMQ Default User Credential Updater IAMGuarded image is deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator
msgTopologyOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image (this image)
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

The RabbitMQ Default User Credential Updater IAMGuarded component is automatically used by the RabbitMQ Cluster Operator when managing RabbitMQ cluster credentials. Validation occurs implicitly when RabbitMQ clusters are successfully provisioned with secure credential management.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Default User Credential Updater IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. This component ensures secure handling of RabbitMQ credentials during cluster operations. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### backup-restore-operator-fips

# backup-restore-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/backup-restore-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/backup-restore-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Backup and Restore Operator that provides the ability to back up and restore the Rancher application running on any Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `backup-restore-operator-fips` image is compatible with [rancher/backup-restore-operator](https://hub.docker.com/r/rancher/backup-restore-operator). The image provides the same API and functionality as the upstream operator, with enhanced security through a minimal attack surface and daily security updates.

### FIPS Support

The `backup-restore-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The `backup-restore-operator-fips` is deployed using the Rancher Helm charts. The operator installs into the `cattle-resources-system` namespace and creates Custom Resource Definitions (CRDs) for Backup, Restore, and ResourceSet resources.

### Installation

First, add the Rancher Helm repository:

```bash
helm repo add rancher-charts https://charts.rancher.io
helm repo update
```

Create a values file to use the Chainguard FIPS image:

```sh
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/backup-restore-operator-fips
  tag: latest
EOF
```

Install the CRD chart first (this is required):

```sh
helm install --wait \
  --create-namespace -n cattle-resources-system \
  rancher-backup-crd rancher-charts/rancher-backup-crd
```

Install the operator chart with your values file:

```sh
helm install --wait \
  -n cattle-resources-system \
  -f values.yaml \
  rancher-backup rancher-charts/rancher-backup
```

### Verification

Verify the operator is running:

```sh
kubectl get pods -n cattle-resources-system
```

You should see output similar to:

```
NAME                             READY   STATUS    RESTARTS   AGE
rancher-backup-xxxxx-xxxxx       1/1     Running   0          1m
```

### Creating a Backup

To create a basic backup of your Kubernetes resources, create a Backup resource:

```sh
cat > backup.yaml <<EOF
apiVersion: resources.cattle.io/v1
kind: Backup
metadata:
  name: default-backup
spec:
  resourceSetName: rancher-resource-set-full
EOF

kubectl apply -f backup.yaml
```

> [!NOTE]
> The operator creates two ResourceSets by default: `rancher-resource-set-full` includes all secrets needed for complete restore, while `rancher-resource-set-basic` excludes secrets for enhanced security. Choose based on your backup requirements.

Check the backup status:

```sh
kubectl get backup default-backup -o yaml
```

## Configuration

The operator supports various backup storage locations. For production use, configure an S3-compatible storage backend. Create a values file with S3 configuration:

```sh
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/backup-restore-operator-fips
  tag: latest

persistence:
  enabled: true
  storageClass: default

s3:
  enabled: true
  credentialSecretName: s3-creds
  credentialSecretNamespace: cattle-resources-system
  bucketName: rancher-backups
  region: us-east-1
  endpoint: s3.amazonaws.com
EOF
```

This configuration enables persistent storage for backup metadata and sets S3 as the backup target, which is essential for disaster recovery scenarios.

For comprehensive configuration options, including encryption, retention policies, and advanced scheduling, refer to the [upstream documentation](https://github.com/rancher/backup-restore-operator).

## Documentation and Resources

- [Rancher Backup Restore Operator GitHub](https://github.com/rancher/backup-restore-operator)
- [Rancher Backup and Restore Documentation](https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery)
- [Helm Charts Repository](https://charts.rancher.io)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-keycloak

# crossplane-keycloak
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-keycloak` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-keycloak/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Crossplane provider for Keycloak.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

These images provide Crossplane providers for SQL.

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `xpkg.upbound.io/crossplane-contrib/provider-keycloak` | `cgr.dev/chainguard/crossplane-keycloak` |

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-keycloak
  namespace: crossplane-system
spec:
  package: cgr.dev/chainguard/crossplane-keycloak:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### langchain

# langchain
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/langchain` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/langchain/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

LangChainPython library image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Run a Python script with LangChain:

```shell
docker run --rm cgr.dev/ORGANIZATION/langchain:latest python3 -c "import langchain; print(langchain.__version__)"
```

Use as a base image in your Dockerfile:

```dockerfile
FROM cgr.dev/ORGANIZATION/langchain:latest
COPY app.py .
ENTRYPOINT ["python3", "app.py"]
```

## Documentation and Resources

- [LangChain Documentation](https://docs.langchain.com/)
- [LangChain GitHub Repository](https://github.com/langchain-ai/langchain)
- [LangChain Python API Reference](https://python.langchain.com/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kiali-operator-fips

# kiali-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kiali-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kiali-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS compliant Kiali Operator that manages the lifecycle of Kiali in Kubernetes environments with Istio service mesh integration

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream [quay.io/kiali/kiali-operator](https://quay.io/repository/kiali/kiali-operator) image, running as a non-root user to maintain security standards. It uses the Ansible Operator SDK to manage Kiali deployments and is designed to be used in Kubernetes environments with Istio service mesh.

### FIPS Support
The `kiali-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

The Kiali Operator is typically deployed in Kubernetes environments. You can deploy it using Helm, OperatorHub (via OLM), or as an Istio add-on.

### Deploying with Helm

```bash
# Add the Kiali Helm repository
helm repo add kiali https://kiali.org/helm-charts

# Install the Kiali Operator
helm install --namespace kiali-operator \
  --create-namespace kiali-operator \
  kiali/kiali-operator \
  --set image.repo=cgr.dev/ORGANIZATION \
  --set image.name=kiali-operator-fips

# Deploy Kiali by creating a Kiali CR
kubectl apply -f - <<EOF
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
  name: kiali
  namespace: istio-system
spec:
  deployment:
    image_name: cgr.dev/ORGANIZATION/kiali-fips
    image_version: latest
EOF
```

### Environment Variables

The Kiali Operator image respects the following environment variables:

- `ANSIBLE_DEBUG`: Set to "true" to enable additional debugging output
- `ANSIBLE_VERBOSITY`: Set the verbosity level (0-4)
- `WATCH_NAMESPACE`: The namespace to watch for Kiali CRs
- `POD_NAMESPACE`: The namespace the operator is deployed in
- `OPERATOR_NAME`: The name of the operator

## Documentation and Resources

- [Kiali Website](https://kiali.io)
- [Kiali Operator GitHub Repository](https://github.com/kiali/kiali-operator)
- [Kiali Documentation](https://kiali.io/docs/)
- [Ansible Operator SDK Documentation](https://sdk.operatorframework.io/docs/building-operators/ansible/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-arangodb

# kube-arangodb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-arangodb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-arangodb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ArangoDB Kubernetes Operator for managing ArangoDB database deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard kube-arangodb image contains the ArangoDB Kubernetes Operator that manages ArangoDB deployments in Kubernetes clusters. This operator runs as a non-root user for enhanced security and manages:

## Getting Started

Add the ArangoDB Helm repository:

```bash
helm repo add arangodb https://arangodb.github.io/kube-arangodb
helm repo update
```

Create a values.yaml file to configure the `kube-arangodb` operator with the Chainguard image:

```yaml
# values.yaml
operator:
  image: cgr.dev/ORGANIZATION/kube-arangodb
  imageTag: latest
```

Deploy the operator using Helm:

```bash
helm install kube-arangodb arangodb/kube-arangodb \
  --namespace kube-arangodb --create-namespace \
  -f values.yaml \
  --wait
```

> [!NOTE]
> Replace `ORGANIZATION` with the name used for your organization's private repository within the Chainguard Registry.

## Documentation and Resources

- [ArangoDB Kubernetes Operator Documentation](https://arangodb.github.io/kube-arangodb/docs/)
- [kube-arangodb GitHub Repository](https://github.com/arangodb/kube-arangodb)
- [Using the ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator.html)
- [API Reference for ArangoDeployment](https://arangodb.github.io/kube-arangodb/docs/api/ArangoDeployment.V1.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-tika

# apache-tika
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-tika` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-tika/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Tika extracts metadata, text, and language from documents, enabling content analysis and indexing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Apache Tika Image is comparable to the [official Apache Tika Image from Docker Hub](https://hub.docker.com/r/apache/tika). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

To get started with Chainguard's Apache Tika Image, we can use Apache Tika Helm chart to deploy it.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/apache-tika
  tag: latest
```

Deploy the Helm chart:

```shell

helm repo add tika https://apache.jfrog.io/artifactory/tika
helm repo update
helm install tika tika/tika \
  --values values.yaml
```

## Documentation and Resources

- (Blog) [Get Tika parsing up and running in 5 minutes](https://tika.apache.org/3.0.0/parser_guide.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nvidia-container-toolkit

# nvidia-container-toolkit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nvidia-container-toolkit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nvidia-container-toolkit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The NVIDIA Container Toolkit allows users to build and run GPU accelerated containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

```sh
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm upgrade --install gpu-operator nvidia/gpu-operator \
    -n gpu-operator \
    --create-namespace \
    --set toolkit.repository=cgr.dev/chainguard \
    --set toolkit.image=nvidia-container-toolkit \
    --set toolkit.version=latest
```

* Refer to [values.yaml](https://github.com/NVIDIA/gpu-operator/blob/master/deployments/gpu-operator/values.yaml) file for more configuration options.

> [!WARNING]
> You'll want to make sure the `gpu-operator` chart is up-to-date and use the latest operator tag that's within the compatibility matrix.

> [!IMPORTANT]
> You need GPU nodes to run the operator as it will schedule Deployments and DaemonSets on nodes with GPUs.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mysqld-exporter

# prometheus-mysqld-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mysqld-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mysqld-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Prometheus mysqld exporter Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flyway

# flyway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flyway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flyway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Flyway is a database migration tool to evolve your database schema easily and reliably across all your instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Flyway Chainguard Image is meant to serve as a drop-in replacement for the [Flyway image from Docker Hub](https://hub.docker.com/r/flyway/flyway). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user. 

The only difference between the Chainguard Image and the official Flyway image is that the Chainguard Image uses JDK 17 while the official Flyway image uses JDK 21.

## Getting Started

To begin, start the Flyway container with a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/flyway
```

> [!NOTE]
> This will return the Flyway Command-line's usage instructions.

Next, configure Flyway by creating a file named `flyway.conf`:

```shell
mkdir -p /tmp/flyway
cat <<EOF > /tmp/flyway/flyway.conf
flyway.url=jdbc:sqlite:/flyway/db/test_db.sqlite3
flyway.user=sa
EOF
```

> [!NOTE]
> This example assumes that you have a SQLite database named `test_db.sqlite3` in the `/tmp/flyway/db` directory.

Following that, create the first migration file:

```shell
cat <<EOF > /tmp/flyway/sql/V1__Create_person_table.sql
create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);
EOF
```

Finally, run the migration:

```shell
docker run --rm -v "/tmp/flyway/db:/flyway/db" -v "/tmp/flyway/sql:/flyway/sql" -v "/tmp/flyway/sql:/flyway/conf" cgr.dev/ORGANIZATION/flyway migrate
```

If everything worked as expected, you will receive the following output:

```shell
Database: jdbc:sqlite:/flyway/db/test_db.sqlite3 (SQLite 3.34)
Schema history table "main"."flyway_schema_history" does not exist yet
Successfully validated 1 migration (execution time 00:00.009s)
Creating Schema History table "main"."flyway_schema_history" ...
Current version of schema "main": << Empty Schema >>
Migrating schema "main" to version "1 - Create person table"
Successfully applied 1 migration to schema "main", now at version v1 (execution time 00:00.034s)
```

## Documentation and Resources

- (Blog) [Quickstart - Docker](https://flywaydb.org/documentation)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-306

# request-306
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-306` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-306/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### polaris

# polaris
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/polaris` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/polaris/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Polaris is an open source policy engine for Kubernetes that validates and remediates resource configuration.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Polaris image is meant to serve as a drop-in replacement for [the official Polaris image from Quay.io](https://quay.io/repository/fairwinds/polaris). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting started
For those with access, this container image is available on `cgr.dev`:

Run the `polaris` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/polaris:latest polaris audit
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [Polaris Documentation](https://polaris.docs.fairwinds.com/)
* [Polaris GitHub Repository](https://github.com/FairwindsOps/polaris)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cinc-auditor

# cinc-auditor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cinc-auditor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cinc-auditor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open source toolkit for applying Chef Inspec audit and test profiles.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cinc-auditor` image is intended as a drop-in implementation of the upstream [CINC Auditor Toolkit](https://cinc.sh/start/auditor/).

To retrieve basic information about an InSpec profile, run a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/cinc-auditor:latest check /usr/share/inspec/profiles/chainguard_srg/
```

```
Location :   /usr/share/inspec/profiles/chainguard_srg/
Profile :    chainguard_stig_v3r2
Controls :   9
Timestamp :  2026-01-08T07:04:47+00:00
Valid :      true

No errors, warnings, or offenses
```

If you have an InSpec profile that you want to evaluate, you can first create a directory to store the files:

```shell
mkdir -p inspec-content
```

Then evaluate the InSpec profile by mounting the content directory into your container; for example

```shell
docker run --rm \
  -v $(pwd)/inspec-content:/inspec-content \
  cgr.dev/ORGANIZATION/cinc-auditor:latest \
  exec /inspec-content ---reporter cli --reporter json:/inspec-content/output.json
```

To evaluate a profile against a container, start the target container:

```shell
docker run --name target -d cgr.dev/chainguard/wolfi-base:latest tail -f /dev/null
```

Then run the cinc-auditor image at the target container using the `--target` argument to cinc-auditor (Note that the docker socket is being mounted into the cinc-auditor container, and the use of privilege.):

```shell
docker run -it --rm -u 0:0 --pid=host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/out:/out \
  cgr.dev/ORGANIZATION/cinc-auditor:latest \
  exec /usr/share/InSpec/profiles/chainguard_srg/ \
     --no-create-lockfile --reporter json:/out/output.json \
     --user root --target docker://target
```

The results will be in the `out/output.json` file. For output to the terminal, the argument `--reporter cli` can be given instead.

Finally, stop the target container.

> [!NOTE]
> Many security scanning operations require elevated privileges or access to host system information. Consider using `--privileged` or specific capability flags when performing system scans.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ml-metadata-store-server

# ml-metadata-store-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ml-metadata-store-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ml-metadata-store-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[ML Metadata (MLMD)](https://www.tensorflow.org/tfx/guide/mlmd) remote gRPC server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. Please refer to the [TensorFlow documentation](https://www.tensorflow.org/tfx/guide/mlmd#use_mlmd_with_a_remote_grpc_server) for more details.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### descheduler

# descheduler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/descheduler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/descheduler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Descheduler is a tool that evicts pods from nodes based on configurable policies to improve cluster balance, resource utilization, and scheduling efficiency.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard image for Kubernetes descheduler is comparable to the official
image linked in [the projects documentation](https://github.com/kubernetes-sigs/descheduler?tab=readme-ov-file#%EF%B8%8F--documentation-versions-by-release).

Similar to the upstream image, our image does not contain a shell or a package
manager, and only the minimum set of tools and dependencies needed to function.

## Getting started

The Chainguard image for Kubernetes descheduler can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/descheduler/descheduler).

Add the helm repository:

```bash
helm repo add descheduler https://kubernetes-sigs.github.io/descheduler/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:

```bash
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/descheduler
  tag: latest
```

Deploy using helm:

```bash
helm install --namespace kube-system descheduler descheduler/descheduler -f values.yaml
```

## Documentation and Resources

For more information on how to deploy and configure kubernetes scheduler, please
refer to the [GitHub project documentation](https://github.com/kubernetes-sigs/descheduler).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### verticadb-operator-fips

# verticadb-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/verticadb-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/verticadb-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The VerticaDB operator automates tasks and monitors the state of your Vertica on Kubernetes deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's VerticaDB Operator FIPS container image is comparable to [the VerticaDB Operator](https://hub.docker.com/r/opentext/verticadb-operator) from Vertica. Chainguard's version is a minimal, secure, and regularly updated container image designed to run Java applications. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

For production scenarios, it's recommended you follow Vertica's guide on [deploying Vertica DB operator using the official Helm chart](https://docs.vertica.com/latest/en/containerized/db-operator/installing-db-operator/).

To illustrate how this image works, the following is an example of how to deploy VerticaDB Operator locally.

Start by creating a `values.yaml` file:

```bash
cat <<EOF > values.yaml
image:
  repo: cgr.dev
  name: ORGANIZATION/verticadb-operator-fips:latest
EOF
```

Then add the repository for Vertica Charts:

```bash
helm repo add vertica-charts https://vertica.github.io/charts
helm repo update
```

Next, install the Helm chart for VerticaDB Operator:

```bash
helm install vdb-op --wait --namespace my-verticadb-operator --create-namespace vertica-charts/verticadb-operator
```

This will deploy VerticaDB Operator on your local Kubernetes cluster. Now you can install VerticaDB by creating a VerticaDB custom resource (CR):

```bash
 cat << EOF > vdb.yaml
apiVersion: vertica.com/v1beta1
kind: VerticaDB
metadata:
  name: verticadb-sample
spec:
  annotations:
    VERTICA_MEMDEBUG: “2”  # Required if running macOS with an arm based chip
  communal:
    path: "/communal/vertica-db-tutorial"
    includeUIDInPath: true
  subclusters:
    - name: sc
  volumes:
  - name: hostpath
    hostPath:
      path: /tmp
  volumeMounts:
  - name: hostpath
    mountPath: /communal
EOF

kubectl apply --namespace my-verticadb-operator -f vdb.yaml
```

Wait for the VerticaDB instance to be initialized:

```bash
kubectl wait --for=condition=DBInitialized=True --namespace my-verticadb-operator vdb/verticadb-sample --timeout=10m
```

Check the status of the VerticaDB instance:

```bash
kubectl get pods --namespace my-verticadb-operator --selector app.kubernetes.io/instance=verticadb-sample
```
```
NAME                                   READY   STATUS              RESTARTS   AGE
verticadb-sample-sc-0                  1/1     ContainerCreating   0          97s
verticadb-sample-sc-1                  1/1     ContainerCreating   0          97s
verticadb-sample-sc-2                  1/1     ContainerCreating   0          97s
```

You can now access the VerticaDB instance using the vsql client:

```bash
kubectl exec -it --namespace my-verticadb-operator verticadb-sample-sc-0 -- vsql
```

This will open a vsql shell where you can run SQL commands.

## Documentation and Resources
- [VerticaDB Operator Helm Charts](https://docs.vertica.com/latest/en/containerized/db-operator/installing-db-operator/)
- [Official VerticaDB Operator documentation](https://docs.vertica.com/latest/en/containerized/db-operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flink

# flink
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flink` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flink/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Flink is an open source stream processing framework with powerful stream- and batch-processing capabilities.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

One of the simplest ways to get started with Apache Flink on Kubernetes is to use the Flink Kubernetes Operator provided by the Apache Flink community. The Flink Kubernetes Operator is a Kubernetes custom controller that simplifies the deployment and management of Apache Flink applications on Kubernetes.

### Deploying Apache Flink on Kubernetes

The following example shows how to deploy Apache Flink on Kubernetes using the Flink Kubernetes Operator.

1. Install the Flink Kubernetes Operator by following the instructions in the [Flink Kubernetes Operator documentation](https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main/docs/try-flink-kubernetes-operator/quick-start/).

2. Create a FlinkDeployment resource to deploy Apache Flink on Kubernetes. The following example shows a basic FlinkDeployment resource that deploys a Flink job using the StateMachineExample.jar example JAR file.

> ⚠️ **Note:** Do not forget to deploy the FlinkDeployment with the same namespace where the Flink Kubernetes Operator is running.

```yaml
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  name: basic-example
spec:
  image: cgr.dev/chainguard-private/flink:latest
  flinkVersion: v1_17
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
  serviceAccount: flink
  jobManager:
    resource:
      memory: "2048m"
      cpu: 1
  taskManager:
    resource:
      memory: "2048m"
      cpu: 1
  job:
    jarURI: local:///opt/flink/examples/streaming/StateMachineExample.jar
    parallelism: 2
    upgradeMode: stateless
```

3. Apply the FlinkDeployment resource to deploy Apache Flink on Kubernetes.

```shell
kubectl apply -f flink-deployment.yaml
```

4. Monitor the Flink job by viewing the logs of the Flink job manager and task manager pods.

```shell

kubectl logs -f deploy/basic-example
```

5. To access the Flink web UI, port-forward the Flink job manager service to your local machine.

```shell

kubectl port-forward svc/basic-example-rest 8081
```

6. Open a web browser and navigate to `http://localhost:8081` to access the Flink web UI.

That's it! You have successfully deployed Apache Flink on Kubernetes using the Flink Kubernetes Operator.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-metrics-scraper-fips

# kubernetes-dashboard-metrics-scraper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-metrics-scraper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-metrics-scraper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Module containing the Kubernetes metrics scraper module of the Kubernetes dashboard application

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-metrics-scraper` component is responsible for the
front-end user interface and contains both the Angular-based web application and
a Go server that handles web-specific logic like settings management. This
component serves as the main point of interaction, displaying data retrieved
from the Kubernetes API via the API module.

## Usage
To deploy `kubernetes-dashboard-metrics-scraper-FIPS` using Helm, follow these
steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set web.image.repository = cgr.dev/ORGANIZATION/kubernetes-dashboard-metrics-scraper-fips \
--set web.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary
permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to
access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components,
refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wait-for-it

# wait-for-it
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wait-for-it` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wait-for-it/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for testing whether a service is listening on an address/port combination.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Simple Example

Test that a service is available!

```shell
$ docker run cgr.dev/chainguard/wait-for-it:latest -h google.com -p 80
wait-for-it: waiting 15 seconds for google.com:80
wait-for-it: google.com:80 is available after 0 seconds
```

### Timeout

You can optionally specify a timeout using the `-t` flag (in seconds):

```shell
$  docker run cgr.dev/chainguard/wait-for-it:latest -h fake.doesnotexist -p 80 -t 5
wait-for-it: waiting 5 seconds for fake.doesnotexist:80
wait-for-it: timeout occurred after waiting 5 seconds for fake.doesnotexist:80
```

### Subcommand

You can then run a command after the execution, using the `--` syntax.

```shell
$ docker run cgr.dev/chainguard/wait-for-it:latest -h fake.doesnotexist -p 80 -t 5 -- echo hello
wait-for-it: waiting 5 seconds for fake.doesnotexist:80
wait-for-it: timeout occurred after waiting 5 seconds for fake.doesnotexist:80
hello
```

Adding `-s` will only run the command if wait-for-it succeeds:

```shell
$ docker run cgr.dev/chainguard/wait-for-it:latest -h fake.doesnotexist -p 80 -t 5 -s -- echo hello
wait-for-it: waiting 5 seconds for fake.doesnotexist:80
wait-for-it: timeout occurred after waiting 5 seconds for fake.doesnotexist:80
wait-for-it: strict mode, refusing to execute subprocess
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cilium-fips

# cilium-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cilium-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cilium-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Cilium](https://cilium.io/) is an open source, cloud native solution for providing, securing, and observing network connectivity between workloads using eBPF

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Cilium FIPS Containers

Cilium is open source software for transparently securing the network connectivity between application services deployed using Linux container management platforms like Docker and Kubernetes. At the foundation of Cilium is a new Linux kernel technology called eBPF (short for Extended Berkely Package Filter), which enables the dynamic insertion of powerful security visibility and control logic within Linux itself. Because eBPF runs inside the Linux kernel, Cilium security policies can be applied and updated without any changes to the application code or container configuration.

Hubble is a fully distributed networking and security observability platform built on top of Cilium and eBPF to enable deep visibility into the communication and behavior of services as well as the networking infrastructure in a completely transparent manner.

For details on how you can work with these Cilium FIPS container images, check out our guide on [Getting Started with the Cilium Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/cilium/) on Chainguard Academy.

### FIPS Support

The cilium-fips Chainguard Containers ship with FIPS-hardened cryptographic modules and libraries to meet federal compliance requirements. These images include validated redistributions of OpenSSL's FIPS provider module and use FIPS-approved algorithms for all cryptographic operations. The FIPS-enabled variants ensure that network encryption, certificate management, and security policy enforcement within Cilium components comply with FIPS 140-2 standards.

For more information on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

Chainguard offers several Cilium FIPS images, as described in the next sections. 

## cilium-agent-fips

Cilium agents serve as the core data-plane component of Cilium, deployed as a DaemonSet on every node within the cluster. These agents implement the Kubernetes Container Networking Interface (CNI) and are responsible for several critical functions:

- **Network Policy Enforcement**: Implements and enforces network security policies using eBPF programs loaded into the Linux kernel
- **Load Balancing**: Provides Layer 3, 4, and 7 load balancing capabilities for services
- **Service Mesh Integration**: Offers transparent service mesh functionality without requiring application changes
- **IP Address Management (IPAM)**: Manages IP address allocation for pods across the cluster
- **Network Connectivity**: Establishes secure network connectivity between pods, both within and across nodes

Each agent contains an embedded Hubble server that provides deep visibility into network traffic, security events, and the overall health of the Kubernetes cluster. The agents communicate with the Cilium operator for cluster-wide coordination and with the Linux kernel through eBPF programs for high-performance data path operations.

## cilium-operator-generic-fips

The Cilium operator serves as the centralized control plane component of Cilium, deployed as a single instance (or in high-availability mode) to manage cluster-wide operations. This generic operator variant is cloud-agnostic and provides several key functions:

- **Resource Management**: Creates, updates, and manages Cilium Custom Resource Definitions (CRDs) including CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy, and CiliumEndpoint resources
- **Network Policy Compilation**: Translates Kubernetes NetworkPolicy and Cilium-specific policies into eBPF programs that are distributed to agents
- **Certificate Management**: Handles TLS certificate lifecycle for secure communication between Cilium components

This generic variant works across different cloud providers and on-premises environments, making it suitable for multi-cloud or hybrid deployments where cloud-specific integrations are not required.

## cilium-operator-aws-fips

The AWS-specific Cilium operator extends the core control plane functionality with deep integration into AWS services and infrastructure. In addition to all the capabilities of the generic operator, this variant provides specialized AWS features:

- **ENI Management**: Integrates with AWS Elastic Network Interface (ENI) allocation and management for advanced networking scenarios
- **VPC Integration**: Leverages AWS VPC routing and security groups for enhanced network isolation and policy enforcement
- **AWS Load Balancer Integration**: Coordinates with AWS Application Load Balancer (ALB) and Network Load Balancer (NLB) for service exposure
- **IAM Integration**: Utilizes AWS Identity and Access Management (IAM) roles and policies for secure access to AWS APIs
- **EKS Optimization**: Includes specific optimizations and integrations for Amazon Elastic Kubernetes Service (EKS) clusters

This operator is specifically designed for production workloads running on AWS infrastructure where native cloud integration is required for optimal performance, security, and operational efficiency.

## cilium-hubble-relay-fips

Hubble Relay serves as the central aggregation and coordination service for network observability data across the entire Kubernetes cluster. It acts as an intermediary between the distributed Hubble servers (embedded in each Cilium agent) and observability clients, providing several critical functions:

- **gRPC API Gateway**: Exposes a unified gRPC API that clients can use to query network flows, security events, and service dependencies across the entire cluster
- **Load Balancing**: Distributes observability queries across multiple Hubble servers to ensure optimal performance and availability
- **Data Filtering and Querying**: Provides advanced filtering capabilities allowing users to query specific network flows, protocols, security events, or time ranges
- **Multi-Cluster Support**: In ClusterMesh deployments, aggregates observability data from multiple connected Kubernetes clusters

Hubble Relay is essential for any deployment requiring comprehensive network observability, enabling tools like the Hubble CLI and Hubble UI to provide insights into application connectivity, performance, and security across the entire infrastructure.

## cilium-hubble-ui-fips

The Hubble UI is a modern, web-based visualization platform built as a ReactJS application and served through nginx. It provides an intuitive, graphical interface for network administrators, security teams, and developers who need to understand, monitor, and troubleshoot network connectivity and security policies in their Kubernetes environments.

## cilium-hubble-ui-backend-fips

The Hubble UI Backend serves as the data processing and API layer that bridges the gap between raw network observability data and the user-friendly Hubble UI interface. This backend component is essential for the Hubble UI to function effectively, handling the computational complexity of processing network observability data while providing a clean, performant interface for the React-based frontend.

## cilium-clustermesh-apiserver-fips

Cilium Cluster Mesh connects multiple Kubernetes clusters, allowing pods in one cluster to access services in others, as long as all clusters use Cilium as their CNI. This is achieved by deploying a clustermesh-apiserver to sync shared state across clusters:

- **Multi-Cluster Service Discovery**: Enables services in one cluster to discover and connect to services running in other clusters, creating a unified service mesh across cluster boundaries
- **Cross-Cluster Load Balancing**: Distributes traffic across service endpoints that span multiple clusters, providing high availability and optimal resource utilization
- **Shared Identity Management**: Synchronizes security identities across clusters, ensuring consistent network policy enforcement in multi-cluster scenarios
- **Secure Communication**: Establishes secure, encrypted communication channels between clusters using mutual TLS authentication
- **Service Export/Import**: Manages which services are exported from each cluster and which remote services are imported for local consumption

The ClusterMesh API Server is deployed as a LoadBalancer service in each participating cluster, enabling Cilium agents across clusters to establish secure connections and exchange routing information. This creates a transparent, scalable solution for multi-cluster deployments without requiring complex VPN setups or network overlays.

## Documentation and Resources

Refer to the [Cilium docs on cilium.io](https://cilium.io/) and their [GitHub repository](https://github.com/cilium/cilium) for more information about this software.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgis

# postgis
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgis` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgis/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostGIS extends the capabilities of the PostgreSQL relational database by adding support for storing, indexing, and querying geospatial data

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image uses the [Chainguard PostgreSQL image](https://images.chainguard.dev/directory/image/postgres) as a base and includes the `postgis` extension to support storing geospatial data.

The image's default `docker-entrypoint.sh` script will automatically load the extension the first time it is run. For example:

```
docker run --name postgis --rm -t -e POSTGRES_HOST_AUTH_METHOD=trust cgr.dev/ORGANIZATION/postgis:latest
```

Will show output like the following:

```
/usr/bin/docker-entrypoint.sh: sourcing /var/lib/postgres/initdb/10_postgis.sh
CREATE DATABASE
Loading PostGIS extensions into template_postgis
CREATE EXTENSION
CREATE EXTENSION
You are now connected to database "template_postgis" as user "postgres".
CREATE EXTENSION
CREATE EXTENSION
Loading PostGIS extensions into postgres
CREATE EXTENSION
CREATE EXTENSION
You are now connected to database "postgres" as user "postgres".
CREATE EXTENSION
CREATE EXTENSION
```

This output indicates that the extension has been installed into the running PostgreSQL instance.

Verify the extension is installed by running the following:

```
 docker exec -it postgis psql -U postgres -c '\dx'
                                        List of installed extensions
          Name          | Version |   Schema   |                        Description
------------------------+---------+------------+------------------------------------------------------------
 fuzzystrmatch          | 1.2     | public     | determine similarities and distance between strings
 plpgsql                | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis                | 3.5.0   | public     | PostGIS geometry and geography spatial types and functions
 postgis_tiger_geocoder | 3.5.0   | tiger      | PostGIS tiger geocoder and reverse geocoder
 postgis_topology       | 3.5.0   | topology   | PostGIS topology spatial types and functions
(5 rows)
```

Note the installed `postgis`, `postgis_tiger_geocoder`, and `postgis_topology` extensions.

Refer to the [Getting Started with the PostgreSQL Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/postgres/) guide for more information on how to use the base PostgreSQL image that this is built on.

For PostGIS specific guides, refer to the [official PostGIS Getting Started pages](https://postgis.net/documentation/getting_started/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### volcano-fips

# volcano-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/volcano-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/volcano-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes-native batch scheduling system, extending and enhancing the capabilities of the standard kube-scheduler.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`volcano-fips` is comprised of 3 images:

cgr.dev/ORGANIZATION/vc-scheduler-fips
cgr.dev/ORGANIZATION/vc-controller-manager-fips
cgr.dev/ORGANIZATION/vc-webhook-manager-fips

The Chainguard images run as 'non root', whereas the upstream images default to running as 'root'. Only the minimum set of tools and dependencies are installed.

### FIPS Support

The `volcano-fips` Chainguard Image Group ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

We can use the [volcano helm chart](https://github.com/volcano-sh/helm-charts) for testing the volcano images. We can create a `values.yaml` that'll override upstream images with Chainguard images.

```yaml
image_registry               : cgr.dev
controller_image_name        : ORGANIZATION/vc-controller-manager-fips
scheduler_image_name         : ORGANIZATION/vc-scheduler-fips
admission_image_name         : ORGANIZATION/vc-webhook-manager-fips
```

Deploy volcano:

```bash
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace -f values.yaml
```

Once deployed, validate the installation by creating a queue:

```
cat <<EOF | kubectl apply -f -
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: test-queue
spec:
  weight: 1
  capability:
    cpu: "2"
    memory: "2Gi"
EOF
```

Create a job leveraging the queue:

```
cat <<EOF | kubectl apply -f -
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: test-vcjob
  namespace: volcano-system
spec:
  minAvailable: 1
  schedulerName: volcano
  queue: test-queue
  maxRetry: 3
  policies:
    - event: PodEvicted
      action: RestartJob
  tasks:
    - replicas: 1
      name: worker
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: test-container
              # This example uses the Chainguard busybox image for demonstration purposes.
              image: cgr.dev/chainguard/ORGANIZATION/busybox-fips:latest
              command: ["sh", "-c", "echo 'Hello from Volcano' && sleep 10"]
              resources:
                requests:
                  cpu: "100m"
                  memory: "128Mi"
EOF
```

## Documentation and Resources
* [Official Documentation](https://volcano.sh/en/docs/)
* [Getting Started](https://volcano.sh/en/docs/tutorials/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-kubernetes-operator

# mongodb-kubernetes-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-kubernetes-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-kubernetes-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard's MongoDB Kubernetes Operator image enables you to deploy a MongoDB community instance to a Kubernetes cluster, as well as support replica sets, scaling the replicas up or down, version upgrades, custom roles, and TLS security.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's MongoDB Kubernetes Operator image is comparable to the [upstream image](https://github.com/mongodb/mongodb-kubernetes-operator). Switching to the Chainguard image should not require any changes to your existing setup. However, the operator expects `/bin/sh` to be available in the MongoDB container image. If you're not using the `-dev` variant, you'll need to ensure your MongoDB image includes `bash` or a `bash-binsh` symlink to provide compatibility.

We also attempted to [secure MongoDBCommunity resource connections using TLS](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/secure.md), but encountered SSL handshake failures in the replica set pods when following the guide, both with our image and the upstream image.

Upstream runs the container as `uid=2000` and `gid=0`, but we've verified that the image works correctly with `uid=65532` and `gid=65532`, so we've configured it to run as non-root.

Note that upstream components of the MongoDB Kubernetes Operator use different versioning schemes—for example, the main operator uses versions like `0.12.x`, while the version hook component uses `1.0.x`. You can see this in the upstream [`release.json`](https://github.com/mongodb/mongodb-kubernetes-operator/blob/0c46290/release.json#L2). In contrast, Chainguard images for all related components (e.g., the operator and version hook) will share the same tag, aligned with the main operator version. This is due to our Git-based automation, and because upstream does not provide separate Git tags for components like the version hook ([see tags](https://github.com/mongodb/mongodb-kubernetes-operator/tags)). While this differs from upstream's tagging scheme, all components are still built from the same source and version-aligned internally. Just be aware that users will not see separate tags per component.
## Getting Started

To get started with Chainguard's MongoDB Kubernetes Operator image, begin by installing the CRDs:

```
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes-operator/refs/heads/master/config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
```

To launch the MongoDB Kubernetes Operator in a Docker container, use the following command:

```
docker run --rm \
    --net=host \
    -v ~/.kube/config:/root/.kube/config:ro \
    -e KUBECONFIG=/root/.kube/config \
    -e AGENT_IMAGE="quay.io/mongodb/mongodb-agent-ubi:108.0.2.8729-1" \
    -e VERSION_UPGRADE_HOOK_IMAGE="quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook:1.0.9" \
    -e READINESS_PROBE_IMAGE="quay.io/mongodb/mongodb-kubernetes-readinessprobe:1.0.22" \
    -e WATCH_NAMESPACE="*" \
    cgr.dev/ORGANIZATION/mongodb-kubernetes-operator:latest
```

To deploy the MongoDB Kubernetes Operator in your cluster, create the required service account and role:

```
cat <<EOF > service_account.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mongodb-kubernetes-operator
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: mongodb-kubernetes-operator
  namespace: default
rules:
- apiGroups: [""]
  resources: ["configmaps", "secrets"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments", "statefulsets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["mongodbcommunity.mongodb.com"]
  resources: ["mongodbcommunity", "mongodbcommunity/status", "mongodbcommunity/spec", "mongodbcommunity/finalizers"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: mongodb-kubernetes-operator-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: mongodb-kubernetes-operator
  namespace: default
roleRef:
  kind: Role
  name: mongodb-kubernetes-operator
  apiGroup: rbac.authorization.k8s.io
EOF
```

Next, create a deployment manifest that will deploy the operator with the Chainguard image:
```
cat <<EOF > manager.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    email: support@mongodb.com
  labels:
    owner: mongodb
  name: mongodb-kubernetes-operator
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mongodb-kubernetes-operator
  strategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: mongodb-kubernetes-operator
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: name
                operator: In
                values:
                - mongodb-kubernetes-operator
            topologyKey: kubernetes.io/hostname
      containers:
      - command:
        - /usr/local/bin/entrypoint
        env:
        - name: WATCH_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: OPERATOR_NAME
          value: mongodb-kubernetes-operator
        - name: AGENT_IMAGE
          value: quay.io/mongodb/mongodb-agent-ubi:108.0.2.8729-1
        - name: VERSION_UPGRADE_HOOK_IMAGE
          value: quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook:1.0.9
        - name: READINESS_PROBE_IMAGE
          value: quay.io/mongodb/mongodb-kubernetes-readinessprobe:1.0.22
        - name: MONGODB_IMAGE
          value: mongodb-community-server
        - name: MONGODB_REPO_URL
          value: quay.io/mongodb
        image: cgr.dev/ORGANIZATION/mongodb-kubernetes-operator:latest
        imagePullPolicy: Always
        name: mongodb-kubernetes-operator
        resources:
          limits:
            cpu: 1100m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 200Mi
        securityContext:
          readOnlyRootFilesystem: true
          runAsUser: 2000
          allowPrivilegeEscalation: false
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      serviceAccountName: mongodb-kubernetes-operator
EOF
```

Finally, apply the service account and deployment:
```
kubectl apply -f service_account.yaml
kubectl apply -f manager.yaml
```

## Documentation and Resources
- [Deploy and configure MongoDB resources](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/deploy-configure.md)
- [Create a database user with SCRAM authentication.](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/users.md)
- [Secure MongoDB resource connections using TLS](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/secure.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### http-echo

# http-echo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/http-echo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/http-echo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

http-echo is a lightweight Go-based web server that responds to all HTTP requests with a predefined message, making it useful for testing and debugging HTTP interactions.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `http-echo` container image is comparable to the [upstream image maintained by Hashicorp](https://hub.docker.com/r/hashicorp/http-echo), with the following differences:

* Like all other Chainguard Images, `http-echo` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting Started

The following example shows how to run Chainguard's `http-echo` container image:

```shell
docker run -p 8080:8080 cgr.dev/ORGANIZATION/http-echo -listen=:8080 -text="Hello, Wolfi!"
```

This will return output like the following:

```shell
2025/05/05 12:00:00 Serving text "Hello, Wolfi!" on port 8080
```

You can then test the web server using `curl`:

```shell
curl http://localhost:8080
```
```
Hello,  Wolfi!
```

## Documentation and Resources

- [GitHub Repository](https://github.com/hashicorp/http-echo)  
- [Docker Hub Page](https://hub.docker.com/r/hashicorp/http-echo)  

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### atmoz-sftp

# sftp
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sftp` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sftp/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Various scripts from https://github.com/atmoz/sftp to help run SFTP in a container

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Atmoz SFTP image is comparable to the [official Atmoz SFTP image](https://hub.docker.com/r/atmoz/sftp/). The upstream image includes the `openssh-server-pam` package in their image, , but we found it unnecessary for our version. None of the settings in upstream’s `sshd_config` require PAM, and user authentication relies solely on the shadow file.

## Getting Started

Ensure you have OpenSSH installed, specifically the `openssh-client` package, which includes the `sftp` command.

Replace `<host-dir>` with your desired directory and run:

```shell
docker run --rm --name sftp-container -v <host-dir>/upload:/home/foo/upload -p 2222:22 -it cgr.dev/ORGANIZATION/atmoz-sftp:latest foo:pass:::upload
```

You can verify the container is running with a `docker ps` command:

```shell
docker ps | grep sftp-container
```

To check if Wildfly has started successfully, check the logs with `docker logs`:

```shell
docker logs sftp-container | grep "Server listening on :: port 22."
```

Create a test file in your upload directory:

```shell
echo "test file" > <host-dir>/upload
```

Connect to the SFTP server:

```shell
sftp -o StrictHostKeyChecking=no -P 2222 foo@127.0.0.1
```

Enter the password (`pass`) when prompted. Once inside the SFTP shell, upload and verify the file:

```shell
put <host-dir>/upload/test.txt upload/test.txt
ls upload/test.txt
exit
```

Confirm the file is inside the container:

```shell
docker exec -it sftp-container ls -l /home/foo/upload | grep test.txt
```

Stop the container when done:

```shell
docker stop sftp-container
```

## Documentation and Resources

- [Atmoz SFTP](https://github.com/atmoz/sftp)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-kubectl-fips

# gitlab-kubectl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-kubectl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-kubectl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### oauth2-proxy-iamguarded

# oauth2-proxy-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/oauth2-proxy-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/oauth2-proxy-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/) is a reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

OAuth2-Proxy IAMGuarded is a security-enhanced variant of Oauth2-Proxy designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Oauth2-Proxy deployments.

## Helm Chart Installation

The Oauth2-Proxy IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install oauth2-proxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ image
image:
  registry: myregistry.example.com
  repository: mirrored/oauth2-proxy-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install oauth2-proxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/oauth2-proxy:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Oauth2-Proxy IAMGuarded installation using standard Oauth2-Proxy verification methods. The deployment functions as a standard Oauth2-Proxy instance, so all typical Oauth2-Proxy validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Oauth2-Proxy IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Oauth2-Proxy and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-cloudwatch-exporter-fips

# prometheus-cloudwatch-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-cloudwatch-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-cloudwatch-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### xeol

# xeol
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/xeol` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/xeol/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A scanner for end-of-life (EOL) software and dependencies in container images, filesystems, and SBOMs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [xeol](https://hub.docker.com/r/noqcks/xeol) image. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker
You can use Chainguard's xeol image with `docker` as follows:

```shell
docker run --rm cgr.dev/ORGANIZATION/xeol:latest cgr.dev/chainguard/static:latest
```
```
✅ no EOL software has been found
```

As this example shows, the scanned image contains no EOL software.

## Documentation and Resources
For more information, please refer to [the official xeo documentation](https://docs.xeol.io/intro). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-gcp-controller

# cluster-api-gcp-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-gcp-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-gcp-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API provider for Google Cloud Platform infrastructure management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-gcp-controller image is compatible with the upstream [Cluster API Provider GCP](https://github.com/kubernetes-sigs/cluster-api-provider-gcp). This image contains only the minimum set of dependencies needed to run the GCP infrastructure provider components.

## Getting Started

The Cluster API Provider for GCP enables you to create and manage Kubernetes clusters on Google Cloud Platform using Cluster API. It provides declarative APIs for provisioning and managing GCP infrastructure resources including Compute Engine instances, VPCs, and load balancers.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Google Cloud Platform account with appropriate permissions
- GCP service account credentials configured

### Installation

Initialize the GCP infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure gcp
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: gcp
  namespace: capg-system
spec:
  version: v1.10.0
  configSecret:
    name: capg-manager-bootstrap-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-gcp-controller:latest
EOF
```

### Usage Example

Create a GCP cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPCluster
metadata:
  name: my-gcp-cluster
  namespace: default
spec:
  project: my-gcp-project-id
  region: us-central1
  network:
    name: my-cluster-network
    autoCreateSubnetworks: true
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: GCPMachineTemplate
metadata:
  name: my-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      instanceType: e2-standard-2
      image: projects/k8s-staging-cluster-api-gcp/global/images/cluster-api-ubuntu-2004-v1-29-0
      diskSizeGb: 50
      publicIP: true
```

### Configuration

The controller requires a GCP service account with the following IAM roles:
- Compute Admin
- Service Account User
- Project IAM Admin (if using workload identity)

Create and configure the credentials secret:

```bash
kubectl create secret generic capg-manager-bootstrap-credentials \
  --from-file=credentials.json=/path/to/service-account.json \
  --namespace capg-system
```

## Documentation and Resources

* [Cluster API Provider GCP GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-gcp)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Google Cloud Platform Documentation](https://cloud.google.com/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### quic-go

# quic-go
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/quic-go` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/quic-go/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A production-ready QUIC implementation in pure Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `quic-go` image is comparable to the [official quic-go-interop image on DockerHub](https://hub.docker.com/r/martenseemann/quic-go-interop).

## Getting started

First, generate certificates for secure communication with the server using an utility such as `mkcert`:
```bash
mkdir -p certificates
cd certificates
mkcert -cert-file cert.pem -key-file key.priv localhost
```

Run the image using `docker` or your preferred container runtime:
```shell
docker run --rm -it \
  -e "TESTCASE=retry" \
  -e "ROLE=server" \
  -v "${PWD}:/certs" \
  -p 443:443 \
  -t cgr.dev/ORGANIZATION/quic-go:latest
```

Then interact with the server by using utilities such as `cURL`:
```
curl --http3 -k --cert=cert.pem --key=key.priv https://localhost:443/yourpath
```

For more information on how to use the client role of this image (`-e ROLE=client`), refer to the [upstream documentation on how to run a simulation](https://github.com/quic-interop/quic-network-simulator/tree/master?tab=readme-ov-file#running-a-simulation) with a docker compose deployment.

## Documentation and Resources
- [General quic-go-interop documentation](https://github.com/quic-interop/quic-network-simulator/tree/master)
- [quic-go-interop documentation on how to run a simulation](https://github.com/quic-interop/quic-network-simulator/tree/master?tab=readme-ov-file#running-a-simulation)
- [quic-go library documentation](https://quic-go.net/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### superset

# superset
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/superset` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/superset/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for Apache Superset. [Apache Superset](https://github.com/apache/superset/tree/master)is a Data Visualization and Data Exploration Platform

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying Apache Superset with Helm

Deploying Apache Superset with Chainguard's images is straightforward using the official Superset Helm chart.

First, add the Superset Helm repository:

```bash
helm repo add superset https://apache.github.io/superset

# Deploy Superset using:

helm install superset superset/superset \
  --set extraSecretEnv.SUPERSET_SECRET_KEY="$(openssl rand -base64 42)" \
  --set image.repository=cgr.dev/chainguard/superset \
  --set image.tag=latest
```

You can also customize your Helm deployment by editing the values.yaml after fetching the chart:

helm fetch superset/superset --untar
Then edit values.yaml to use Chainguard's images/tags:

```
image:
  repository: cgr.dev/chainguard/apache-superset
  tag: latest
```
Deploy your customized Helm chart:

```
helm install superset .
```

For detailed instructions on deploying Apache Superset via Helm, consult the official Apache Superset Helm chart documentation.

## Usage
With Apache Superset running, access the web interface by navigating to http://localhost:8088. Login with the default credentials or the ones you have configured.

You can now manage databases, create visualizations, and configure your dashboards.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-nifi

# apache-nifi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-nifi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-nifi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache NiFi was made for dataflow. It supports highly configurable directed graphs of data routing, transformation, and system mediation logic.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage

To get started with Chainguard's NiFi image, run it with Docker:

```bash
docker run -p 8443:8443 --name nifi cgr.dev/chainguard/apache-nifi:latest
```

NiFi will take a moment to start. Once it is finished, you'll see a message stating the Web UI is available:
     
```
NiFi has started. The UI is available at the following URLs
```

To obtain the username and password, check the Docker logs:

```bash
docker logs nifi | grep Generated
```

You can now access the Web UI at [localhost:8443](https://localhost:8443).

A user guide for NiFi can be found [here](https://nifi.apache.org/docs/nifi-docs/html/user-guide.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluentd

# fluentd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluentd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluentd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Fluentd](https://www.fluentd.org/): Unified Logging Layer (project under CNCF)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using fluentd

Run a Fluentd instance that will receive messages over TCP port 24224 through the Forward protocol, and send the messages to the STDOUT interface in JSON format

Create a config file at `./examples/basic_docker.conf` with the following content:

```
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.*>
  @type stdout
</match>
```

Run the fluentd container and mount the fluent.conf

```sh
docker run --rm -p 127.0.0.1:24224:24224 -v ${PWD}/examples/basic_docker.conf:/etc/fluent/fluent.conf cgr.dev/chainguard/fluentd
```

In another terminal try sending some logs to fluentd with another container

```sh
docker run --rm --log-driver=fluentd --log-opt tag="docker.{{.ID}}" cgr.dev/chainguard/wolfi-base echo 'Hello Fluentd!'
```

The Fluentd container should receive the message and print it to stdout:

```sh
2023-02-24 17:06:32 +0000 [info]: starting fluentd-1.15.3 pid=1 ruby="3.2.0"
2023-02-24 17:06:32 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "--under-supervisor"]
2023-02-24 17:06:32 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil
2023-02-24 17:06:32 +0000 [info]: #0 init worker0 logger path=nil rotate_age=nil rotate_size=nil
2023-02-24 17:06:32 +0000 [info]: adding match pattern="*.*" type="stdout"
2023-02-24 17:06:32 +0000 [info]: adding source type="forward"
2023-02-24 17:06:32 +0000 [warn]: #0 define <match fluent.**> to capture fluentd logs in top level is deprecated. Use <label @FLUENT_LOG> instead
2023-02-24 17:06:32 +0000 [info]: #0 starting fluentd worker pid=11 ppid=1 worker=0
2023-02-24 17:06:32 +0000 [info]: #0 listening port port=24224 bind="0.0.0.0"
2023-02-24 17:06:32 +0000 [info]: #0 fluentd worker is now running worker=0
2023-02-24 17:06:32.824499403 +0000 fluent.info: {"pid":11,"ppid":1,"worker":0,"message":"starting fluentd worker pid=11 ppid=1 worker=0"}
2023-02-24 17:06:32.824689854 +0000 fluent.info: {"port":24224,"bind":"0.0.0.0","message":"listening port port=24224 bind=\"0.0.0.0\""}
2023-02-24 17:06:32.825323737 +0000 fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}
2023-02-24 17:06:54.000000000 +0000 docker.eb2613ef91b4: {"container_id":"eb2613ef91b4fa0989b7af9f3b1310bc4de6c13aae5ee42901d553e81b575045","container_name":"/focused_fermat","source":"stdout","log":"Hello Fluentd!"}
```

## Using the -dev variant

The `-dev` variant contains a shell and tools like `apk` to allow users to easily debug and modify the image. The `-dev` variant uses the same entrypoint as the regular image so if you want to get a shell make sure to override the entrypoint like so.

```sh
docker run --rm --entrypoint 'sh' cgr.dev/chainguard/fluentd
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluentd-fips

# fluentd-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluentd-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluentd-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `fluentd-fips` image is based on the [fluent/fluentd image](https://hub.docker.com/r/fluent/fluentd).

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Verify the image configuration:

```shell
docker run --rm --entrypoint fluentd cgr.dev/ORGANIZATION/fluentd-fips:latest --dry-run
```

Create a configuration file. The following is a minimal example that will suffice for demonstration purposes:

```shell
cat > fluent.conf <<EOF
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.*>
  @type stdout
</match>
EOF
```

Run Fluentd with the configuration:

```shell
docker run --rm -p 127.0.0.1:24224:24224 -v ${PWD}/fluent.conf:/etc/fluent/fluent.conf cgr.dev/ORGANIZATION/fluentd-fips:latest
```

Test log forwarding from another container:

```shell
docker run --rm --log-driver=fluentd --log-opt fluentd-address=127.0.0.1:24224 --log-opt tag="docker.test" cgr.dev/chainguard/wolfi-base echo 'Hello Fluentd!'
```

> [!WARNING] 
> This image enforces FIPS-approved cryptographic algorithms for secure connections, which may affect compatibility with legacy systems or non-FIPS compliant endpoints.

## Documentation and Resources

- [Fluentd Documentation](https://docs.fluentd.org/)
- [fluent/fluentd Docker Hub](https://hub.docker.com/r/fluent/fluentd)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-operator

# fluent-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Operator for Fluent Bit and Fluentd - previously known as FluentBit Operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The Fluent Operator is designed to deploy FluentBit Fluentd as a DaemonSet and StatefulSet respectively. It supports dynamic reconfiguration via CRDs and can be deployed using YAML or Helm.

To deploy the Chainguard Fluent Operator image, use the following Helm commands:

```
helm repo add fluent https://fluent.github.io/helm-charts
helm install fluent-operator \
    --create-namespace \
    -n fluent fluent/fluent-operator \
    --set operator.container.repository=cgr.dev/chainguard/fluent-operator \
    --set operator.container.tag=latest
```

Once the operator is deployed, follow the [Fluent Operator Walkthrough](https://github.com/kubesphere-sigs/fluent-operator-walkthrough) guides to configure FluentBit or Fluentd appropriately for your Kubernetes cluster.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-crds

# secrets-store-csi-driver-crds
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-crds` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-crds/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An image to be used as a init container to create the necessary CRDs while deploying the Kubernetes Secrets Store CSI Driver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

You can use the Kubernetes Secrets Store CSI Driver official Helm chart with the following parameters to use this image:

```bash
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
--namespace kube-system \
--set linux.crds.image.repository=cgr.dev/chainguard-private/secrets-store-csi-driver-crds \
--set linux.crds.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### shellcheck

# shellcheck
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/shellcheck` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/shellcheck/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ShellCheck -- Shell script analysis tool

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `shellcheck` container image is compatible with the [`koalaman/shellcheck`](https://hub.docker.com/r/koalaman/shellcheck) image.

## Getting Started

### Docker

Run ShellCheck with Docker to analyze a shell script:

```shell
docker run --rm -v "$PWD:/mnt" cgr.dev/ORGANIZATION/shellcheck:latest script.sh
```

To check all shell scripts in the current directory:

```shell
docker run --rm -v "$PWD:/mnt" cgr.dev/ORGANIZATION/shellcheck:latest *.sh
```

## Documentation and Resources

- [ShellCheck Wiki](https://www.shellcheck.net/wiki/)
- [ShellCheck Website](https://www.shellcheck.net/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jenkins-inbound-agent

# jenkins-inbound-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jenkins-inbound-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jenkins-inbound-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Jenkins Inbound Agent container image is designed to run as a Jenkins agent that connects to a Jenkins controller via inbound (JNLP) connection method, used in Jenkins Kubernetes setups.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [jenkins/inbound-agent](https://github.com/jenkinsci/docker-inbound-agent) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing Jenkins setup.

> [!NOTE]
> Like upstream, the jenkins-inbound-agent image supports the `jdk17` and `jdk21` subtags. For example, v2.544-jdk21 contains Jenkins with OpenJDK-21. Unlike upstream, the non-JDK specified tags (including latest) still point to JDK 17. These tags will be updated in the future to point to JDK 21 with a breaking change announcement.

## Getting Started

### Docker

You can run the Jenkins Inbound Agent with Docker:

```bash
docker run --init cgr.dev/ORGANIZATION/jenkins-inbound-agent -url http://jenkins-server:8080 <secret> <agent-name>
```

### Kubernetes with Helm

The most common use case for this image is within Kubernetes. You can use the official Jenkins Helm chart with the Chainguard Jenkins Inbound Agent image:

1. Add the Jenkins Helm repository:

```bash
helm repo add jenkins https://charts.jenkins.io
helm repo update
```

2. Create a values.yaml file to configure the deployment with the Chainguard image:

```yaml
agent:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/jenkins-inbound-agent
    tag: latest
    alwaysPullImage: true
  resources:
    requests:
      cpu: "256m"
      memory: "256Mi"
    limits:
      cpu: "512m"
      memory: "512Mi"

# Additionally, if you wish to use the Chainguard Jenkins image:
controller:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/jenkins
    tag: latest
```

3. Install the Jenkins Helm chart:

```bash
helm install jenkins jenkins/jenkins \
  --values values.yaml \
  --namespace jenkins --create-namespace
```

### JCasC Configuration

If you're using Jenkins Configuration as Code (JCasC), you can configure pod templates to use the Chainguard Jenkins Inbound Agent:

```yaml
jenkins:
  clouds:
    - kubernetes:
        name: "kubernetes"
        templates:
          - name: "jenkins-agent"
            namespace: "jenkins"
            label: "jenkins-agent"
            nodeUsageMode: NORMAL
            containers:
              - name: "jnlp"
                image: "cgr.dev/ORGANIZATION/jenkins-inbound-agent:latest"
                alwaysPullImage: true
                privileged: false
                resourceRequestCpu: "256m"
                resourceRequestMemory: "256Mi"
                resourceLimitCpu: "512m"
                resourceLimitMemory: "512Mi"
                workingDir: "/home/jenkins/agent"
            idleMinutes: 30
            podRetention: "OnFailure"
```

### Environment Variables

The image respects the following environment variables:

- `AGENT_WORKDIR`: Path to the agent's work directory (default: `/home/jenkins/agent`)
- `JENKINS_URL`: Jenkins controller URL
- `JENKINS_SECRET`: Agent connection secret
- `JENKINS_AGENT_NAME`: Agent name
- `JENKINS_WEB_SOCKET`: If true, use WebSocket transport for JNLP (default: `false`)

## Documentation and Resources

* [Official Jenkins inbound-agent repository](https://github.com/jenkinsci/docker-inbound-agent)
* [Jenkins Kubernetes Plugin Documentation](https://plugins.jenkins.io/kubernetes/)
* [Jenkins Helm Chart Documentation](https://github.com/jenkinsci/helm-charts/tree/main/charts/jenkins)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-node-termination-handler-fips

# aws-node-termination-handler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-node-termination-handler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-node-termination-handler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Gracefully handle EC2 instance shutdown within Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the official [aws-node-termination-handler](https://gallery.ecr.aws/aws-ec2/aws-node-termination-handler) image. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install Chainguard's aws-node-termination-handler image on your Kubernetes cluster, you can use the official image's [Helm chart](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler).

> **NOTE**:  AWS Node Termination Handler Helm chart is now deprecated under https://aws.github.io/eks-charts. 

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/aws-node-termination-handler-fips
  tag: latest
```

You can also invoke the following command to install aws-node-termination-handler in your cluster.

```shell
git clone https://github.com/aws/aws-node-termination-handler
cd aws-node-termination-handler
helm install aws-node-termination-handler \
    --wait --timeout=5m \
    --namespace kube-system \
    -f values.yaml \
    ./config/helm/aws-node-termination-handler
```

### FIPS Support
The `aws-node-termination-handler-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Documentation and Resources
- [Official GitHub repository](https://github.com/aws/aws-node-termination-handler/)
- (Blog) [Automate deployment of Node Termination Handler in Amazon EKS by using a CI/CD pipeline](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### eclipse-mosquitto

# eclipse-mosquitto
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/eclipse-mosquitto` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/eclipse-mosquitto/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Eclipse Mosquitto - An open source MQTT broker

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

You can use the following config file to run the Eclipse Mosquitto image for quick testing:

```yaml
cat <<EOF > mosquitto.conf
listener 1883
allow_anonymous true
EOF
```

Then, you can run the image with the following command:

```bash
docker run -d --name mosquitto -p 1883:1883 -v $(pwd)/mosquitto.conf:/mosquitto/config/mosquitto.conf cgr.dev/chainguard/eclipse-mosquitto:latest
```

That's it! You can now connect to the Mosquitto broker using an MQTT client.

To get more information about the configuration options, you can refer to the [official Mosquitto Quick Start documentation](https://github.com/eclipse/mosquitto/tree/master?tab=readme-ov-file#quick-start).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-secret-sync

# k8s-secret-sync
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-secret-sync` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-secret-sync/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

k8s-secret-sync provides two-way sync of JSON files to Kubernetes secret objects

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with `docker.io/jupyterhub/k8s-secret-sync`. It provides a Python-based utility for bidirectional synchronization.

## Getting Started

The `k8s-secret-sync` utility provides two core operations for managing Kubernetes secrets:

- Load Operation: Read data from a Kubernetes secret and write it into a JSON file.

- Watch-Save Operation: Continuously watch a file and sync changesback to a Kubernetes secret.

## Kubernetes Deployment

When deployed in Kubernetes with JupyterHub, k8s-secret-sync typically runs as a sidecar container alongside Traefik in the autohttps deployment. In JupyterHub deployments, k8s-secret-sync is automatically deployed when using Let's Encrypt for HTTPS:

```yaml
# values.yaml for JupyterHub Helm chart
proxy:
  https:
    enabled: true
    type: letsencrypt
    hosts:
      - jupyterhub.example.com
    letsencrypt:
      contactEmail: admin@example.com
  secretSync:
    image:
      name: cgr.dev/ORGANIZATION/k8s-secret-sync
      tag: latest
```

The container only deploys when **all** of these conditions are met:
- `proxy.https.enabled = true`
- `proxy.https.type = "letsencrypt"`
- `proxy.https.hosts` is configured (not empty)

## Documentation and Resources

- [JupyterHub Zero to Hero Guide](https://z2jh.jupyter.org/)
- [JupyterHub Helm Chart Documentation](https://z2jh.jupyter.org/en/stable/jupyterhub)
- [JupyterHub GitHub Repository](https://github.com/jupyterhub/zero-to-jupyterhub-k8s)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### liberica-jre

# liberica-jre
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/liberica-jre` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/liberica-jre/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Free and open source Progressive Java Runtime for modern Java deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard version of [Liberica JRE](https://bell-sw.com/libericajdk/) is a minimal, secure, and regularly updated container image designed to run Java applications. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

To test the Chainguard version of Liberica JRE, you can use the following examples:

### Running a Simple Java Application

Create a Java application, such as this `HelloWorld.java` example:

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

Compile the application:

```shell
javac HelloWorld.java
```

Create a Dockerfile to build the image:

```Dockerfile
FROM cgr.dev/chainguard/liberica-jre:latest
COPY HelloWorld.class /app/
WORKDIR /app
CMD ["java", "HelloWorld"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the application output:

```
Hello, World!
```

### Running a Java Application with Dependencies

If your Java application has dependencies, you can use a build tool like Maven. Create a `pom.xml` file for your project and a Java application:

```xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</project>
```

```java
import org.apache.commons.lang3.StringUtils;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(StringUtils.capitalize("hello, world!"));
    }
}
```

Create a Dockerfile to build the image:

```Dockerfile
FROM maven:3.8.4-openjdk-11 AS build
COPY pom.xml /app/
COPY src /app/src
WORKDIR /app
RUN mvn package

FROM cgr.dev/chainguard/liberica-jre:latest
COPY --from=build /app/target/hello-world-1.0-SNAPSHOT.jar /app/hello-world.jar
WORKDIR /app
CMD ["java", "-jar", "hello-world.jar"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the output returned by the application:

```
Hello, world!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ksops

# ksops
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ksops` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ksops/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

KSOPS, or kustomize-SOPS, is a kustomize KRM exec plugin for SOPS encrypted resources. KSOPS can be used to decrypt any Kubernetes resource, but is most commonly used to decrypt encryptedKubernetes Secrets and ConfigMaps. As a kustomize plugin, KSOPS allows you to manage, build, and apply encrypted manifests the same way you manage the rest of your Kubernetes manifests.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `ksops` image contains only the minimum set of tools and dependencies needed to function. It is comparable to the [official ksops image.](https://hub.docker.com/r/viaductoss/ksops).

## Getting started

Below is a short guide demonstrating how to:

* Create and encrypt a sample Kubernetes Secret using `sops`.
* Decrypt it using the `ksops` image in a Docker container

### 1. Create a sample Kubernetes Secret

```bash
cat <<EOF > secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
EOF
```

### 2. Generate an AGE key pair

```bash
age-keygen -o age-key.txt
```
You can also make use of other tools such as `gnupg`.

### 3. Create a SOPS configuration

Use an environment variable to capture the public key:

```bash
export AGE_PUBLIC_KEY="$(grep -oE 'age1[0-9a-z]+' age-key.txt)"
```
Then create a `.sops.yaml` file to instruct SOPS on how to encrypt only data fields:

```bash
cat <<EOF > .sops.yaml
creation_rules:
  - unencrypted_regex: "^(apiVersion|metadata|kind|type)$"
    age: "$AGE_PUBLIC_KEY"
EOF
```

### 4. Encrypt the Secret
Use SOPS to encrypt the file:

```bash
sops -e secret.yaml > secret.enc.yaml
```
The resulting `secret.enc.yaml` file will contain encrypted values for username and password.

### 5. Create a KSOPS manifest
This manifest references the encrypted file so that kustomize-sops (KSOPS) knows how to handle decryption:

```bash
cat <<EOF > secret-generator.yaml
apiVersion: viaduct.ai/v1
kind: ksops
metadata:
  name: test-secret-generator
files:
  - ./secret.enc.yaml
EOF
```

### 6. Decrypt with ksops Inside a Docker Container
Replace ORGANIZATION with the appropriate namespace for your image:

```bash
docker run --rm \
  -v "$(pwd):/test" \
  -e SOPS_AGE_KEY_FILE=/test/age-key.txt \
  cgr.dev/ORGANIZATION/ksops:latest \
  /test/secret-generator.yaml > decrypted-secret.yaml
```
### 7. Verify the Decrypted File
Compare the newly decrypted file against your original secret.yaml (minus metadata fields):

```bash
diff <(yq eval 'del(.metadata)' secret.yaml) <(yq eval 'del(.metadata)' decrypted-secret.yaml)
```

The `decrypted-secret.yaml` file will look like the original Secret:

```bash
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
```

## Documentation and Resources

For more information, you can refer to the [official kustomize-sops documentation](https://github.com/viaduct-ai/kustomize-sops?tab=readme-ov-file#ksops---a-flexible-kustomize-plugin-for-sops-encrypted-resources).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ntpd-rs

# ntpd-rs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ntpd-rs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ntpd-rs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [ntpd-rs](https://github.com/pendulum-project/ntpd-rs).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using ntpd-rs

The Chainguard nptd-rs image contains the `ntp-daemon` server binary.

This binary requires extra capabilities to run (in order to interface with the system time).
In Docker, this can be added with `--cap-add SYS_TIME`.

To run this image, using the public `pool.ntp.org` server as a peer:

```shell
$ docker run --cap-add SYS_TIME cgr.dev/chainguard/ntpd-rs -p pool.ntp.org

2023-04-02T18:50:30.985666Z  WARN ntp_daemon::config: Fewer peers configured than are required to agree on the current time. Daemon will not do anything.
2023-04-02T18:50:31.001470Z  WARN ntp_proto::peer: Peer rejected due to invalid stratum stratum=16
2023-04-02T18:50:31.094893Z  WARN run{config=SystemConfig { min_intersection_survivors: 3, min_cluster_survivors: 3, frequency_tolerance: FrequencyTolerance { ppm: 15 }, distance_threshold: NtpDuration(1000.0000002328306 ms), frequency_measurement_period: NtpDuration(900000.0002095476 ms), spike_threshold: NtpDuration(900000.0002095476 ms), panic_threshold: StepThreshold { forward: Some(NtpDuration(1000000.0002328306 ms)), backward: Some(NtpDuration(1000000.0002328306 ms)) }, startup_panic_threshold: StepThreshold { forward: None, backward: None }, accumulated_threshold: None, local_stratum: 16, poll_limits: PollIntervalLimits { min: PollInterval(16 s), max: PollInterval(1024 s) }, initial_poll: PollInterval(16 s) } local_clock_time=NtpInstant { instant: Instant { tv_sec: 331968, tv_nsec: 938303897 } } system_poll=PollInterval(16 s) peers=[PeerIndex { index: 0 }]}:clock_select{peers=[(PeerIndex { index: 0 }, PeerTimeSnapshot { root_distance_without_time: NtpDuration(8035.252420705569 ms), statistics: PeerStatistics { offset: NtpDuration(47.34621826730347 ms), delay: NtpDuration(93.3494211857555 ms), dispersion: NtpDuration(7937.502728527762 ms), jitter: 3.814697266513178e-6 }, time: NtpInstant { instant: Instant { tv_sec: 331968, tv_nsec: 938270064 } }, stratum: 2, leap_indicator: NoWarning, root_delay: NtpDuration(60.57739259222927 ms), root_dispersion: NtpDuration(20.782470707963796 ms) })]}: ntp_proto::clock_select: No clique of peers that agree on the current time.
2023-04-02T18:50:31.094923Z  INFO ntp_proto::algorithm::standard: filter and combine did not produce a result
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sbt-fips

# sbt-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sbt-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sbt-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Tags and FIPS specific notes

The tags are in the form of `<SBT_VERSION>-jdk<OPENJDK_VERSION>[-dev]`, such that one can track `1-jdk21` for SBT 1.x.x with OpenJDK 21.

The `-dev` variants contain jmods, thus suitable to use jlink.

Note, when performing jlink exclude `bc-fips.jar`'s `/usr/share/java/bouncycastle-fips/` module-path from jlink, as jlink is unable to link signed jars. Instead ensure that `--module-path=/usr/share/java/bouncycastle-fips` is used at runtime, with such path copied from either this image, or `jdk-fips` or `jre-fips` images.

OpenJDK 8 is not currently supported for FIPS, thus with this `sbt-fips` image, one must target at least JDK 11 during build.

Please see specification tab for the extra variables set to ensure SBT and Java are operating in FIPS mode.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### xeol-fips

# xeol
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/xeol` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/xeol/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A scanner for end-of-life (EOL) software and dependencies in container images, filesystems, and SBOMs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [xeol](https://hub.docker.com/r/noqcks/xeol) image. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker
You can use Chainguard's xeol image with `docker` as follows:

```shell
docker run --rm cgr.dev/ORGANIZATION/xeol:latest cgr.dev/chainguard/static:latest
```
```
✅ no EOL software has been found
```

As this example shows, the scanned image contains no EOL software.

## Documentation and Resources
For more information, please refer to [the official xeo documentation](https://docs.xeol.io/intro). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redisinsight

# redisinsight
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redisinsight` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redisinsight/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Redis GUI by Redis

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

RedisInsight is a free GUI for Redis that provides visualization, analysis, and debugging capabilities for Redis and Redis Stack. Chainguard's RedisInsight container image is comparable to the [official RedisInsight images available on Docker Hub](https://hub.docker.com/r/redislabs/redisinsight). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it does not include things like a shell or a package manager.

The Chainguard RedisInsight image is built from the official RedisInsight source and provides the same web-based interface for managing Redis databases.

One important note is that the Chainguard RedisInsight image does not ship with `RI_SEGMENT_WRITE_KEY` environment variable set so you have to set it manually. You can obtain a Segment Write Key by signing up for a free account at [Segment](https://segment.com/).

## Getting Started

The quickest way to get started with this image is by using Docker:

```shell
docker run --rm -it \
  -v redisinsight:/db \
  -p 5540:5540 \
  cgr.dev/ORGANIZATION/redisinsight:latest
```

Once the container is running, you can access the RedisInsight web interface at `http://localhost:5540`.

### Connecting to Redis

After accessing the web interface, you can add Redis database connections by clicking "Add Redis Database" and providing the connection details:
- For local Redis instances, use `host.docker.internal` as the hostname (on macOS/Windows) or the host IP address
- For remote Redis instances, use the appropriate hostname/IP and port
- Provide authentication credentials if required

### Using with Docker Compose

You can also deploy RedisInsight alongside Redis using Docker Compose:

```yaml
version: '3.8'
services:
  redis:
    image: cgr.dev/ORGANIZATION/redis:latest
    ports:
      - "6379:6379"
    
  redisinsight:
    image: cgr.dev/ORGANIZATION/redisinsight:latest
    ports:
      - "5540:5540"
    depends_on:
      - redis
```

### Using with Kubernetes

You can follow up the official documentation about how to deploy RedisInsight on Kubernetes: [Deploying RedisInsight on Kubernetes](https://redis.io/docs/latest/operate/redisinsight/install/install-on-k8s).

But basically this is a simple example of a Kubernetes Deployment and Service for RedisInsight:

```yaml
# Redis Insight service with name 'redisinsight-service'
apiVersion: v1
kind: Service
metadata:
  name: redisinsight-service       # name should not be 'redisinsight'
                                   # since the service creates
                                   # environment variables that
                                   # conflicts with redisinsight
                                   # application's environment
                                   # variables `RI_APP_HOST` and
                                   # `RI_APP_PORT`
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 5540
  selector:
    app: redisinsight
---
# Redis Insight deployment with name 'redisinsight'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redisinsight #deployment name
  labels:
    app: redisinsight #deployment label
spec:
  replicas: 1 #a single replica pod
  selector:
    matchLabels:
      app: redisinsight #which pods is the deployment managing, as defined by the pod template
  template: #pod template
    metadata:
      labels:
        app: redisinsight #label for pod/s
    spec:
      containers:

      - name:  redisinsight #Container name (DNS_LABEL, unique)
        image: cgr.dev/ORGANIZATION/redisinsight:latest #Container image name
        imagePullPolicy: IfNotPresent #Installs the latest Redis Insight version
        volumeMounts:
        - name: redisinsight #Pod volumes to mount into the container's filesystem. Cannot be updated.
          mountPath: /data
        ports:
        - containerPort: 5540 #exposed container port and protocol
          protocol: TCP
      volumes:
      - name: redisinsight
        emptyDir: {} # node-ephemeral volume https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
```

then apply it with:

```shell
kubectl apply -f redisinsight-deployment.yaml
```

Redis Insight also provides a health check endpoint at http://localhost:5540/api/health/ to monitor the health of the running container.

## Documentation and Resources

- [RedisInsight Official Documentation](https://redis.io/docs/latest/operate/redisinsight)
- [RedisInsight GitHub Repository](https://github.com/RedisInsight/RedisInsight)
- [Redis Official Documentation](https://redis.io/documentation)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nvidia-device-plugin-fips

# nvidia-device-plugin-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nvidia-device-plugin-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nvidia-device-plugin-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Pre-requisites
Ensure your environment satisfies the [prerequisites](https://github.com/NVIDIA/k8s-device-plugin#prerequisites).

Jump to [Quick Start](https://github.com/NVIDIA/k8s-device-plugin#quick-start)
to learn more.

## Deploy via helm
To use the Chainguard Image, override the values below in your
`values.yaml` to use with [Helm](https://github.com/NVIDIA/k8s-device-plugin#deployment-via-helm):

```yaml
image:
  repository: cgr.dev/ORGANIZATION/nvidia-device-plugin-fips
  tag: latest
```

When using this image with the `nvidia/gpu-operator` [helm chart](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/23.9.0/index.html) `bash` is required to run the mounted `/bin/entrypoint.sh` script.

For this you should use the `latest-dev` variant.

```
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

helm install --wait gpu  -n gpu-operator --create-namespace nvidia/gpu-operator
```
Values:
```yaml
driver:
   enabled: false
devicePlugin:
  repository: cgr.dev/ORGANIZATION
  image: nvidia-device-plugin-fips
  tag: latest-dev
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-fips

# grafana-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal wolfi-based image for grafana, which is an open-source monitoring and observability application

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The FIPS Chainguard Image for Grafana is meant to serve as a FIPS drop-in replacement for [the official Grafana image from Docker Hub](https://hub.docker.com/r/grafana/grafana). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The FIPS Chainguard Image for Grafana can be deployed using Docker or Helm.

### Using Docker to Deploy

Refer to the [Grafana Docker image documentation](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker) for full instructions on how to launch Grafana using Docker.

Example:

```bash
docker run --name=local-grafana -p 3000:3000 cgr.dev/ORGANIZATION/grafana-fips:latest
```

The Grafana Web UI will then be accessible at [`http://localhost:3000`](http://localhost:3000).

### Using Helm to Deploy

Grafana can be deployed using [this Helm chart](https://artifacthub.io/packages/helm/grafana/grafana).

Be aware that when using this Helm chart, you will need to override the default image and tag used by replacing it with the Chainguard image, as in this example:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```
Then, create a YAML values file with the following command:

```shell
cat > values.yaml <<EOF
image:
  repository: cgr.dev/chainguard/grafana-fips
  tag: latest

EOF
```

If you want to leverage the Chainguard Image for sidecar images you are using, add these lines to `values.yaml`:

```yaml
image:
  registry: cgr.dev
  repository: cgr.dev/chainguard/k8s-sidecar
  tag: latest
```

Refer to the [Helm chart documentation](https://artifacthub.io/packages/helm/grafana/grafana) for more information.

## Documentation and Resources

- [Grafana documentation](https://grafana.com/docs/)
- [Grafana GitHub repository](https://github.com/grafana/grafana)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sql_exporter

# sql_exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sql_exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sql_exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Database-agnostic SQL Exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard SQL Exporter image is meant to serve as a drop-in replacement for the [official sql_exporter image from Docker Hub](https://hub.docker.com/r/burningalchemist/sql_exporter). Like most other Chainguard Images, the SQL Exporter image has few-to-zero CVEs and does not run as the root user.

## Getting Started

To deploy Chainguard's SQL Exporter image with the official Helm chart, you can run a command like the following:

Add the Helm repo:
```shell
helm repo add sql_exporter https://burningalchemist.github.io/sql_exporter/
helm repo update
```

Prepare the custom values `values.yaml`
```shell
image:
  repository: cgr.dev/ORGANIZATION/sql_exporter
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Install the chart:

```shell
helm upgrade --install sql_exporter/sql-exporter -f values.yaml
```

Wait for the deployment to complete, and you should have the SQL Exporter running in your cluster.

```shell
kubectl wait --for condition=ready pod -l app.kubernetes.io/instance=sql-exporter --timeout=120s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-vsphere-controller-fips

# cluster-api-provider-vsphere-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-provider-vsphere-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-provider-vsphere-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes-native declarative infrastructure for vSphere

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-vsphere-controller image is compatible with the upstream [Cluster API Provider vSphere](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere). This image contains only the minimum set of dependencies needed to run the vSphere infrastructure provider components.

### FIPS Support
The `cluster-api-azure-controller-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Installation

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool

### Initialization

Initialize the vSphere infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure vsphere
```

You need to create a [`clusterctl.yaml`](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md#configuring-and-installing-cluster-api-provider-vsphere-in-a-management-cluster) to configure the `VSPHERE_` variables.

### Creating a vSphere-based workload cluster

Use the `clusterctl` CLI tool to generate a workload cluster configuration:

```
clusterctl generate cluster vsphere-quickstart \
  --infrastructure vsphere \
  --kubernetes-version v1.17.3 \
  --control-plane-machine-count 1 \
  --worker-machine-count 3 > cluster.yaml
```

Inspect and make any changes:

```
vi cluster.yaml
```

Finally, apply the configuration:

```
kubectl apply -f cluster.yaml
```

### Accessing the workload cluster

```
kubectl get secret/vsphere-quickstart-kubeconfig -o json \
| jq -r .data.value \
| base64 --decode \
> ./vsphere-quickstart.kubeconfig
```

Now you can access the workload cluster:

```
KUBECONFIG=vsphere-quickstart.kubeconfig kubectl get --raw='/readyz?verbose'
```

## Documentation and Resources

* [Cluster API Provider vSphere GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere)
* [Getting Started](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-mailroom

# gitlab-mailroom
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-mailroom` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-mailroom/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GitLab Mailroom is a daemon that monitors IMAP and POP3 mailboxes for incoming emails and forwards them to GitLab. It enables email-based workflows such as creating issues via email, replying to issues, and Service Desk functionality.

To get more information about the image, please visit the GitLab [repository](https://gitlab.com/gitlab-org/ruby/gems/gitlab-mail_room).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab-mailroom` image is designed as a drop-in replacement for the official GitLab Mailroom container image, with the following key differences:

* Runs as a non-root user by default
* Tagged with the gitlab-mailroom gem version

This image is compatible with GitLab's Helm chart and can be configured as a direct replacement in your GitLab deployment.

Note that this image does not include `bundler` and `gcc`.

## Getting Started

The `gitlab-mailroom` image is typically deployed as part of a GitLab installation to handle incoming email. It monitors IMAP or POP3 mailboxes and delivers received emails to GitLab for processing.

### Basic Usage with Docker

To test the image directly with Docker:

```sh
docker run cgr.dev/ORGANIZATION/gitlab-mailroom:latest
```

The container will start the mail_room service, which expects a configuration file at `/var/opt/gitlab/mail_room.yml`. By default, it will parse ERB templates from `/etc` and then start monitoring configured mailboxes.

### Using with GitLab Helm Chart

The `gitlab-mailroom` image integrates seamlessly with the GitLab Helm chart. Configure it in your `values.yaml`:

```yaml
global:
  appConfig:
    incomingEmail:
      enabled: true
      address: "incoming@example.com"
      host: "imap.example.com"
      port: 993
      ssl: true
      user: "mailroom@example.com"
      password:
        secret: gitlab-mailroom-password
        key: password
      mailbox: "inbox"
      idleTimeout: 60
      inboxMethod: "imap"
      deliveryMethod: "sidekiq"

gitlab:
  mailroom:
    enabled: true
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-mailroom
      tag: latest
```

This configuration enables:
- IMAP mailbox monitoring on `imap.example.com`
- Automatic email delivery to GitLab via Sidekiq
- Secure credential storage using Kubernetes secrets

## Configuration

The `gitlab-mailroom` container is configured through environment variables and a YAML configuration file:

### Environment Variables

- `CONFIG_TEMPLATE_DIRECTORY`: Directory containing ERB templates (default: `/etc`)

### Configuration File

The mail_room service expects its configuration at `/var/opt/gitlab/mail_room.yml`. In a GitLab Helm deployment, this file is automatically generated from the `global.appConfig.incomingEmail` settings.

Example minimal configuration:

```yaml
mailboxes:
  - email: "incoming@example.com"
    host: "imap.example.com"
    port: 993
    ssl: true
    start_tls: false
    name: "inbox"
    idle_timeout: 60
    delivery_method: sidekiq
    delivery_options:
      redis_url: "redis://redis:6379"
      namespace: "resque:gitlab"
      queue: "incoming_email"
      worker: "EmailReceiverWorker"
```

### Volume Mounts

When running standalone, mount your configuration:

```sh
docker run -v /path/to/mail_room.yml:/var/opt/gitlab/mail_room.yml \
  cgr.dev/ORGANIZATION/gitlab-mailroom:latest
```

## Documentation and Resources

For more information about GitLab Mailroom and email integration:

* [GitLab Incoming Email Documentation](https://docs.gitlab.com/ee/administration/incoming_email.html)
* [GitLab Service Desk Documentation](https://docs.gitlab.com/ee/user/project/service_desk.html)
* [mail_room gem on RubyGems](https://rubygems.org/gems/mail_room)
* [GitLab Mailroom Source Code](https://gitlab.com/gitlab-org/ruby/gems/gitlab-mail_room)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-elasticsearch-exporter-iamguarded

# prometheus-elasticsearch-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-elasticsearch-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-elasticsearch-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Elasticsearch Exporter image for exporting various metrics about Elasticsearch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Elasticsearch Exporter IAMGuarded is a security-enhanced variant of Prometheus Elasticsearch Exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Prometheus Elasticsearch Exporter deployments.

## Helm Chart Installation

The Elasticsearch IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Elasticsearch image
image:
  registry: myregistry.example.com
  repository: mirrored/elasticsearch-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Elasticsearch exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-elasticsearch-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctlImage:
  registry: myregistry.example.com
  repository: mirrored/os-shell-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for copying TLS certificates
copyTlsCerts:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Kibana image (if enabled)
kibana:
  image:
    registry: myregistry.example.com
    repository: mirrored/elasticsearch-kibana
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/elasticsearch:16.0.2
   Digest: sha256:9ec24375344b5161756f11d49d3011655c44fa2e40244d7fbecaa0b20eee2eeb
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Elasticsearch IAMGuarded installation using standard Elasticsearch verification methods. The deployment functions as a standard Elasticsearch instance, so all typical Elasticsearch validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Elasticsearch IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Elasticsearch and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-state-metrics

# kube-state-metrics
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-state-metrics` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-state-metrics/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Kube State Metrics Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm
Add the `prometheus-community` Helm repository:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
```

Next, we can install the kube-state-metrics with the following command:

```sh
helm upgrade --install kube-state-metrics \
    prometheus-community/kube-state-metrics \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/kube-state-metrics \
    --set image.tag=latest
```

Once the kube-state-metrics has been deployed, verify the pods are running:

```shell
kubectl get pods -l app.kubernetes.io/name=kube-state-metrics
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-mimir-fips

# grafana-mimir-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-mimir-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-mimir-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluentd-iamguarded

# fluentd-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluentd-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluentd-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Fluentd](https://www.fluentd.org/): Unified Logging Layer (project under CNCF)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Fluentd IAMGuarded is a security-enhanced variant of Fluentd designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Fluentd deployments.

## Helm Chart Installation

The Fluentd IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/fluentd
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install fluentd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/fluentd \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Fluentd image
image:
  registry: myregistry.example.com
  repository: mirrored/fluentd-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install fluentd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/fluentd@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/fluentd
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/fluentd:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Fluentd IAMGuarded installation using standard Fluentd verification methods. The deployment functions as a standard Fluentd instance, so all typical Fluentd validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Fluentd IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Fluentd and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zot

# zot
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zot` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zot/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [zot](https://github.com/project-zot/zot) binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Create a zot config file:

```
cat <<EOF > zot-config.yaml
distspecversion: 1.1.0-dev
http:
  address: 0.0.0.0
  port: 5000
storage:
  rootdirectory: /var/lib/zot/data
EOF
```

Create a fresh `data` directory (this will store all OCI blobs as
[OCI Image Layout](https://github.com/opencontainers/image-spec/blob/main/image-layout.md)):

```
rm -rf data && mkdir data && chmod go+wrx data
```

Run the server:

```
docker run --rm -p 5000:5000 \
  -v "${PWD}/zot-config.yaml":/zot-config.yaml \
  -v "${PWD}/data":/var/lib/zot/data \
  cgr.dev/chainguard/zot:latest \
  serve /zot-config.yaml
```

Then in another terminal, try pushing an image with crane:
```
crane cp \
  cgr.dev/chainguard/bash:latest \
  localhost:5000/demo:latest
```

Then try pulling and running the image:
```
docker run --rm \
  localhost:5000/demo:latest \
  -c 'echo hello world'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falco

# falco
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falco` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falco/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for falco. This streamlined variant of [Falco](https://github.com/falcosecurity/falco/tree/master) designed for real-time security monitoring on Linux, replaces the traditional kernel module with eBPF technology, thus enhancing portability in containerized environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `falco` image is based on the upstream [Falco project](https://falco.org/) with the following differences:

* Uses eBPF (modern-bpf driver) instead of traditional kernel modules for system call monitoring
* Does not require loading separate kernel modules, making it more portable across different environments
* Includes the modern-bpf driver bundled within the image
* Built on Chainguard OS for enhanced security and minimal attack surface
* No shell or package manager included (distroless design)

> [!WARNING]
> Falco does not run on macOS. For local testing, use a Linux VM or pass the `--nodriver` argument (though this will not collect any security events).

> [!WARNING]
> This Falco container image is not compatible with Falco plugins other than the built-in container plugin, due to an ABI incompatibility in gRPC.
> Upstream Falco plugins are statically linked against gRPC 1.44, while this build links against a maintained version of gRPC that includes security fixes and CVE remediation.
> The ABI exposed by the maintained gRPC version is not compatible with the older ABI used by the plugins.
> Because of this mismatch, Falco cannot load plugins that were built against the older gRPC 1.44 ABI.

## Prerequisites

* Linux environment with kernel version 4.14 or later
* Privileged container access for eBPF functionality
* Access to `/proc` and `/var/run/docker.sock` for system monitoring

## Getting Started

The `falco` image provides real-time security monitoring by detecting suspicious activity using runtime security rules:

### Docker

Run Falco with eBPF for container and host monitoring:

```sh
docker run --rm -i -t \
    --privileged \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    -v /proc:/host/proc:ro \
    cgr.dev/ORGANIZATION/falco:latest falco --modern-bpf
```

For testing without drivers (limited functionality):

```sh
docker run --rm -i -t \
    cgr.dev/ORGANIZATION/falco:latest falco --nodriver
```

### Kubernetes with Helm

Deploy Falco in Kubernetes using the official Helm chart. Create a values file:

```sh
cat > falco-values.yaml <<EOF
image:
  registry: cgr.dev
  repository: ORGANIZATION/falco
  tag: latest

driver:
  kind: modern-bpf

falcoctl:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/falcoctl
    tag: latest

# Configure rules
rulesFiles:
  - /etc/falco/falco_rules.yaml
  - /etc/falco/k8s_audit_rules.yaml
EOF
```

Install the chart:

```sh
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

helm install falco falcosecurity/falco \
  --namespace falco \
  --create-namespace \
  --values falco-values.yaml
```

## Configuration

Configure Falco for your specific security monitoring needs:

### Custom Security Rules

Create custom security rules by mounting a configuration file:

```sh
cat > custom-rules.yaml <<EOF
- rule: Unexpected Network Activity
  desc: Detect unexpected network connections
  condition: evt.type=connect and not proc.name in (nginx, curl, wget)
  output: Unexpected network activity (command=%proc.cmdline)
  priority: WARNING

- rule: Privilege Escalation Attempt
  desc: Detect potential privilege escalation
  condition: spawned_process and proc.name=sudo and not user.name=root
  output: Privilege escalation attempt (user=%user.name command=%proc.cmdline)
  priority: HIGH
EOF

docker run --rm -i -t \
    --privileged \
    -v $(pwd)/custom-rules.yaml:/etc/falco/custom-rules.yaml \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    -v /proc:/host/proc:ro \
    cgr.dev/ORGANIZATION/falco:latest falco --modern-bpf
```

### Environment Variables

Configure Falco behavior using environment variables:

```sh
docker run --rm -i -t \
    --privileged \
    -e FALCO_PRIORITY=WARNING \
    -e FALCO_BUFFERED_OUTPUTS=true \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    -v /proc:/host/proc:ro \
    cgr.dev/ORGANIZATION/falco:latest falco --modern-bpf
```

## Documentation and Resources

* [Falco Official Documentation](https://falco.org/docs/)
* [Falco Rules Documentation](https://falco.org/docs/rules/)
* [Falco Helm Chart](https://github.com/falcosecurity/charts/tree/master/charts/falco)
* [eBPF Driver Documentation](https://falco.org/docs/event-sources/drivers/#modern-ebpf-probe)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudnative-pg

# cloudnative-pg
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudnative-pg` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudnative-pg/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based image for CloudNative PG, a comprehensive platform designed to seamlessly manage PostgreSQL databases within Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

CloudNative PG is a platform for managing PostgreSQL databases within Kubernetes environments.

These images consist of the CloudNative PG operator as well as PostgreSQL images that have been
extended to support the full functionality of the CloudNative PG platform.

## Deploying CloudNative PG

To deploy CloudNative PG, install the CNPG Helm chart repository:

```bash
helm repo add cnpg https://cloudnative-pg.github.io/charts
```

Deploy the operator:

```bash
helm upgrade --install cnpg \
  --namespace cnpg-system \
  --create-namespace \
  cnpg/cloudnative-pg \
  --set image.repository="cgr.dev/<REGISTRY>/cloudnative-pg" \
  --set image.tag="latest"
```

And now deploy the database:

```bash
helm upgrade --install database \
  --namespace database \
  --create-namespace \
  cnpg/cluster \
  --set cluster.imageName="cgr.dev/<REGISTRY>/postgres-cloudnative-pg:<POSTGRES VERSION>"
```

Note, you must provide a Postgres version (I.E. 15, 16, etc) as the operator expects the versioned
tag for migrations.

Alternatively, deploy the database with pooler enabled using Chainguard's PgBouncer image:

```bash
helm upgrade --install database \
  --namespace database \
  --create-namespace \
  cnpg/cluster \
  --set cluster.imageName="cgr.dev/<REGISTRY>/postgres-cloudnative-pg:<POSTGRES VERSION>"
  --set pooler.enabled=true \
  --set pooler.template.spec.containers[0].name="pgbouncer" \
  --set pooler.template.spec.containers[0].image="cgr.dev/<REGISTRY>/pgbouncer:latest"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-dns-fips

# external-dns-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-dns-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-dns-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using External DNS

The Chainguard External DNS image is a drop-in replacement for the upstream image.
See the [upstream documentation](https://github.com/kubernetes-sigs/external-dns) for usage information specific to your environment.

```shell
$ docker run cgr.dev/ORGANIZATION/external-dns-fips:latest
usage: external-dns --source=source --provider=provider [<flags>]

ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS
providers.

Note that all flags may be replaced with env vars - `--flag` ->
`EXTERNAL_DNS_FLAG=1` or `--flag value` -> `EXTERNAL_DNS_FLAG=value`

Flags:
  --help                         Show context-sensitive help (also try
                                 --help-long and --help-man).
  --version                      Show application version.
  --server=""                    The Kubernetes API server to connect to
                                 (default: auto-detect)
  --kubeconfig=""                Retrieve target cluster configuration from
                                 a Kubernetes configuration file (default:
                                 auto-detect)
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### yunikorn-web-fips

# yunikorn-web-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/yunikorn-web-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/yunikorn-web-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache YuniKorn Web UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

There is a Getting Started guide for the YuniKorn Web UI available in the official repository [here](https://yunikorn.apache.org/docs/) where you can learn more about deploying and using Yunikorn Web UI but the most common way to deploy it is by using the following Helm command:

```shell
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
kubectl create namespace yunikorn
helm install yunikorn yunikorn/yunikorn \
   --namespace yunikorn \
   --set web.image.repository=cgr.dev/chainguard/yunikorn-web-fips \
   --set web.image.tag=latest
```

Then you should be able to see access the Web UI by running the following command:

```shell
kubectl port-forward svc/yunikorn-service 9889:9889 -n yunikorn
open http://localhost:9889
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### neuvector-fips

# neuvector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/neuvector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/neuvector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-compose-fips

# docker-compose-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-compose-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-compose-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

minimal docker-compose image with docker-compose binary

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The upstream is not maintained anymore. We recommend using the [Chainguard Image for docker-compose](https://images.chainguard.dev/directory/image/compose/overview) instead. This image only contains the `docker-compose` binary.

## Getting Started
We can create a simple `docker-compose.yml` file to test the `docker-compose` image:
```yaml
services:
  web:
    image: cgr.dev/chainguard/nginx:latest
    ports:
      - "8080:8080"
```
then we can run the following command to start the service:
```bash
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/app cgr.dev/ORGANIZATION/docker-compose:latest up
```

## Documentation & Resources
Please refer to the upstream documentation for a [getting started](https://docs.docker.com/compose/gettingstarted/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-kube-events

# newrelic-kube-events
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-kube-events` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-kube-events/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-kube-events](https://github.com/newrelic/nri-kube-events) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle). chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: chainguard/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/chainguard/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: chainguard/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: chainguard/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### atlantis

# atlantis
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/atlantis` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/atlantis/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Terraform Pull Request Automation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. Please refer to the [installation guide](https://www.runatlantis.io/docs/installation-guide.html) for more details.

Atlantis has an [official Helm chart](https://github.com/runatlantis/helm-charts/tree/main), more instructions can be found in the [deployment guide](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api

# cluster-api
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Home for Cluster API, a subproject of sig-cluster-lifecycle

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Cluster-Api image is comparable to Kubernetes Sig  [Cluster-Api on Docker Hub](https://hub.docker.com/r/registryk8s). Chainguard's image contains only the minimum set of dependencies needed to run the different components.

## Getting Started

Start by creating a Kubernetes manifest that allows the Docker provider to access Docker on the host:

```yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: dual
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock
```
Next, apply this manifest above by creating a cluster. The following example will create a Kubernetes cluster with kind:
```
kind create cluster -config config.yaml
```

Next, initialize a management cluster against the host cluster:

```
docker run -d \
    cgr.dev/ORGANIZATION/cluster-api-clusterctl:latest \
    clusterctl init \
    --kubeconfig <KUBECONFIG> \
    --infrastructure vcluster \
    --core cluster-api \
    --bootstrap kubeadm \
    --control-plane kubeadm \
    --wait-providers=false
```

Generate a manifest for creating clusters:

```
docker run -d \
    cgr.dev/ORGANIZATION/cluster-api-clusterctl:latest \
    clusterctl generate cluster ${CLUSTER_NAME} \
    --infrastructure vcluster \
    --kubernetes-version ${KUBERNETES_VERSION} \
    --target-namespace ${CLUSTER_NAMESPACE} > cluster-manifest.yaml
```

## Documentation and Resources

* [cluster-api GitHub Repository](https://github.com/kubernetes-sigs/cluster-api)
* [cluster-api Documentation](https://cluster-api.sigs.k8s.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### configurable-http-proxy

# configurable-http-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/configurable-http-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/configurable-http-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

configurable-http-proxy provides you with a way to update and manage a proxy table using a command line interface or REST API

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the [official usage documentation](https://github.com/jupyterhub/configurable-http-proxy?tab=readme-ov-file#usage) on GitHub.

Run:

```sh
docker run --rm cgr.dev/chainguard-private/configurable-http-proxy:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-provider-kubernetes-fips

# crossplane-provider-Kubernetes-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-provider-Kubernetes-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-provider-Kubernetes-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the Crossplane Kubernetes provider, which allows you to manage Kubernetes resources using Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-provider-kubernetes-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-kubernetes](https://github.com/crossplane-contrib/provider-kubernetes/pkgs/container/provider-kubernetes) image.

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-kubernetes
spec:
  package: cgr.dev/ORGANIZATION/crossplane-provider-kubernetes-fips:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the function is healthy:
```bash
kubectl get providers
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-kubernetes).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-proportional-autoscaler

# cluster-proportional-autoscaler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-proportional-autoscaler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-proportional-autoscaler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Kubernetes Cluster Proportional Autoscaler Container

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
$ helm install my-release cluster-proportional-autoscaler/cluster-proportional-autoscaler \
    --set image.repository=cgr.dev/chainguard/cluster-proportional-autoscaler \
    --set image.tag=latest
    <other configuration parameters here>
```

See the [configuration](https://github.com/kubernetes-sigs/cluster-proportional-autoscaler/tree/master/charts/cluster-proportional-autoscaler) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5166

# request-5166
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5166` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5166/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sonobuoy

# sonobuoy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sonobuoy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sonobuoy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A diagnostic tool for Kubernetes clusters to run conformance and plugin-based tests

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `sonobuoy` container image is a drop-in replacement for the upstream [sonobuoy/sonobuoy](https://hub.docker.com/r/sonobuoy/sonobuoy) image. It is fully compatible with the official Sonobuoy’s CLI functionality, including conformance testing, plugin execution, and result aggregation. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

This `sonobuoy` image provides the core Sonobuoy CLI and aggregator used to orchestrate conformance and diagnostic tests in a Kubernetes cluster.

To run Sonobuoy using this custom image, use the `--sonobuoy-image` flag:

```bash
  sonobuoy run \
  --sonobuoy-image cgr.dev/ORGANIZATION/sonobuoy:latest \
  --wait \
  --mode quick
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

## Documentation and Resources
- [Sonobuoy Github Repository](https://github.com/vmware-tanzu/sonobuoy)
- [Sonobuoy Documentation](https://sonobuoy.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-jena-fuseki

# apache-jena-fuseki
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-jena-fuseki` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-jena-fuseki/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SPARQL 1.1 server with a web interface, backed by the Apache Jena TDB RDF triple store.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `apache-jena-fuseki` container image is designed as a drop-in replacement for the [stain/jena-fuseki](https://hub.docker.com/r/stain/jena-fuseki) image.

## Usage

### Basic Usage

Start Fuseki server:

```bash
docker run -d -p 3030:3030 cgr.dev/ORGANIZATION/apache-jena-fuseki
```

### With Persistent Storage

```bash
docker run -d \
    -p 3030:3030 \
    -v fuseki-data:/fuseki \
    -e ADMIN_PASSWORD=your-secure-password \
    cgr.dev/ORGANIZATION/apache-jena-fuseki
```

### With In-Memory Dataset

To start with an in-memory dataset, pass the full command:

```bash
docker run -d -p 3030:3030 cgr.dev/ORGANIZATION/apache-jena-fuseki \
    /jena-fuseki/fuseki-server --mem /ds
```

### Accessing the Web Interface

Once running, access the Fuseki web UI at `http://localhost:3030/`.

### Creating a Dataset via API

```bash
curl -u admin:$ADMIN_PASSWORD -X POST \
    -H "Content-Type: application/x-www-form-urlencoded" \
    --data "dbName=mydata&dbType=tdb2" \
    http://localhost:3030/$/datasets
```

### Running a SPARQL Query

```bash
curl -X POST \
    -H "Accept: application/sparql-results+json" \
    -H "Content-Type: application/sparql-query" \
    --data "SELECT * WHERE { ?s ?p ?o } LIMIT 10" \
    http://localhost:3030/mydata/query
```

## Documentation and Resources

- [Apache Jena Fuseki Documentation](https://jena.apache.org/documentation/fuseki2/)
- [SPARQL 1.1 Query Language](https://www.w3.org/TR/sparql11-query/)
- [Apache Jena GitHub Repository](https://github.com/apache/jena)
- [Upstream Docker Image (stain/jena-fuseki)](https://github.com/stain/jena-docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dex-iamguarded-fips

# dex-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dex-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dex-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

dex is a federated OpenID Connect provider.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Important Usage Notes

This is a FIPS-compliant variant of the IAMGuarded dex image. It includes OpenSSL FIPS modules and is built with FIPS-enabled packages.

For general usage information about Dex, refer to the [upstream documentation](https://dexidp.io/docs/).

### Differences from the Standard dex-iamguarded Image

This FIPS variant differs from the standard dex-iamguarded image in the following ways:
- Uses FIPS-compliant OpenSSL libraries
- Includes OpenSSL FIPS provider modules
- Built with FIPS-hardened configurations

For non-FIPS use cases, consider using the standard `cgr.dev/chainguard-private/dex-iamguarded` image.

### IAMGuarded Integration

This image includes IAMGuarded components for enhanced identity and access management features. The IAMGuarded integration provides:
- Enhanced authentication workflows
- Additional security controls
- Integration with enterprise IAM systems

Dex IAMGuarded is a security-enhanced variant of Dex, used as part of other IAMGuarded Helm Charts such as the Argo CD IAMGuarded deployment.

### Helm Chart Installation
Dex IAMGuarded does not come with its own Helm Chart, but rather is used as part of other charts, such as the Argo CD IAMGuarded Helm chart.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for IAMGuarded charts that use Dex and pins the image to specific digest:

```yaml
# Dex image configuration
dex:
  image:
    registry: myregistry.example.com
    repository: mirrored/dex-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### renovate

# renovate
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/renovate` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/renovate/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This Chainguard `renovate` container image is comparable to the upstream [Renovate image](https://hub.docker.com/r/renovate/renovate), with improved security and few-to-zero CVEs. 

## Getting Started

Check the Renovate version:

```shell
docker run --rm cgr.dev/ORGANIZATION/renovate:latest --version
```

Run Renovate to scan a repository for dependency updates:

```shell
export RENOVATE_TOKEN=your_github_token_here
docker run --rm -e RENOVATE_TOKEN="${RENOVATE_TOKEN}" cgr.dev/ORGANIZATION/renovate:latest --dry-run owner/repository
```

The `--dry-run` flag ensures Renovate logs what it would do without making actual changes.

## Documentation and Resources

- [Renovate Documentation](https://docs.renovatebot.com/)
- [Configuration Options](https://docs.renovatebot.com/configuration-options/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-tika-fips

# apache-tika-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-tika-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-tika-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Tika extracts metadata, text, and language from documents, enabling content analysis and indexing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Apache Tika Image is comparable to the [official Apache Tika Image from Docker Hub](https://hub.docker.com/r/apache/tika). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

### FIPS Support

The apm-server-fips Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To get started with Chainguard's Apache Tika Image, we can use Apache Tika Helm chart to deploy it.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/apache-tika-fips
  tag: latest
```

Deploy the Helm chart:

```shell

helm repo add tika https://apache.jfrog.io/artifactory/tika
helm repo update
helm install tika tika/tika \
  --values values.yaml
```

## Documentation and Resources

- (Blog) [Get Tika parsing up and running in 5 minutes](https://tika.apache.org/3.0.0/parser_guide.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jenkins

# jenkins
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jenkins` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jenkins/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, Wolfi-based container image for Jenkins - an open-source CI/CD server that enables developers to build, test, and deploy their software.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Jenkins container image is comparable to the [official Jenkins image](https://hub.docker.com/_/jenkins) from Docker Hub. Chainguard Containers are designed with minimalism and security in mind, and thus the Jenkins image has the following differences from the upstream image:

* Chainguard's Jenkins image does not expose any ports whereas the ports exported by the upstream are: `50000/tcp` and `8080/tcp`.

> [!NOTE]
> Like upstream, the Chainguard Jenkins image supports the `jdk17` and `jdk21` subtags. For example, `v2.544-jdk21` contains Jenkins with OpenJDK-21. Unlike upstream, the non-JDK specified tags (including latest) still point to JDK 17. These tags will be updated in the future to point to JDK 21 with a breaking change announcement.

## Getting Started

The following example runs a local instance of Jenkins, specifying a local volume named `jenkins_home` for data persistence:

```bash
docker run --rm -v jenkins_home:/var/jenkins_home \
  -p 8080:8080 -it \
  cgr.dev/chainguard/jenkins:latest
```

In the console output, the initial admin password will be logged. Use this to log in to the Jenkins UI:

- [http://localhost:8080/](http://localhost:8080/)

Refer to the [upstream documentation](https://github.com/jenkinsci/docker/blob/master/README.md) for full instructions on running and configuring Jenkins.

## Documentation and Resources

* [Jenkins Documentation](https://www.jenkins.io/doc/)
* [Steps for setting up Jenkins with Docker](https://github.com/jenkinsci/docker/blob/master/README.md)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### node-problem-detector-fips

# node-problem-detector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/node-problem-detector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/node-problem-detector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Node-problem-detector](https://github.com/kubernetes/node-problem-detector) aims to make various node problems visible to the upstream layers in the cluster management stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Install via `helm` using the upstream source shown below:

```bash
helm repo add deliveryhero https://charts.deliveryhero.io/
helm upgrade --install npd deliveryhero/node-problem-detector \
  --namespace node-problem-detector \
  --create-namespace \
  --set image.repository=cgr.dev/chainguard/node-problem-detector-fips \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grypedb

# grypedb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grypedb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grypedb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolfi-powered image for GrypeDB and Vunnel that allows you to create your own Grype DB instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-iamguarded-fips

# redis-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Redis](https://github.com/redis/redis) Redis is an in-memory data structure store, used as a database, cache, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Redis IAMGuarded FIPS is a FIPS-compliant security-enhanced variant of Redis designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Redis deployments with FIPS 140-2 compliance.

## Helm Chart Installation

The Redis IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Redis server image
image:
  registry: myregistry.example.com
  repository: mirrored/redis-server-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Redis Sentinel image for high availability
sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-sentinel-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctl:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Redis exporter for metrics
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# kubectl image for management operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/redis:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Redis IAMGuarded FIPS installation using standard Redis verification methods. The deployment functions as a standard Redis instance, so all typical Redis validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Redis IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both Redis and Kubernetes environments. This FIPS-compliant variant ensures cryptographic operations meet FIPS 140-2 standards. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

### Redis Cluster

For sharded, distributed Redis deployments with FIPS compliance, use the Redis Cluster chart:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster
```

#### Basic Installation

```bash
helm install redis-cluster oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

#### Configuration

The Redis Cluster chart uses the following FIPS-compliant images from this module:

- **redis-cluster-iamguarded-fips**: Main Redis Cluster nodes with FIPS compliance
- **os-shell-iamguarded-fips**: Volume permissions initialization with FIPS compliance
- **prometheus-redis-exporter-iamguarded-fips**: Metrics collection with FIPS compliance (when enabled)

Example configuration with custom registry:

```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/redis-cluster-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:...
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-gateway

# envoy-gateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-gateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-gateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Manages Envoy Proxy as a Standalone or Kubernetes-based Application Gateway.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/envoyproxy/gateway/). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install the [upstream helm chart](https://gateway.envoyproxy.io/docs/install/install-helm/) with Chainguard's Envoy Gateway image you can use the following command:
```bash
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v0.0.0-latest -n envoy-gateway-system --create-namespace  --set deployment.envoyGateway.image.repository=cgr.dev/chainguard/envoy-gateway --set deployment.envoyGateway.image.tag=latest
```

If you prefer to use a `values.yaml` file then you can override the image repository and tag as follows:
```yaml
deployment:
  envoyGateway:
    image:
      repository: cgr.dev/chainguard/envoy-gateway
      tag: latest
```

## Documentation and Resources
Once the deployment is successful, you can access the envoy gateway by following the [official documentation](https://gateway.envoyproxy.io/docs/).

You can also find various application specific tasks in the [tasks section](https://gateway.envoyproxy.io/docs/tasks/).

For next steps following installation, please refer to [quickstart guide](https://gateway.envoyproxy.io/docs/tasks/quickstart/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-bridge

# kafka-bridge
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-bridge` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-bridge/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

HTTP-based bridge for Apache Kafka using Vert.x framework

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `kafka-bridge` image is a drop-in replacement for the upstream [Strimzi Kafka Bridge](https://github.com/strimzi/strimzi-kafka-bridge) image. It maintains full compatibility with the Strimzi operator and provides the same HTTP REST API for interacting with Apache Kafka clusters.

## Getting Started

Install the Strimzi Kafka Operator using Helm:

```sh
kubectl create namespace kafka

helm install strimzi-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator \
  --namespace kafka \
  --set watchAnyNamespace=true
```

Deploy the Kafka Bridge using the Strimzi `KafkaBridge` custom resource:

```yaml
apiVersion: kafka.strimzi.io/v1
kind: KafkaBridge
metadata:
  name: my-bridge
  namespace: kafka
spec:
  replicas: 1
  bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9092
  http:
    port: 8080
  image: cgr.dev/ORGANIZATION/kafka-bridge:latest
```

Apply the configuration:

```sh
kubectl apply -f kafka-bridge.yaml -n kafka
```

The Strimzi operator will create a Deployment, ConfigMap, and Service for the bridge automatically.

NOTE: Running multiple replicas is not recommended. The Kafka Bridge maintains in-memory consumer state, requiring HTTP clients to maintain affinity to the same instance.

For complete configuration options, refer to the [Strimzi Kafka Bridge documentation](https://strimzi.io/docs/bridge/latest/).

## Documentation and Resources

* [Strimzi Kafka Bridge Documentation](https://strimzi.io/docs/bridge/latest/)
* [Strimzi Deploying and Managing Guide](https://strimzi.io/docs/operators/latest/deploying)
* [Kafka Bridge GitHub Repository](https://github.com/strimzi/strimzi-kafka-bridge)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-path-provisioner-fips

# local-path-provisioner-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-path-provisioner-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-path-provisioner-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-proxy

# kafka-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Proxy connections to Kafka cluster. Connect through SOCKS Proxy, HTTP Proxy or to cluster running in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the [grepplabs/kafka-proxy image on Docker Hub](https://hub.docker.com/r/grepplabs/kafka-proxy). Switching to Chainguard kafka-proxy image should not require any changes to your existing setup.

## Getting Started
This image is intended to be deployed as described in the official kafka-proxy [documentation](https://github.com/grepplabs/kafka-proxy). For example, using this command will start kafka-proxy by proxying two Kafka brokers running on `broker-1:9092` and `broker-2:9092` to ports `19092` and `29092`:

```bash
docker run --rm -it \
  cgr.dev/ORGANIZATION/kafka-proxy:latest \
  -p 19092:19092 \
  -p 29092:29092 \
  server \
  --bootstrap-server-mapping "broker-1:9092,0.0.0.0:19092" \
  --bootstrap-server-mapping "broker-2:9092,0.0.0.0:29092"
```

meaning that you can connect to `localhost:19092` and `localhost:29092` to reach the respective Kafka brokers.

On the other hand, for Kubernetes deployments, you can use the image in your deployment manifests or Helm charts by replacing the image reference with the Chainguard kafka-proxy image.

You can look for the more usage examples here: [kafka-proxy Examples](https://github.com/grepplabs/kafka-proxy#usage-example).

## Documentation & Resources

For more detailed information on configuring and using kafka-proxy, refer to the following resources:

- [Official kafka-proxy GitHub Repository](https://github.com/grepplabs/kafka-proxy)
- [kafka-proxy Documentation](https://github.com/grepplabs/kafka-proxy/blob/master/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-fips

# postgres-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Advanced object-relational database management system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `postgres-fips` image is comparable to [the PostgreSQL image from Docker Hub](https://hub.docker.com/_/postgres). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager. Unlike many other Chainguard Containers, though, the `postgres-fips` image does include a shell, allowing you to manage databases interactively.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

### Migrating to Chainguard PostgreSQL container images

When migrating an existing PostgreSQL database to use one of Chainguard's `postgres-fips` container image it is likely that the collation version in the Chainguard container image will be different from the collation version in the original image that created the database.  This may be due to different glibc versions, use of a different implementation of the C standard library (musl in Alpine for example), or the use of different locale configuration.

Chainguard recommends that you [re-index and refresh the collation version](https://wiki.postgresql.org/wiki/Locale_data_changes) when migrating to this image before the database is put back into production.

## Getting Started

This section provides a high-level overview of how you can use Chainguard's `postgres-fips` container image. For a more in-depth walkthrough of how you can use the image in practice, please refer to our guide on [getting started with the PostgreSQL Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/getting-started-postgres/). This getting started guide outlines how to set up and run a PHP application that stores its data in a PostgreSQL database running within a containerized environment.

You can test the `postgres-fips` image by running the following command:

```shell
docker run --rm -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres-fips:<version>
```

Note that the only environment variable required by the `postgres-fips` container image is `POSTGRES_PASSWORD`. 

This command will run the Image, but no data within the PostgreSQL database will persist after the Image stops running. To persist PostgreSQL data you can mount a volume mapped to the container's data folder:

```shell
docker run --rm -v $PWD/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres-fips:<version>
```

In a __new__ terminal,  `exec` into the running container:

```shell
docker exec -ti postgres-test bash
```

Connect using the postgres user:

```shell
su postgres
```

Use the `createdb` wrapper to create a test database:

```shell
createdb test
```

Then use the PostgreSQL client to Connect to the new database: 

```shell
psql test
```

From there you can interact with the database as you would with any other PostgreSQL database. For instance, you can create a sample table:

```sh
CREATE TABLE accounts (
	user_id serial PRIMARY KEY,
	username VARCHAR ( 50 ) UNIQUE NOT NULL,
	password VARCHAR ( 50 ) NOT NULL,
	email VARCHAR ( 255 ) UNIQUE NOT NULL,
	created_on TIMESTAMP NOT NULL,
	last_login TIMESTAMP
);
```

You could then insert data into the table:

```sh
INSERT INTO accounts (username, password, email, created_on, last_login)
VALUES (
'Inky',
'p@$$w0rD',
'inky@example.com',
'2017-07-23',
'2017-07-23'
);
```

You can also use all of PostgreSQL's internal meta-commands. For example, `\dt` will list all the tables stored within the database:

```sh
\dt
```
```
          List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+----------
 public | accounts | table | postgres
(1 row)
```

### Customizing PostgreSQL with environment variables

You can extend Chainguard's Postgres image with environment variables. Chainguard's Postgres image is compatible with the environment variables available in the official PostgreSQL image, including the following:

* `PGDATA`: This variable allows you to define another location for database files. The default data directory is `/var/lib/postgresql/data`.
* `POSTGRES_PASSWORD`: This environment variable sets the superuser password for PostgreSQL. This variable is required to use the Postgres image.
* `POSTGRES_USER`: This is used with the `POSTGRES_PASSWORD` variable to set a superuser for the database and its password. If not specified, you can use the default `postgres` user.
*  `POSTGRES_DB`: Using this variable allows you to set a different name for the default database. If not specified, the default database will be `postgres` or the value set by `POSTGRES_USER`.
* `POSTGRES_INITDB_ARGS`: This variable allows you to send arguments to `postgres initdb`.
* `POSTGRES_INITDB_WALDIR`: You can set this variable to define the location for the PostgreSQL transaction log. By default, the transaction log is stored in a subdirectory of the main postgresql data folder, which you can define with `PGDATA`.
* `POSTGRES_HOST_AUTH_METHOD`: This variable allows you to control the `auth-method` used to authenticate when connecting to the database.

Note that if you set the `POSTGRES_HOST_AUTH_METHOD` variable to `trust`, then the `POSTGRES_PASSWORD` variable is no longer required:

```shell
docker run --rm -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=linky -ti --name postgres-test cgr.dev/ORGANIZATION/postgres-fips:latest
```

Additionally, be aware that the Docker specific variables will only have an effect if you start the container with an empty data directory; pre-existing databases won't be affected on container startup.

### Running PostgreSQL with a custom configuration file

You can also run the Chainguard Postgres image with a custom configuration file. The following example will mount a PostgreSQL configuration file named `my-postgres.conf` to the container. 

```shell
docker run --rm -v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=password -ti --name postgres-test cgr.dev/ORGANIZATION/postgres-fips:latest -c 'config_file=/etc/postgresql/postgresql.conf'
```

This command also uses the `postgres` server's `-c` flag to set the `config_file` runtime parameter.

### Initial SQL script

The path for initial load sql script should be same as per application docs `/docker-entrypoint-initdb.d/init.sql` except for PostgreSQL 14 which needs to be mounted at `/var/lib/postgres/initdb/init.sql`.

## Documentation and Resources

- [Getting Started with the PostgreSQL Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/postgres/)
- [PostgreSQL Official Documentation](https://www.postgresql.org/docs/)
- [PostgreSQL Docker Hub Image](https://hub.docker.com/_/postgres)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### swift

# swift
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/swift` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/swift/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Swift applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using the image
You can invoke the image and compile swift binaries:

```shell
docker run --rm -ti cgr.dev/chainguard/swift:latest repl
bash-5.2# echo 'print("Hello, World!")' > /tmp/hello.swift
bash-5.2# swift /tmp/hello.swift
Hello, World!
```

### Using swift repl for exploring / debugging

You can use the image as is for exploring swift capabilities using swift repl

```shell
docker run --rm -ti cgr.dev/chainguard/swift:latest repl
Welcome to Swift version 6.0.1 (swift-6.0.1-RELEASE).
Type :help for assistance.
  1> print("Hello, World!")
Hello, World!
  2> 1+1
$R0: Int = 2
  3> func answer() -> Int {
  4.     return 42
  5. }
  6> answer()
$R1: Int = 42
```

### Using as a base image
```shell
cat <<EOF | docker build -t swift-hello -
FROM cgr.dev/chainguard/swift:latest
RUN echo 'print("Hello, World!")' > /tmp/hello.swift
ENTRYPOINT ["/usr/bin/swift", "/tmp/hello.swift"]
EOF
```

```shell
docker run --rm swift-hello 
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wavefront-proxy

# wavefront-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wavefront-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wavefront-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal wavefront-proxy image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.

To test:

```shell
# Need to update WAVEFRONT_URL and WAVEFRONT_TOKEN accordingly

$ docker run -d \
 -e WAVEFRONT_URL=https://<myinstance>.wavefront.com/api \
 -e WAVEFRONT_TOKEN=<YOUR-API-TOKEN> \
 -e JAVA_HEAP_USAGE="1650m"\
 -m 2g \
 -p 2878:2878 \
  cgr.dev/chainguard/wavefront-proxy

```

Note that the `wavefront-proxy` does need the `WAVEFRONT_URL` and `WAVEFRONT_TOKEN`  to work correctly.
See the [configuration](https://docs.wavefront.com/proxies_kube_container.html) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1313

# request-1313
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1313` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1313/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Bundled Logstash/Opensearch image

Provides a `bundled` container image, containing opensearch and multiple
supporting applications.

A custom image request for c3.ai. Provides a `bundled` container image,
containing prometheus and multiple supporting applications.

## Image contents

This bundled image contains the following applications:

- opensearch
- opensearch-dashboards
- logstash-oss-with-opensearch-output-plugin
- prometheus-logstash-exporter-fips
- filebeat-fips
- prometheus-beat-exporter-fips

### opensearch

Refer to the [opensearch](https://images.chainguard.dev/directory/image/opensearch/overview)
image documentation for more information.

As an example, to run `opensearch` on the bundled image:

```bash
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d --entrypoint=/usr/bin/opensearch-docker-entrypoint.sh --name opensearch cgr.dev/c3.ai/bundled-opensearch:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### opensearch-dashboards-fips

Refer to the [opensearch-dashboard](https://github.com/chainguard-images/images-private/blob/main/images/opensearch-dashboard/README.md)
image documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run -d --name opensearch-dashbboard -p 5601:5601 \
--link opensearch:opensearch \
-e "OPENSEARCH_HOSTS=https://opensearch:9200" \
--entrypoint=/usr/share/opensearch-dashboards/opensearch-dashboards-docker-entrypoint.sh cgr.dev/c3.ai/bundled-opensearch:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### logstash-oss-with-opensearch-output-plugin

Refer to the [logstash-oss-with-opensearch-output-plugin](https://images.chainguard.dev/directory/image/logstash-oss-with-opensearch-output-plugin/overview)
image documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run --rm -it -v $(pwd)/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --network="host" --entrypoint=/usr/bin/docker-entrypoint --name logstash-container cgr.dev/c3.ai/bundled-opensearch:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-logstash-exporter-fips

Refer to the [prometheus-logstash-exporter](https://images.chainguard.dev/directory/image/prometheus-logstash-exporter/overview)
image documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
docker run -d -p ${FREE_PORT}:9198 --name opensearch-logstash -v $(pwd)/prometheus-logstash.conf:/usr/share/logstash/pipeline/logstash.conf --entrypoint=/usr/bin/logstash-exporter --name prometheus-logstash-exporter cgr.dev/c3.ai/bundled-opensearch:latest
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### filebeat-fips

Refer to the [filebeat-fips](https://images.chainguard.dev/directory/image/filebeat/overview)
image documentation for more information.

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. Example using docker:

```bash
 docker run -d \
  --name=${container_name} \
  --user=nonroot \
  --volume="$(pwd)/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro" \
  --volume="nonroot:/usr/share/filebeat/data:rw" \
  --entrypoint=/usr/local/bin/docker-entrypoint \
  ${IMAGE_NAME} filebeat -e --strict.perms=false
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

### prometheus-beat-exporter-fips

Note, as this is a bundled image as per request, the executable must be
specified as the entrypoint. It is usually run as docker-compose so here's a sample yaml:

```bash
cat <<EOF > docker-compose.yml
version: '3'

services:
  filebeat-victorialogs:
    image: docker.elastic.co/beats/filebeat:8.8.1
    restart: on-failure
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /var/lib/docker/containers/
        target: /var/lib/docker/containers/
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
    user: root
    command:
      - "--strict.perms=false"
    depends_on: [ victorialogs ]
  beat-exporter-victorialogs:
    image: cgr.dev/c3.ai/bundled-opensearch:latest
    entrypoint: ["/usr/bin/beat-exporter"]
    command:
      - -beat.uri=http://filebeat-victorialogs:5066

  victorialogs:
    image: docker.io/victoriametrics/victoria-logs:v0.3.0-victorialogs
    volumes:
      - victorialogs-filebeat-docker-vl:/vlogs
    ports:
      - '9428:9428'
    command:
      - -storageDataPath=/vlogs
      - -loggerFormat=json
  victoriametrics:
    image: victoriametrics/victoria-metrics:latest
    ports:
      - '8428:8428'
    command:
      - -storageDataPath=/vmsingle
      - -promscrape.config=/promscrape.yml
      - -loggerFormat=json
    volumes:
      - victorialogs-filebeat-docker-vm:/vmsingle
      - ./scrape.yml:/promscrape.yml

volumes:
  victorialogs-filebeat-docker-vl:
  victorialogs-filebeat-docker-vm:
EOF
```

> If a helm chart is being used to deploy this application (inside this bundled image),
> changes may be required to the chart to facilitate specifying an entrypoint.

## Entrypoint

Due to containing multiple applications, no entrypoint is configured for this
image. The executable path will need to be passed when running the image, to
launch the appropriate application.

## Default user

All the applications run as non-root user.

## Image versioning

Due to containing multiple applications, each with their own independent
version streams, this bundled image simply provides a `latest` tagged image.
Image digests can be used to pin to a specific point in time.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-podman-exporter-fips

# prometheus-podman-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-podman-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-podman-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for podman environments exposing containers, pods, images, volumes and networks information.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This Chainguard image provides compatibility with the `prometheus-podman-exporter` image.

### FIPS Support
The `prometheus-podman-exporter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
To run the image, we need podman to be installed on the host:
```bash
  docker run -d --name exporter \
  -e CONTAINER_HOST=unix:///run/podman/podman.sock \
  -v /run/podman/podman.sock:/run/podman/podman.sock \
  -u root \
  -p 9882:9882 \
  cgr.dev/ORGANIZATION/prometheus-podman-exporter-fips:latest
```
## Documentation & Resources
Please refer to the upstream [documentation](https://github.com/containers/prometheus-podman-exporter/?tab=readme-ov-file#prometheus-podman-exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cc-dynamic

# cc-dynamic
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cc-dynamic` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cc-dynamic/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Base image with just enough to run arbitrary binaries that may require gcc or cc libraries, typically C++ or Rust binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image is meant to be used as just a base image only. It does not contain any programs that can be run, other than `/sbin/ldconfig`.

You must bring your own artifacts to use this image, e.g. with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

This image is deprecated.  Use the `glibc-dynamic` image instead which is designed to cover the same use cases.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### terraform

# terraform
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/terraform` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/terraform/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Terraform](https://github.com/hashicorp/terraform) is an infrastructure as code tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with upstream terraform image with few exceptions:
- Chainguard's terraform root image is totally compatible with upstream image.
- Chainguard's terraform nonroot image includes a `/work` directory specifically for the nonroot user, which allows you to mount your Terraform project in that location.

We'll create a simple main.tf file for using chainguard terraform image. 
```tf
terraform {
  required_providers {
    random = {
      source = "hashicorp/random"
    }
  }
}

provider "random" {}
resource "random_string" "random" {
  length = 16
}

output "random" {
  value = random_string.random.result
}
```
Save this file as main.tf in your current working directory.

We'll now use chainguard terraform image to initialize the plugins and create the resource.
```bash
$ docker run --rm -v $(pwd):/test -w /test cgr.dev/chainguard/terraform:latest init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/random...
- Installing hashicorp/random v3.6.3...
- Installed hashicorp/random v3.6.3 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```
Once our plugins are initialized, we'll go ahead and create the resource.

```bash
$ docker run --rm -v $(pwd):/test -w /test cgr.dev/chainguard/terraform:latest apply -auto-approve

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # random_string.random will be created
  + resource "random_string" "random" {
      + id          = (known after apply)
      + length      = 16
      + lower       = true
      + min_lower   = 0
      + min_numeric = 0
      + min_special = 0
      + min_upper   = 0
      + number      = true
      + numeric     = true
      + result      = (known after apply)
      + special     = true
      + upper       = true
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + random = (known after apply)
random_string.random: Creating...
random_string.random: Creation complete after 0s [id=PbPn(n:POB5tuPLn]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

random = "PbPn(n:POB5tuPLn"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### milvus

# milvus
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/milvus` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/milvus/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

High-performance, cloud-native vector database built for scalable vector ANN search

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the official [Milvus](https://milvus.io/) vector database and is compatible with the upstream `milvusdb/milvus` Docker images.

## Prerequisites

To run Milvus, you'll need:

- **Kubernetes cluster** (for production deployments using Helm)
- **Docker** (for local standalone deployments)
- **Dependencies** (for production):
  - **etcd**: Metadata storage and service discovery
  - **MinIO** or **S3**: Object storage for vector data
  - **Pulsar** or **Kafka**: Message queue (optional for distributed mode)

For detailed system requirements, see the [Milvus Installation Overview](https://milvus.io/docs/install-overview.md).

## Getting Started

### Standalone Deployment with Docker

For development and testing, you can run Milvus in standalone mode:

```bash
docker run -d \
  --name milvus-standalone \
  -p 19530:19530 \
  -p 9091:9091 \
  -v milvus-data:/var/lib/milvus/data \
  cgr.dev/chainguard/milvus:latest \
  milvus run standalone
```

This exposes:
- Port 19530: Milvus gRPC service (client connections)
- Port 9091: Metrics endpoint

### Production Deployment with Helm

For production environments, use the official Milvus Helm chart with Chainguard images:

```bash
# Add Milvus Helm repository
helm repo add milvus https://zilliztech.github.io/milvus-helm/
helm repo update

# Create values file for Chainguard images
cat <<EOF > milvus-values.yaml
image:
  all:
    repository: cgr.dev/chainguard/milvus
    tag: latest
    pullPolicy: Always

# Configure storage and dependencies
cluster:
  enabled: true

etcd:
  enabled: true

minio:
  enabled: true

pulsar:
  enabled: true
EOF

# Install Milvus
helm install milvus milvus/milvus \
  -n milvus \
  --create-namespace \
  -f milvus-values.yaml
```

### Verifying the Deployment

Once Milvus is running, verify connectivity using the Python SDK:

```bash
apk add py3-pymilvus

python3 <<'PYTHON'
from pymilvus import connections, utility

# Connect to Milvus
connections.connect(host="localhost", port=19530)

# Check server version
print(f"Milvus version: {utility.get_server_version()}")

# Disconnect
connections.disconnect("default")
PYTHON
```

### Basic Usage Example

Create a collection and insert some vectors

```python
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType

# Connect to Milvus
connections.connect(host="localhost", port=19530)

# Define collection schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields=fields, description="Product embeddings")

# Create collection
collection = Collection(name="products", schema=schema)

# Insert vectors
import random
embeddings = [[random.random() for _ in range(128)] for _ in range(1000)]
collection.insert([embeddings])
collection.flush()
```

## Configuration

### Configuration File Approach

See [upstream](https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml) for an example.

Create a `milvus.yaml` configuration file:

```yaml
# Storage configuration
common:
  storagePath: /var/lib/milvus/data

queryNode:
  cacheSize: 8GB

  # Enable GPU acceleration (if available)
  enableGPU: true

# Metrics and monitoring
metrics:
  enabled: true
  port: 9091

# Security configuration
common:
  security:
    tlsEnabled: true
```

Mount the configuration file when running the container:

```bash
docker run -d \
  --name milvus-standalone \
  -p 19530:19530 \
  -v $(pwd)/milvus.yaml:/milvus/configs/milvus.yaml:ro \
  -v milvus-data:/var/lib/milvus/data \
  cgr.dev/chainguard/milvus:latest \
  milvus run standalone --config-file /milvus/configs/milvus.yaml
```

### Environment Variables Approach

For Kubernetes deployments, configure via Helm values:

```yaml
queryNode:
  replicas: 3
  resources:
    limits:
      memory: 16Gi
      cpu: 4
    requests:
      memory: 8Gi
      cpu: 2

indexNode:
  replicas: 2
  resources:
    limits:
      memory: 8Gi
      cpu: 2
```

For detailed configuration options, refer to the [Milvus Configuration Guide](https://milvus.io/docs/system_configuration.md#Milvus-System-Configurations-Checklist).

## Documentation and Resources

- [Official Milvus Documentation](https://milvus.io/docs)
- [Milvus GitHub Repository](https://github.com/milvus-io/milvus)
- [Milvus Helm Chart](https://artifacthub.io/packages/helm/milvus/milvus)
- [PyMilvus Python SDK](https://github.com/milvus-io/pymilvus)
- [Milvus Use Cases and Applications](https://milvus.io/intro)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudprober

# cloudprober
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudprober` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudprober/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cloudprober is a monitoring software that makes it super-easy to monitor availability and performance of various components of your system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy [Cloudprober](https://github.com/cloudprober/cloudprober) on Kubernetes, you can follow the [official documentation](https://cloudprober.org/docs/how-to/run-on-kubernetes/).

Cloudprober also provides official [Helm Chart](https://github.com/cloudprober/helm-charts) for straightforward deployment:

```shell
helm repo add cloudprober https://helm.cloudprober.org/
helm repo update
helm install cloudprober cloudprober/cloudprober \
  --create-namespace \
  --namespace cloudprober \
  --set image.repository=cgr.dev/chainguard/falco-exporter \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fulcio

# fulcio
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fulcio` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fulcio/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Fulcio image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Sigstore Fulcio

Fulcio is one of the core components of the sigstore stack.  For more information
on this see [`sigstore-scaffolding`](../sigstore-scaffolding/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### verticadb-operator

# verticadb-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/verticadb-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/verticadb-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The VerticaDB operator automates tasks and monitors the state of your Vertica on Kubernetes deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's VerticaDB Operator container image is comparable to [the VerticaDB Operator](https://hub.docker.com/r/opentext/verticadb-operator) from Vertica. Chainguard's version is a minimal, secure, and regularly updated container image designed to run Java applications. It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Getting Started

For production scenarios, it's recommended you follow Vertica's guide on [deploying Vertica DB operator using the official Helm chart](https://docs.vertica.com/latest/en/containerized/db-operator/installing-db-operator/).

To illustrate how this image works, the following is an example of how to deploy VerticaDB Operator locally.

Start by creating a `values.yaml` file:

```bash
cat <<EOF > values.yaml
image:
  repo: cgr.dev
  name: ORGANIZATION/verticadb-operator:latest
EOF
```

Then add the repository for Vertica Charts:

```bash
helm repo add vertica-charts https://vertica.github.io/charts
helm repo update
```

Next, install the Helm chart for VerticaDB Operator:

```bash
helm install vdb-op --wait --namespace my-verticadb-operator --create-namespace vertica-charts/verticadb-operator
```

This will deploy VerticaDB Operator on your local Kubernetes cluster. Now you can install VerticaDB by creating a VerticaDB custom resource (CR):

```bash
 cat << EOF > vdb.yaml 
apiVersion: vertica.com/v1beta1 
kind: VerticaDB 
metadata: 
  name: verticadb-sample 
spec: 
  annotations: 
    VERTICA_MEMDEBUG: “2”  # Required if running macOS with an arm based chip 
  communal: 
    path: "/communal/vertica-db-tutorial" 
    includeUIDInPath: true 
  subclusters: 
    - name: sc 
  volumes: 
  - name: hostpath 
    hostPath: 
      path: /tmp 
  volumeMounts: 
  - name: hostpath 
    mountPath: /communal 
EOF

kubectl apply --namespace my-verticadb-operator -f vdb.yaml
```

Wait for the VerticaDB instance to be initialized:

```bash
kubectl wait --for=condition=DBInitialized=True --namespace my-verticadb-operator vdb/verticadb-sample --timeout=10m 
```

Check the status of the VerticaDB instance:

```bash
kubectl get pods --namespace my-verticadb-operator --selector app.kubernetes.io/instance=verticadb-sample
```
```
NAME                                   READY   STATUS              RESTARTS   AGE 
verticadb-sample-sc-0                  1/1     ContainerCreating   0          97s 
verticadb-sample-sc-1                  1/1     ContainerCreating   0          97s 
verticadb-sample-sc-2                  1/1     ContainerCreating   0          97s 
```

You can now access the VerticaDB instance using the vsql client:

```bash
kubectl exec -it --namespace my-verticadb-operator verticadb-sample-sc-0 -- vsql
```

This will open a vsql shell where you can run SQL commands.

## Documentation and Resources
- [VerticaDB Operator Helm Charts](https://docs.vertica.com/latest/en/containerized/db-operator/installing-db-operator/)
- [Official VerticaDB Operator documentation](https://docs.vertica.com/latest/en/containerized/db-operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cortex-fips

# cortex-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cortex-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cortex-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mysqld-exporter-iamguarded-fips

# prometheus-mysqld-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mysqld-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mysqld-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for MySQL server metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-mysqld-exporter-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus exporter for MySQL server metrics IAMGuarded is a security-enhanced variant of Prometheus exporter for MySQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Prometheus exporter for MySQL deployments.

## Helm Chart Installation

The MySQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MySQL image
image:
  registry: myregistry.example.com
  repository: mirrored/mysql-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# MySQL Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mysqld-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mysql:13.0.0
   Digest: sha256:61485fe902828b2859684d8d99df394878131eb6590f738bfa7f6f1f43eb8174
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MySQL IAMGuarded installation using standard MySQL verification methods. The deployment functions as a standard MySQL instance, so all typical MySQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MySQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MySQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-cluster-operator

# rabbitmq-cluster-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-cluster-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-cluster-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ Cluster Kubernetes Operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using kustomize with:

```shell
LATEST=$(curl -s "https://api.github.com/repos/rabbitmq/cluster-operator/releases/latest" | jq -r '.tag_name')

cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - "https://github.com/rabbitmq/cluster-operator/releases/download/${LATEST}/cluster-operator.yml"
patches:
  - patch: |
      - op: replace
        path: /spec/template/spec/containers/0/image
        value: cgr.dev/chainguard/rabbitmq-cluster-operator:latest
    target:
      version: v1
      kind: Deployment
      name: rabbitmq-cluster-operator
      namespace: rabbitmq-system
EOF

kubectl apply -f .
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-receive-controller-fips

# thanos-receive-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-receive-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-receive-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller to automatically configure Thanos receive hashrings

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `thanos-receive-controller` container image is comparable to the [observatorium/thanos-receive-controller](https://quay.io/repository/observatorium/thanos-receive-controller?tab=tags&tag=latest) image on quay.io, with the following differences:

* Like all other Chainguard Containers, `thanos-receive-controller` features a stripped down, minimal design
* It has few-to-zero CVEs

### FIPS support

Chainguard's `thanos-receive-controller-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

First you need to create a ConfigMap that contains the initial hashring configuration. For example, create a file named `hashrings.json` with the following content:

```json
{
  "hashrings": [
    {
      "hashring": "hashring0",
      "tenants": ["foo", "bar"]
    },
    {
      "hashring": "hashring1",
      "tenants": ["baz"]
    }
  ]
}
```

Then, create the ConfigMap in your Kubernetes cluster:

```bash
kubectl create configmap thanos-receive --from-file=hashrings.json
```

then create the Deployment:

`deployment.yaml`:

```yaml
cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: thanos-receive-controller
  labels:
    app.kubernetes.io/name: thanos-receive-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: thanos-receive-controller
  template:
    metadata:
      labels:
        app.kubernetes.io/name: thanos-receive-controller
    spec:
      containers:
      - args:
        - --configmap-name=thanos-receive
        - --configmap-generated-name=thanos-receive-generated
        - --file-name=hashrings.json
        image: cgr.dev/ORGANIZATION/thanos-receive-controller-fips:latest
        name: thanos-receive-controller
EOF
```

Make sure to replace `ORGANIZATION` with your organization's name.

After deploying, you can check if the ConfigMap was created successfully:

```bash
kubectl get configmap thanos-receive-generated -o yaml
```

You should see the `thanos-receive-generated` ConfigMap with the same data as the original `thanos-receive` ConfigMap.

Next, deploy StatefulSets of Thanos receivers labeled with `controller.receive.thanos.io=thanos-receive-controller`. The controller lists all of the StatefulSets with that label and matches the value of their `controller.receive.thanos.io/hashring` labels to the hashring names in the configuration file. The endpoints for each hashring will be populated automatically by the controller and the complete configuration file will be placed in a ConfigMap named `thanos-receive-generated`. This configuration should be consumed as a ConfigMap volume by the Thanos receivers.

## Documentation and Resources

- **[Hashring management and autoscaling in Kubernetes](https://thanos.io/tip/components/receive.md/#hashring-management-and-autoscaling-in-kubernetes)**
- **[GitHub Repository](https://github.com/observatorium/thanos-receive-controller)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prism

# prism
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prism` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prism/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prism is a set of packages for API mocking and contract testing with OpenAPI v2 (formerly known as Swagger) and OpenAPI v3.x.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage
Prism provides:
- **Mock Servers**: Life-like mock servers from any API specification document.
- **Validation Proxy**: Contract Testing for API consumers and developers.

If you want to start the mock server, you can run a command like this:

```bash
export SPEC_FILE="https://raw.githack.com/OAI/OpenAPI-Specification/master/examples/v3.0/petstore-expanded.yaml"
docker run --init -p 4010:4010 cgr.dev/ORGANIZATION/prism:latest mock -h 0.0.0.0 $SPEC_FILE
```

If the document you want to mock is on your computer, you'll need to mount the directory where the file resides as a volume:

```bash
docker run --init --rm -v $(pwd):/tmp -p 4010:4010 cgr.dev/ORGANIZATION/prism:latest mock -h 0.0.0.0 "/tmp/file.yaml"
```

If you want to start the proxy server, you can run a command like this:

```bash
docker run --init --rm -d -p 4010:4010 -v $(pwd):/tmp -P cgr.dev/ORGANIZATION/prism:latest proxy -h 0.0.0.0 "/tmp/file.yml" http://host.docker.internal:8080 --errors
```
For example, creating a proxy server for the mock server would look like this:
```bash
export SPEC_FILE="https://raw.githack.com/OAI/OpenAPI-Specification/master/examples/v3.0/petstore-expanded.yaml"

# create the mock server
docker run --init -p 4010:4010 cgr.dev/ORGANIZATION/prism:latest mock -h 0.0.0.0 $SPEC_FILE

# create the proxy server
docker run --init -p 3000:3000 -P cgr.dev/ORGANIZATION/prism:latest proxy -h 0.0.0.0 $SPEC_FILE http://localhost:4010 --errors

```
For more information on using prism, refer to the [official docs.](https://docs.stoplight.io/docs/prism/f51bcc80a02db-installation#docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### podinfo

# podinfo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/podinfo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/podinfo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Podinfo is a tiny web application that provides Go microsrvice template for kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Podinfo image is built to be compatible with the upstream [stefanprodan/podinfo](https://github.com/stefanprodan/podinfo) project. The image runs as a non-root user named `app` with UID `100` and includes the `podinfo` binary along with the `podcli` CLI tool.

Like most Chainguard container images, the production variant comes with only the minimum dependencies needed to function and does not include a shell or package manager.

## Getting Started

### Running with Docker

To run Podinfo with Docker using the default configuration:

```shell
docker run -d -p 9898:9898 cgr.dev/ORGANIZATION/podinfo:latest
```

This command starts the Podinfo server on the default HTTP port `9898`. You can verify that it's running by accessing the web interface:

```shell
curl http://localhost:9898
```

You should see a response containing "greetings from podinfo".

### Testing HTTP Endpoints

Podinfo provides several built-in endpoints for testing and monitoring:

```shell
# Homepage
curl http://localhost:9898/

# Health check endpoint
curl http://localhost:9898/healthz

# Readiness probe endpoint
curl http://localhost:9898/readyz

# Generate a token (POST request)
curl -X POST http://localhost:9898/token
```

### Enabling gRPC Support

Podinfo also supports gRPC. To enable the gRPC server, you can specify the gRPC port when starting the container:

```shell
docker run -d -p 9898:9898 -p 9999:9999 \
  cgr.dev/ORGANIZATION/podinfo:latest \
  --grpc-port=9999
```

You can then test the gRPC endpoints using `grpcurl`:

```shell
# Check gRPC health
grpcurl -plaintext localhost:9999 grpc.health.v1.Health/Check

# Get service info
grpcurl -plaintext -d '{}' localhost:9999 info.InfoService/Info
```

### Command-Line Options

The `podinfo` binary supports various configuration flags. You can view all available options:

```shell
docker run --rm cgr.dev/ORGANIZATION/podinfo:latest --help
```

To check the version:

```shell
docker run --rm cgr.dev/ORGANIZATION/podinfo:latest --version
```

## Kubernetes Deployment

### Using Helm

Podinfo can be easily deployed to Kubernetes using the official Helm chart:

```shell
helm install podinfo oci://ghcr.io/stefanprodan/charts/podinfo \
  --set image.repository=cgr.dev/ORGANIZATION/podinfo \
  --set image.tag=latest
```

This will deploy Podinfo with all necessary Kubernetes resources including Services, Deployments, and optional Ingress configurations.

## Use Cases

Podinfo is commonly used for:

- **Testing Kubernetes deployments**: Demonstrating pod lifecycle, service discovery, and networking
- **GitOps workflows**: Serving as a demo application for continuous deployment with Flux or Argo CD
- **Service mesh validation**: Testing service mesh features like traffic splitting and observability
- **Cloud-native best practices**: Learning about health checks, metrics, logging, and tracing
- **Load testing**: Generating consistent workloads for infrastructure testing

## Documentation and Resources

* [Official Podinfo GitHub Repository](https://github.com/stefanprodan/podinfo)
* [Podinfo Helm Chart](https://github.com/stefanprodan/podinfo/tree/master/charts/podinfo)
* [Flux GitOps Toolkit Documentation](https://fluxcd.io/) — Podinfo is frequently used in Flux examples

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### code-server-fips

# code-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/code-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/code-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

VS Code in the browser

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `code-server-fips` container image is comparable to Coders's [code-server](https://hub.docker.com/r/codercom/code-server). Chainguard's container contains only the minimum set of dependencies needed to run code-server.

### FIPS support

Chainguard's `code-server-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The [official documentation](https://coder.com/docs/code-server) outlines how to run the code-server image.

As detailed on the official [Docker Hub page](https://hub.docker.com/r/codercom/code-server), to run the image locally, first create a .config directory in your home directory:

```bash 
mkdir -p ~/.config
```

Next, the image can be ran with the `docker run` command below. Be sure to replace `ORGANIZATION` with your actual organization name.

```bash
docker run -it --name code-server -p 127.0.0.1:8080:8080 \
  -v "$HOME/.config:/home/coder/.config" \
  -v "$PWD:/home/coder/project" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  cgr.dev/ORGANIZATION/code-server-fips:latest
```

Alternatively, the image can be installed in a Kubernetes cluster with the official helm chart. Follow the instructions in the [documentation](https://coder.com/docs/code-server/helm) to clone the official repository, then create a values.yaml file using the instructions in the same documentation page. In the values.yaml file, under the `image` section, define the `repository` and `tag` keys and set their values to the appropriate Chainguard values, as illustrated below. Be sure to replace `ORGANIZATION` with your actual organization name.

```yaml
values:
  image:
    repository: cgr.dev/ORGANIZATION/code-server
    tag: "latest"
```

After creating the values.yaml file, follow the remaining instructions to install with helm:

```bash
helm upgrade --install code-server \
  ci/helm-chart \
  --values init.yaml
```

## Documentation and Resources
- [code-server documentation](https://coder.com/docs/code-server)
- [code-server Github](https://github.com/coder/code-server)
- [code-server Dockerhub](https://hub.docker.com/r/codercom/code-server)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openfga-fips

# openfga-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openfga-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openfga-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenFGA is a high-performance and flexible authorization and permission engine built for developers and inspired by Google Zanzibar.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This container image is comparable to the [OpenFGA image available from Docker Hub](https://hub.docker.com/r/openfga/openfga). Switching to Chainguard's image should not require any changes to your existing setup.

### FIPS Support
The `openfga-fips` Chainguard Container Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Helm Chart

You can use the [official Helm chart](https://github.com/openfga/helm-charts/tree/main/charts/openfga) and replace the image in `values.yaml` with the Chainguard image.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/openfga-fips
  tag: latest
```

Execute the following commands to install and run Chainguard's OpenFGA FIPS image using Helm:

```bash
helm repo add openfga https://openfga.github.io/helm-charts
helm repo update
helm install openfga openfga/openfga --values values.yaml --wait

### Docker

You can execute the following command to run Chainguard's OpenFGA FIPS container image:

```shell
docker run -d --name openfga -p 8080:8080 cgr.dev/ORGANIZATION/openfga-fips:latest run
```

With the container running in the background, you can send a `GET` request to the `/stores` endpoint:

```shell
curl -X GET localhost:8080/stores
```
```
{"stores":[],"continuation_token":""}
```

## Documentation and Resources

* [Official OpenFGA Documentation](https://openfga.dev/docs/fga)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pushgateway-iamguarded

# prometheus-pushgateway-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pushgateway-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pushgateway-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Push acceptor for ephemeral and batch jobs.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

### Docker

Run the Pushgateway with Docker:

```shell
docker run -d --name pushgateway -p 9091:9091 cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded:latest
```

Push a metric to the gateway. The URL format is `/metrics/job/<job_name>`:

```shell
echo 'my_job_batch_size 100' | curl -X POST --data-binary @- http://localhost:9091/metrics/job/my_job
```

Verify the metric was received:

```shell
curl http://localhost:9091/metrics | grep my_job_batch_size
```

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pushgateway prometheus-community/prometheus-pushgateway -f values.yaml
```

## Documentation and Resources

- [Prometheus Pushgateway Documentation](https://prometheus.io/docs/instrumenting/pushing/)
- [Prometheus Documentation](https://prometheus.io/docs/)
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudflared-fips

# cloudflared-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudflared-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudflared-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cloudflare Tunnel client (formerly Argo Tunnel)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `cloudflared` image is built with the standard Go toolchain, rather than Cloudflare’s patched fork. It is otherwise functionally equivalent to the upstream [`cloudflared`](https://github.com/cloudflare/cloudflared) container image.

This image enables integration into security-focused environments and reproducible builds while maintaining full compatibility with expected `cloudflared` behavior.

### FIPS Support
The `cloudflared-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Quick Start
You can quickly get started with the `cloudflared` image using Docker:

```sh
docker run -it cgr.dev/ORGANIZATION/cloudflared-fips:latest tunnel --no-autoupdate --hello-world
```
This command runs the built-in hello-world tunnel check.

To start cloudflared as a DNS proxy on port 1053, run:
```sh
docker run -it -p 1053:5053/tcp -p 1053:5053/udp cgr.dev/ORGANIZATION/cloudflare-fips:latest proxy-dns
```

## Notes
- The upstream Helm chart documentation has not been updated in several months; using [this chart](https://github.com/cloudflare/helm-charts) is not recommended.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-2682-fips

# request-2682-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-2682-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-2682-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-complaint container registry offering secure image storage, access control, scanning, and replication, built as Harbor's customized Docker Distribution registry service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Harbor-registry image is a lean, Wolfi-based container image.
It is comparable to the [Upstream Harbor registry Image](https://hub.docker.com/r/goharbor/registry-photon) in functionality and has minimal dependencies.
Chainguard's Harbor-registry image release tags are in-sync with Harbor releases which is similar to the upstream Harbor registry Image.

### FIPS Support
The `request-2682-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
For getting started with Harbor-registry, we can use helm to deploy it:
### Deploying Harbor with Helm
The easiest way to get up and running with Chainguard's Harbor-registry is via deployment with Harbor's official Helm chart.

To get started, we need to add Harbor's Helm repository:  

```bash
helm repo add harbor https://helm.goharbor.io
```
Now that we've added the repository, we can deploy Harbor-registry:
```shell
helm install harbor harbor/harbor \
  --set registry.registry.image.repository=cgr.dev/ORGANIZATION/request-2682-fips,registry.registry.image.tag=latest
```
**Note:** In order to deploy Harbor-registry along with entire Chainguard's Harbor images, we can use:

```bash
helm install harbor harbor/harbor \
  --set core.image.repository=cgr.dev/ORGANIZATION/harbor-core,core.image.tag=latest \
  --set jobservice.image.repository=cgr.dev/ORGANIZATION/harbor-jobservice,jobservice.image.tag=latest \
  --set portal.image.repository=cgr.dev/ORGANIZATION/harbor-portal,portal.image.tag=latest \
  --set registry.registry.image.repository=cgr.dev/ORGANIZATION/request-2682-fips,registry.registry.image.tag=latest \
  --set registry.registryctl.image.repository=cgr.dev/ORGANIZATION/harbor-registryctl,registry.registryctl.image.tag=latest \
  --set trivy.image.repository=cgr.dev/ORGANIZATION/harbor-trivy-adapter,trivy.image.tag=latest \
  --set registry.registry.extraEnvVars[0].name=REGISTRY_REDIS_OPTIONS_ADDRS \
  --set registry.registry.extraEnvVars[0].value="[harbor-redis:6379]"
```
*You will need to override the `image` and `tag` values for each image like we've done here to point to Chainguard's Harbor images and tags.*

Additionally, you may fetch Harbor's Helm chart after adding the repository and edit values directly without overriding them on installation:

```bash
helm fetch harbor/harbor --untar
```

Afterwards, edit `values.yml` and substitute in Chainguard's images/tags. For instance, for `harbor-core`, the following changes should be made:

```yaml
core:
  ...
  image: cgr.dev/ORGANIZATION/harbor-core
  tag: latest
  ...
```

## Documentation and Resources
- [Official Documentation](https://goharbor.io/docs/2.14.0/install-config/)
- [Project Repository](https://github.com/goharbor/harbor)
- [Configuration Guide](https://goharbor.io/docs/2.14.0/install-config/configure-system-settings-cli/)
- [Architecture](https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-sigv4-proxy

# aws-sigv4-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-sigv4-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-sigv4-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This project signs and proxies HTTP requests with Sigv4

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image is comparable to the upstream [aws-observability/aws-sigv4-proxy](https://gallery.ecr.aws/aws-observability/aws-sigv4-proxy) image. Chainguard's container contains only the minimum set of dependencies needed to run aws-sigv4-proxy.

## Getting Started

To get started with the aws-sigv4-proxy, you need to configure it with your AWS credentials and the target service you want to access. The proxy will sign requests using AWS Signature Version 4.

```bash
docker container run -d \
  --name aws-sigv4-proxy \
  -p 8080:8080 \
  -e AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>" \
  -e AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>" \
  cgr.dev/ORGANIZATION/aws-sigv4-proxy:latest
```

Then you can access the AWS service through the proxy by sending requests to `http://localhost:8080`. The proxy will automatically sign the requests with your AWS credentials.

For example to access an S3 bucket, you can use the following command:

```bash
# us-east-1
curl -s -H 'host: s3.amazonaws.com' http://localhost:8080/<BUCKET_NAME>
```

You will see the logs of the signing requests in the container logs, which will look like this:

```
2023/10/01 12:00:00 [INFO] Signing request for service s3 in region us-east-1
2023/10/01 12:00:00 [INFO] Request signed successfully
2023/10/01 12:00:00 [INFO] Forwarding request to s3.amazonaws.com
```

To learn more about how to run the aws-sigv4-proxy for different use cases, you can refer to the [aws-sigv4-proxy examples in GitHub repository](https://github.com/awslabs/aws-sigv4-proxy/#examples).

Also, you can deploy the aws-sigv4-proxy as a sidecar container alongside your application and there is a project named aws-sigv4-proxy-admission-controller that can automatically inject the aws-sigv4-proxy sidecar into your pods. To get more information about aws-sigv4-proxy-admission-controller, you can refer to the [aws-sigv4-proxy-admission-controller GitHub repository](https://github.com/aws-observability/aws-sigv4-proxy-admission-controller#example-deployment).

## Documentation and Resources
- [AWS Signature Version 4 for API requests](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)
- [AWS SigV4 Proxy GitHub Repository](https://github.com/awslabs/aws-sigv4-proxy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tomcat-fips

# tomcat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tomcat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tomcat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image uses the [Apache Portable Runtime](https://apr.apache.org/) library to default to using the OS provided OpenSSL libraries through the Java Secure Socket Extension (JSSE).

Running this image will show output like the following, indicating the APR is loaded and the underlying OpenSSL library is being used: 

```shell
% docker run cgr.dev/chainguard/tomcat-fips:latest
Using CATALINA_BASE:   /usr/local/tomcat
. . .
19-Jul-2024 13:47:15.331 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [2.0.8] using APR version [1.7.4].
19-Jul-2024 13:47:15.337 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL Using OpenSSL with the FIPS provider as the default provider
19-Jul-2024 13:47:15.337 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.3.1 4 Jun 2024]
. . .
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-security-scan

# rancher-security-scan
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-security-scan` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-security-scan/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Evaluates Kubernetes cluster security posture against established best practices using kube-bench framework.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `rancher-security-scan` container image is designed to be a drop-in replacement for the upstream [rancher/security-scan image](https://github.com/rancher/security-scan). This image maintains full compatibility with rancher/security-scan:latest while providing enhanced security through Chainguard's distroless base and regular vulnerability patching.

## Getting Started

### Kubernetes Deployment

The rancher-security-scan image is typically deployed as part of Rancher's compliance scanning framework. For deployment examples and configurations, please refer to the upstream test deployment.
- [deploy.yaml](https://github.com/rancher/security-scan/blob/main/tests/deploy.yaml) for the basic deployment manifest
- [hack/e2e](https://github.com/rancher/security-scan/blob/main/hack/e2e) for the full recipe/setup process

## Documentation and Resources

- [Rancher Security Scan](https://github.com/rancher/security-scan)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### stakater-reloader-fips

# stakater-reloader-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/stakater-reloader-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/stakater-reloader-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Overview
This image is a drop-in replacement for the stakater-reloader image available
upstream at `ghcr.io/stakater/reloader`.

### Deploy with Helm
```bash
helm repo add reloader https://stakater.github.io/stakater-charts
helm install reloader reloader/reloader \
  --set reloader.deployment.image=cgr.dev/ORGANIZATION/stakater-reloader-fips \
  --set reloader.deployment.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hailo-ai-onnxruntime

# images/hailo-ai-onnxruntime
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/hailo-ai-onnxruntime` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/hailo-ai-onnxruntime/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image with ONNX Runtime, HailoRT, and the Hailo Execution Provider for hardware-accelerated ML inference

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What's Included

This image contains:

- **HailoRT**: Open source runtime library for Hailo AI accelerator devices
- **ONNX Runtime**: ML inference engine with C++ libraries and headers
- **Hailo Execution Provider**: Integration enabling ONNX Runtime to use Hailo accelerators
- **Python 3.12 Bindings**: Full Python API for ONNX Runtime with Hailo support
- **Development Tools**: Build tools for compiling C++ applications (bash, build-base)
- **HailortCLI**: Command-line tool for managing and querying Hailo devices

## Usage

### Available Execution Providers

This image includes both `CPUExecutionProvider` and `HailoExecutionProvider`. You can verify the providers are available:

```bash
docker run --rm cgr.dev/ORGANIZATION/hailo-ai-onnxruntime:latest -lc "python3 -c 'import onnxruntime as ort; print(ort.get_available_providers())'"
```

This will output: `['HailoExecutionProvider', 'CPUExecutionProvider']`

### Python Example

Run ONNX model inference using Python:

```python
import onnxruntime as ort
import numpy as np

# Create inference session with Hailo provider
session = ort.InferenceSession(
    "model.onnx",
    providers=["HailoExecutionProvider", "CPUExecutionProvider"]
)

# Prepare input data
input_name = session.get_inputs()[0].name
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)

# Run inference
outputs = session.run(None, {input_name: input_data})
print("Inference completed:", outputs[0].shape)
```

### C++ Example

Compile and link against ONNX Runtime C++ API:

```cpp
#include <iostream>
#include "core/session/onnxruntime_cxx_api.h"

int main() {
    // List available providers
    for (auto& provider : Ort::GetAvailableProviders()) {
        std::cout << provider << std::endl;
    }

    // Get ONNX Runtime version
    std::cout << OrtGetApiBase()->GetVersionString() << std::endl;
    return 0;
}
```

Build the application:

```bash
docker run --rm -v "$PWD:/work" -w /work \
  cgr.dev/ORGANIZATION/hailo-ai-onnxruntime:latest -lc \
  "c++ -std=c++17 app.cpp -o app \
   $(pkgconf --cflags libonnxruntime) \
   $(pkgconf --libs libonnxruntime)"
```

### Using HailortCLI

The image includes the `hailortcli` tool for device management:

```bash
docker run --rm cgr.dev/ORGANIZATION/hailo-ai-onnxruntime:latest -lc "hailortcli --version"
```

## Hardware Requirements

- **For CPU-only inference**: No special hardware required
- **For accelerated inference**: Hailo AI accelerator device (e.g., Hailo-8, Hailo-15) with appropriate drivers installed on the host

When running with Hailo hardware, you may need to pass device access to the container:

```bash
docker run --rm --device=/dev/hailo0 \
  cgr.dev/ORGANIZATION/hailo-ai-onnxruntime:latest \
  -lc "hailortcli scan"
```

## Environment Variables

- `HAILORT_LOGGER_PATH`: Path for HailoRT log files (default: `/var/log/hailort`)
- `ONNXRUNTIME_LOG_LEVEL`: Set ONNX Runtime logging verbosity (0-4, where 0 is most verbose)

## Resources

- [Hailo AI GitHub - HailoRT](https://github.com/hailo-ai/hailort)
- [Hailo AI ONNX Runtime Fork](https://github.com/hailo-ai/onnxruntime)
- [ONNX Runtime Documentation](https://onnxruntime.ai/docs/)
- [ONNX Model Zoo](https://github.com/onnx/models)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-iamguarded-fips

# postgres-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostgreSQL is a powerful, open source object-relational database system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `postgres-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

PostgreSQL IAMGuarded is a security-enhanced variant of PostgreSQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main PostgreSQL image
image:
  registry: myregistry.example.com
  repository: mirrored/postgres-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql:16.7.2
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dfc

# dfc
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dfc` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dfc/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CLI to convert Dockerfiles to use Chainguard Images and APKs in FROM and RUN lines

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### geoip-api

# geoip-api
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/geoip-api` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/geoip-api/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A JSON REST API for Maxmind GeoIP databases

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard geoip-api image is comparable to [the official image hosted on ghcr.io](https://github.com/observabilitystack/geoip-api/pkgs/container/geoip-api).
In the interests of delivering a minimal, secure image, the Chainguard image does not run as root user, and does not contain a shell.

GeoIP requires up-to-date databases in order to function. The Chainguard image does not include any static databases. You must download the latest databases from [from here](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data/#generate-a-license-key-to-authenticate-geolite-database-downloads-and-web-service-requests), and mount them into the container (example given below).

## Getting started
For those with access, this container image is available on `cgr.dev`:

Run the `geoip-api` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/geoip-api:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

> **NOTE**: To use geoip-api, you need to provide the Maxmind GeoIP databases. You can download the databases from [Maxmind's website](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data/#generate-a-license-key-to-authenticate-geolite-database-downloads-and-web-service-requests) and mount them into the container using the `-v` flag in Docker and you should use the `-e` flag to set the environment variables for the database files. For example:

```bash
docker run -d --name geoip-api \
  -e ASN_DB_FILE="/tmp/GeoLite2-ASN.mmdb" \
  -e CITY_DB_FILE="/tmp/GeoLite2-City.mmdb" \
  -v /path/to/GeoLite2-ASN.mmdb:/tmp/GeoLite2-ASN.mmdb:ro \
  -v /path/to/GeoLite2-City.mmdb:/tmp/GeoLite2-City.mmdb:ro \
  cgr.dev/ORGANIZATION/geoip-api:latest
```

### Documentation and Resources

* [geoip-api Documentation](https://www.maxmind.com/en/geoip-api-web-services)
* [geoip-api GitHub Repository](https://github.com/observabilitystack/geoip-api)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-fips

# cert-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-mimir

# grafana-mimir
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-mimir` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-mimir/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Wolfi-based image for Grafana Mimir, providing horizontally scalable, highly available, multi-tenant, long-term storage for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage

To get started with Grafana Mimir, add Grafana's Helm repository: 

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```

Now deploy the Helm chart, substituting Grafana's image with Chainguard's:

```bash
helm install mimir grafana/mimir-distributed \
  --set image.repository=cgr.dev/chainguard/grafana-mimir \
  --set image.tag=latest
```

For additional configuration, please refer to the [upstream documentation](https://grafana.com/docs/helm-charts/mimir-distributed/latest/get-started-helm-charts/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-operator

# opentelemetry-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for OpenTelemetry Collector

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard OpenTelemetry Operator for Kubernetes Image is comparable to the official OpenTelemetry Operator Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager.

## Getting Started

### OpenTelemetry Operator

To get started with Chainguard's OpenTelemetry Operator for Kubernetes Image, deploy it using the [official Helm chart](https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator):

Use the following `values.yaml` file to configure the Helm chart:

```yaml
manager:
  image:
    repository: cgr.dev/ORGANIZATION/opentelemetry-operator
    tag: latest
  targetAllocatorImage:
    repository: cgr.dev/ORGANIZATION/opentelemetry-operator-target-allocator
    tag: latest
```

Deploy the Helm chart:

```shell
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm install opentelemetry-operator open-telemetry/opentelemetry-operator \
  --values values.yaml
```

## Example

Now create a simple `OpenTelemetryCollector` instance:

```shell
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: simplest
spec:
  config:
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318
    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 10s

    exporters:
      debug: {}

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [debug]
EOF
```

### OpenTelemetry Target Allocator

The OpenTelemetry Operator comes with an optional component, the Target Allocator (TA). In a nutshell, the TA is a mechanism for decoupling the service discovery and metric collection functions of Prometheus such that they can be scaled independently.

The only thing that you have to do is that you have to enable targetAllocator in the above CR like this:

```yaml
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: collector-with-ta
spec:
  mode: statefulset
  targetAllocator:
    enabled: true # HERE!
  config: |
    receivers:
      prometheus:
        config:
          scrape_configs:
          - job_name: 'otel-collector'
            scrape_interval: 10s
            static_configs:
            - targets: [ '0.0.0.0:8888' ]
            metric_relabel_configs:
            - action: labeldrop
              regex: (id|name)
              replacement: $$1
            - action: labelmap
              regex: label_(.+)
              replacement: $$1 

    exporters:
      # NOTE: Prior to v0.86.0 use `logging` instead of `debug`.
      debug:

    service:
      pipelines:
        metrics:
          receivers: [prometheus]
          processors: []
          exporters: [debug]

```

To get more information about Target Allocator, you can visit the [official documentation](https://opentelemetry.io/docs/kubernetes/operator/target-allocator/).

### Documentation and Resources
For further configuration, please reference the official usage documentation and Helm chart.

- [Official usage documentation](https://opentelemetry.io/docs/kubernetes/operator/)
- [Official Helm chart](https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator)
- [OpenTelemetry Target Allocator](https://opentelemetry.io/docs/kubernetes/operator/target-allocator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### timescaledb-compat

# timescaledb-compat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/timescaledb-compat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/timescaledb-compat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A time-series database for high-performance real-time analytics packaged as a Postgres extension

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's TimescaleDB Compat image is comparably to the [official open source TimescaleDB image](https://hub.docker.com/r/timescale/timescaledb) from Docker Hub. However, this image only contains Apache 2 from TimescaleDB; no proprietary code is included, so some features may not be available. Please see this [feature comparison](https://docs.tigerdata.com/about/latest/timescaledb-editions/#feature-comparison) for more information.

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it -p 5432:5432 -e POSTGRES_PASSWORD=password cgr.dev/ORGANIZATION/timescaledb-compat:latest
```

It should return output similar to this:
```
The files belonging to this database system will be owned by user "nonroot".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
# ...
```

Note that the only mandatory environment variable needed by the TimescaleDB image is `POSTGRES_PASSWORD`. 

This command will run the image, but no data within the underlying PostgreSQL database will persist after the image stops running. For a persistent database you can mount a volume mapped to the container's data folder:

```sh
docker run --rm -v timescaledb_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -it --name postgres-test cgr.dev/ORGANIZATION/timescaledb-compat:latest
```

From there you can start making queries with tools that interop with PostgreSQL, for example, with the `psql` CLI tool.

### Example: Using PSQL CLI to deploy a basic database using TimescaleDB's extensions

Create a file named `hello_world.sql` with the following contents in your current working directory

```sql
-- Create table 'rides' which will store trip data
DROP TABLE IF EXISTS "rides";
CREATE TABLE "rides"(
    vendor_id TEXT,
    pickup_datetime TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    dropoff_datetime TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    passenger_count NUMERIC,
    trip_distance NUMERIC,
    pickup_longitude  NUMERIC,
    pickup_latitude   NUMERIC,
    rate_code         INTEGER,
    dropoff_longitude NUMERIC,
    dropoff_latitude  NUMERIC,
    payment_type INTEGER,
    fare_amount NUMERIC,
    extra NUMERIC,
    mta_tax NUMERIC,
    tip_amount NUMERIC,
    tolls_amount NUMERIC,
    improvement_surcharge NUMERIC,
    total_amount NUMERIC
);

-- Create hypertable for rides 
-- This allows us to take advantage of timescaledb's space and time partitioning
SELECT create_hypertable('rides', 'pickup_datetime', 'payment_type', 2, create_default_indexes=>FALSE);
-- Create indexes (special look up tables/ pointers) on the following columns to speed up data retrieval
CREATE INDEX ON rides (vendor_id, pickup_datetime desc);
CREATE INDEX ON rides (pickup_datetime desc, vendor_id);
CREATE INDEX ON rides (rate_code, pickup_datetime DESC);
CREATE INDEX ON rides (passenger_count, pickup_datetime desc);

-- Create table 'payment_types' to store description of payment types for easy lookup
CREATE TABLE IF NOT EXISTS "payment_types"(
    payment_type INTEGER,
    description TEXT
);
INSERT INTO payment_types(payment_type, description) VALUES
(1, 'credit card'),
(2, 'cash'),
(3, 'no charge'),
(4, 'dispute'),
(5, 'unknown'),
(6, 'voided trip');

-- Create table 'rates' to store description of rate codes for for easy lookup
CREATE TABLE IF NOT EXISTS "rates"(
    rate_code   INTEGER,
    description TEXT
);
INSERT INTO rates(rate_code, description) VALUES
(1, 'standard rate'),
(2, 'JFK'),
(3, 'Newark'),
(4, 'Nassau or Westchester'),
(5, 'negotiated fare'),
(6, 'group ride');
```

Then run the following to apply the database schema: 

```shell
psql -h "${PGHOST:-127.0.0.1}" -U postgres -f hello_world.sql
```

Make sure to specify the password either via stdin or by manually typing it

You should see output similar to the following:
```
psql:hello_world.sql:2: NOTICE:  table "rides" does not exist, skipping
DROP TABLE
CREATE TABLE
psql:hello_world.sql:26: WARNING:  column type "timestamp without time zone" used for "pickup_datetime" does not follow best practices
HINT:  Use datatype TIMESTAMPTZ instead.
psql:hello_world.sql:26: WARNING:  column type "timestamp without time zone" used for "dropoff_datetime" does not follow best practices
HINT:  Use datatype TIMESTAMPTZ instead.
 create_hypertable
--------------------
 (1,public,rides,t)
(1 row)

CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 6
```

## Documentation References

- [TimescaleDB Documentation](https://docs.tigerdata.com/self-hosted/latest)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
- [How to deploy TimescaleDB on Kubernetes](https://docs.tigerdata.com/self-hosted/latest/install/installation-kubernetes/#install-timescaledb-on-kubernetes)
- [TimescaleDB Apache 2 Edition Compatibility Notice](https://docs.tigerdata.com/about/latest/timescaledb-editions/#timescaledb-apache-2-edition)
- [TimescaleDB Editions Feature Comparison](https://docs.tigerdata.com/about/latest/timescaledb-editions/#feature-comparison)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-network-policy-agent-fips

# aws-network-policy-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-network-policy-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-network-policy-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5762

# request-5762
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5762` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5762/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenTofu-FIPS with FIPS variant Terraform providers, meant for a Custom Assembly package bundle

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-7571

# request-7571
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-7571` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-7571/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

custom image with monit package

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

This image contains the Monit monitoring utility, which can be used to manage and monitor Unix systems, processes, programs, files, directories, and filesystems.

To verify the installation:

```shell
docker run --rm cgr.dev/ORGANIZATION/request-7571:latest monit -V
```

For more information on using Monit, refer to the [official Monit documentation](https://mmonit.com/monit/documentation/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### doppler-kubernetes-operator

# doppler-kubernetes-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/doppler-kubernetes-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/doppler-kubernetes-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automatically sync secrets from Doppler to Kubernetes and auto-reload deployments when secrets change.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ztunnel-fips

# ztunnel-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ztunnel-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ztunnel-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The ztunnel component of ambient mesh

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Notes

Ztunnel binary starting with 1.26.1-r1 onwards uses OpenSSL at runtime, with CMVP certification as specified in the [FIPS commitment](https://www.chainguard.dev/legal/fips-commitment). Prior versions of Ztunnel binaries in this image use [CVMP #4407](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4407).

Ztunnel binary contains [cargo-auditable](https://github.com/rust-secure-code/cargo-auditable) information which indicates presence of ring cryptographic crate. However the ring crate is not in fact linked or used by this ztunnel binary. This is due to an [upstream issue](https://github.com/rust-secure-code/cargo-auditable/issues/66) with cargo-auditable and rust crates that support multiple alternative optional dependencies, such as ztunnel. This can lead to false positive results from security scanners that may detect ring crate metadata presence.

## Compatibility Notes
This image is compatible with the distroless version of the upstream image. This is the image that gets deployed by default when you run `helm install ztunnel istio/ztunnel -n istio-system`.
The upstream project releases two container images, one with a shell and package manager and one without. This image is based on the distroless version of the upstream image.
If you want to use the image with a shell and package manager, you can use the `-dev` variant of this image.

## Getting Started
For getting started, we can use helm to deploy istio in ambient mesh mode.
The details to install istio in ambient mode can be found on [official documentation](https://istio.io/latest/docs/ambient/install/helm/)

When deploying the `ztunnel` helm chart, we need to override the

```bash
helm install ztunnel istio/ztunnel -n istio-system --set hub=cgr.dev/chainguard --set image=ztunnel-fips --set tag=latest
```
If you're using `values.yaml` file, you can add the following lines to override the image:
```yaml
hub: cgr.dev/chainguard
image: ztunnel-fips
tag: latest
```
Before installation, this can also be verified by running the following command:
```bash
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
helm template ztunnel istio/ztunnel -n istio-system -f values.yaml
```

## Documentation and Resources
After installation, we can follow the starting guide of an application which can be found [here](https://istio.io/latest/docs/ambient/getting-started/deploy-sample-app/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-istio-csr

# cert-manager-istio-csr
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-istio-csr` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-istio-csr/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

istio-csr is an agent that allows for Istio workload and control plane components to be secured using cert-manager.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard cert-manager-istio-csr image is designed to be a drop-in replacement for the upstream [quay.io/jetstack/cert-manager-istio-csr image](https://quay.io/repository/jetstack/cert-manager-istio-csr?tab=tags&tag=latest). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a package manager, while maintaining full compatibility.

## Usage

There is a detailed guide on how to use this image with cert-manager and Istio in the [official documentation](https://cert-manager.io/docs/usage/istio-csr/installation/).

Fortunately, there is a Helm chart available that simplifies the installation process. You can install the Helm chart with the following command:

```shell
helm upgrade cert-manager-istio-csr jetstack/cert-manager-istio-csr \
  --install \
  --namespace cert-manager \
  --wait \
  --set image.repository=cgr.dev/ORGANIZATION/cert-manager-istio-csr \
  --set image.tag=latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-replicator

# kubernetes-replicator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-replicator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-replicator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[kubernetes-replicator](https://github.com/mittwald/kubernetes-replicator) is a custom Kubernetes controller that can be used to make secrets and config maps available in multiple namespaces.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-replicator` container image is comparable to the [upstream image maintained by Mittwald](https://quay.io/mittwald/kubernetes-replicator:stable), with the following differences:

* Like all other Chainguard Containers, `kubernetes-replicator` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting Started

You can run the `kubernetes-replicator` container image using the official Helm chart.

First create a `values.yaml` file like the following:

```shell
image:
  repository: cgr.dev/chainguard/kubernetes-replicator
  tag: latest

# Add other configuration parameters below as needed
```

Then deploy `kubernetes-replicator` with Helm:

```shell
helm repo add mittwald https://helm.mittwald.de
helm repo update
helm install kubernetes-replicator mittwald/kubernetes-replicator \
  -f values.yaml
```

Create the source and target namespaces where you want the secrets to be replicated:

```shell
kubectl create ns source-ns
kubectl create ns target-ns
```

Create a secret in the `source-ns` namespace, as in the following sample manifest:

```shell
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: source-ns
  annotations:
    replicator.v1.mittwald.de/replicate-to: "target-ns"
type: Opaque
data:
  key: dmFsdWU=  # base64 for "value"
```

Apply the secret to the Kubernetes cluster:

```shell
kubectl apply -f my-secret.yaml
```

Verify the content of the secret:

```shell
kubectl get secret my-secret -n target-ns -o yaml
```
```
apiVersion: v1
data:
  key: dmFsdWU=  # base64 for "value"
kind: Secret
metadata:
  annotations:
    replicator.v1.mittwald.de/replicate-from: "source-ns"
  creationTimestamp: "2025-05-05T12:00:00Z"
  name: my-secret
  namespace: target-ns
  resourceVersion: "12345"
  selfLink: /api/v1/namespaces/target-ns/secrets/my-secret
  uid: abcd1234-5678-90ab-cdef-ghijklmnop
type: Opaque
```

## Documentation and Resources

- **[Kubernetes Replicator GitHub Repository](https://github.com/mittwald/kubernetes-replicator)**
- **[Kubernetes Replicator Helm Chart](https://artifacthub.io/packages/helm/kubernetes-replicator/kubernetes-replicator)**  

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ant-fips

# ant-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ant-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ant-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `ant` container image provides [Apache Ant](https://ant.apache.org/), a Java-based build automation tool. Since there is no official Apache Ant Docker image, this image serves as a secure alternative to community-maintained versions. 

This container image's tags are in the form of `<ANT_VERSION>-jdk<OPENJDK_VERSION>[-dev]`, such that one can track `1-jdk21` for Ant 1.x.x with OpenJDK 21. The `-dev` variants contain jmods, and are thus suitable to use jlink.

### FIPS Support

The `ant-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. 

Note, exclude bc-fips.jars `/usr/share/java/bouncycastle-fips/` module-path from jlink, as jlink is unable to link signed jars. Instead ensure that `--module-path=/usr/share/java/bouncycastle-fips` is used at runtime, with such path copied from either this container image, or `jdk-fips` or `jre-fips` images.

OpenJDK 8 is not currently supported for FIPS; with this image, one must target at least JDK 11 during build. Refer to the **Specification** tab for the extra variables set to ensure Ant and Java are operating in FIPS mode.

For more on FIPS support in Chainguard Containers, consult the guide on [FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Use the `ant-fips` container to build Java projects with Ant build files:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant-fips:latest
```

To compile and package a Java project:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant-fips:latest compile jar
```

To run a specific Ant target:

```shell
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/ant-fips:latest [target-name]
```

## Documentation and Resources

- [Apache Ant Manual](https://ant.apache.org/manual/)
- [Apache Ant Project](https://ant.apache.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-elasticsearch-exporter-fips

# prometheus-elasticsearch-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-elasticsearch-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-elasticsearch-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### percona-server

# percona-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/percona-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/percona-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Percona Server for MySQL is a free, fully compatible, enhanced, and open source drop-in replacement for any MySQL database. It provides superior performance, scalability, and instrumentation.'

To get more information about the image, please visit the GitHub [repository](https://github.com/percona/percona-server).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To get started with Percona Server for MySQL promptly, this Quickstart guide emphasizes using Docker or installing with APT or YUM. Also you can follow along the Quickstart guide on the [Percona website](https://docs.percona.com/percona-server/innovation-release/quickstart-overview.html) for more details.

### Docker

#### Starting a Detached Container

Start a container with the `--detached` or `-d` option to run it in the background. In detached mode, the container exits when the main process used to run it exits.

Start a container named `ps` with the latest version of Percona Server for MySQL 8.3. This example sets the root password to `root` (not secure).

```bash
$ docker run -d \
  --name ps \
  -e MYSQL_ROOT_PASSWORD=root \
  cgr.dev/ORGANIZATION/percona-server:latest
```

By default, Docker pulls the image from Docker Hub if it is not available locally.

To view the container’s logs, use:

```bash
$ docker logs ps --follow
```

<details>

<summary>Expected Output:</summary>

```bash
You can access the server when you see the "ready for connections" message in the log.
```
</details>

You can pass options with the docker run command. Example: Set UTF-8 as the default character set and collation for all databases.

```bash
$ docker run -d \
  --name ps \
  -e MYSQL_ROOT_PASSWORD=root \
  cgr.dev/ORGANIZATION/percona-server:latest \
  --character-set-server=utf8 \
  --collation-server=utf8_general_ci
```

#### Accessing the Percona Server Container

Use the docker exec command to get a shell inside the container. Example:

```bash
$ docker exec -it ps /bin/bash
```

For troubleshooting, the error log is located in /var/log/ or /var/log/mysql/, typically named error.log or mysqld.log.

View the error log with:

```bash
$ more /var/log/mysql/error.log
```

<details>

<summary>Expected Output:</summary>

```bash
...
2017-08-29T04:20:22.190474Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2017-08-29T04:20:22.190520Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
...
```

</details>

#### Accessing the Database
You can access the database using docker exec or the mysql command inside the container’s shell.

```bash
$ docker exec -ti ps mysql -uroot -proot
```

<details>

<summary>Expected Output:</summary>

```bash
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
...
```

</details>

You can also use the MySQL command-line client inside the container’s shell to access the database:

```bash
$ mysql -uroot -proot
```

<details>

<summary>Expected Output:</summary>

```bash
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.3.0-1 Percona Server (GPL), Release 21, Revision c59f87d2854

Copyright (c) 2009-2022 Percona LLC and/or its affiliates
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

</details>

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openfga

# openfga
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openfga` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openfga/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A high performance and flexible authorization/permission engine built for developers and inspired by Google Zanzibar

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [OpenFGA image available from Docker Hub](https://hub.docker.com/r/openfga/openfga). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

### Helm Chart

You can use the [official Helm chart](https://github.com/openfga/helm-charts/tree/main/charts/openfga) and replace the image in `values.yaml` with the Chainguard image.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/openfga
  tag: latest
```

Run the following commands to install and run Chainguard's OpenFGA image using Helm:

```bash
helm repo add openfga https://openfga.github.io/helm-charts
```
```
"openfga" has been added to your repositories
```
```shell
helm repo update
```
```
...Successfully got an update from the "openfga" chart repository
Update Complete. ⎈Happy Helming!⎈
```
```shell
helm install openfga openfga/openfga --values values.yaml
```
```
NAME: openfga
LAST DEPLOYED:
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=openfga,app.kubernetes.io/instance=openfga" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[1].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
```

### Docker

You can run the following command to run Chainguard's OpenFGA image:

```shell
docker run -d --name openfga -p 8080:8080 cgr.dev/ORGANIZATION/openfga:latest run
```

With the container running in the background, you can send a `GET` request to the `/stores` endpoint:

```shell
curl -X GET localhost:8080/stores
```
```
{"stores":[],"continuation_token":""}
```

## Documentation and Resources

* [Official OpenFGA Documentation](https://openfga.dev/docs/fga).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### duckdb-fips

# duckdb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/duckdb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/duckdb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

DuckDB is an analytical in-process SQL database management system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Image for `duckdb` is meant to serve as a drop-in replacement for [datacatering/duckdb image from Docker Hub](https://hub.docker.com/r/datacatering/duckdb). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

To use Chainguard's DuckDB image, you can pass an SQL query as an argument to the image:

```shell
docker run --rm k3d-k3d.localhost:5005/duckdb:latest :memory: "SELECT 'foo' AS bar;"
```
```Output
┌─────────┐
│   bar   │
│ varchar │
├─────────┤
│ foo     │
└─────────┘
```

## Documentation and Resources

You can refer to the official [CLI API documentation](https://duckdb.org/docs/api/cli/overview.html) for more information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-image-updater-fips

# argocd-image-updater-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-image-updater-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-image-updater-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automatic container image update for Argo CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [argocd-image-updater](https://quay.io/repository/argoprojlabs/argocd-image-updater) image. Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support
The `argocd-image-updater-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

To install Chainguard's argocd-image-updater image on your Kubernetes cluster, you can use the official image's [Helm chart](https://github.com/argoproj/argo-helm/tree/main/charts/argocd-image-updater).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/argocd-image-updater
  tag: latest
```
	
You can also invoke the following command to install argocd-image-updater in your cluster.

```shell
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd-image-updater argo/argocd-image-updater -f values.yaml
```

## Documentation and Resources
For more information, please refer to [the official documentation for argocd-image-updater](https://argocd-image-updater.readthedocs.io/en/stable/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sqlpad-fips

# sqlpad-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sqlpad-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sqlpad-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### liberica-jre-fips

# liberica-jre-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/liberica-jre-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/liberica-jre-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Free and open source Progressive Java Runtime for modern Java deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`liberica-jre-fips` is comparable to the upstream [liberica-runtime-container](https://hub.docker.com/r/bellsoft/liberica-runtime-container) image, with the following differences:

* Like all other Chainguard Images, `liberica-jre-fips` features a stripped down, minimal design
* This base image comes with BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs
* It does not run as the root user

Most importantly, the `liberica-jre-fips` image contains the OpenSSL FIPS Provider Module. For more information, refer to our [FIPS image documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/)

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

To test the Chainguard version of Liberica JRE with FIPS, you can use the following examples:

### Running a Simple Java Application

Create a Java application, such as this `HelloWorld.java` example:

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

Compile the application:

```shell
javac HelloWorld.java
```

Create a Dockerfile to build the image:

```Dockerfile
FROM cgr.dev/chainguard/liberica-jre-fips:latest
COPY HelloWorld.class /app/
WORKDIR /app
CMD ["java", "HelloWorld"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the application output:

```
Hello, World!
```

### Running a Java Application with Dependencies

If your Java application has dependencies, you can use a build tool like Maven. Create a `pom.xml` file for your project and a Java application:

```xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</project>
```

```java
import org.apache.commons.lang3.StringUtils;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(StringUtils.capitalize("hello, world!"));
    }
}
```

Create a Dockerfile to build the image:

```Dockerfile
FROM maven:3.8.4-openjdk-11 AS build
COPY pom.xml /app/
COPY src /app/src
WORKDIR /app
RUN mvn package

FROM cgr.dev/chainguard/liberica-jre-fips:latest
COPY --from=build /app/target/hello-world-1.0-SNAPSHOT.jar /app/hello-world.jar
WORKDIR /app
CMD ["java", "-jar", "hello-world.jar"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the output returned by the application:

```
Hello, world!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-openshift-routes-fips

# cert-manager-openshift-routes-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-openshift-routes-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-openshift-routes-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant image for cert-manager OpenShift Route support

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream `ghcr.io/cert-manager/cert-manager-openshift-routes:latest` Image. Like most other Chainguard Images, this image has few-to-zero CVEs.
If you want to use the image with a shell and package manager, you can use the `-dev` variant of this image.

### FIPS Support
The `cert-manager-openshift-routes-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
**Note:** For getting started with Openshift routes, we need to deploy it in an **OpenShift Cluster**.

### Prerequisites:
1. Ensure you have cert-manager installed through the method of your choice. Make sure you install `cert-manager` and `openshift-routes-deployment` in the same namespace. By default this is in the namespace `cert-manager`. For example, with Helm:
```shell
helm install \
  cert-manager oci://quay.io/jetstack/charts/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true
```
2. Both **ClusterIssuer** and namespace based **Issuer** are possible. Here, a **ClusterIssuer** is used:
For example, create the ClusterIssuer (no additional ingress class is needed for the `openshift-ingress` router. The `example.com` email must be replaced by another one):
```yaml
apiVersion: v1
items:
  - apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      annotations:
      name: letsencrypt-prod
    spec:
      acme:
        email: mymail@example.com
        preferredChain: ""
        privateKeySecretRef:
          name: letsencrypt-prod
        server: https://acme-v02.api.letsencrypt.org/directory
        solvers:
          - http01:
              ingress: {}
```
```shell
oc apply -f clusterissuer.yaml
```
3. Make sure that there is an A record on the load balancer IP or a CNAME record on the load balancer hostname in your DNS system for the HTTP-01 subdomain.
```
CNAME:
  Name: *.service.clustername.domain.com
  Alias: your-lb-domain.cloud
```

### Installation
The openshift-routes component can be installed using the Helm chart:
```shell
# Override default openshift-routes image with Chainguard variant
helm install openshift-routes oci://ghcr.io/cert-manager/charts/openshift-routes \
  -n cert-manager \
  --set image.repository=cgr.dev/ORGANIZATION/cert-manager-openshift-routes-fips \
  --set image.tag=latest
```

## Documentation and Resources
- [Project Repository](https://github.com/cert-manager/openshift-routes)
- [Usage Instructions](https://github.com/cert-manager/openshift-routes?tab=readme-ov-file#usage)
- [Documentation on Route configuration](https://docs.redhat.com/en/documentation/openshift_container_platform/4.11/html/networking/configuring-routes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hubble-export-stdout

# hubble-export-stdout
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hubble-export-stdout` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hubble-export-stdout/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

hubble-export-stdout exports Hubble data to stdout.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `hubble-export-stdout` image is compatible with the [quay.io/cilium/hubble-export-stdout](https://quay.io/repository/cilium/hubble-export-stdout) image with the following charecteristics:
* Minimal, distroless design with only the essential runtime dependencies
* Built on Chainguard's secure base images with minimal CVEs
* Compatible with Cilium's Hubble observability framework

The image runs as root similar to the upstream image to ensure its capable of reading logs written with varying permissions.

## Prerequisites

To use `hubble-export-stdout`, you need:

* A Kubernetes cluster with [Cilium](https://cilium.io/) installed
* Hubble observability enabled in your Cilium configuration  

For detailed setup instructions, refer to the [Cilium Hubble documentation](https://docs.cilium.io/en/stable/observability/hubble/).

## Getting Started

### Kubernetes Deployment with Tetragon Helm Chart

A common deployment method is as a sidecar container in Tetragon pods using the official Helm chart:

```bash
# Add the Cilium Helm repository
helm repo add cilium https://helm.cilium.io
helm repo update

# Install Tetragon with stdout export enabled
helm install tetragon cilium/tetragon \
  --set export.stdout.enabled=true \
  --set export.stdout.image.repository=cgr.dev/ORGANIZATION/hubble-export-stdout \
  --set export.stdout.image.tag=latest
```

This configuration adds an `export-stdout` sidecar container to each Tetragon DaemonSet pod that reads security events from Tetragon's log file and streams them to stdout for Kubernetes log collection.

### Basic Docker Usage

For testing purposes, you can run the container directly:

```bash
# Run with file tailing
docker run --rm -v /path/to/events:/data:ro \
  cgr.dev/ORGANIZATION/hubble-export-stdout:latest \
  tail -f /data/sample-events.json
```

## Documentation and Resources

* [Cilium Hubble Documentation](https://docs.cilium.io/en/stable/observability/hubble/)
* [hubble-export-stdout GitHub Repository](https://github.com/cilium/hubble-export-stdout)
* [Hubble Export Configuration](https://docs.cilium.io/en/stable/observability/hubble/configuration/export/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### volsync

# volsync
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/volsync` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/volsync/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Asynchronous data replication for Kubernetes volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `volsync` container image is comparable to [the volsync image](https://quay.io/repository/backube/volsync?tab=tags). Like most other Chainguard container images, the `volsync` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

Chainguard's `volsync` container image does not ship `diskrsync` and `diskrsync-tcp` with it.

## Getting Started

The Chainguard's `volsync` container image can be installed via the [volsync helm chart](https://artifacthub.io/packages/helm/backube-helm-charts/volsync).

Create a `values.yaml` file with the following values

```
image:
    repository: cgr.dev/ORGANIZATION/volsync
    tag: latest
```

Run the following command to install the helm chart:

```
helm repo add backube-helm-charts https://backube.github.io/helm-charts/
helm install --create-namespace --namespace volsync-system volsync backube/volsync -f values.yaml
```

You can then try to configure backups using different movers such as `restic`, `rclone`, `syncthing` etc.

Below is an example of a `ReplicationSource` resource which uses the `restic` mover. You should define your own spec for the following resource.

```
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
  name: mydata-backup
spec:
  sourcePVC: mydata
  trigger:
    schedule: "*/30 * * * *"
  restic:
    pruneIntervalDays: 14
    repository: restic-config
    retain:
      hourly: 6
      daily: 5
      weekly: 4
      monthly: 2
      yearly: 1
    copyMethod: Clone
```

## Documentation and Resources
- [Official Documentation](https://volsync.readthedocs.io/en/stable/index.html)
- [Official Usage Guide](https://volsync.readthedocs.io/en/stable/usage/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-operator

# grafana-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolfi-powered operator for Grafana that installs and manages Grafana instances, Dashboards and Datasources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage

Use `kubectl` to create a namespace to be used by Grafana Operator:

```bash
kubectl create ns grafana-operator
```

Deploy Grafana Operator within the namespace with the Helm chart:

```bash
  helm upgrade \
    -n grafana-operator \
    -i grafana-operator oci://ghcr.io/grafana/helm-charts/grafana-operator \
    --version v5.8.1 \
    --set image.repository=cgr.dev/chainguard/grafana-operator \
    --set image.tag=latest
```

Note that the upstream chart is not tagged with `latest` so we need to set the version explicitly. Always use the [latest supported version of the chart](https://grafana.github.io/grafana-operator/docs/installation/helm/).

We can verify that the operator is available by checking for the service:

```bash
kubectl get svc -n grafana-operator
```

You've now successfully deployed Grafana Operator! For more documentation, checkout the official docs [here](https://grafana.github.io/grafana-operator/docs/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### headlamp

# headlamp
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/headlamp` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/headlamp/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Headlamp is an easy-to-use and extensible Kubernetes web UI designed for developers and cluster operators.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `headlamp` container image is a drop-in replacement for the upstream [kubernetes-sigs/headlamp](https://github.com/kubernetes-sigs/headlamp/tree/main) image. It offers the same functionality and user experience as the upstream, including support for multiple clusters, dynamic plugin extensions, and rich Kubernetes resource views. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.  

## Getting Started

You can deploy this image using the official [Headlamp Helm chart](https://github.com/kubernetes-sigs/headlamp/tree/main/charts/headlamp). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/headlamp
  tag: latest
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `Headlamp` helm chart

```shell
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
helm repo update
helm install headlamp headlamp/headlamp --namespace kube-system -f values.yaml --wait
```

## Documentation and Resources:
- [Headlamp GitHub Repository](https://github.com/kubernetes-sigs/headlamp/tree/main)
- [Headlamp Helm Chart](https://github.com/kubernetes-sigs/headlamp/tree/main/charts/headlamp)
- [Official Website & Docs](https://headlamp.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pushgateway-fips

# prometheus-pushgateway-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pushgateway-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pushgateway-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

### Docker

Run the Pushgateway with Docker:

```shell
docker run -d --name pushgateway -p 9091:9091 cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded-fips:latest
```

Push a metric to the gateway. The URL format is `/metrics/job/<job_name>`:

```shell
echo 'my_job_batch_size 100' | curl -X POST --data-binary @- http://localhost:9091/metrics/job/my_job
```

Verify the metric was received:

```shell
curl http://localhost:9091/metrics | grep my_job_batch_size
```

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded-fips
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pushgateway prometheus-community/prometheus-pushgateway -f values.yaml
```

## Documentation and Resources

- [Prometheus Pushgateway Documentation](https://prometheus.io/docs/instrumenting/pushing/)
- [Prometheus Documentation](https://prometheus.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### heartbeat

# heartbeat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/heartbeat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/heartbeat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Heartbeat periodically checks the status of your services and determine whether they are available.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Heartbeat Image is comparable to the official Heartbeat Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

The Chainguard Heartbeat Image also does not ship the Chromium and Node.js components as it is in beta and not generally available.

## Getting Started
Heartbeat image is usually deployed together with Elasticsearch to send the data to it. It can be run in docker with the configuration mounted - such as:

```shell
docker run \
  -v /path/to/heartbeat.yml:/usr/share/heartbeat/heartbeat.yml \
  cgr.dev/ORGANIZATION/heartbeat
```

A sample, minimal configuration file is as follows:

```
heartbeat.monitors:
  - type: http
    id: nginx
    name: nginx
    service.name: sampleapp
    hosts: ["http://localhost:80"]
    check.response.status: [200]
    schedule: '@every 5s'
output.elasticsearch:
  enabled: false
output.file:
  path: "/tmp/output"
  filename: "metricbeat"
  rotate_every_kb: 10000
  number_of_files: 7
```

This will query http://localhost:80 URL every 5 seconds and store the results in `/tmp/output` directory.

In most cases, `elasticsearch` output should be used - such as:

```
heartbeat.monitors:
  # same content as before
output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
  username: '${ELASTICSEARCH_USERNAME:}'
  password: '${ELASTICSEARCH_PASSWORD:}'
```

This will cause heartbeat to send data to elasticsearch, which can be configured via environment variables, but defaults to `elasticsearch` hostname. To run it, simply pass the values to docker run:

```
docker run \
  -v /path/to/heartbeat.yml:/usr/share/heartbeat/heartbeat.yml \
  -e ELASTICSEARCH_USERNAME=elasticadmin \
  -e ELASTICSEARCH_PASSWORD=.... \
  cgr.dev/ORGANIZATION/heartbeat
```

## Running on Kubernetes

There are no Helm charts that simplify the deployment of Heartbeat, but the [Running Heartbeat on Kubernetes](https://www.elastic.co/guide/en/beats/heartbeat/current/running-on-kubernetes.html) documentation provides detailed instructions on how to run it inside Kubernetes. The only change needed is to replace the image to use the one provided by Chainguard.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitea-fips

# gitea-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitea-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitea-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy Gitea

To deploy Gitea with Chainguard's images, add the Helm repo:

```bash
helm repo add gitea https://dl.gitea.com/charts/
```

Update Helm chart info from your repositories:

```bash
helm repo update
```

Create a namespace for Gitea:

```bash
kubectl create ns gitea-system
```

Finally, install the chart:

```bash
helm install gitea gitea/gitea --namespace gitea-system \
  --set image.fullOverride=cgr.dev/chainguard-private/gitea-fips:latest \
  --set redis-cluster.enabled=false --set redis.enabled=true \
  --set postgresql.enabled=true --set postgresql-ha.enabled=false \
  --set persistence.enabled=true
```

See [here](https://gitea.com/gitea/helm-chart) for all configuration options.

Note: the use of either `image.fullOverride` or `image.digest` is needed
or else the Helm chart will automatically append a "-rootless" suffix to the image tag.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### arangodb

# arangodb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/arangodb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/arangodb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard arangodb image is comparable to the [official arangodb image](https://hub.docker.com/_/arangodb). Note that the Chainguard arangodb image does **NOT** run as root, but rather as the arangodb user.

ArangoDB Pods are using readonly root filesystem, so the containers cannot write the logs to the default location `/var/log/arangodb3`. Instead, the logs should be written to the stderr for best practice. ArangoDB uses `/data` as the default data directory, which is mounted as a persistent volume. You may need to pass the following flags to the `ArangoDeployment` manifest:

* `--log.file=-`
* `--temp.path=/data/tmp`
* `--javascript.app-path=/data/apps`

## Getting Started

### Docker Usage

To run ArangoDB using Docker:

```shell
docker run -d --rm --name arangodb -e ARANGO_ROOT_PASSWORD=password -p 8529:8529 cgr.dev/ORGANIZATION/arangodb:latest
```

Wait for the container to be ready:

```shell
# Check if ArangoDB is available
curl -fsSL http://localhost:8529/_admin/server/availability -u root:password
```

Test basic functionality:

```shell
# Check version
curl -fsSL http://localhost:8529/_api/version -u root:password

# List databases
curl -fsSL http://localhost:8529/_api/database -u root:password

# View statistics
curl -fsSL http://localhost:8529/_admin/statistics -u root:password
```

### Kubernetes Deployment

You can use Helm to deploy the `arangodb` container image using the [ArangoDB Kubernetes Operator](https://github.com/arangodb/kube-arangodb) and start a minimal ArangoDB cluster.

Start by installing the operator:

```shell
helm repo add arangodb https://arangodb.github.io/kube-arangodb
helm repo update

helm install arangodb arangodb/kube-arangodb \
  --version my-version
```

Then deploy a cluster with Chainguard's `arangodb` container image:

```shell
curl -O https://raw.githubusercontent.com/arangodb/kube-arangodb/master/examples/simple-cluster.yaml
```

Then apply it:

```
kubectl apply -f simple-cluster.yaml
```

Replace the default image with the Chainguard version

```
kubectl patch arangodeployment example-simple-cluster --type='merge' -p '{"spec": {"image": "cgr.dev/ORGANIZATION/arangodb:latest"}}'
```

To test that the container is working correctly, create a collection:

```shell
curl -k -u root: -X POST --header "Content-Type: application/json" \
  --data '{"name":"testcol"}' \
  https://127.0.0.1:8529/_api/collection
```

Then use `curl` to view the collection:

```shell
curl -k -u root: https://127.0.0.1:8529/_api/collection
```

## Documentation and Resources

- [Using the ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator.html)
- [kube-arangodb GitHub Repository](https://github.com/arangodb/kube-arangodb)
- [Helm Chart Documentation](https://arangodb.github.io/kube-arangodb/docs/helm.html)
- [API Reference for ArangoDeployment V1](https://arangodb.github.io/kube-arangodb/docs/api/ArangoDeployment.V1.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### heartbeat-fips

# heartbeat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/heartbeat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/heartbeat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Heartbeat periodically checks the status of your services and determine whether they are available.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Heartbeat Image is comparable to the official Heartbeat Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

The Chainguard Heartbeat Image also does not ship the Chromium and Node.js components as it is in beta and not generally available.

### FIPS Support
The `heartbeat-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
Heartbeat image is usually deployed together with Elasticsearch to send the data to it. It can be run in docker with the configuration mounted - such as:

```shell
docker run \
  -v /path/to/heartbeat.yml:/usr/share/heartbeat/heartbeat.yml \
  cgr.dev/ORGANIZATION/heartbeat-fips
```

A sample, minimal configuration file is as follows:

```
heartbeat.monitors:
  - type: http
    id: nginx
    name: nginx
    service.name: sampleapp
    hosts: ["http://localhost:80"]
    check.response.status: [200]
    schedule: '@every 5s'
output.elasticsearch:
  enabled: false
output.file:
  path: "/tmp/output"
  filename: "metricbeat"
  rotate_every_kb: 10000
  number_of_files: 7
```

This will query http://localhost:80 URL every 5 seconds and store the results in `/tmp/output` directory.

In most cases, `elasticsearch` output should be used - such as:

```
heartbeat.monitors:
  # same content as before
output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
  username: '${ELASTICSEARCH_USERNAME:}'
  password: '${ELASTICSEARCH_PASSWORD:}'
```

This will cause heartbeat to send data to elasticsearch, which can be configured via environment variables, but defaults to `elasticsearch` hostname. To run it, simply pass the values to docker run:

```
docker run \
  -v /path/to/heartbeat.yml:/usr/share/heartbeat/heartbeat.yml \
  -e ELASTICSEARCH_USERNAME=elasticadmin \
  -e ELASTICSEARCH_PASSWORD=.... \
  cgr.dev/ORGANIZATION/heartbeat-fips
```

## Running on Kubernetes

There are no Helm charts that simplify the deployment of Heartbeat, but the [Running Heartbeat on Kubernetes](https://www.elastic.co/guide/en/beats/heartbeat/current/running-on-kubernetes.html) documentation provides detailed instructions on how to run it inside Kubernetes. The only change needed is to replace the image to use the one provided by Chainguard.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-admin-tools-fips

# temporal-admin-tools-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-admin-tools-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-admin-tools-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Administrative command-line tools for Temporal workflow management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `temporal-admin-tools-fips` container image is comparable to the
[temporalio/admin-tools image](https://hub.docker.com/r/temporalio/admin-tools),
but does NOT contain the legacy [`tctl`](https://github.com/temporalio/tctl)
command-line tool.

`tctl` is deprecated and will reach End of Support on September 30, 2025, after
which it is expected to be removed from the upstream image. Users should migrate
to the modern `temporal` CLI, which provides equivalent functionality and is
actively maintained.

### FIPS support

This image ships with a validated redistribution of the OpenSSL FIPS provider
module. For more on FIPS support in Chainguard container images, consult the
[guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The `temporal-admin-tools-fips` image is designed to run alongside a Temporal
deployment and provide administrative access through command-line tools.

### Deploy with Helm

The recommended way to deploy Temporal with admin tools is using the official
Helm chart.

Add the Temporal Helm repository:

```shell
helm repo add temporalio https://go.temporal.io/helm-charts
helm repo update
```

Create a `values.yaml` file to use the Chainguard image:

```yaml
admintools:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/temporal-admin-tools-fips
    tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Install Temporal with admin tools:

```shell
helm install temporal temporalio/temporal -f values.yaml
```

### Access Administrative Tools

Once deployed, you can access the admin tools container:

```shell
kubectl exec -it deployment/temporal-admintools -- /bin/bash
```

From within the container, you can run administrative commands:

```shell
# List namespaces
temporal operator namespace list

# Check cluster health
temporal operator cluster health

# Manage database schemas
temporal-cassandra-tool setup-schema
```

### Standalone Usage

You can also run the container directly for development or testing:

```shell
docker run -it --rm cgr.dev/ORGANIZATION/temporal-admin-tools-fips:latest /bin/bash
```

## Documentation and Resources

For more information on using Temporal administrative tools, refer to:

- [Temporal CLI documentation](https://docs.temporal.io/cli)
- [Temporal Helm Charts](https://github.com/temporalio/helm-charts)
- [Self-hosted Temporal deployment guide](https://docs.temporal.io/self-hosted-guide/deployment)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-operator-iamguarded-fips

# prometheus-operator-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-operator-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-operator-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-operator-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus Operator IAMGuarded is a security-enhanced variant of the Prometheus Operator designed to be deployed using the Kube-Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Prometheus Operator deployments and manages Prometheus and Alertmanager instances in Kubernetes.

## Kube-Prometheus Helm Chart Usage

This image is primarily used with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

### Prometheus Operator Configuration

When using the Kube-Prometheus chart, you can override the Prometheus Operator image under the `operator` section in your `values.yaml`:

```yaml
operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6212

# request-6212
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6212` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6212/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostgreSQL IAMGuarded FIPS with pgvector

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `postgres-iamguarded-fips-with-pgvector` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

PostgreSQL IAMGuarded is a security-enhanced variant of PostgreSQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main PostgreSQL image
image:
  registry: myregistry.example.com
  repository: mirrored/postgres-iamguarded-fips-with-pgvector
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication
Ensure proper pull credentials are configured through one of the following methods:

**Option 1: Using Helm values with `global.imagePullSecrets`**
```yaml
# values.yaml
global:
  imagePullSecrets:
    - name: chainguard-pull-secret
```

**Option 2: Create a Kubernetes pull secret**
```bash
# Step 1: Authenticate with chainctl and generate a pull token
chainctl auth login
chainctl auth configure-docker --pull-token --save --ttl=24h

# Step 2: Create the Kubernetes secret
kubectl create secret docker-registry chainguard-pull-secret \
  --docker-server=cgr.dev \
  --docker-username=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Username') \
  --docker-password=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Secret') \
  -n <your-namespace>

# Step 3: Reference the secret in your Helm installation
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION" \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret"
```

**Option 3: Cluster node-scoped registry permissions** (cluster-dependent)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql:16.7.2
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatekeeper-crds-fips

# gatekeeper-crds-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatekeeper-crds-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatekeeper-crds-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS-compliant image for installing Gatekeeper Custom Resource Definitions (CRDs) in Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `gatekeeper-crds-fips` image is a drop-in replacement for the upstream `opa/gatekeeper-crds` image. This image includes all necessary CRDs to configure Gatekeeper and is fully compatible with the official [Gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper) and supports all core functionality. This image is designed to be minimal, secure alternative and runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS Support

The `gatekeeper-crds-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [opa/gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper-crds-fips
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `gatekeeper` helm chart

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update
helm install gatekeeper/gatekeeper --name-template=gatekeeper --namespace gatekeeper-system --create-namespace -f values.yaml --wait
```

## Documentation and Resources

You can refer to the [official documentation](https://open-policy-agent.github.io/gatekeeper/website/) for more information and [usage examples](https://open-policy-agent.github.io/gatekeeper/website/docs/examples).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### istio

# istio
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/istio` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/istio/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Istio](https://istio.io) is a service mesh that extends Kubernetes to provide traffic management, telemetry, security, and policy for complex deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Istio Images

Istio is an open-source service mesh platform that provides a uniform way to secure, connect, and monitor microservices. Built on the high-performance Envoy proxy, Istio manages traffic flow between services, enforces access policies, and gathers telemetry data without requiring changes to application code. The service mesh architecture enables organizations to manage complex distributed systems with enhanced security, observability, and traffic management capabilities.

Chainguard offers several Istio images that provide the core components needed for a complete service mesh deployment:

## istio-pilot

Istio Pilot serves as the core control plane component responsible for service discovery and configuration distribution throughout the mesh. This component performs several critical functions:

- **Service Discovery**: Automatically discovers services running in the cluster and maintains an up-to-date service registry
- **Configuration Management**: Distributes traffic management rules, security policies, and routing configurations to all Envoy proxies
- **Certificate Management**: Handles workload identity certificates and root certificate distribution for mutual TLS (mTLS)
- **Traffic Routing**: Implements advanced traffic routing capabilities including canary deployments, circuit breakers, and retry policies

## istio-proxy

The Istio proxy is built on the Envoy proxy and acts as a sidecar container deployed alongside each application workload. This component provides the data plane functionality:

- **Traffic Interception**: Transparently intercepts all inbound and outbound traffic for the associated workload
- **Security Enforcement**: Implements mutual TLS authentication, authorization policies, and encrypted communication between services
- **Observability**: Collects detailed metrics, logs, and distributed tracing data for all service communications

## istio-install-cni

The Istio CNI (Container Network Interface) plugin eliminates the need for elevated privileges (NET_ADMIN capability) during sidecar injection:

- **Secure Network Setup**: Configures iptables rules and network interfaces without requiring privileged init containers
- **Traffic Redirection**: Establishes traffic redirection rules to route application traffic through the Envoy proxy

## Installation with Helm

These images can be used by overriding the default image values in the official Istio Helm charts.

First, add the Istio Helm repository:

```bash
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
```

Then install Istio using a single `helm install` command. Below is a basic example installing the Istio base, control plane, and CNI plugin.

```bash
helm install istio-base istio/base -n istio-system --create-namespace

helm install istiod istio/istiod -n istio-system \
  --set global.proxy.image=cgr.dev/ORGANIZATION/istio-proxy \
  --set pilot.image=cgr.dev/ORGANIZATION/istio-pilot

helm install istio-cni istio/cni -n istio-system \
  --set cni.enabled=true \
  --set cni.image=cgr.dev/ORGANIZATION/istio-install-cni \
  --set cni.cniConfDir="/var/lib/rancher/k3s/agent/etc/cni/net.d" \
  --set cni.cniBinDir="/opt/cni/bin"
```

## Installation with Helm Using `values.yaml`

If you prefer to keep your customizations in a file instead of long `--set` strings, create a small **`values.yaml` for each chart** you install.

> [!IMPORTANT]
> **Why one file per chart?**  
> The Istio Helm repository publishes *separate* charts (`base`, `istiod`, `cni`).  
> Each chart has its own values schema, so you pass the file that matches the chart you’re installing.

---

### `istiod-values.yaml`

```yaml
# istiod-values.yaml
global:
  proxy:
    image: cgr.dev/ORGANIZATION/istio-proxy     # Envoy + iptables
pilot:
  image: cgr.dev/ORGANIZATION/istio-pilot       # Control-plane
```

Install:

```bash
helm install istiod istio/istiod \
  -n istio-system -f istiod-values.yaml
```

---

### `istio-cni-values.yaml`

```yaml
# istio-cni-values.yaml
cni:
  enabled: true
  image: cgr.dev/ORGANIZATION/istio-install-cni
  cniConfDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
  cniBinDir: /opt/cni/bin
```

Install:

```bash
helm install istio-cni istio/cni \
  -n istio-system -f istio-cni-values.yaml
```

## Documentation and Resources

* [Official Istio documentation](https://istio.io/latest/)
* [Installation‑options reference](https://istio.io/latest/docs/setup/install/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sriov-network-device-plugin

# sriov-network-device-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sriov-network-device-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sriov-network-device-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SRIOV network device plugin for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Where possible, the sriov-network-device-plugin Chainguard Image is built for compatibility with the official [SR-IOV Network Device Plugin](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin/) image.

## Getting Started

The SR-IOV Network Device Plugin facilitates the use of SR-IOV-capable network devices in Kubernetes clusters, enabling high-performance networking for your workloads. 

If you're exploring the usage of `sriov-network-device-plugin` for the first time, bear in mind that when deploying on a virtual machine like an EC2 instance or a Google Cloud VM these environments often expose only virtual functions (VFs), not physical functions (PFs).

The upstream documentation assumes you have access to PFs and uses the SR-IOV type `net-attach-def`. However, for it to function properly, it requires access to the PFs, which is typically available only on bare-metal instances. Therefore, we recommend using a bare-metal instance, such as those offered by IBM Cloud, for full functionality. Alternatively, on VMs, consider using the Host Device CNI, which allows VFs to pass through without requiring direct access to the PFs. 

## Documentation and Resources
* [Upstream GitHub project](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin)
* [Upstream GitHub issue highlighting problems with the `sriov-network-device-plugin` and virtual function passthrough](https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin/issues/127)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trust-manager

# trust-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trust-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trust-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based trust-manager operator for distributing trust bundles across a Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k6-operator-fips

# k6-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k6-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k6-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-enabled Kubernetes operator for running distributed k6 performance tests

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `k6-operator-fips` image is a FIPS 140-2/140-3 compliant version designed to be a drop-in replacement for the upstream [`grafana/k6-operator`](https://github.com/grafana/k6-operator) image in FIPS-required environments, with the following characteristics:

* This image uses three FIPS-compliant components available via tags:
  * `latest` or `controller-v*` - The k6-operator-fips controller
  * `latest-starter` or `starter-v*` - The FIPS test initializer/starter pod
  * `latest-runner` or `runner-v*` - The FIPS k6 test runner pod

For non-FIPS environments, see [`k6-operator`](https://images.chainguard.dev/directory/image/k6-operator/overview).

### FIPS support

The `k6-operator-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The k6-operator-fips requires a Kubernetes cluster in a FIPS-compliant environment. The operator watches for `TestRun` custom resources and orchestrates distributed k6 load tests using FIPS-validated cryptography.

### Helm Installation

Add the Grafana Helm repository and install the k6 Operator with FIPS images:

```sh
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install k6-operator grafana/k6-operator \
  --set image.repository=cgr.dev/ORGANIZATION/k6-operator-fips \
  --set image.tag=latest
```

Be sure to replace `ORGANIZATION` with your organization's name in the Chainguard Registry.

Then create a `TestRun` resource using the Chainguard FIPS runner and starter images:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
  name: k6-fips-sample
spec:
  parallelism: 2
  script:
    configMap:
      name: k6-test-fips
      file: test-script.js
  runner:
    image: cgr.dev/ORGANIZATION/k6-operator-fips:latest-runner
  starter:
    image: cgr.dev/ORGANIZATION/k6-operator-fips:latest-starter
EOF
```

## Configuration

You can configure default FIPS runner and starter images at the Helm chart level to avoid specifying them in every TestRun:

```sh
helm install k6-operator grafana/k6-operator \
  --set image.repository=cgr.dev/ORGANIZATION/k6-operator-fips \
  --set image.tag=latest \
  --set customImages.runner=cgr.dev/ORGANIZATION/k6-operator-fips:latest-runner \
  --set customImages.starter=cgr.dev/ORGANIZATION/k6-operator-fips:latest-starter
```

For advanced configuration options including resource limits, parallelism settings, and test execution parameters, refer to the [official k6 Operator documentation](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/install-k6-operator/).

## Documentation and Resources

- [Run k6 scripts with TestRun CRD](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/)
- [Running k6](https://grafana.com/docs/k6/latest/get-started/running-k6/)
- [Using k6](https://grafana.com/docs/k6/latest/using-k6/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promtail-fips

# promtail-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promtail-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promtail-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `promtail` application for log aggregation. `promtail` is the log aggregator that ships logs to Loki and/or Prometheus. It runs as an agent and scrapes logs from files, containers, and hosts and ships them to a logging backend.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1370

# request-1370
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1370` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1370/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### smarter-device-manager

# smarter-device-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/smarter-device-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/smarter-device-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for smarter device manager.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Smarter-device-manager is a Kubernetes tool designed for IoT applications,
enabling containers to securely access host devices like sensors, actuators,
and various hardware interfaces.

## Usage

### Manifests
Deploy using one of the example manifests provided in the upstream projects
Gitlab repository: [Smart Device Manager](https://gitlab.com/arm-research/smarter/smarter-device-manager).

> If using one of the manifests from the upstream repository, you'll need to
change the `config` mountPath to `/etc/smarter-device-manager`(in place of /root/config).

### Helm chart

The following helm chart can be used:
[helm chart](https://github.com/gabe565/charts/tree/main/charts/smarter-device-manager).

You'll need to override the image and tag:

```bash
helm repo add gabe565 https://charts.gabe565.com
helm repo update
helm install smart-device-manager gabe565/smarter-device-manager \
 --set image.repository=cgr.dev/chainguard/smarter-device-manager --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### atmoz-sftp-fips

# atmoz-sftp-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/atmoz-sftp-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/atmoz-sftp-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Various scripts from https://github.com/atmoz/sftp to help run SFTP in a container

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Atmoz SFTP FIPS image is comparable to the [official Atmoz SFTP image](https://hub.docker.com/r/atmoz/sftp/). The upstream image includes the `openssh-server-pam` package in their image, , but we found it unnecessary for our version. None of the settings in upstream’s `sshd_config` require PAM, and user authentication relies solely on the shadow file.

### FIPS Support
The `atmoz-sftp-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

Ensure you have OpenSSH installed, specifically the `openssh-client` package, which includes the `sftp` command.

Replace `<host-dir>` with your desired directory and run:

```shell
docker run --rm --name sftp-container -v <host-dir>/upload:/home/foo/upload -p 2222:22 -it cgr.dev/ORGANIZATION/atmoz-sftp-fips:latest foo:pass:::upload
```

You can verify the container is running with a `docker ps` command:

```shell
docker ps | grep sftp-container
```

To check if Wildfly has started successfully, check the logs with `docker logs`:

```shell
docker logs sftp-container | grep "Server listening on :: port 22."
```

Create a test file in your upload directory:

```shell
echo "test file" > <host-dir>/upload
```

Connect to the SFTP server:

```shell
sftp -o StrictHostKeyChecking=no -P 2222 foo@127.0.0.1
```

Enter the password (`pass`) when prompted. Once inside the SFTP shell, upload and verify the file:

```shell
put <host-dir>/upload/test.txt upload/test.txt
ls upload/test.txt
exit
```

Confirm the file is inside the container:

```shell
docker exec -it sftp-container ls -l /home/foo/upload | grep test.txt
```

Stop the container when done:

```shell
docker stop sftp-container
```

## Documentation and Resources

- [Atmoz SFTP](https://github.com/atmoz/sftp)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dask-gateway

# dask-gateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dask-gateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dask-gateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A multi-tenant server for securely deploying and managing [Dask clusters](https://gateway.dask.org/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Dask Gateway container is comparable to the [daskgateway/dask-gateway image](https://github.com/dask/dask-gateway/tree/main) maintained by Dask. Like most of Chainguard's container images, the Dask Gateway image was designed for minimalism and does not include things like a shell or package manager.

## Getting Started

To get started, first create a pair of environment variables to hold the names of the Helm release and the Kubernetes namespace, respectively:

```shell
RELEASE=dask-gateway
NAMESPACE=dask-gateway
```

This example uses the name `dask-gateway` for both variables, but you can name the Helm release and Kubernetes namespace anything you'd like.

Next, you need to set up a [values file](https://helm.sh/docs/chart_template_guide/values_files/). The Dask Gateway Helm chart offers many configuration options allowing you to create a setup that suits your exact needs. You can use the [default `values.yaml` file](https://github.com/dask/dask-gateway/blob/main/resources/helm/dask-gateway/values.yaml) as a basis for your own. The default file also includes explanations for many of the available configuration options.

Be sure to edit the `values.yaml` file to point to Chainguard's Dask Gateway image instead of the upstream alternative:

```
  backend:
    image:
      name: cgr.dev/ORGANIZATION/dask-gateway
      tag: latest
      pullPolicy:
```

Next, install the Dask Gateway Helm chart by running the following command:

```shell
helm upgrade $RELEASE dask-gateway \
    --repo=https://helm.dask.org \
    --install \
    --namespace $NAMESPACE \
    --create-namespace \
    --values values.yaml
```

Once the resources have been created, run the following command to ensure that the services are running:

```shell
kubectl get service --namespace dask-gateway
```
```
NAME               	TYPE       	CLUSTER-IP  	EXTERNAL-IP  	PORT(S)    	AGE
api-dask-gateway   	ClusterIP  	10.96.107.183   <none>       	8000/TCP   	134m
traefik-dask-gateway   LoadBalancer   10.96.236.132   146.148.58.187   80:31487/TCP   134m
```

Additionally, run the following command to ensure the `daskcluster` CRD was installed:

```shell
kubectl get daskcluster -o yaml
```
```
apiVersion: v1
items: []
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
```

## Documentation and Resources

* [Official Dask Gateway documentation](https://docs.dask.org/en/stable/)
* [Default `values.yaml` file for Dask Gateway](https://github.com/dask/dask-gateway/blob/main/resources/helm/dask-gateway/values.yaml)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak

# keycloak
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Keycloak](https://www.keycloak.org/) image for identity and access management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Docker

Launch a development instance of Keycloak:

```bash
docker run --name local-keycloak -p 8080:8080 \
	-e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=change_me \
	cgr.dev/chainguard/keycloak:latest \
	start-dev
```

The Keycloak UI can be accessed via:
- [http://localhost:8080/](http://localhost:8080)

To launch a production instance of Keycloak, refer to the examples in the
[following documentation](https://github.com/keycloak/keycloak/blob/main/docs/guides/server/containers.adoc),
as this is dependent on environment-specific settings and customizations.

### Kubernetes operator

To deploy Keycloak leveraging the Keycloak operator, refer to the documentation
for our [Keycloak operator image](https://images.chainguard.dev/directory/image/keycloak-operator).

### Customizing the image

Keycloak provides a mechanism to configure and customize the image. This process
is outlined in the [Keycloak image documentation](https://github.com/keycloak/keycloak/blob/main/docs/guides/server/containers.adoc).

There are subtle differences in the executable paths used in the Chainguard
image. Below is the example copied from the documentation, updated with the
correct paths:

```bash
FROM cgr.dev/chainguard/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /usr/share/java/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /usr/share/java/keycloak/bin/kc.sh build

FROM cgr.dev/chainguard/keycloak:latest
COPY --from=builder /usr/share/java/keycloak/ /usr/share/java/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/usr/share/java/keycloak/bin/kc.sh"]
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats

# nats
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NATS is a flexible messaging system providing pub/sub, streaming, storage etc.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [nats-server](https://hub.docker.com/_/nats) image. Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

The default Chainguard NATS images includes only the `nats-server` binary.
The `dev` variant also includes the `nats` cli, and the `nsc` tool.
The default entrypoint is set to run the `nats-server` binary with a sample configuration at `/etc/nats/nats-server.conf`.
This can be overridden with the `--config-file` flag.

### docker
To run the NATS image with docker use:

```shell
$ docker run cgr.dev/ORGANIZATION/nats
[1] 2025/02/04 03:13:34.048577 [INF] Starting nats-server
[1] 2025/02/04 03:13:34.049000 [INF]   Version:  2.10.25
[1] 2025/02/04 03:13:34.049002 [INF]   Git:      [006039e]
[1] 2025/02/04 03:13:34.049004 [INF]   Cluster:  xcSDBYyqYh9XzC0jGAbjLG
[1] 2025/02/04 03:13:34.049009 [INF]   Name:     NC7G3OX73ZIMPD2XGJIAXFUSJHAVVMQKMFADJOPH332BE7N4OIL73R2S
[1] 2025/02/04 03:13:34.049010 [INF]   ID:       NC7G3OX73ZIMPD2XGJIAXFUSJHAVVMQKMFADJOPH332BE7N4OIL73R2S
[1] 2025/02/04 03:13:34.049024 [INF] Using configuration file: /etc/nats/nats-server.conf
[1] 2025/02/04 03:13:34.049801 [INF] Starting http monitor on 0.0.0.0:8222
[1] 2025/02/04 03:13:34.050008 [INF] Listening for client connections on 0.0.0.0:4222
[1] 2025/02/04 03:13:34.050139 [INF] Server is ready
[1] 2025/02/04 03:13:34.050166 [INF] Cluster name is xcSDBYyqYh9XzC0jGAbjLG
[1] 2025/02/04 03:13:34.050179 [WRN] Cluster name was dynamically generated, consider setting one
[1] 2025/02/04 03:13:34.050208 [INF] Listening for route connections on 0.0.0.0:6222
```
### helm
To install Chainguard's nats image on your Kubernetes cluster, you can use the upstream image's [Helm chart](https://artifacthub.io/packages/helm/nats/nats).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
container:
  image:
    repository: ORGANIZATION/nats
    tag: latest
    registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for nats project](https://docs.nats.io/) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### consul-k8s-fips

# consul-k8s-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/consul-k8s-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/consul-k8s-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Helm

```sh
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install consul hashicorp/consul --set global.name=consul --create-namespace -n consul --set imageK8S=cgr.dev/chainguard/consul-k8s-fips
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### db-operator

# db-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/db-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/db-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The DB Operator creates databases and make them available in the cluster via Custom Resource.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `db-operator` image is meant to serve as a drop-in replacement for the [official db-operator image](https://ghcr.io/db-operator/db-operator:latest). Switching to Chainguard `db-operator` image should not require any changes to your existing setup. 
The image is completely compatible with [official Helm chart for db-operator](https://db-operator.github.io/charts)

## Getting Started
`db-operator` can be deployed using Official Helm chart:

db-operator Deployments need certmanager CRDs to set up:
```
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
```

Deploy using helm by overriding with Chainguard `db-operator` image:
Use the following `values.yaml` file to configure the Helm chart.
```yaml
image:
  repository: cgr.dev/ORGANIZATION/db-operator
  tag: latest
```

Deploy the Helm chart:
```shell
helm repo add db-operator https://db-operator.github.io/charts
helm repo update
helm install db-operator db-operator/db-operator \
  --values values.yaml
```

Apply relevant CRDs based on use case:
```
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_databases.yaml
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_dbusers.yaml
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_dbinstances.yaml
```

The operator should be ready to use in the environment.

## Documentation and Resources
For full instructions on this image, refer to [official repository for db-operator](https://github.com/db-operator/db-operator). Other resourceful content:
- [How it works](https://github.com/db-operator/db-operator/blob/main/docs/howitworks.md)
- [Examples](https://github.com/db-operator/db-operator/tree/main/examples)
- [Configuration and Setup Docs](https://github.com/db-operator/db-operator/tree/main/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6335

# request-6335
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6335` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6335/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Custom Base image on top of Chainguard glibc-dynamic image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is customized on top of Chainguard's standard `glibc-dynamic` container image and is meant to be used as just a base image only. It does not contain any programs that can be run, other than `/sbin/ldconfig`. This image also includes `libstdc++`, the GNU C++ standard library implementation.
Unlike Chainguard's standard `glibc-dynamic` container image, this image is configured with a custom working directory at `/app` with owned by the `appuser` (default user) (uid `1000`, gid `1000`) and set with `755` permissions to allow standard read/execute access.

You must bring your own artifacts to use this image, e.g. with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

## Getting Started
To illustrate how you can use Chainguard's Custom `glibc-dynamic` container image, start by creating the following Go program:

```go
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```
This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require glibc.
Next, create a Dockerfile that uses the Chainguard `glibc-dynamic` container as a base image:

```Dockerfile
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/ORGANIZATION/request-6335
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Using this Dockerfile, build an image:
```bash
docker build -t custom-glibc-dynamic-example .
```
Then run the newly-built image:
```bash
docker run --rm custom-glibc-dynamic-example
```

This will return the following output, indicating the program was run successfully and the Custom `glibc-dynamic` base image worked as expected:
```
Hello, world!
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openssh-server

# openssh-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openssh-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openssh-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenSSH Server is a secure shell (SSH) server implementation that provides encrypted communication between clients and servers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This is a minimal OpenSSH server image that contains only the essential components needed to run an SSH daemon. The image is designed to be used with external volume mounts for all configuration and runtime data.

Unlike traditional SSH container images, this image:

- Includes no pre-generated moduli
- Requires external volume mounts for all SSH-related files, such as authorized_keys
- Does not include a package manager

## Prerequisites

Since this is a minimal image, you must provide all necessary SSH server components through volume mounts:

- **Host keys**: Mount your SSH host keys to `/etc/ssh/`
- **Authorized keys**: Mount user authorized keys (typically to `/home/nonroot/.ssh/authorized_keys` or similar)

Before running the container, ensure you have:

1. **Generated host keys**:
   ```bash
   ssh-keygen -t rsa -b 3072 -f /host/ssh/keys/ssh_host_rsa_key -N ""
   ssh-keygen -t ecdsa -b 384 -f /host/ssh/keys/ssh_host_ecdsa_key -N ""
   ssh-keygen -t ed25519 -f /host/ssh/keys/ssh_host_ed25519_key -N ""
   ```

2. **Set up user authentication**: Either through authorized keys or other supported authentication methods

## Getting Started

```bash
docker run -d \
  -p 2222:22 \
  -v /host/ssh/keys:/etc/ssh:ro \
  cgr.dev/ORGANIZATION/openssh-server:latest
```

## Additional Resources
[Openssh Server Documentation](https://www.openssh.com/manual.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### seaweedfs-fips

# seaweedfs-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/seaweedfs-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/seaweedfs-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, providing S3-compatible API and filesystem interface.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream [chrislusf/seaweedfs](https://hub.docker.com/r/chrislusf/seaweedfs) Docker Hub image, running as root to maintain compatibility with the upstream Helm chart and deployment configurations.Unlike upstream which bundles busybox, this image uses dash to minimize attack surface.

### FIPS Support
The `seaweedfs-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

SeaweedFS is a distributed storage system consisting of three main components that work together:

* **Master**: Coordinates the cluster, manages volume assignments, and maintains metadata
* **Volume**: Stores actual file data as blobs
* **Filer**: Provides user-facing APIs (filesystem HTTP API and S3-compatible API)

### Deploying with Docker

To run a complete SeaweedFS cluster with Docker, you'll need to start all three components. First, create a Docker network:

```sh
docker network create seaweedfs-net
```

Start the Master server:

```sh
docker run -d \
  --name seaweedfs-master \
  --network seaweedfs-net \
  -p 9333:9333 \
  cgr.dev/ORGANIZATION/seaweedfs-fips \
  master -ip=seaweedfs-master -port=9333
```

Start the Volume server:

```sh
docker run -d \
  --name seaweedfs-volume \
  --network seaweedfs-net \
  -p 8080:8080 \
  cgr.dev/ORGANIZATION/seaweedfs-fips \
  volume -mserver=seaweedfs-master:9333 -port=8080 -ip=seaweedfs-volume
```

Start the Filer server with S3 API enabled:

```sh
docker run -d \
  --name seaweedfs-filer \
  --network seaweedfs-net \
  -p 8888:8888 \
  -p 8333:8333 \
  cgr.dev/ORGANIZATION/seaweedfs-fips \
  filer -master=seaweedfs-master:9333 -ip=seaweedfs-filer -s3
```

### Deploying with Helm

For production deployments on Kubernetes, use the official [SeaweedFS Helm chart](https://github.com/seaweedfs/seaweedfs/tree/master/k8s/charts/seaweedfs). Create a values file to use the Chainguard FIPS image:

```sh
cat > values-fips.yaml <<EOF
master:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs-fips:latest

volume:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs-fips:latest

filer:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs-fips:latest
EOF
```

Install the chart:

```sh
helm repo add seaweedfs https://seaweedfs.github.io/seaweedfs/helm
helm install seaweedfs seaweedfs/seaweedfs -f values-fips.yaml
```

## Documentation and Resources

* [SeaweedFS GitHub Repository](https://github.com/seaweedfs/seaweedfs)
* [SeaweedFS Wiki](https://github.com/seaweedfs/seaweedfs/wiki)
* [SeaweedFS Helm Chart](https://github.com/seaweedfs/seaweedfs/tree/master/k8s/charts/seaweedfs)
* [NIST FIPS 140-2 Overview](https://csrc.nist.gov/publications/detail/fips/140/2/final)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton-chains

# tekton-chains
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton-chains` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton-chains/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Tekton Chains is a Kubernetes Custom Resource Definition (CRD) controller that allows you to manage your supply chain security in Tekton.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

[Tekton Chains](https://tekton.dev/docs/chains/) provides additional supply chain security features.

## Usage

These images a drop-in replacement for the upstream images.

You can use an [upstream release](https://github.com/tektoncd/pipeline/releases) and replace the released images with those from Chainguard.

```shell
curl -sL https://storage.googleapis.com/tekton-releases/chains/latest/release.yaml | \
    sed "s|ghcr.io/tektoncd/github.com/tektoncd/chains/cmd/controller[a-z0-9:@.]\{1,\}|cgr.dev/chainguard/tekton-chains|g" | \
    kubectl apply -f -
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### deno

# deno
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/deno` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/deno/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for running [Deno](https://deno.com/) apps

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The image specifies a default non-root `deno` user (UID 65532), and a working directory at `/app`, owned by that `deno` user, and accessible to all users.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cis-operator

# cis-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cis-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cis-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Enables running CIS benchmark security scans on a Kubernetes cluster and generates compliance reports that can be downloaded

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `cis-operator` container image is comparable to [the cis-operator image](https://hub.docker.com/r/rancher/cis-operator). Like most other Chainguard container images, the `cis-operator` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's `cis-operator` container image can be installed via the [cis-operator helm chart](https://github.com/rancher/cis-operator/tree/main/chart).

Create a `values.yaml` file with the following values

```
image:
  cisoperator:
    repository: cgr.dev/ORGANIZATION/cis-operator
    tag: latest
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add rancher-cis-benchmark https://github.com/rancher/cis-operator
helm install https://github.com/rancher/cis-operator chart/ -n cis-operator-system -f values.yaml
```

We can then try creating a `ClusterScan` resource like below which is going to run a ClusterScan on your cluster:

```
apiVersion: cis.cattle.io/v1
kind: ClusterScan
metadata:
  name: k3s-e2e-scan
  namespace: cis-operator-system
spec:
  scanProfileName: k3s-cis-1.9-profile
  scoreWarning: pass
```

## Documentation and Resources

* [Official GitHub Repository](https://github.com/rancher/cis-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### httpd

# httpd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/httpd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/httpd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[httpd](https://github.com/apache/httpd), a powerful and flexible HTTP/1.1 compliant web server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`httpd` is comparable to the upstream [httpd](https://hub.docker.com/_/httpd) image, with the following differences:

- Like all other Chainguard Images, `httpd` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user

## Getting Started

To try out the image, run:

```sh
docker run -d -p 8080:80 cgr.dev/ORGANIZATION/httpd
```

After starting the container, navigate to `localhost:8080` in your web browser. You should find the default httpd (apache2) `It works`! page.

You can also try the image by serving a local filesystem path (e.g. "$PWD"). For this run:

```sh
docker run -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs cgr.dev/ORGANIZATION/httpd
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dbgate

# dbgate
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dbgate` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dbgate/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

DbGate is a database administration tool for SQL Server, MySQL, PostgreSQL, MongoDB, Redis and SQLite. DbGate provides a modern web interface for database management, query execution, and data visualization.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `DBgate` images images are compatible with the upstream [DBgate](https://github.com/dbgate/dbgate). The `dbgate` image provides a web-based database administration interface that supports multiple database types including PostgreSQL, MySQL, SQL Server, MongoDB, Redis, and SQLite.

## Getting Started

The `dbgate` image provides a web-based database administration interface that supports multiple database types including PostgreSQL, MySQL, SQL Server, MongoDB, Redis, and SQLite.

To start DbGate with default settings:

```sh
docker run -d -p 3000:3000 cgr.dev/ORGANIZATION/dbgate
```

## Documentation and Resources

* [DbGate Official Documentation](https://github.com/dbgate/dbgate/wiki)
* [DbGate GitHub Repository](https://github.com/dbgate/dbgate)
* [Chainguard Images Migration Guide](https://edu.chainguard.dev/chainguard/migration/migrations-overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pdns-recursor-fips

# pdns-recursor-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pdns-recursor-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pdns-recursor-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PowerDNS Recursor is a non authoritative/recursing DNS server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard pdns-recursor image is comparable to the [pdns-recursor image on Docker Hub](https://hub.docker.com/u/powerdns?page=1&search=recursor). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

### FIPS Support

The `pdns-recursor-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

#### Disable non-FIPS Algorithms

To disable non-FIPS algorithms in PowerDNS Recursor, pass the `disabled_algorithms` configuration option under `dnssec`:

```yaml
dnssec:
  disabled_algorithms: [5, 7, 15, 16]
```

It doesn't support to use the human-readable names:

- 5: RSASHA1
- 7: RSASHA1-NSEC3-SHA1
- 15: ED25519
- 16: ED448

Note: In OpenSSL's FIPS provider module version 3.1.2, ED25519 and ED448 algorithms are not supported. Support for these algorithms will be introduced in module version 3.4.0.

## Getting Started

### Running with Docker

To run pdns-recursor using Docker, you can use the following command:

```shell
docker run \
    -p 53:53/tcp \
    -p 53:53/udp \
    -p 8082:8082 \
    --name "pdns-recursor-fips" \
    -v $(pwd)/recursor.yaml:/etc/powerdns/recursor.yaml:ro \
    cgr.dev/ORGANIZATION/pdns-recursor-fips:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

#### Ensure the non-FIPS algorithms are disabled

```shell
$ docker exec pdns-recursor-fips rec_control list-dnssec-algos
RSASHA1(disabled) RSASHA1-NSEC3-SHA1(disabled) RSASHA256 RSASHA512 ECDSAP256SHA256 ECDSAP384SHA384 ED25519(disabled) ED448(disabled)
```

See the following below resources for further usage details.

## Resources
- [Getting Started](https://doc.powerdns.com/recursor/getting-started.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow-centraldashboard

# kubeflow-centraldashboard
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow-centraldashboard` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow-centraldashboard/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This project serves as the landing page and central dashboard for Kubeflow deployments. It provides a jump-off point to all other facets of the platform.

For more information, see the [Kubeflow Central Dashboard](https://www.kubeflow.org/docs/components/central-dash/) documentation.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metricbeat

# metricbeat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metricbeat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metricbeat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Metricbeat fetches a set of metrics on a predefined interval from the operating system and services such as Apache web server, Redis, and more and ships them to Elasticsearch or Logstash.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Metricbeat Image is comparable to the official Metricbeat Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started

1. Metricbeat requires kube-state-metrics to be installed. Please refer to the [following manifests](https://github.com/kubernetes/kube-state-metrics/tree/main/examples/standard) provided by the upstream maintainers to deploy.

2. There are no actively supported helm charts for deploying metricbeat upstream. The most recent are present [here](https://github.com/elastic/helm-charts/tree/main/metricbeat) and were archived in 2023. Manifest based deployments are offered as an alternative by the upstream maintainers [here](https://github.com/elastic/beats/tree/main/deploy/kubernetes/metricbeat).

Note: Ensure to override the image properties to use the Chainguard provided image for metricbeat.

Note: You configure Metricbeat to write to a specific output by setting options in the `Outputs` section of the `metricbeat.yml` config file  ([Reference](https://www.elastic.co/guide/en/beats/metricbeat/current/configuring-output.html)). In the manifests provided above, it can be done [here](https://github.com/elastic/beats/blob/main/deploy/kubernetes/metricbeat/metricbeat-configmap.yaml#L74).

Note: Make sure to change the image in the daemonset the Chainguard metricbeat Image. 

3. The above manifests will bring metricbeat up in `kube-system` namespace. And you will be able to see metricbeat output in `*.ndjson` file in `/usr/share/metricbeat/output` directory in metricbeat pod.

## Documentation and Resources

- [Metricbeat official docs](https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-overview.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics-operator-config-reloader

# victoriametrics-operator-config-reloader
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics-operator-config-reloader` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics-operator-config-reloader/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Config reloader component for VictoriaMetrics Operator that watches and reloads configurations for VMAgent, VMAuth, and VMAlert.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Victoriametrics-operator-config-reloader Chainguard image is comparable to the official victoriametrics/operator:config-reloader-latest image from Docker Hub.

## Usage

To install the VictoriaMetrics operator using the Helm chart, refer to the
installation instructions provided in the README of the relevant chart:

- [victoria-metrics-operator/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-operator/README.md)
- [victoria-metrics-k8s-stack/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-k8s-stack/README.md)).

For additional information, see the [quick start guide](https://docs.victoriametrics.com/operator/quick-start).

Below is an example:

```bash
helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update
```

Specify the Chainguard image when deploying the chart:

```bash
helm install vmoperator vm/victoria-metrics-operator \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/victoriametrics-operator \
    --set image.tag=latest
```

This image is the config-reloader sidecar used by the VictoriaMetrics Operator. It is automatically injected into VMAgent, VMAuth, and VMAlert pods when using the operator.

To use this image with the VictoriaMetrics Operator Helm chart:

```yaml
operator:
useCustomConfigReloader: true

env:
- name: VM_CUSTOMCONFIGRELOADERIMAGE
    value: cgr.dev/ORGANIZATION/victoriametrics-operator-config-reloader:latest
```

```bash
helm upgrade --install vm-operator vm/victoria-metrics-operator
-f values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5276

# request-5276
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5276` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5276/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

A custom image, based on the [management API for Cassandra image](https://images.chainguard.dev/directory/image/management-api-for-apache-cassandra), with the following additions:

1. OpenJDK-11 JRE bcfips v2.x
2. Cassandra Medusa
3. Custom Cassandra directory locations and permissions, per customer request
4. Modified java.security file _(details below)_

The java.security file shipped with this image, enables the following providers,
required by cassandra. These are blocked on our OpenJDK FIPS images,
due to non-compliance:

```INI
security.provider.4=SunRsaSign
security.provider.5=SunEC
security.provider.6=SunJSSE
security.provider.7=SunJCE
```

This is not delivered as a FIPS complaint image, due to the reasons outlined
above.

Image tagging is customized to the requirements of the customer, namely:

```
cgr.dev/ORGANIZATION/request-518:<cassandra-version>-<cassandra-mgmt-api-version>
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promxy

# promxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Promxy.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using promxy

The Chainguard promxy image contains the [promxy](https://github.com/jacksontj/promxy) server binary. The image is meant to be a drop-in replacement for the existing `promxy` images built based on upstream Dockerfile.

Promxy requires configuration to be passed - which can be done as follows:

```
docker run --volume /path/to/config.yaml:/config.yaml cgr.dev/chainguard/promxy
ts=2024-10-29T14:15:10.640Z caller=manager.go:941 level=info msg="Starting rule manager..."
time="2024-10-29T14:15:15Z" level=info msg="promxy starting with HTTP..."
```

To provide configuration in another path and/or provide additional command line flags, simply pass them as arguments to the image - such as:

```
docker run ... cgr.dev/chainguard/promxy --config /data/config.yaml --check-config
/data/config.yaml if valid promxy config file syntax
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gh

# gh
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gh` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gh/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The GitHub CLI, or gh, is a command-line interface to GitHub for use in your terminal or your scripts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard GitHub CLI Image is meant to provide the `gh` binary in a container, for use in CI/CD pipelines or locally in Docker.  It currently does not have an upstream image.  Like most other Chainguard Images, the GitHub CLI image has few-to-zero CVEs and does not run as the root user.

Be aware that commands or flags that open a web browser will not work in CI/CD pipelines, including the following examples:
    * `gh auth login`
    * `gh browse ...`
    * `gh repo view --web ...`

Note that for `gh auth login` the default authentication mode is a web-based browser flow. You can instead provide the `--with-token` flag or use the `GITHUB_TOKEN` environment variable.

## Getting Started

After downloading the image, you can run it with the `--version` flag to make sure the image is functional:

```shell
docker run --rm cgr.dev/ORGANIZATION/gh:latest --version
```

This will return output similar to the following:

```shell
gh version 2.62.0 (2024-11-14)
https://github.com/cli/cli/releases/tag/v2.62.0
```

You can also run it as you would any other `gh` command, with the exceptions noted above.  The following command will list repositories owned by a user or organization:

```bash
docker run --rm -e GITHUB_TOKEN=<your-token> cgr.dev/ORGANIZATION/gh:latest repo list <owner>
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry. Also, make sure that you update the `<your-token>` and `<owner>` variables to match your own configuration.

## Documentation and Resources

For more information on working with the GitHub CLI, please refer to the [official user manual](https://cli.github.com/manual/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse

# clickhouse
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Clickhouse](https://clickhouse.com) is the fastest and most resource efficient open-source database for real-time apps and analytics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Clickhouse

The default Clickhouse listen_host is `127.0.0.1` and port is `8123`.

### Environment Variable Substitution

Environmental variables require the `/entrypoint.sh` script which is not run by default. You will need to modify and mount configuration files for any values that are not editable via CLI options.

### Entrypoint

The entrypoint for the `clickhouse` Chainguard container is `/usr/bin/clickhouse`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `clickhouse`. 

### start server instance

To run with Docker and allow empty passwords:

```
docker run -d --ulimit nofile=262144:262144 cgr.dev/chainguard/clickhouse:latest server
```

By default, ClickHouse will be accessible only via the Docker network.

By default, starting above server instance will be run as the default user without password.

## Users and Directories

By default, this image runs as a non-root user named `clickhouse` with a uid of `101` and a home directory of `/home/clickhouse`.

### Volumes

Typically you may want to mount the following folders inside your container to achieve persistency:

* /var/lib/clickhouse/ - main folder where ClickHouse stores the data
* /var/log/clickhouse-server/ - logs

```
docker run -d \
    -v $(realpath ./ch_data):/var/lib/clickhouse/ \
    -v $(realpath ./ch_logs):/var/log/clickhouse-server/ \
    --ulimit nofile=262144:262144 cgr.dev/chainguard/clickhouse:latest
```

You may also want to mount:

* /etc/clickhouse-server/config.d/*.xml - files with server configuration adjustmenets
* /etc/clickhouse-server/users.d/*.xml - files with user settings adjustmenets
* /docker-entrypoint-initdb.d/ - folder with database initialization scripts

If adding user and server configuration adjustments please ensure to add the `--config-file` CLI option.

## Docker Compose Example

This `docker-compose.yaml` sets up a Clickhouse database with a default database and user.

```yaml
version: "3.7"
services:
  clickhouse:
    image: cgr.dev/chainguard/clickhouse:latest
    restart: unless-stopped
    entrypoint: /usr/bin/clickhouse-server -- --listen_host 0.0.0.0
    working_dir: /home/clickhouse
    ports:
      - 8123:8123
    volumes:
      - ./data/clickhouse:/var/lib/clickhouse
      - ./logs/clickhouse:/var/log/clickhouse-server
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge
```

## Advanced Configuration

Please refer to [Clickhouse's documentation](https://clickhouse.com/docs/en/operations/configuration-files#configuration_files) for more advanced configuration.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-proxy-fips

# kafka-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Proxy connections to Kafka cluster. Connect through SOCKS Proxy, HTTP Proxy or to cluster running in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the [grepplabs/kafka-proxy image on Docker Hub](https://hub.docker.com/r/grepplabs/kafka-proxy). Switching to Chainguard kafka-proxy-fips image should not require any changes to your existing setup.

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

This image is intended to be deployed as described in the official kafka-proxy [documentation](https://github.com/grepplabs/kafka-proxy). For example, using this command will start kafka-proxy in the local container runtime:

```bash
docker run --rm -it \
  -p 9092:9092 \
  cgr.dev/ORGANIZATION/kafka-proxy-fips:latest \
  server \
  --bootstrap-server-mapping "localhost:9092,0.0.0.0:9092" \
  --bootstrap-server "kafka:9092"
```

You can also run kafka-proxy with additional configuration options:

```bash
docker run --rm -it \
  cgr.dev/ORGANIZATION/kafka-proxy-fips:latest \
  -p 19092:19092 \
  -p 29092:29092 \
  server \
  --bootstrap-server-mapping "broker-1:9092,0.0.0.0:19092" \
  --bootstrap-server-mapping "broker-2:9092,0.0.0.0:29092" \
  --bootstrap-server "kafka-1:9092,kafka-2:9092"
```

meaning that you can connect to `localhost:19092` and `localhost:29092` to reach the respective Kafka brokers.

On the other hand, for Kubernetes deployments, you can use the image in your deployment manifests or Helm charts by replacing the image reference with the Chainguard kafka-proxy image.

You can look for the more usage examples here: [kafka-proxy Examples](https://github.com/grepplabs/kafka-proxy#usage-example).

## Documentation & Resources

For more detailed information on configuring and using kafka-proxy, refer to the following resources:

- [Official kafka-proxy GitHub Repository](https://github.com/grepplabs/kafka-proxy)
- [kafka-proxy Documentation](https://github.com/grepplabs/kafka-proxy/blob/master/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mesosphere-vsphere-csi-syncer-fips

# mesosphere-vsphere-csi-syncer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mesosphere-vsphere-csi-syncer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mesosphere-vsphere-csi-syncer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

vSphere storage Container Storage Interface (CSI) plugin

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream **vSphere CSI Syncer** container (`csi-vsphere/syncer`).  

Follow the Broadcom/VMware deployment documentation for vSphere Container Storage Plug-in (vSphere CSI) 3.x, substituting the image reference for the syncer container only. All other sidecars and supporting containers (provisioner, attacher, resizer, node-driver-registrar, liveness-probe, snapshotter, etc.) should remain as documented.

> **Namespace**: The vSphere CSI stack should run in the `vmware-system-csi` namespace — do not install into `kube-system`.

> **Versioning**: Select a driver version compatible with your vSphere and Kubernetes versions using the official compatibility matrix.

## Prerequisites

- Supported vCenter Server and ESXi environment.
- Supported Kubernetes version for the driver release you choose.
- vSphere CPI (out-of-tree cloud provider) installed and configured in the cluster.
- vCenter user account with the required privileges as defined in the upstream docs.
- Network/DNS reachability from all cluster nodes to vCenter.

## Usage

## Prepare the Namespace

```bash
# Create the namespace for vSphere CSI components
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v3.0.0/manifests/vanilla/namespace.yaml
```

### Create the vSphere Config Secret

Prepare a configuration file named `csi-vsphere.conf`:

```ini
[Global]
cluster-id = "your-unique-cluster-id"
cluster-distribution = "native"

[VirtualCenter "vcenter.example.com"]
user = "administrator@vsphere.local"
password = "REDACTED"
port = "443"
datacenters = "DC1"
insecure-flag = "1"
# thumbprint = "AA:BB:CC:...:ZZ"
```

Create the Kubernetes Secret in the `vmware-system-csi` namespace:

```bash
kubectl -n vmware-system-csi create secret generic vsphere-config-secret \
  --from-file=csi-vsphere.conf
```

### Deploy the vSphere CSI Driver

Follow the upstream deployment manifests for your environment.
When editing the controller `Deployment` and node `DaemonSet`, replace the driver and/or syncer container images only.

Example - Controller Deployment snippet:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vsphere-csi-controller
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following containers
      - name: vsphere-csi-controller
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver-fips
      - name: vsphere-syncer
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-syncer-fips
      # other containers and rest of containers above should remain unchanged
```

Example - Node DaemonSet snippet:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: vsphere-csi-node
  namespace: vmware-system-csi
spec:
  template:
    spec:
      containers: # modify the image only for the following container    
      - name: vsphere-csi-node
        image: cgr.dev/ORGANIZATION/mesosphere-vsphere-csi-driver-fips
      # other containers and rest of container above should remain unchanged
```

This can be changed either in the manifests before applying them, or using `kubectl edit` to change existing deployments.

### Verify the Installation

```bash
kubectl get deployment -n vmware-system-csi vsphere-csi-controller
kubectl get daemonset -n vmware-system-csi vsphere-csi-node
```

Both should show pods in the `READY` state across control-plane and worker nodes as appropriate.

Another way to check it is to use `kubectl wait` and `kbuectl rollout status` commands to wait for Deployment and DaemonSet accordingly - such as:

```bash
kubectl wait --for=condition=Available -n vmware-system-csi deployment/vsphere-csi-controller --timeout=120s

kubectl rollout status daemonset -n vmware-system-csi vsphere-csi-node
```

### Verify

Create a `StorageClass` using the upstream example.

Create a `PersistentVolumeClaim` that uses this `StorageClass`.

Attach the PVC to a test Pod and verify provisioning works.

## Documentation and Resources

* [Upstream Mesosphere vSphere CSI Driver repository](https://github.com/mesosphere/vsphere-csi-driver)
* [Kubernetes-sigs vSphere CSI Driver repository](https://github.com/kubernetes-sigs/vsphere-csi-driver)
* [VMware vSphere Container Storage Plug-in Deployment Docs](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/container-storage-plugin/3-0/getting-started-with-vmware-vsphere-container-storage-plug-in-3-0/vsphere-container-storage-plug-in-deployment.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### omni-fips

# omni-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/omni-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/omni-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Omni managing Kubernetes clusters across bare metal, VMs, and cloud

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `omni-fips` container image is comparable to the [siderolabs/omni](https://github.com/siderolabs/omni) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `omni-fips` features a stripped down, minimal design
* It has few-to-zero CVEs

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

**Run the Container**

Replace paths to your TLS certs and private keys and adjust parameters as needed:

```bash
docker run --rm -it \
  -v /path/to/tls.crt:/tls.crt \
  -v /path/to/tls.key:/tls.key \
  -v /path/to/privatekey.asc:/omni.asc \
  cgr.dev/ORGANIZATION/omni-fips:latest \
  --cert=/tls.crt \
  --key=/tls.key \
  --private-key-source=file:///omni.asc \
```

- This starts the Omni container with the minimal required configuration.
- The container listens on port 443 by default (you can modify this with `--bind-addr`).

**What to Expect**

- The container will start running the omni backend services (API, control plane).
- Logs will output startup success.
- Omni will serve its API and associated services on the bind address.

**Accessing the Web UI**

- Once the container is running, access the Omni Web UI by navigating to the domain or IP you configured for Omni in your browser.
- If you used the IP or domain `omni.example.com` and bind address `0.0.0.0:443`, visit:

```
https://omni.example.com/
```

- If running on localhost for testing and binding to port 443, you can try:

```
https://localhost/
```

## Documentation and Resources

- **[Official Omni Documentation](https://github.com/siderolabs/omni)** 
- **[Omni Getting Started Guide](https://omni.siderolabs.com/tutorials/getting_started)** 
- **[Omni CLI Docs - omnictl](https://omni.siderolabs.com/reference/cli)** 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-nodejs-instrumentation-fips

# opentelemetry-nodejs-instrumentation-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-nodejs-instrumentation-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-nodejs-instrumentation-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Auto instrumention for any Node application to capture telemetry from a number of popular libraries and frameworks.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `opentelemetry-nodejs-instrumentation` Image is comparable to the official Opentelemetry-nodejs-instrumentation Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Support

The `opentelemetry-nodejs-instrumentation` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

- However, due to Javascript being an interpreted language there may be external libraries that are not strictly compliant with OpenSSL's FIPS provider module, any external dependency should be reviewed before being executed in a FIPS environment

## Getting Started

This image is meant to be used as a companion to the `opentelemetry-operator` image, deployment should be done following the [documentation for the `opentelemetry` operator for kubernetes](https://opentelemetry.io/docs/platforms/kubernetes/operator/) and [autoinstrumentation documentation](https://opentelemetry.io/docs/platforms/kubernetes/operator/automatic/), but specifying the Chainguard image to be injected instead of the upstream image.

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: example
  annotations:
    instrumentation.opentelemetry.io/inject-nodejs: "true"
    instrumentation.opentelemetry.io/default-auto-instrumentation-nodejs-image: "cgr.dev/ORGANIZATION/REPO_NAME:latest"
```

Once a compatible image with autoinstrumentation is deployed, the contents of the Chainguard REPO_NAME image will be copied to the target deployments following the autoinstrumentation documentation

## Documentation and Resources

* [OpenTelemetry NodeJS instrumentation Documentation](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/)
* [OpenTelemetry Documentation](https://opentelemetry.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane

# crossplane
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Crossplane](https://www.crossplane.io/) lets you build a control plane with Kubernetes-style declarative and API-driven configuration and management for anything.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-exporter

# kafka-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kafka exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
To deploy [kafka-exporter](https://github.com/danielqsj/kafka_exporter) on Kubernetes, you can run the container image directly or use the provided [Helm Chart](https://artifacthub.io/packages/helm/prometheus-community/prometheus-kafka-exporter) by Prometheus.

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install kafka-exporter prometheus-community/prometheus-kafka-exporter \
  --create-namespace \
  --namespace kafka-exporter \
  --set image.repository=cgr.dev/chainguard/kafka-exporter \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-oidc-proxy

# kube-oidc-proxy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-oidc-proxy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-oidc-proxy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-elasticsearch-exporter

# prometheus-elasticsearch-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-elasticsearch-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-elasticsearch-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Elasticsearch Exporter image for exporting various metrics about Elasticsearch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus Elasticsearch Exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-elasticsearch-exporter prometheus-community/prometheus-elasticsearch-exporter \
 --set image.repository=cgr.dev/chainguard/prometheus-elasticsearch-exporter --set image.tag=latest
```

For more detail, please refer to the [Elasticsearch Exporter documentation](https://github.com/prometheus-community/elasticsearch_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argo-rollouts-fips

# argo-rollouts-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argo-rollouts-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argo-rollouts-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Argo Rollouts is a Kubernetes controller and set of CRDs which provide advanced deployment capabilities such as blue-green, canary, canary analysis, experimentation, and progressive delivery features to Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

You can deploy the `argo-rollouts` container image using Helm:

```
helm repo add argo https://argoproj.github.io/argo-helm
helm install --create-namespace --namespace argo-rollouts argo-rollouts argo/argo-rollouts \
    --set controller.image.registry=cgr.dev \
    --set controller.image.repository="ORGANIZATION/argo-rollouts-fips" \
    --set controller.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cilium-certgen

# cilium-certgen
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cilium-certgen` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cilium-certgen/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A convenience tool to generate and store certificates for Hubble Relay mTLS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Cilium Certgen Image is comparable to the official [Cilium Image from Quay.io](https://quay.io/repository/cilium/certgen?tab=tags&tag=latest). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
Chainguard image can be used as a drop in replacement in the Helm charts offered by Cilium.
 
The following is an example `values.yaml` file. Be sure to change the image repository and tag placeholders:

```yaml
values:
  certgen:
    image:
      repository: cgr.dev/ORGANIZATION/cilium-certgen
      tag: latest

  hubble:
    relay:
      enabled: true

    tls:
      auto:
        enabled: true
        method: cronJob
        certValidityDuration: 1095
        schedule: "0 0 1 */4 *"

    ui:
      enabled: true
```

Run helm install:
```
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium \
   --namespace kube-system \
   -f values.yaml \
    --wait
```

You will see that the `hubble-generate-certs` job is created in the `kube-system` namespace. This job will generate the certificates needed for Hubble Relay mTLS and store them in a Kubernetes secret.

## Documentation and Resources
- [Cilium certgen quickstart example](https://docs.cilium.io/en/latest/observability/hubble/configuration/tls/#enable-tls-on-the-hubble-api)
- [Cilium official helm chart](https://artifacthub.io/packages/helm/cilium/cilium)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falcosidekick-fips

# falcosidekick-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falcosidekick-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falcosidekick-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault-fips

# vault-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard image is designed to work as a drop-in replacement for the
[vault image](https://hub.docker.com/r/hashicorp/vault).

This image supports the same environment variables, but has a number of
key differences, including:

* The directory for configuration files is `/etc/vault`
* The directory for filesystem driver (not used by default) is `/var/lib/vault`
* The directory for logs (not used by default) is `/var/log/vault`
* The vault binary and entrypoint script are stored in `/usr/bin`

Additionally, the Vault Chainguard image starts as the root user and
switches to the lower privileged `vault` user in the entrypoint script.

## Getting Started

The default entrypoint starts a single-node instance of the server in
development mode. Note that the container should be given the `IPC_LOCK`
capability:

```bash
docker run --cap-add IPC_LOCK cgr.dev/ORGANIZATION/vault-fips
```

```
==> Vault server configuration:
Administrative Namespace:
         	Api Address: http://0.0.0.0:8200
                 	Cgo: enabled
     	Cluster Address: https://0.0.0.0:8201
   Environment Variables: GOTRACEBACK, HOME, HOSTNAME, PATH, PWD, SHLVL, SSL_CERT_FILE
          	Go Version: go1.23.2
          	Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", disable_request_limiter: "false", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
           	Log Level:
               	Mlock: supported: true, enabled: false
       	Recovery Mode: false
             	Storage: inmem
             	Version: Vault v1.17.6, built 2024-11-06T19:17:24Z
         	Version Sha: 69a720d5d940bfcd590d7c24f3c98f178673d796
. . .
==> Vault server started! Log data will stream in below:
. . .
```

### IPC\_LOCK Capability

If you run the container without `IPC_LOCK` capability, you will receive a warning:

```shell
docker run cgr.dev/ORGANIZATION/vault-fips
```
```
Couldn't start vault with IPC_LOCK. Disabling IPC_LOCK, please use --cap-add IPC_LOCK
==> Vault server configuration:
. . .
```

`IPC_LOCK` is required for the memory lock (`mlock`) feature that prevents memory — which could potentially contain sensitive information — from being written to disk. For a full explanation of how it works, refer to the [official vault documentation](https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-security-concerns#ensure-mlock-is-enabled).

To turn on this capability, include the `--cap-add IPC_LOCK` argument:

```shell
docker run --cap-add IPC_LOCK cgr.dev/ORGANIZATION/vault-fips
```

You can alternatively configure a Security Context in Kubernetes:

```
securityContext:
    runAsNonRoot: true
    runAsUser: 65532
    capabilities:
      add: ["IPC_LOCK"]
```

### Helm Chart Usage

This image and the `vault-k8s` image can be used with the [Helm chart](https://github.com/hashicorp/vault-helm). To replace the official images with the Chainguard images, provide the chart with the following values:

```
injector:
  image:
    repository: "cgr.dev/ORGANIZATION/vault-k8s-fips"
    tag: "latest"

  agentImage:
    repository: "cgr.dev/ORGANIZATION/vault-fips"
    tag: "latest"

server:
  image:
    repository: "cgr.dev/ORGANIZATION/vault-fips"
    tag: "latest"
```

Assuming these values are saved in a file named `cgr_values.yaml`, you should be able to apply them by running the following commands:

```shell
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault --values cgr_values.yaml
```

## Configuration

To configure Vault for production or other environments you can mount a configuration file to the `/etc/vault` directory, as in this example:

```shell
docker run --cap-add=IPC_LOCK -v $PWD/vault.hcl:/etc/vault/vault.hcl cgr.dev/ORGANIZATION/vault-fips server
```

You can also supply a vault configuration using the `VAULT_LOCAL_CONFIG` variable, like this:

```shell
docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/var/lib/vault"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 cgr.dev/ORGANIZATION/vault-fips server
```

### Persisting Data

If using the file data storage plugin, we recommend that you configure it to write to `/var/lib/vault`.

By default logs will be streamed to stdout and stderr, but can be configured to write to
`/var/log/vault`.

## Documentation and Resources

* [Official Vault Documentation](https://developer.hashicorp.com/vault/docs)
* [Vault Tutorials](https://developer.hashicorp.com/vault/tutorials)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-functions-python

# azure-functions-python
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-functions-python` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-functions-python/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for Python code projects. It extends the Azure platform with the capability to implement code triggered by many events occurring in Azure, on-premises or other 3rd party services.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream [azure-functions/python](https://hub.docker.com/r/microsoft/azure-functions-python) image, but follows the slim variant to reduce image size and improve performance.

Key differences:
- Slim base: Uses a smaller footprint compared to the full azure-functions/python image, which can lead to faster cold start times and reduced resource consumption.

These changes are intended to optimize app performance and keep the image aligned with the latest platform capabilities.

Chainguard's Azure Functions Python image is smaller in size compared to the original image and has few-to-zero CVEs.

## Getting Started

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for code projects. It extends the Azure platform with the capability to implement code triggered by many events occurring in Azure, on-premises or other 3rd party service. The Azure Functions Python image offers support for writing and running Functions code in Python.

### Creating and running a minimal Function locally

This section outlines how you can run an Azure Function application locally with the Chainguard Azure Functions Python Image.

Start by creating a sample http triggered function named `HelloWolfi`:

```sh
mkdir HelloWolfi

cat > HelloWolfi/__init__.py <<EOL
import azure.functions as func
import logging

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello, {name}!")
    else:
        return func.HttpResponse(
            "Pass a name in the query string or request body.",
            status_code=200
        )
EOL

cat > HelloWolfi/function.json <<EOL
{
    "scriptFile": "__init__.py",
    "bindings": [
      {
        "authLevel": "anonymous",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": ["get", "post"]
      },
      {
        "type": "http",
        "direction": "out",
        "name": "\$return"
      }
    ]
}
EOL
```

Then, create the **host.json** metadata file which contains configuration options for all functions in a Function App. For more information about the this file check the [host.json reference](https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json). Make sure to use version 4 of Azure Functions Extension Bundles, since version 3 and 2 are not supported.

```sh
cat > host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Information"
      },
      "console": {
          "isEnabled": true,
          "DisableColors": true
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Following that, you can create a Dockerfile to copy your Function code to the Chainguard image and build the new image.

```sh
cat > Dockerfile <<EOL
FROM cgr.dev/ORGANIZATION/azure-functions-python

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-python-function .
```

You can now run the image locally with the following command:

```sh
docker run -p 8080:80 wolfi-python-function
```
```
WEBSITES_INCLUDE_CLOUD_CERTS is not set to true.
info: Host.Triggers.Warmup[0]
      Initializing Warmup Extension.
info: Host.Startup[503]
      Initializing Host.
...
info: Microsoft.Azure.WebJobs.Hosting.JobHostService[0]
      Starting JobHost
...
info: Host.Startup[314]
      Loading functions metadata
info: Host.Startup[326]
      Reading functions metadata (Custom)
info: Host.Startup[327]
      1 functions found (Custom)
info: Host.Startup[315]
      1 functions loaded
info: Host.Startup[0]
      Generating 1 job function(s)
info: Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcher[0]
      Worker process started and initialized.
info: Host.Startup[0]
      Found the following functions:
      Host.Functions.HelloWolfi

info: Microsoft.Azure.WebJobs.Script.WebHost.WebScriptHostHttpRoutesManager[0]
      Initializing function HTTP routes
      Mapped function route 'api/HelloWolfi' [get,post] to 'HelloWolfi'
...
info: Host.Startup[412]
      Host initialized (48ms)
info: Host.Startup[413]
      Host started (59ms)
info: Host.Startup[0]
      Job host started
Hosting environment: Production
Content root path: /azure-functions-host
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
```

Now that the function launched properly, you can test it by making a request to the **/api/HelloWolfi** endpoint:

```sh
curl http://127.0.0.1:8080/api/HelloWolfi?name=Chainguard
```
```
Hello, Chainguard!
```

### Creating and running a minimal Function in an Azure Function App

The most common use case for an Azure Functions image is deploying it within an Azure Function App. You can use the Chainguard Azure Functions Python image for this purpose.
The following example demonstrates how to deploy a queue-triggered function that responds to messages in an Azure Storage Queue by creating a copy of a file in Azure Blob Storage.

Start by creating the function and its metadata file:

```sh
mkdir BlobFunction

cat > BlobFunction/__init__.py <<EOL
import azure.functions as func
import logging

def main(myQueueItem: func.QueueMessage, myInputBlob: func.InputStream, myOutputBlob: func.Out[bytes]):
    logging.warning(f'Python Queue trigger function processed: {myQueueItem.get_body().decode()}')

    # Copy the input blob to the output blob
    blob_content = myInputBlob.read()
    myOutputBlob.set(blob_content)

    logging.info(f'Blob copied successfully')
EOL

cat >BlobFunction/function.json <<EOL
{
    "scriptFile": "__init__.py",
    "bindings": [
      {
        "queueName": "python-function-queue",
        "connection": "AzureWebJobsStorage",
        "name": "myQueueItem",
        "type": "queueTrigger",
        "direction": "in"
      },
      {
        "name": "myInputBlob",
        "type": "blob",
        "path": "python-test-workitems/{queueTrigger}",
        "connection": "AzureWebJobsStorage",
        "direction": "in"
      },
      {
        "name": "myOutputBlob",
        "type": "blob",
        "path": "python-test-workitems/{queueTrigger}-Copy",
        "connection": "AzureWebJobsStorage",
        "direction": "out"
      }
    ],
    "disabled": false
}
EOL

cat > host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Warning"
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Then, create a Dockerfile to copy the Function to the Chainguard image and built the image.

```sh
cat > Dockerfile <<EOL
FROM cgr.dev/ORGANIZATION/azure-functions-python

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-queue-function .
```

Next, tag your image as needed and push it to your container registry by following [these steps](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#publish-the-container-image-to-a-registry).

Once the image is published, [provision the required Azure resources](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#create-supporting-azure-resources-for-your-function) and [configure your Function App](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#create-and-configure-a-function-app-on-azure-with-the-image) to use the container image.

After setup, create an **Azure Storage Queue** named `python-function-queue` and a **Blob Container** named `python-test-workitems` in your storage account. Upload a file to the container.

Ensure the Function App's managed identity has the correct roles assigned to the storage account:
- **Storage Queue Data Reader**
- **Storage Blob Data Contributor**

These roles allow the function to read from the queue and write to the blob container.

Restart the Function App to apply the updated configuration. Then, add a message to the queue containing the name of the uploaded file. Within a few seconds, the function should trigger and process the file, creating a copy in the designated container.

You can monitor execution logs in Azure Application Insights (note that logs may appear with a slight delay).

## Documentation and Resources

For more information about Azure Functions in container images, please refer to the [official documentation](https://learn.microsoft.com/en-us/azure/azure-functions/functions-container-apps-hosting).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-50

# request-50
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-50` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-50/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tesseract

# tesseract
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tesseract` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tesseract/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that contains tesseract

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage

tessaract sample Example: OCR an image from a URL to standard output

```
$ docker run --rm \
    -v "${PWD}":/work \
    -w /work \
    cgr.dev/chainguard/tesseract:latest
    https://tesseract-ocr.github.io/tessdoc/images/eurotext.png -
The (quick) [brown] {fox} jumps!
Over the $43,456.78 <lazy> #90 dog
& duck/goose, as 12.5% of E-mail
from aspammer@website.com is spam.
Der ,schnelle” braune Fuchs springt
iiber den faulen Hund. Le renard brun
«rapide» saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marrén rapido salta sobre el perro
perezoso. A raposa marrom ripida
salta sobre o cdo preguigoso.
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elasticsearch-iamguarded

# elasticsearch-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elasticsearch-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elasticsearch-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Free and Open Source, Distributed, RESTful Search Engine built with the Apache Lucene library.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Elasticsearch IAMGuarded is a security-enhanced variant of Elasticsearch designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Elasticsearch deployments.

## Helm Chart Installation

The Elasticsearch IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Elasticsearch image
image:
  registry: myregistry.example.com
  repository: mirrored/elasticsearch-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Elasticsearch exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-elasticsearch-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctlImage:
  registry: myregistry.example.com
  repository: mirrored/os-shell-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for copying TLS certificates
copyTlsCerts:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Kibana image (if enabled)
kibana:
  image:
    registry: myregistry.example.com
    repository: mirrored/elasticsearch-kibana
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/elasticsearch:16.0.2
   Digest: sha256:9ec24375344b5161756f11d49d3011655c44fa2e40244d7fbecaa0b20eee2eeb
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Elasticsearch IAMGuarded installation using standard Elasticsearch verification methods. The deployment functions as a standard Elasticsearch instance, so all typical Elasticsearch validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Elasticsearch IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Elasticsearch and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-source-watcher

# flux-source-watcher
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-source-watcher` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-source-watcher/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Flux Source Watcher extends Flux CD with ArtifactGenerator CRD for source composition

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `flux-source-watcher` container image is designed to be a drop-in replacement for the upstream [flux-source-watcher image](https://github.com/fluxcd/source-watcher).

## Getting Started

### Kustomize

Deploy source-watcher using kustomize with the upstream configuration:

```yaml
cat > kustomization.yaml <<EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/fluxcd/source-watcher/config/default
images:
  - name: fluxcd/source-watcher
    newName: cgr.dev/ORGANIZATION/flux-source-watcher
    newTag: latest
EOF
```

Apply the configuration:

```shell
kubectl apply -k .
```

This deploys both source-controller (a dependency) and source-watcher with all necessary CRDs and RBAC.

## Documentation and Resources

- [Flux Source Watcher GitHub](https://github.com/fluxcd/source-watcher)
- [Flux CD Documentation](https://fluxcd.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### label-studio

# label-studio
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/label-studio` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/label-studio/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Label Studio](https://labelstud.io/) is an open-source data labeling platform that supports annotation of audio, text, images, videos, and time series data.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started with Docker

To run Label Studio with Docker, you'll need a PostgreSQL database. This example demonstrates a complete setup with both PostgreSQL and Label Studio.

> [!NOTE]
> Label Studio supports two deployment modes:
> - **label-studio-uwsgi**: The main application server
> - **nginx**: An nginx reverse proxy (optional)

### Step 1: Create a Docker Network

```bash
docker network create label-studio
```

### Step 2: Start a PostgreSQL Database

Label Studio requires PostgreSQL for storing project data, annotations, and user information:

```bash
docker run -d \
  --name postgres \
  --network label-studio \
  -e POSTGRES_DB=labelstudio \
  -e POSTGRES_USER=labelstudio \
  -e POSTGRES_PASSWORD=mypassword \
   cgr.dev/ORGANIZATION/postgres:latest
```

### Step 3: Start Label Studio

The Chainguard Label Studio image supports two deployment modes. Start with the main application server:

```bash
docker run -d \
  --name label-studio \
  --network label-studio \
  -p 8000:8000 \
  -e DJANGO_DB=default \
  -e POSTGRE_NAME=labelstudio \
  -e POSTGRE_USER=labelstudio \
  -e POSTGRE_PASSWORD=mypassword \
  -e POSTGRE_HOST=postgres \
  -e POSTGRE_PORT=5432 \
  -e LABEL_STUDIO_BASE_DATA_DIR=/label-studio/data \
  cgr.dev/ORGANIZATION/label-studio:latest \
  label-studio-uwsgi
```

The Label Studio web interface will be accessible at `http://localhost:8000`.

### Step 4: Verify Label Studio is Running

Check the health endpoint to ensure the service is up:

```bash
curl -s http://localhost:8000/health | jq '.status'
```

This should return `"UP"`.

### Step 6 (Optional): Add Nginx Reverse Proxy

For production deployments, you can add an nginx reverse proxy:

```bash
docker run -d \
  --name label-studio-nginx \
  --network label-studio \
  -p 8085:8085 \
  -e LABEL_STUDIO_HOST=http://label-studio:8000 \
  -e APP_HOST=label-studio \
  cgr.dev/ORGANIZATION/label-studio:latest \
  nginx
```

The nginx proxy will be available at `http://localhost:8085`.

## Getting Started with Kubernetes

Label Studio can be deployed to Kubernetes using the [official Helm chart](https://github.com/HumanSignal/charts/tree/master/heartex/label-studio). This guide demonstrates deploying Label Studio with a PostgreSQL database.

### Step 1: Deploy PostgreSQL

Create a PostgreSQL instance for Label Studio:

```bash
kubectl run postgres-test \
  --image=cgr.dev/ORGANIZATION/postgres:latest \
  --port=5432 \
  --labels='app=postgres-test' \
  --env='POSTGRES_DB=labelstudio' \
  --env='POSTGRES_USER=labelstudio' \
  --env='POSTGRES_PASSWORD=mypassword' \
  --restart=Never
```

Expose the PostgreSQL service:

```bash
kubectl expose pod postgres-test \
  --name=postgres-test \
  --port=5432 --target-port=5432 \
  --type=ClusterIP
```

Wait for PostgreSQL to be ready:

```bash
kubectl wait --for=condition=ready pod --selector app=postgres-test \
  --timeout=30s
```

### Step 2: Create PostgreSQL Credentials Secret

Create a Kubernetes secret for the database password:

```bash
kubectl create secret generic postgres-creds \
  --from-literal=password=mypassword
```

### Step 3: Add the Label Studio Helm Repository

```bash
helm repo add heartex https://charts.heartex.com/
helm repo update
```

### Step 4: Create a `values.yaml` file for Label Studio

```bash
cat <<EOF > label-studio-values.yaml
global:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/label-studio
    tag: latest
  pgConfig:
    host: postgres-test.default.svc.cluster.local
    port: 5432
    dbName: labelstudio
    userName: labelstudio
    password:
      secretName: postgres-creds
      secretKey: password
  extraEnvironmentVars:
    DJANGO_DB: "default"
    LABEL_STUDIO_BASE_DATA_DIR: "/label-studio/data"

app:
  replicas: 1
  service:
    type: ClusterIP
    port: 8000
    targetPort: 8085 # Route to nginx sidecar

postgresql:
  enabled: false
EOF
```

### Step 5: Install Label Studio

```bash
helm install label-studio heartex/label-studio -f label-studio-values.yaml
```

Wait for Label Studio to be ready:

```bash
kubectl rollout status deployment/label-studio-ls-app --timeout=60s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/name=ls-app --timeout=60s
```

### Step 6: Access the Label Studio UI

Port-forward the Label Studio service to access it locally:

```bash
kubectl port-forward svc/label-studio-ls-app 8085:8000
```

The UI can now be accessed at `http://localhost:8085`

## Documentation and Resources

- [Label Studio Documentation](https://labelstud.io/guide/)
- [Label Studio GitHub Repository](https://github.com/HumanSignal/label-studio)
- [Label Studio Helm Chart Repository](https://github.com/HumanSignal/charts)
- [Label Studio Getting Started Tutorial](https://labelstud.io/learn/getting-started-with-label-studio/)
- [Label Studio API Reference](https://api.labelstud.io/api-reference/introduction/getting-started)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5756

# request-5756
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5756` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5756/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GraalVM is an advanced JDK with ahead-of-time Native Image compilation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

> **NOTICE**
> Native Images produced with GraalVM's native-image utility are NOT FIPS
> compliant. The Native Image utility compiles the classes for crypto
> modules into platform-specific code that is not certified for use
> in FIPS environments
>
> Even if a FIPS-validated provider were used, the provider is only compliant
> in its original state, before it was compiled to platform-specific native code

This image is a production-ready distribution of [GraalVM](https://www.graalvm.org/)
with the Bouncy Castle crypto libraries for FIPS. It is part of the
Chainguard Images collection, which are minimal, regularly-updated
container images designed with security in mind. The image can be
pulled from `cgr.dev` and is suitable for use in various environments,
including production.

The FIPS certified version of Bouncy Castle (CMVP [#4743]) is
compliant to the FIPS 140-3 standard when used in accordance with the
[Bouncy Castle Security Policy].

When using the GraalVM Chainguard Image for FIPS compliance, please
make sure to read the security policy and adapt your code as
needed. Follow these documents:

* [Bouncy Castle FIPS Java API User Guide]
* [Bouncy Castle FIPS Java API Upgrade Guide]

> **Note**:
> In this document, the registry and repository path will be referred as
> `cgr.dev/ORGANIZATION`. Make sure to replace those with the correct
> path of where your image is located.

## How are the `java.policy` and `java.security` files configured?

An updated version of the `java.security` configuration file is shipped under
the default location (`$JAVA_HOME/conf/security/java.security`) in this image and
is configured as described below:
* It excludes every default security provider except for the `SUN` provider,
    leaving only the following configuration:
    ```none
    security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider C:DEFRND[SHA256];ENABLE{ALL};
    security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider fips:BCFIPS
    security.provider.3=SUN
    ```

* It loads the `java.policy` file shipped under `/usr/lib/jvm/jdk-fips-config/java.policy`
    as an additional policy file, at position 2, leaving the policy configuration
    as:
    ```none
    policy.url.1=file:${java.home}/conf/security/java.policy
    policy.url.2=file:/usr/lib/jvm/jdk-fips-config/java.policy
    ```

    The additional policy file is configured as described in the BCFIPS user manual:
    ```none
    grant {
        permission java.lang.PropertyPermission "java.runtime.name", "read";

        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.internal.spec";
        permission java.lang.RuntimePermission "getProtectionDomain";
        permission java.lang.RuntimePermission "accessDeclaredMembers";

        permission org.bouncycastle.crypto.CryptoServicesPermission "tlsAlgorithmsEnabled";
        permission org.bouncycastle.crypto.CryptoServicesPermission "exportKeys";
    };
    ```

* It configures the `keystore.type` as `bcfks`, in order for Keystores to be
    FIPS-compliant.

* It sets the algorithms for the `KeyManagerFactory` and `TrustManagerFactory` as PKIX:
    ```none
    ssl.KeyManagerFactory.algorithm=PKIX
    ssl.TrustManagerFactory.algorithm=PKIX
    ```

* It sets BCFIPS to `approved_only` mode:
    ```none
    org.bouncycastle.fips.approved_only=true
    ```

## Using the provided Bouncy Castle libraries

Whenever possible ensure to use `--module-path
/usr/share/java/bouncycastle-fips`, as that allows one to execute
classes, jars, modules correctly with bouncycastle-fips JCA & JSSE
providers available to the JVM.

There are many additional environment variables preset in the image
that enable using `CLASSPATH` instead if desired.

This image ships with the following environment variables exported by default:
* `JAVA_FIPS_CLASSPATH=/usr/share/java/bouncycastle-fips/*`
* `JDK_JAVA_FIPS_OPTIONS="--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED"`
* `JDK_JAVAC_FIPS_OPTIONS="--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED"`
* `JAVA_TRUSTSTORE_OPTIONS="-Djavax.net.ssl.trustStoreType=FIPS"`

> **Warning**:
> These variable values **must not** be changed. If you need to use custom `CLASSPATH`
> or other JDK options, make sure to include these variables in your new variable declarations.
> Ensure that the `JAVA_TRUSTSTORE_OPTIONS` is part of your `JDK_JAVA_OPTIONS` variablee when
> using this image as a base image.

In addition, the following environment variables are also exported by default and can
be updated as needed:
* `CLASSPATH=$JAVA_FIPS_CLASSPATH:.:./*`
* `JDK_JAVA_OPTIONS=$JDK_JAVA_FIPS_OPTIONS $JAVA_TRUSTSTORE_OPTIONS`
* `JDK_JAVAC_OPTIONS=$JDK_JAVAC_FIPS_OPTIONS`

When updating your classpath variable, make sure to keep the path to the
`bouncycastle-fips` folder in your classpath, so the Bouncy Castle libraries
are discoverable:
```shell
CLASSPATH="${JAVA_FIPS_CLASSPATH}:${CLASSPATH}"
```

When updating the `JDK_JAVA_OPTIONS`/`JDK_JAVAC_OPTIONS` environment variables,
make sure to specify the exports options required for Bouncy Castle to work
properly:
```shell
JDK_JAVA_OPTIONS="${JDK_JAVA_FIPS_OPTIONS} ${JDK_JAVA_OPTIONS}"
JDK_JAVAC_OPTIONS="${JDK_JAVAC_FIPS_OPTIONS} ${JDK_JAVAC_OPTIONS}"
```

If you need the use of the converted keystore, make sure to also add the
`JAVA_TRUSTSTORE_OPTIONS` variable to your `JDK_JAVA_OPTIONS`:
```shell
JDK_JAVA_OPTIONS="${JAVA_TRUSTSTORE_OPTIONS} ${JDK_JAVA_OPTIONS}"
JDK_JAVAC_OPTIONS="${JDK_JAVAC_OPTIONS}"
```

Alternatively, these can be also set as an argument to the JVM tools via the
`--class-path`/`-cp` and `-D` options. Please note these arguments take
precedence over the environment variables:
```shell
javac --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS} TestClass.java
java -cp "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVA_FIPS_OPTIONS} TestClass
jshell --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS}
```

## Checking the configuration is being loaded correctly

As part of the effort to build this image, a set of tests was created
that validates that the BCFIPS and BCJSSE providers are in use.

Some of these tests are shipped in the image in
`/usr/lib/bcfips-policy-140-3`. They validate that allowed algorithms
are available, and disallowed ones are blocked.

## Getting Started

To consume this image as a base image, add it in the `FROM` statement of your Dockerfile. One can execute jars like this `java --module-path /usr/share/java/bouncycastle-fips -jar`. Without the ``-module-path` setting one will eventually see cryptic runtime errors from JCA or JSSE APIs. Alternatively one can add jars to the `CLASSPATH` and invoke the main class directly:
```dockerfile
FROM cgr.dev/ORGANIZATION/graalvm-fips:<JDK VERSION>

WORKDIR /src
COPY MyClass.java .

RUN javac MyClass.java && \
    jar cvf my-app.jar *.class
```

## Documentation and Resources

### BCFIPS

- [#4743]: https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4743
- [Bouncy Castle Security Policy]: https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp4743.pdf
- [Bouncy Castle FIPS Java API User Guide]: https://downloads.bouncycastle.org/fips-java/BC-FJA-UserGuide-2.0.0.pdf
- [Bouncy Castle FIPS Java API Upgrade Guide]: https://downloads.bouncycastle.org/fips-java/docs/BC-FJA%202.0.0%20Porting%20Guide.pdf

### GraalVM

- [GraalVM documentation](https://www.graalvm.org/latest/docs/)
- [GraalVM guides](https://www.graalvm.org/latest/guides/)
- [GraalVM community](https://www.graalvm.org/community/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-replicator-fips

# kubernetes-replicator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-replicator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-replicator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[kubernetes-replicator](https://github.com/mittwald/kubernetes-replicator) is a custom Kubernetes controller that can be used to make secrets and config maps available in multiple namespaces.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using kubernetes-replicator-fips

This image is a drop-in replacement for the upstream image.
You can run it using the official helm chart with:

```shell
$ helm repo add mittwald https://helm.mittwald.de
$ helm repo update
$ helm install kubernetes-replicator mittwald/kubernetes-replicator \
    --set image.repository=cgr.dev/chainguard/kubernetes-replicator-fips \
    --set image.tag=latest
    <other configuration parameters here>
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### statsd

# statsd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/statsd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/statsd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Daemon for easy but powerful stats aggregation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

See the [statsd documentation](https://github.com/statsd/statsd?tab=readme-ov-file#usage) for more information on how to use statsd.

You can also use a Helm chart to install this image on a Kubernetes cluster:

```bash
helm repo add keyporttech https://keyporttech.github.io/helm-charts/
helm install my-release keyporttech/statsd \
  --namespace statsd \
  --create-namespace \
  --set image.repository="cgr.dev/chainguard/statsd" \
  --set image.tag="latest"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-autoscaler-fips

# cluster-autoscaler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-autoscaler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-autoscaler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add autoscaler https://kubernetes.github.io/autoscaler
$ helm install my-release autoscaler/cluster-autoscaler \
    --set image.repository=cgr.dev/ORGANIZATION/cluster-autoscaler-fips \
    --set image.tag=latest
    <other configuration parameters here>
```

Note that the `cluster-autoscaler` does need cloud provider configuration to work correctly, so it won't run locally.
See the [configuration](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/charts/cluster-autoscaler) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### splunk-otel-collector

# splunk-otel-collector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/splunk-otel-collector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/splunk-otel-collector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Splunk OpenTelemetry Collector is a distribution of the OpenTelemetry Collector. It provides a unified way to receive, process, and export metric, trace, and log data for Splunk Observability Cloud

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`splunk-otel-collector` is comparable to the splunk-otel-collector (quay.io/signalfx/splunk-otel-collector:latest) image, with the following differences:

- Like all other Chainguard Images, `splunk-otel-collector` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user
- This image as currently built does not support the agent bundle plugins

## Getting Started

Splunk OpenTelemetry Collector is a distribution of the OpenTelemetry Collector. It provides a unified way to receive, process, and export metric, trace, and log data for Splunk Observability Cloud. Here is an example setup of the collector to ingest metrics from a Redis server.

### Requirements

1. Configuration for the OpenTelemetry Collector deployed with a configMap
2. Configuration for the Redis server deployed with a configMap

The following is an example `otel-collector.yaml` configuration file:

```
apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-config
  namespace: splunk
data:
  otel-collector-config.yaml: |
    receivers:
      redis:
        endpoint: "localhost:6379"
        collection_interval: 10s
        password: $REDIS_PASSWORD
        metrics:
          redis.role:
            enabled: true
          redis.cmd.calls:
            enabled: true
    extensions:
      health_check:
        endpoint: 0.0.0.0:13133
      zpages:
        endpoint: 0.0.0.0:55679
    processors:
      batch:
    exporters:
      signalfx:
        access_token: "token"
        realm: "us0"
      debug:
        verbosity: detailed
    service:
      telemetry:
        metrics:
          address: ":8888"
      pipelines:
        metrics/sfx:
          receivers: [redis]
          processors: [batch]
          exporters: [signalfx]
        metrics/logging:
          receivers: [redis]
          processors: [batch]
          exporters: [debug]

```

More information can be found in the [Otel collector examples folder](https://github.com/signalfx/splunk-otel-collector/tree/main/examples).

To test out this image, deploy an `otel-collector` pod in a Kubernetes cluster:

```
apiVersion: v1
kind: Pod
metadata:
  name: redis-otel-pod
  namespace: splunk
spec:
  serviceAccount: default
  containers:
    - name: redis-db
      image: redis:latest
      command: ["redis-server", "/etc/redis/redis.conf"]
      ports:
        - containerPort: 6379
        - containerPort: 6329
      volumeMounts:
        - name: redis-config
          mountPath: /etc/redis/redis.conf
          subPath: redis.conf

    - name: otelcollector
      image: ${local.parsed.registry}/${local.parsed.repo}:${local.parsed.pseudo_tag}
      args:
        - "--config=/etc/otel-collector-config.yaml"
        - "--set=service.telemetry.logs.level=debug"
      env:
        - name: SPLUNK_ACCESS_TOKEN
          value: "token"
        - name: SPLUNK_REALM
          value: "us0"
        - name: REDIS_PASSWORD
          value: "changeme"
      ports:
        - containerPort: 8088
          name: otel-http
        - containerPort: 8888
          name: otel-grpc
      volumeMounts:
        - name: otel-config
          mountPath: /etc/otel-collector-config.yaml
          subPath: otel-collector-config.yaml

  volumes:
    - name: otel-config
      configMap:
        name: otel-config
    - name: redis-config
      configMap:
        name: otel-config
```

Ensure that the container is up and running and ensure that the metric counts have been ingested by the collector

```
kubectl -n splunk logs redis-otel-pod -c otelcollector 2>&1 | \
  grep "Metrics" | head -n 1 | jq -R 'split(",") | \
  map(select(contains("\"metrics\":"))) | map(split(": ")[1] | tonumber) | .[0] > 10'

```

The test above is to validate that metrics, in the case from a redis container are been collected by the otel collector service.

## Documentation and Resources

1. https://github.com/signalfx/splunk-otel-collector - Main project repository
2. https://github.com/signalfx/splunk-otel-collector/tree/main/examples - Deployment scenarios
3. https://github.com/signalfx/splunk-otel-collector-chart - Helm chart
4. https://docs.splunk.com/observability/en/gdi/opentelemetry/opentelemetry.html

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vector

# vector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [Vector](https://vector.dev/), an end-to-end data observability pipeline

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `vector` Chainguard image is meant to serve as a drop-in replacement for the [Vector image on DockerHub](https://hub.docker.com/r/timberio/vector). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

## Getting Started

### Basic usage

To begin, start the `vector` container with a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/vector
```

> [!NOTE]
> This will start `vector` with the [demo_logs source](https://vector.dev/docs/reference/configuration/sources/demo_logs/) configuration.
> Sample log data will be generated and printed to stdout.
> You can drop in your own configuration by mounting the file to `/etc/vector/vector.yaml` inside the container.

### Vector with kubernetes

`vector` can be [installed](https://vector.dev/docs/setup/installation/platforms/kubernetes/) or managed on kubernetes via [helm](https://vector.dev/docs/setup/installation/package-managers/helm/).

> [!NOTE]
> This example assumes that you have a PostgreSQL database pod and Elasticsearch pod configured and running on a [local Kubernetes cluster setup](https://kind.sigs.k8s.io/).
> The [CloundNative PG Operator](https://github.com/cloudnative-pg/cloudnative-pg) was used to deploy PostgreSQL by following their [CNPG quickstart guide](https://cloudnative-pg.io/documentation/1.25/quickstart/) and [example manifests](https://github.com/cloudnative-pg/cloudnative-pg/blob/main/docs/src/samples/cluster-example-secret.yaml).
> The [ECK Operator](https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/install-using-helm-chart) was used to deploy Elasticsearch by following the [Elasticsearch quickstart guide](https://www.elastic.co/docs/deploy-manage/deploy/cloud-on-k8s/elasticsearch-deployment-quickstart)
> All example resources are deployed into the `default` namespace.

#### Prerequisites

* `k3d` cluster
* `helm`
* `docker`
* `curl`

#### PostgreSQL setup

1. install the cnpg operator
```shell
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm upgrade --install cnpg \
--set config.clusterWide=false \
cnpg/cloudnative-pg
```

2. deploy postgresql
```shell
cat <<EOF | kubectl apply -f -
apiVersion: v1
data:
  password: c3VwZXJzZWN1cmU=
  username: YXBw
kind: Secret
metadata:
  name: cluster-example-app-user
type: kubernetes.io/basic-auth
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-example
spec:
  instances: 1
  imageName: ghcr.io/cloudnative-pg/postgresql:16
  bootstrap:
    initdb:
      database: app
      owner: app
      secret:
        name: cluster-example-app-user
  storage:
    size: 1Gi
EOF
```
> [!NOTE]
> When deploying the PostgreSQL instance ensure `v16` is used. Otherwise vector will not emit any metrics other than up, and instead emit errors related to the checkpoints_timed column being missing.
> The likely cause is that the `checkpoints_timed` column, along with other metrics in `pg_stat_bgwriter`, was renamed and moved to the `pg_stat_checkpointer` table in PostgreSQL 17
> Ref: https://github.com/vectordotdev/vector/issues/22094

#### Elasticsearch setup

1. install the eck operator
```shell
helm repo add elastic https://helm.elastic.co
helm repo update

helm install elastic-operator elastic/eck-operator
```

2. deploy elasticsearch
```shell
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 9
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
EOF
```

### Vector setup
> [!NOTE]
> Vector will be configured with a [postgresql_metrics source](https://vector.dev/docs/reference/configuration/sources/postgresql_metrics/) and [elasticsearch sink](https://vector.dev/docs/reference/configuration/sinks/elasticsearch/).

1. Grab the elasticsearch user credentials
```shell
export ELASTIC_PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)
```

3. create the `vector` values for the `vector` helm chart
```shell
cat <<EOF > /tmp/values.yaml
role: "Aggregator"
image:
  repository: k3d-k3d.localhost:5005/vector
  tag: "latest-dev"
replicas: 1
service:
  enabled: true
  type: "ClusterIP"
  ports: 
    - name: datadog-agent
      port: 8282
      protocol: TCP
      targetPort: 8282
    - name: fluent
      port: 24224
      protocol: TCP
      targetPort: 24224
    - name: logstash
      port: 5044
      protocol: TCP
      targetPort: 5044
    - name: splunk-hec
      port: 8080
      protocol: TCP
      targetPort: 8080
    - name: statsd
      port: 8125
      protocol: TCP
      targetPort: 8125
    - name: syslog
      port: 9000
      protocol: TCP
      targetPort: 9000
    - name: vector
      port: 6000
      protocol: TCP
      targetPort: 6000
    - name: prom-exporter
      port: 9090
      protocol: TCP
      targetPort: 9090
customConfig:
  data_dir: "/var/lib/vector"
  sources:
    postgres:
      type: postgresql_metrics
      endpoints:
        - postgresql://app:supersecure@cluster-example-rw.default.svc.cluster.local:5432/app
      namespace: default
  sinks:
    elastic:
      type: elasticsearch
      inputs:
        - postgres
      api_version: auto
      doc_type: _doc
      mode: bulk
      bulk:
        action: "create"
        index: "vector-demo"
        template_fallback_index: "test-index"
      endpoints:
        - https://quickstart-es-http.default.svc.cluster.local:9200
      auth:
        strategy: "basic"
        user: "elastic"
        password: "$ELASTIC_PASSWORD"
      tls:
        verify_certificate: false
EOF
```
> [!NOTE]
> The index that this vector configuration will create in elasticsearch will be called: `vector-demo`
> This index will be used to query elasticsearch for metric data.

3. deploy `vector`
```shell
helm install vector vector/vector -f /tmp/values.yaml
```

expected output:
```
kubectl logs vector-0

2025-05-05T22:18:39.858586Z  INFO vector::app: Log level is enabled. level="info"
2025-05-05T22:18:39.859439Z  INFO vector::app: Loading configs. paths=["/etc/vector"]
2025-05-05T22:18:39.870296Z  WARN sink{component_kind="sink" component_id=elastic component_type=elasticsearch}: vector_core::tls::settings: The `verify_certificate` option is DISABLED, this may lead to security vulnerabilities.
2025-05-05T22:18:39.949237Z  INFO vector::topology::running: Running healthchecks.
2025-05-05T22:18:39.949295Z  INFO vector: Vector has started. debug="false" version="0.46.1" arch="aarch64" revision=""
2025-05-05T22:18:39.949303Z  INFO vector::app: API is disabled, enable by setting `api.enabled` to `true` and use commands like `vector top`.
2025-05-05T22:18:39.955193Z  INFO vector::topology::builder: Healthcheck passed.
```

#### Verify metric logs

1. port forward the elasticsearch service
```shell
kubectl port-forward service/quickstart-es-http 9200

Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200
```

2. query elasticsearch for metric data
```shell
export ELASTIC_PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)

curl -k -X GET --user elastic:$ELASTIC_PASSWORD 'https://localhost:9200/vector-demo/_search?pretty=true&size=100'
```

expected metrics:
```
name: pg_stat_database_datid
name: pg_stat_database_numbackends
name: pg_stat_database_xact_commit_total
name: pg_stat_database_xact_rollback_total
name: pg_stat_database_blks_read_total
name: pg_stat_database_blks_hit_total
name: pg_stat_database_tup_returned_total
name: pg_stat_database_tup_fetched_total
name: pg_stat_database_tup_inserted_total
name: pg_stat_database_tup_updated_total
name: pg_stat_database_tup_deleted_total
name: pg_stat_database_conflicts_total
name: pg_stat_database_temp_files_total
name: pg_stat_database_temp_bytes_total
name: pg_stat_database_deadlocks_total
name: pg_stat_database_checksum_failures_total
name: pg_stat_database_checksum_last_failure
name: pg_stat_database_blk_read_time_seconds_total
name: pg_stat_database_blk_write_time_seconds_total
name: pg_stat_database_stats_reset
```

expected response:
```json
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1540,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "vector-demo",
        "_id" : "N4mHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "gauge" : {
            "value" : 1.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_active",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950988925Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OImHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 2.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_accepted_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989466Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OYmHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 2.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_handled_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989675Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "OomHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "counter" : {
            "value" : 3.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "http_requests_total",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950989925Z"
        }
      },
      {
        "_index" : "vector-demo",
        "_id" : "O4mHopYBngIh9-WFpZX7",
        "_score" : 1.0,
        "_source" : {
          "gauge" : {
            "value" : 0.0
          },
          "host" : "nginx-demo.default.svc.cluster.local:8080",
          "kind" : "absolute",
          "name" : "connections_reading",
          "namespace" : "default",
          "tags" : {
            "endpoint" : "http://nginx-demo.default.svc.cluster.local:8080/status"
          },
          "timestamp" : "2025-05-05T22:18:39.950990300Z"
        }
      }
    ]
  }
}
```

## Documentation and Resources
- [Vector Docs - Getting Started](https://vector.dev/guides/getting-started/getting-started/)
- [Vector Docs - Configuration](https://vector.dev/docs/reference/configuration/)
- [Vector Docs - Sources](https://vector.dev/docs/reference/configuration/sources/)
- [Vector Docs - Sinks](https://vector.dev/docs/reference/configuration/sinks/)
- [Vector Docs - CLI](https://vector.dev/docs/reference/cli/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-fips

# flux-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### r-base

# r-base
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/r-base` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/r-base/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the R programming language and environment.It can be used for statistical analysis, machine learning and data visualization.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

The image can be run directly and sets the R wrapper as the entrypoint:

```shell
docker run cgr.dev/chainguard/r-base:latest

Usage: R [options] [< infile] [> outfile]
   or: R CMD command [arguments]

Start R, a system for statistical computation and graphics, with the
specified options, or invoke an R tool via the 'R CMD' interface.

Options:
  -h, --help            Print short help message and exit
  --version             Print version info and exit
  --encoding=ENC        Specify encoding to be used for stdin
  --encoding ENC
  RHOME                 Print path to R home directory and exit
```

The binary also contains the Rscript wrapper:

```shell
docker run --entrypoint=/usr/bin/Rscript cgr.dev/chainguard/r-base:latest

Usage: Rscript [options] file [args]
   or: Rscript [options] -e expr [-e expr2 ...] [args]
A binary front-end to R, for use in scripting applications.

Options:
  --help              Print usage and exit
  --version           Print version and exit
  --verbose           Print information on progress
  --default-packages=LIST  Attach these packages on startup;
                        a comma-separated LIST of package names, or 'NULL'
and options to R (in addition to --no-echo --no-restore), for example:
  --save              Do save workspace at the end of the session
  --no-environ        Don't read the site and user environment files
  --no-site-file      Don't read the site-wide Rprofile
  --no-init-file      Don't read the user R profile
  --restore           Do restore previously saved objects at startup
  --vanilla           Combine --no-save, --no-restore, --no-site-file,
                        --no-init-file and --no-environ

Expressions (one or more '-e <expr>') may be used *instead* of 'file'.
Any additional 'args' can be accessed from R via 'commandArgs(TRUE)'.
See also  ?Rscript  from within R.
```

Note that the standard version of this image requires a shell because R is typically
invoked through built-in shell wrappers.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### TEMPLATE_GROUP

# Chainguard Image Group Template

This is a template README.md for new image groups.

1. Include a brief description of the image here, and instructions about how to use it.
1. Run `monopod readme`, which will update the top section of this file and the root README.md file.
1. Run `make tfgen`, which will update the generated root module config.

If you need to support version streams, you can leave `packages` empty in `latest.apko.yaml`, and instead add packages to the images using the `extra_packages` TF variable in `config/main.tf`.

<!-- IMAGE_SEPARATOR -->

### objectstorage-fips

# objectstorage-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/objectstorage-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/objectstorage-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container Object Storage Interface (COSI) controller and sidecar

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

These images are built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's images maintain functional parity with the upstream images:

- `controller`: The main COSI controller that manages object storage resources.
- `sidecar`: A sidecar container that provides additional functionality for object storage operations.

### FIPS Support

These Chainguard Containers ship with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### `controller`

The `objectstorage-controller` image is not meant to be run directly with Docker. Instead, deploy with the `kubectl` and replace the image as upstream recommended:

```shell
kubectl create -k 'https://github.com/kubernetes-sigs/container-object-storage-interface//?ref=v<VERSION>'
kubectl set image -n container-object-storage-system deployment/container-object-storage-controller objectstorage-controller=cgr.dev/ORGANIZATION/objectstorage-controller-fips:latest
```

Then you can deploy the [`cosi-driver-sample`](https://github.com/kubernetes-sigs/cosi-driver-sample) to test the controller.

### `sidecar`

After you deployed your COSI driver, you can use the Chainguard's `objectstorage-sidecar` image as a sidecar container in your Kubernetes deployments with a simple replacement of the image:

```shell
kubectl set image deploy/<COSI_DEPLOYMENT> objectstorage-provisioner-sidecar=cgr.dev/ORGANIZATION/objectstorage-sidecar-fips:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [README](https://github.com/kubernetes-sigs/container-object-storage-interface/blob/main/README.md)
* [Documentations](https://github.com/kubernetes-sigs/container-object-storage-interface/tree/main/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-ebs-csi-driver

# aws-ebs-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-ebs-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-ebs-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal images for [aws-ebs-csi-driver](https://aws.amazon.com/ebs/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Testing

Since this application requires AWS credentials to be set up, we should create the required permissions before deploying it.

To do that, you can follow up on the official documentation [here](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md#set-up-driver-permissions).

But for the sake of simplicity, we can create the Kubernetes secret resource called `aws-secret` with the proper options `key_id` and `access_key`:

```shell
kubectl create secret generic aws-secret \
    --namespace kube-system \
    --from-literal "key_id=${AWS_ACCESS_KEY_ID}" \
    --from-literal "access_key=${AWS_SECRET_ACCESS_KEY}"
```

There are several methods to deploy the driver, but we will use the `helm` method.

We should add the `aws-ebs-csi-driver` Helm repository to our repositories list:

```shell
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update
```

Next, we can install the driver with the following command:

```shell
helm upgrade --install aws-ebs-csi-driver \
    --namespace kube-system \
    --set image.repository=cgr.dev/chainguard/aws-ebs-csi-driver \
    --set image.tag=latest \
    aws-ebs-csi-driver/aws-ebs-csi-driver
```

Once the driver has been deployed, verify the pods are running:

```shell
kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-ebs-csi-driver
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k3s

# k3s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k3s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k3s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image of [K3s](https://k3s.io/), a lightweight Kubernetes distribution

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image is a drop in replacement for the upstream `rancher/k3s` image, which means it works everywhere you would expect.

The quickest way to test it is locally with `docker`:

```bash
docker run --rm -v `pwd`:/etc/rancher/k3s --privileged -p 6443:6443 cgr.dev/chainguard/k3s:latest

KUBECONFIG=k3s.yaml kubectl get po -A
```

You can also use it as a drop in replacement in `k3d`:

```bash
k3d cluster create -i cgr.dev/chainguard/k3s:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-fips

# thanos-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Thanos Image, a highly available Prometheus setup with long term storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `thanos-fips` container image is functionally equivalent to the upstream [Thanos project](https://github.com/thanos-io/thanos). It is fully compatible with Thanos components such as sidecar, store, query, and compactor. This Chainguard image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `thanos-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy `thanos-fips` as a sidecar using the [kube-prometheus Helm chart](https://prometheus-community.github.io/helm-charts/). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
prometheus:
  prometheusSpec:
    thanos:
      image: cgr.dev/ORGANIZATION/thanos-fips:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy `kube-prometheus-stack` helm chart

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install thanos --create-namespace -n monitoring prometheus-community/kube-prometheus-stack -f values-thanos.yaml --wait
```

## Documentation and Resources

* [Official Getting Started Guide](https://thanos.io/tip/thanos/getting-started.md/)
* [Thanos Github Repository](https://github.com/thanos-io/thanos)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mailpit

# mailpit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mailpit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mailpit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Mailpit is an email and SMTP testing tool with API for developers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `REPO_NAME` Chainguard Container is a drop-in replacement for the [upstream Mailpit image](https://hub.docker.com/r/axllent/mailpit). It provides the same functionality with the following differences:

* Runs as a non-root user by default

## Getting Started

You can run Mailpit directly with Docker:

```sh
docker run -d \
  -p 8025:8025 \
  -p 1025:1025 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

This starts Mailpit with the web UI accessible at http://localhost:8025 and the SMTP server listening on port 1025.

### Deploying with Helm

You can deploy Mailpit to Kubernetes using the [jouve Helm Chart](https://github.com/jouve/charts/tree/main/charts/mailpit).

First, create a `values.yaml` file to configure the Chainguard Container:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/REPO_NAME
  tag: latest
```

Then deploy the Helm chart:

```sh
helm repo add jouve https://jouve.github.io/charts/
helm install mailpit jouve/mailpit -f values.yaml
```

### Sending a Test Email

Once Mailpit is running, you can send a test email. These instructions are based on the [upstream documentation](https://mailpit.axllent.org/docs/install/testing/).

Create a file called `email.txt` with the following contents:

```sh
cat > email.txt <<EOF
From: sender@example.com
To: recipient@example.com
Subject: Email Subject

This is the body of the email.
It can contain multiple lines of text.
EOF
```

If using Kubernetes, port forward the services:

```sh
kubectl port-forward svc/mailpit-http 8025:80 &
kubectl port-forward svc/mailpit-smtp 1025:25 &
```

Send the email using the Mailpit sendmail command:

```sh
mailpit sendmail < email.txt
```

Navigate to http://localhost:8025 to view the email in the Mailpit web interface.

## Documentation and Resources

* [Mailpit Official Documentation](https://mailpit.axllent.org/docs/)
* [Mailpit GitHub Repository](https://github.com/axllent/mailpit)
* [Chainguard Academy](https://edu.chainguard.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zig

# zig
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zig` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zig/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with zig binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image should be used to build and test zig applications.
You should *not* use it as a runtime image.

For runtime images, you can use `cgr.dev/chainguard/static` or `cgr.dev/chainguard/glibc-dynamic` depending on the type of zig application you build.

## Run It!

The zig tool in this image can be used to setup and build basic zig projects:

```yaml
$ docker run -it -v $(pwd):/app -w /app cgr.dev/chainguard/zig init-exe
info: Created build.zig
info: Created src/main.zig
info: Next, try `zig build --help` or `zig build run`
$ docker run -it -v $(pwd):/app -w /app cgr.dev/chainguard/zig build run
$  docker run -it -v $(pwd):/app -w /app cgr.dev/chainguard/zig build run
All your codebase are belong to us.
Run `zig build test` to run the tests.
```

It can also be used in a multi-stage build:

```Dockerfile
FROM cgr.dev/chainguard/zig:latest-dev as builder
COPY --chown=nonroot . /app
WORKDIR /app
RUN zig build

FROM cgr.dev/chainguard/static
COPY --from=builder /app/zig-out/bin/app /usr/local/bin/app
CMD ["/usr/local/bin/app"]
```

```shell
$ cat << EOF > Dockerfile
FROM cgr.dev/chainguard/zig:latest-dev as builder
WORKDIR /app
COPY . /app
RUN zig build

FROM cgr.dev/chainguard/static
COPY --from=builder /app/zig-out/bin/app /usr/local/bin/app
CMD ["/usr/local/bin/app"]
EOF

$ docker build . -t zigtest
[+] Building 0.4s (12/12) FINISHED
 => [internal] load .dockerignore                                                                                                                                                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                           0.0s
 => => transferring dockerfile: 305B                                                                                                                                                                                                                                                           0.0s
 => [internal] load metadata for cgr.dev/chainguard/static:latest                                                                                                                                                                                                                              0.3s
 => [internal] load metadata for cgr.dev/chainguard/zig:latest-dev                                                                                                                                                                                                                             0.2s
 => [internal] load build context                                                                                                                                                                                                                                                              0.0s
 => => transferring context: 1.40kB                                                                                                                                                                                                                                                            0.0s
 => [stage-1 1/2] FROM cgr.dev/chainguard/static@sha256:54b589146d4dbc80a094fcbcd6b09414f3df94cde8ea6d31c44fd02692c58203                                                                                                                                                                       0.0s
 => => resolve cgr.dev/chainguard/static@sha256:54b589146d4dbc80a094fcbcd6b09414f3df94cde8ea6d31c44fd02692c58203                                                                                                                                                                               0.0s
 => [builder 1/4] FROM cgr.dev/chainguard/zig:latest-dev@sha256:74d1fd19ab5f32a350745c155deaf26684733ac20392e8ca38648bcd0f73db54                                                                                                                                                               0.0s
 => => resolve cgr.dev/chainguard/zig:latest-dev@sha256:74d1fd19ab5f32a350745c155deaf26684733ac20392e8ca38648bcd0f73db54                                                                                                                                                                       0.0s
 => CACHED [builder 2/4] COPY --chown=nonroot . /app                                                                                                                                                                                                                                           0.0s
 => CACHED [builder 3/4] WORKDIR /app                                                                                                                                                                                                                                                          0.0s
 => CACHED [builder 4/4] RUN zig build                                                                                                                                                                                                                                                         0.0s
 => CACHED [stage-1 2/2] COPY --from=builder /app/zig-out/bin/app /usr/local/bin/app                                                                                                                                                                                                           0.0s
 => exporting to image                                                                                                                                                                                                                                                                         0.0s
 => => exporting layers                                                                                                                                                                                                                                                                        0.0s
 => => exporting manifest sha256:b2b46fa2142a0a74b56531f700b9052326e19d8f73d576583af26803bf6a32f0                                                                                                                                                                                              0.0s
 => => exporting config sha256:5f75e89de21e888ce46efef85a14919c0499ef854ed78f0bc9fb0126ed677cb8                                                                                                                                                                                                0.0s
 => => naming to docker.io/library/zigtest:latest                                                                                                                                                                                                                                              0.0s
 => => unpacking to docker.io/library/zigtest:latest

$ docker run zigtest
Run `zig build test` to run the tests.
All your codebase are belong to us.
```

## WASM

Zig can also be used to build WASM modules.

This Dockerfile can be used to build a WASM image, compatible with Docker's WASM runtime support.

```Dockerfile
# syntax=docker/dockerfile:1
FROM cgr.dev/chainguard/zig:latest as wasm-builder
WORKDIR /app
COPY --chown=nonroot . /app
RUN zig build-exe src/main.zig -target wasm32-wasi

FROM scratch
COPY --from=wasm-builder /app/main.wasm /main.wasm
ENTRYPOINT [ "/main.wasm" ]
```

Follow the [instructions to enable WASM in docker](https://docs.docker.com/desktop/wasm/), then build this and run it:

```shell
$ cat << EOF > Dockerfile.wasm
# syntax=docker/dockerfile:1
FROM cgr.dev/chainguard/zig:latest as wasm-builder
WORKDIR /app
COPY --chown=nonroot . /app
RUN zig build-exe src/main.zig -target wasm32-wasi

FROM scratch
COPY --from=wasm-builder /app/main.wasm /main.wasm
ENTRYPOINT [ "/main.wasm" ]
EOF

$ docker build . -t myfirstwasmapp -f Dockerfile.wasm
$ docker run \
  --runtime=io.containerd.wasmedge.v1 \
  myfirstwasmapp
All your codebase are belong to us.
Run `zig build test` to run the tests.
```

### Other WASM Runtimes

These wasm binaries can also be run in other WASM runtimes outside of Docker.

Wolfi currently packages [wazero](https://edu.chainguard.dev/chainguard/chainguard-images/reference/wazero/), [wasmtime](https://edu.chainguard.dev/chainguard/chainguard-images/reference/wasmtime/), and [wasmer](https://edu.chainguard.dev/chainguard/chainguard-images/reference/wasmer/).

These can be used together. Here's an example using Zig with [Wasmer](https://wasmer.io):

```shell
$ docker run -it cgr.dev/chainguard/wolfi-base sh
$ apk add zig wasmer
$ zig init-exe
$ zig build-exe src/main.zig -target wasm32-wasi
$ wasmer run main.wasm
All your codebase are belong to us.
Run `zig build test` to run the tests.
```

Or in a multi-stage Dockerfile:

```Dockerfile
FROM cgr.dev/chainguard/zig:latest as builder
WORKDIR /app
RUN zig init-exe
RUN zig build-exe src/main.zig -target wasm32-wasi

FROM cgr.dev/chainguard/wasmer:latest
COPY --from=builder /app/main.wasm /app/main.wasm
CMD ["run", "/app/main.wasm"]
```

```shell
$ cat << EOF > Dockerfile.wasmer
FROM cgr.dev/chainguard/zig:latest as builder
WORKDIR /app
RUN zig init-exe
RUN zig build-exe src/main.zig -target wasm32-wasi

FROM cgr.dev/chainguard/wasmer:latest
COPY --from=builder /app/main.wasm /app/main.wasm
CMD ["run", "/app/main.wasm"]
EOF

$ docker build -t mysecondwasmapp -f Dockerfile.wasmer .
$ docker run mysecondwasmapp
All your codebase are belong to us.
Run `zig build test` to run the tests.
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jre

# jre
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jre` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jre/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Java JRE image using [OpenJDK](https://openjdk.org/projects/jdk/). Used for running Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's JRE image is built directly from the [OpenJDK project](https://openjdk.org/). The Chainguard JRE image has few-to-zero CVEs and does not run as the root user.

## Getting Started

A JRE is the standard runtime for a Java application and is used for running an already developed and packaged Java application. Generally, you will combine your application with the Chainguard JRE image and Docker or a build tool like [Maven](https://maven.apache.org/) or [Gradle](https://gradle.org/)

### Using Jib to build a JRE-based application image

Using Maven or Gradle, you can compile and package your application. [Jib](https://github.com/GoogleContainerTools/jib/tree/master) is a tool from Google Container Tools which builds optimized Docker and OCI images for Java applications. It's available as a plugin for both Maven and Gradle, as well as a Java library. 

The Jib GitHub repository includes [a useful example application](https://github.com/GoogleContainerTools/jib/tree/master/examples/spring-boot) that works with Maven or Gradle.

### Using Helm to Deploy your Java Application

Using [Helm](https://helm.sh/) to deploy your JRE-based application image is relatively straightforward using either [this Kubernetes Service Helm Chart](https://github.com/gruntwork-io/helm-kubernetes-services/blob/main/charts/k8s-service/README.md) or [this Service Helm Chart](https://artifacthub.io/packages/helm/kvalitetsit/service) from ArtifactHub.

## Documentation and Resources

- (Video) [How to Migrate a Java Application to Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
- (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
- (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
- (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

The latest builds of Chainguard's JRE image pass the TCK for OpenJDK Java 21.0.3 and Java 22.0.1 as provided by [OpenJDK Community TCK License Agreement](https://openjdk.org/legal/openjdk-tck-license.pdf) (OCTLA) and are [Java Compatibility Kit (JCK) conformant](https://www.chainguard.dev/unchained/chainguards-openjdk-java-images-are-now-jck-conformant).

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-config-cli-iamguarded

# keycloak-config-cli-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-config-cli-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-config-cli-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Import YAML/JSON-formatted configuration files into Keycloak - Configuration as Code for Keycloak.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Keycloak Config CLI IAMGuarded is a security-enhanced configuration management tool designed to work as a companion image with the Keycloak IAMGuarded Helm chart. This image enables configuration-as-code for Keycloak deployments by importing YAML/JSON-formatted configuration files.

## Helm Chart Integration

The Keycloak Config CLI IAMGuarded image is automatically deployed as part of the Keycloak IAMGuarded Helm chart installation:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

The Keycloak Config CLI is included when you install the Keycloak chart with configuration enabled:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "keycloakConfigCli.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Keycloak Config CLI
keycloakConfigCli:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded
    digest: sha256:... # Use specific digest instead of tag
  configuration:
    # Your Keycloak configuration files
    "realm-config.json": |
      {
        "realm": "my-realm",
        "enabled": true
      }
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "keycloakConfigCli.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, the Keycloak Config CLI will automatically apply your configuration files to the Keycloak instance. You can verify successful configuration by checking the job logs and validating the configuration in the Keycloak admin console.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. The Keycloak Config CLI requires a running Keycloak instance and will automatically wait for it to be ready before applying configurations.

## Security Considerations

The Keycloak Config CLI IAMGuarded image provides security-minded defaults while ensuring secure configuration management. Store sensitive configuration data using Kubernetes secrets and reference them in your Helm values for enhanced security.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-shell

# rancher-shell
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-shell` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-shell/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

rancher-shell is the kubectl and helm installer image for Rancher

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Rancher Documentation

## Compatibility Notes
This image is comparable to the [rancher/shell](https://hub.docker.com/r/rancher/shell) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
### Docker
You can run the following command to use Chainguard's Rancher image:
```shell
docker run --rm  -it \
  cgr.dev/ORGANIZATION/rancher-shell:latest
```

### Kubernetes
For complete instructions on installing this image with Helm, please refer to the [Helm Chart documentation](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/install-upgrade-on-a-kubernetes-cluster). As a prerequisite, you may need to install `cert-manager` in your cluster.

The following is an example of how to use the Helm chart, using the Chainguard image.

Start by adding a `values.yaml` file to configure the Helm chart:
```yaml
cat <<EOF > values.yaml
image:
  rancherImage: cgr.dev/ORGANIZATION/rancher
  rancherImageTag: latest
  rancherImagePullPolicy: Always
postDelete:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/rancher-shell
    tag: latest
hostname: rancher.my.org
bootstrapPassword: admin
replicas: 1
debug: true
EOF
```

Add the Helm repository:
```shell
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
```

Then Install the chart:
```shell
helm install rancher rancher \
  --namespace cattle-system \
  --create-namespace \
  --values values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rails-fips

# rails-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rails-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rails-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ruby on Rails (often just called "Rails") is a web-application framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [Ruby image available from Docker Hub](https://hub.docker.com/_/ruby/) with the `rails` gems installed. Switching to the Chainguard image should not require any changes to your existing setup.

### FIPS Support

The ruby-on-rails-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Docker

You can run the following command to test Chainguard's Rails-FIPS image:

```shell
docker run --rm cgr.dev/ORGANIZATION/rails-fips:latest rails --version
```

The following is a minimal example of a Dockerfile that uses a single-stage build to run a Rails application:

```Dockerfile
FROM cgr.dev/ORGANIZATION/rails-fips:latest

WORKDIR /rails

# This assumes your Dockerfile is in the root directory of your Rails project
COPY . .

RUN bundle install

CMD [ "rails", "server", "-b", "0.0.0.0" ]
```

This image can be built with:

```shell
docker build -t my-new-tag .
```

You can then run the Rails app with the following command:

```shell
$ docker run --rm my-new-tag
=> Booting Puma
=> Rails 8.0.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.5.0 ("Sky's Version")
* Ruby version: ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +YJIT +PRISM [aarch64-linux-gnu]
*  Min threads: 3
*  Max threads: 3
*  Environment: development
*          PID: 1
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
```

## Documentation and Resources

* [Official Ruby on Rails Documentation](https://rubyonrails.org/docs).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cosign

# cosign
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cosign` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cosign/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Cosign images for signing and verifying images using Sigstore.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Like most other Chainguard Images, the Cosign image has few-to-zero CVEs and does not run as the root user.

## Getting Started
You can use the Cosign image to sign and verify container images via Docker or through automated workflows such as GitHub Actions.

### Verifying a container image signature
To verify an image signature, use the image to run Cosign's `verify` command. As of Cosign 2.0, Cosign defaults to using Sigstore's keyless mode, you'll need to also specify the OIDC issuer and signer identity to tell Cosign who you trust for the verification process.

For convenience, you can export those values as environment variables in your shell, and then tell Docker to pass those environment variables into the running Cosign container:

```shell
export COSIGN_CERTIFICATE_OIDC_ISSUER=https://token.actions.githubusercontent.com
export COSIGN_CERTIFICATE_IDENTITY=https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main
```

The following example uses the Cosign image to verify the signature of the Cosign image itself:

```
docker run --rm \
  -e COSIGN_CERTIFICATE_OIDC_ISSUER \
  -e COSIGN_CERTIFICATE_IDENTITY \
  cgr.dev/chainguard/cosign \
  verify cgr.dev/chainguard/cosign
```

### Signing a container image

The following GitHub Action will log into the registry, push an image, and then sign it with Cosign:

```yaml
on:
  workflow_dispatch:

env:
  IMAGE: ghcr.io/${{ github.repository }}
  DOCKER_CONFIG: .docker-tmp
jobs:
  push-and-sign:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      packages: write
    steps:
      - name: Log in to registry
        run: |
          set -x
          mkdir -p "${DOCKER_CONFIG}"
          echo '{}' > "${DOCKER_CONFIG}/config.json"
          echo "${{ github.token }}" | docker login \
            -u "${{ github.repository_owner }}" \
            --password-stdin ghcr.io
      - name: Push image with docker
        run: |
          set -x
          docker pull cgr.dev/chainguard/wolfi-base
          docker tag cgr.dev/chainguard/wolfi-base "${IMAGE}"
          docker push "${IMAGE}"
      - name: Sign image with cosign
        run: |
          set -x
          env | grep -v ^HOME= > github-actions.txt
          docker run --rm --env-file=./github-actions.txt \
            -v "${PWD}/${DOCKER_CONFIG}:/tmp/${DOCKER_CONFIG}" \
            -e DOCKER_CONFIG="/tmp/${DOCKER_CONFIG}" \
            cgr.dev/chainguard/cosign \
            sign "${IMAGE}" \
              --yes \
              -a sha=${{ github.sha }} \
              -a run_id=${{ github.run_id }} \
              -a run_attempt=${{ github.run_attempt }}
```

### Attesting to an image's SBOM

Another common use case for Cosign is attesting to an image's SBOM (software bill of materials). The following command creates an attestation of type `spdxjson` for an image based on the provided SBOM file and image digest:

```shell
docker run --rm cgr.dev/chainguard/cosign attest --type spdxjson \
 --predicate example-image.spdx.json \
 sha256:7f95c5aa7e789ad51737e03021586949346f38ced1533ecdcb2ef2b9104137ac

```

A detailed guide on how to sign an SBOM with Cosign is available on [Chainguard Academy](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/).

### Verifying an Attestation

Cosign can also be used to verify the identity of the person or entity issuing an attestation. To verify that an attestation was issued by a specific entity, we use the `cosign verify-attestation` command, specifying the email address of the issuer:

```shell
cosign verify-attestation \
 --certificate-oidc-issuer=https://github.com/login/oauth \
 --type https://spdx.dev/Document \
 --certificate-identity=emailaddress@emailprovider.com \
 sha256:7f95c5aa7e789ad51737e03021586949346f38ced1533ecdcb2ef2b9104137ac
```

If the identity is successfully verified, an initial message similar to the following is printed to stderr:

```shell
Verification for user/example-image@sha256:545a731e803b917daf44e292b03b427427f8090c4e6c4a704e4c18d56c38539f --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority certificates
Certificate subject: <you@domain.com>
Certificate issuer URL: https://github.com/login/oauth
```

## Configuration

The following environment variables are required when verifying a container image signature:

- `COSIGN_CERTIFICATE_OIDC_ISSUER`: Trusted OIDC issuer, example: `https://token.actions.githubusercontent.com`
- `COSIGN_CERTIFICATE_IDENTITY`: Trusted certificate identity, example: `https://github.com/chainguard-images/images/.github/workflows/release.yaml@refs/heads/main`

### Detailed Environment Information

To obtain detailed information about the environment, you can run the `cosign env` command:

```shell
docker run --rm cgr.dev/chainguard/cosign env --show-descriptions=false
```

You'll get output similar to this, containing the environment variables used to configure Cosign:

```shell
ACTIONS_ID_TOKEN_REQUEST_TOKEN=
ACTIONS_ID_TOKEN_REQUEST_URL=
BUILDKITE_AGENT_ACCESS_TOKEN=
BUILDKITE_AGENT_ENDPOINT=
BUILDKITE_AGENT_LOG_LEVEL=
BUILDKITE_JOB_ID=
COSIGN_DOCKER_MEDIA_TYPES=
COSIGN_EXPERIMENTAL=
COSIGN_MAX_ATTACHMENT_SIZE=
COSIGN_PASSWORD=
COSIGN_PKCS11_IGNORE_CERTIFICATE=
COSIGN_PKCS11_MODULE_PATH=
COSIGN_PKCS11_PIN=
COSIGN_REPOSITORY=
GITHUB_HOST=
GITHUB_TOKEN=
GITLAB_HOST=
GITLAB_TOKEN=
GOOGLE_SERVICE_ACCOUNT_NAME=
SIGSTORE_CT_LOG_PUBLIC_KEY_FILE=
SIGSTORE_ID_TOKEN=
SIGSTORE_REKOR_PUBLIC_KEY=
SIGSTORE_ROOT_FILE=
SIGSTORE_TSA_CERTIFICATE_FILE=
SOURCE_DATE_EPOCH=
SPIFFE_ENDPOINT_SOCKET=
COSIGN_CERTIFICATE_OIDC_ISSUER=******
COSIGN_CERTIFICATE_IDENTITY=******
```

## Documentation and Resources

- [Chainguard Academy: An Introduction to Cosign](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/)
- [Blog Post: Chainguard announces new Sigstore Images to bring critical software supply chain tooling to enterprises](https://www.chainguard.dev/unchained/chainguard-announces-new-sigstore-images-to-bring-critical-software-supply-chain-tooling-to-enterprises)
 - [Chainguard Academy: How to Sign an SBOM with Cosign](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-sign-an-sbom-with-cosign/)
- [Chainguard Academy: Verifying Chainguard Images and Metadata Signatures with Cosign](https://edu.chainguard.dev/chainguard/chainguard-images/verifying-chainguard-images-and-metadata-signatures-with-cosign/)

- [Video: Signing and Verifying Container Images With Sigstore Cosign and Kyverno ](https://www.youtube.com/watch?v=HLb1Q086u6M)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-operator-fips

# clickhouse-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for ClickHouse. Creates, configures and manages ClickHouse clusters running on Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Clickhouse Operator container image is comparable to [the clickhouse operator image](https://hub.docker.com/r/altinity/clickhouse-operator). Like most other Chainguard container images, the Clickhouse Operator container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's Clickhouse Operator container image can be installed via the [clickhouse-operator helm chart](https://github.com/Altinity/clickhouse-operator/tree/master/deploy/helm/clickhouse-operator).

Create a `values.yaml` file with the following values

```
operator:
  image:
    repository: cgr.dev/ORGANIZATION/clickhouse-operator
    tag: latest
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add clickhouse-operator https://github.com/Altinity/clickhouse-operator
helm install https://github.com/Altinity/clickhouse-operator deploy/helm -f values.yaml
```

We can then try creating a basic ClickHouse Cluster with the following manifest:

```
apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
  name: "simple-01"
spec:
  configuration:
    users:
      # printf 'test_password' | sha256sum
      test_user/password_sha256_hex: 10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01
      test_user/password: test_password
      # to allow access outside from kubernetes
      test_user/networks/ip:
        - 0.0.0.0/0
    clusters:
      - name: "simple"
```

Once cluster is created, we can verify it by running the following command:

```
kubectl get pods -n test-clickhouse-operator
NAME                    READY   STATUS    RESTARTS   AGE
chi-b3d29f-a242-0-0-0   1/1     Running   0          10m
```

## Documentation and Resources

- [Official Documentation](https://github.com/Altinity/clickhouse-operator/tree/master/docs)
- [Official Quick Start Guide](https://github.com/Altinity/clickhouse-operator/blob/master/docs/quick_start.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jellyfin

# jellyfin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jellyfin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jellyfin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-dind

# docker-dind
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-dind` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-dind/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for Docker in Docker (DinD), allowing you to run Docker within a container.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Docker Image is comparable to [the official Docker Image from Docker Hub](https://hub.docker.com/_/docker). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started

To use the image you can either run in privileged mode after mounting sock path or run the image with --privileged flag
As an example of how you can use this image, run the container in detached mode by passing the `-d` argument and bind the Docker socket:

```shell
docker run --rm -it -d -v /var/run/docker.sock:/var/run/docker.sock --name my-dind $IMAGE_NAME sh
```

Following that, you can interact with the container using `docker exec`:

```shell
docker exec -it my-dind docker info
docker exec -it my-dind docker version
docker exec -it my-dind docker images
docker exec -it my-dind docker run --rm cgr.dev/chainguard/busybox echo "Hello from BusyBox"
```
Another example of how you can use this image, run the container in privileged mode by passing the `--privileged` flag:
```shell
docker run --name my-privileged-dind --rm --privileged -d $IMAGE_NAME
```

Following that, you can interact with the container using `docker exec`:

```shell
docker exec -it my-dind docker info
docker exec -it my-dind docker version
docker exec -it my-dind docker images
docker exec -it my-dind docker run --rm cgr.dev/chainguard/busybox echo "Hello from BusyBox"
```

## Documentation and Resources
- [Docker in Docker usage docs](https://hub.docker.com/_/docker)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dask-kubernetes

# dask-kubernetes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dask-kubernetes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dask-kubernetes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Native Kubernetes integration for Dask

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Dask Kubernetes image is comparable to the [dask/dask-kubernetes-operator image](https://github.com/dask/dask-kubernetes/pkgs/container/dask-kubernetes-operator) maintained by Dask. Like most of Chainguard's container images, the Dask Kubernetes image was designed for minimalism and does not include things like a shell or package manager.

## Getting Started

### Install the operator
   ```bash
   helm repo add dask https://helm.dask.org
   helm install dask-k8s-operator dask/dask-kubernetes-operator \
     --set image.name=cgr.dev/ORGANIZATION/dask-kubernetes \
     --set image.tag=latest \
     --create-namespace -n dask-operator

Verify its running: 
  `kubectl get pods -n dask-operator`

To get started with a dask cluster and scale it run this python snippet: 
  ```
  from dask_kubernetes.operator import KubeCluster
  cluster = KubeCluster(
    name="my-dask-cluster",
    image="ghcr.io/dask/dask:latest"
  )
  cluster.scale(10)
  ```

You can see the dask worker nodes created above
```
kubectl get daskcluster -n default
kubectl get pods -l dask.org/cluster-name=my-dask-cluster
```

## Documentation and Resources

* [Official Dask Kubernetes documentation](https://docs.dask.org/en/latest/deploying-kubernetes.html#dask-kubernetes-operator)
* [Default `values.yaml` file for Dask Kubernetes](https://github.com/dask/dask-kubernetes/blob/main/dask_kubernetes/operator/deployment/helm/dask-kubernetes-operator/values.yaml)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-cloudwatch-agent-fips

# amazon-cloudwatch-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-cloudwatch-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-cloudwatch-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CloudWatch Agent enables you to collect and export host-level metrics and logs on instances running Linux or Windows server. 

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The `cloudwatch-agent` container image can be used in two ways:

1. Using Helm Charts
Below is an example of how to use the helm chart, overriding the upstream image with chainguard image:
```bash
helm repo add aws-observability https://aws-observability.github.io/helm-charts
helm repo update aws-observability
helm install amazon-cloudwatch-observability aws-observability/amazon-cloudwatch-observability \
  --create-namespace \
  --namespace amazon-cloudwatch \
  --set clusterName=my-cluster-name \
  --set region=my-cluster-region \
  --set agent.image.repository=amazon-cloudwatch-agent-fips \
  --set agent.image.repositoryDomainMap.public=cgr.dev/chainguard \
  --set agent.image.tag=latest
```

2. Using YAML Manifests
For using YAML manifests you can follow [the official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-metrics.html). You'll be required to replace the image where you deploy the daemonset to the cluster.

## Documentation and Resources

For full instructions on amazon-cloudwatch-agent, refer to [official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html) Please go through it to set the correct permissions. You'll be required to have push access to cloudwatch logs.

The GitHub repository can also be found on [GitHub](https://github.com/aws/amazon-cloudwatch-agent).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elasticsearch

# elasticsearch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elasticsearch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elasticsearch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `elasticsearch` container image is comparable to the [Elasticsearch image available from Elastic](https://www.docker.elastic.co/r/elasticsearch), but with the following notable differences:

- **JDK**
  - Elastic: Bundles JDK inside the distribution.
  - Chainguard: Uses the system-provided Chainguard JDK `/usr/lib/jvm/java-<version>-openjdk`. This means there is no `jdk/` directory in `/usr/share/elasticsearch`. This approach helps with patching and allows for smaller container images.
 
- **Config files**
  - Elastic: Ships `elasticsearch.yml` and `log4j2.properties`.
  - Chainguard: Includes `elasticsearch.yml` and `log4j2.properties`, plus example files like `elasticsearch.example.yml` (so upgrades don't overwrite your configs). You can drop in your own logging configurations if needed.

- **Logging behavior**
  - Elastic: JSON logs to stdout; no application log files (only garbage collection logs).
  - Chainguard: Defaults to plaintext logs to stdout and also writes log files under `/usr/share/elasticsearch/logs/` (e.g., `docker-cluster.log`, `docker-cluster_server.json`,`gc.log)`.
    - To restore upstream-style JSON-to-stdout and disable file logs, provide your own `log4j2.properties` in `/usr/share/elasticsearch/config/`.
   
- **Filesystem layout**
  - Elastic: Everything is installed under the `elasticsearch-<version>/` directory.
  - Chainguard: Follows distro conventions, installs into `/usr/share/elasticsearch/` and symlinks binaries to `/usr/bin/`.

## Getting Started

Run Elasticsearch in single-node mode:

```shell
docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  cgr.dev/ORGANIZATION/elasticsearch:latest
```

The `ES_JAVA_OPTS` environment variable sets the JVM heap size, which is essential for Elasticsearch performance and to prevent out-of-memory errors.

Test the cluster status:

```shell
curl http://localhost:9200
```
```json
{
  "name" : "a431c8b4f3b1",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "gKsPq8N4RiGQpidQ4289pA",
  "version" : {
    "number" : "9.0.2",
    "build_flavor" : "default",
    "build_type" : "docker"
    . . .
  },
  "tagline" : "You Know, for Search"
}
```

For data persistence, mount a volume to the data directory. Note that if you followed the previous example you will need to stop and remove the `elasticsearch` container in order to execute this example:

```shell
docker run -d \
  --name elasticsearch-persist \
  -p 9200:9200 \
  -v $(pwd)/elasticsearch-data:/usr/share/elasticsearch/data \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  cgr.dev/ORGANIZATION/elasticsearch:latest
```

## Documentation and Resources

- [Elasticsearch Docker Documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)
- [Elasticsearch REST API Reference](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-yet-another-cloudwatch-exporter-fips

# prometheus-yet-another-cloudwatch-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-yet-another-cloudwatch-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-yet-another-cloudwatch-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant Prometheus exporter for AWS CloudWatch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [yet-another-cloudwatch-exporter](https://quay.io/repository/prometheuscommunity/yet-another-cloudwatch-exporter) image. Switching to Chainguard's yet-another-cloudwatch-exporter image should not require any changes to your existing setup.

## Usage Instructions
The exporter will need to be running in an environment which has access to AWS. The exporter uses the AWS SDK for Go and supports providing authentication via AWS's default credential chain. Regardless of the method used to acquire the credentials, some permissions are needed for the exporter to work.

### Helm

To deploy prometheus-yet-another-cloudwatch-exporter on your Kubernetes cluster using Chainguard's prometheus-yet-another-cloudwatch-exporter-fips image, you can use the upstream chart's [Helm repository](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-yet-another-cloudwatch-exporter).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
  image:
    repository: ORGANIZATION/prometheus-yet-another-cloudwatch-exporter-fips
    tag: latest
    registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for yet-another-cloudwatch-exporter project](https://github.com/prometheus-community/yet-another-cloudwatch-exporter/blob/master/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-sidecar-fips

# k8s-sidecar-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-sidecar-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-sidecar-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-sentinel

# redis-sentinel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-sentinel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-sentinel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [redis-sentinel](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/) Image which is compatible with [Bitnami's](https://github.com/bitnami/containers/tree/main/bitnami/redis-sentinel)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `redis-sentinel` container image is comparable to the [Bitnami Redis Sentinel image](https://hub.docker.com/r/bitnami/redis-sentinel). It has all the functionality expected in Redis Sentinel, but in a secure, minimal container image.

## Getting Started

Create a basic Sentinel configuration file:

```shell
cat > sentinel.conf <<EOF
port 26379
sentinel monitor myinstance 127.0.0.1 6379 1
sentinel down-after-milliseconds myinstance 30000
sentinel failover-timeout myinstance 180000
sentinel parallel-syncs myinstance 1
EOF
```

Run `redis-sentinel` with the configuration:

```shell
docker run --rm -v $(pwd):/opt/bitnami/redis-sentinel/etc cgr.dev/ORGANIZATION/redis-sentinel:latest redis-sentinel /opt/bitnami/redis-sentinel/etc/sentinel.conf
```

This will instract Redis Sentinel to monitor a Redis instance at `127.0.0.1:6379`. The configuration file must be mounted to a writable location within the container.

## Documentation and Resources

- [Redis Sentinel Documentation](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/)
- [Bitnami Redis Sentinel Documentation](https://github.com/bitnami/containers/tree/main/bitnami/redis-sentinel)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubelet-csr-approver-fips

# kubelet-csr-approver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubelet-csr-approver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubelet-csr-approver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller to enable automatic kubelet CSR validation after a series of (configurable) security checks

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubelet-csr-approver-fips` container image is comparable to [the kubelet-csr-approver image](https://ghcr.io/postfinance/kubelet-csr-approver). Like most other Chainguard container images, the `kubelet-csr-approver-fips` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## FIPS Support

The `kubelet-csr-approver-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

The Chainguard's `kubelet-csr-approver-fips` container image can be installed via the [kubelet-csr-approver helm chart](https://github.com/postfinance/kubelet-csr-approver/tree/main/charts/kubelet-csr-approver).

Create a `values.yaml` file with the following values

```
operator:
  image:
    repository: cgr.dev/ORGANIZATION/kubelet-csr-approver-fips
    tag: latest
  providerRegex: '^node-\w*\.int\.company\.ch$'
  providerIpPrefixes: '192.168.8.0/22'
  maxExpirationSeconds: '86400'
  bypassDnsResolution: 'false'
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add kubelet-csr-approver https://postfinance.github.io/kubelet-csr-approver
helm install kubelet-csr-approver kubelet-csr-approver/kubelet-csr-approver -n kube-system -f values.yaml
```

We can then try creating a `CertificateSigningRequest` resource like below:

```
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: test-node-csr-valid
spec:
  request: $(base64 -w0 < /tmp/test-node.csr)
  signerName: kubernetes.io/kubelet-serving
  usages: ["digital signature","key encipherment","server auth"]
  groups: ["system:nodes"]
```

This should be Approved/Denied by the controller accordingly.

## Documentation and Resources

* [Official Quick Start](https://github.com/postfinance/kubelet-csr-approver?tab=readme-ov-file#quick-start)
* [Helm Chart](https://github.com/postfinance/kubelet-csr-approver/tree/main/charts/kubelet-csr-approver)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hugo

# hugo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hugo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hugo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This is a minimal [Hugo](https://gohugo.io/) image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Application Setup for End Users

The following is an example of using the Hugo image locally. It's based on the official [Hugo "quickstart"](https://gohugo.io/getting-started/quick-start/#commands) example.

To begin, start a shell in the Hugo developer (dev) container.

```shell
docker run -v $PWD/data:/home/data --entrypoint=/bin/sh -p 8080:8080 -it \
cgr.dev/chainguard/hugo:latest-dev
```

Create a new Hugo site using the quickstart commands.

```shell
hugo new site quickstart
```

Navigate into the new site's root directory.

```shell
cd quickstart
```

Initiate an empty Git repository 

```shell
git init
```

Clone a Hugo theme into the `themes` directory. 

```shell
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke
```

Add a line to the site's configuration file to let Hugo know to use the new theme.

```shell
echo "theme = 'ananke'" >> hugo.toml
```

Start the Hugo development server to serve the site. Be sure to change the default bind address and port to make the site accessible outside of the container.

```shell
hugo serve --bind 0.0.0.0 --port 8080
```

Now open your browser to [localhost:8080](http://localhost:8080) to visit the sample site.

When finished, you can press `CTRL + C` to stop the Hugo server from running, and then `CTRL + D` to exit the container shell.

If you're interested in enterprise support, SLAs, and access to older tags, [get in touch](https://www.chainguard.dev/contact?utm_source=docs).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra-iamguarded

# cassandra-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Cassandra distributed NoSQL database, compatible with iamguarded charts

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Cassandra IAMGuarded is a security-enhanced variant of Apache Cassandra designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Cassandra deployments.

## Helm Chart Installation

The Cassandra IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/cassandra
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install cassandra oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cassandra \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Cassandra image
image:
  registry: myregistry.example.com
  repository: mirrored/cassandra-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install cassandra oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cassandra@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cassandra
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/cassandra:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Cassandra IAMGuarded installation using standard Cassandra verification methods. The deployment functions as a standard Cassandra instance, so all typical Cassandra validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Cassandra IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Cassandra and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kiali-fips

# kiali-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kiali-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kiali-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-auto-ready

# crossplane-function-auto-ready
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-auto-ready` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-auto-ready/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This composition function automatically detects when composed resources are ready in Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-function-auto-ready` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/function-auto-ready](https://github.com/crossplane-contrib/function-auto-ready/pkgs/container/function-auto-ready) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Function

Deploy the function to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: function-auto-ready
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-auto-ready:latest
```

Apply this configuration:
```bash
kubectl apply -f function.yaml
```

Verify the function is healthy:
```bash
kubectl get functions
```

### Using the Function

The function-auto-ready automatically detects when composed resources are ready. A resource is considered ready when:

1. Another function added the resource to the desired state
2. The resource exists in the observed state
3. The resource has a "Ready: True" status condition

Example Composition using the auto-ready function:

```yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: example-composition
spec:
  compositeTypeRef:
    apiVersion: example.io/v1alpha1
    kind: XDatabase
  mode: Pipeline
  pipeline:
  - step: auto-ready
    functionRef:
      name: function-auto-ready
```

For detailed usage examples and documentation, refer to the [upstream project](https://github.com/crossplane-contrib/function-auto-ready#function-auto-ready).

## Documentation and Resources
- [Crossplane Functions Documentation](https://docs.crossplane.io/v2.0/packages/functions/)
- [Upstream Project](https://github.com/crossplane-contrib/function-auto-ready)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### deck-fips

# deck-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/deck-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/deck-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

deck is a command-line interface for managing Kong Gateway configurations declaratively

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `deck-fips` container image is comparable to the [Kong/deck](https://github.com/Kong/deck) image, with the following differences:

* Like all other Chainguard Images, `deck-fips` features a stripped down, minimal design
* It has few-to-zero CVEs

### FIPS Support
The `deck-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Validating Kong Configuration Files

Create a simple Kong configuration file:

```sh
cat > kong-config.yaml << 'EOF'
_format_version: "3.0"
services:
  - name: example-service
    url: http://httpbin.org
    routes:
      - name: example-route
        paths:
          - /example
EOF
```

Validate the configuration file:

```sh
docker run --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/deck-fips:latest file validate kong-config.yaml
```

## Documentation and Resources

- **[Official Documentation](https://developer.konghq.com/index/deck/)**
- **[GitHub Repository](https://github.com/Kong/deck)**
- **[Get Started Guide](https://developer.konghq.com/deck/get-started/)**
- **[Gateway Documentation](https://developer.konghq.com/gateway/get-started/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1314

# request-1314
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1314` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1314/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-nri-statsd

# newrelic-nri-statsd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-nri-statsd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-nri-statsd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The StatsD integration lets you easily get StatsD data into New Relic

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To run the container, you can use the following command:

```bash
docker run \
  -d --restart unless-stopped \
  --name newrelic-statsd \
  -h $(hostname) \
  -e NR_ACCOUNT_ID=YOUR_ACCOUNT_ID \
  -e NR_API_KEY=NEW_RELIC_LICENSE_KEY
  -p 8125:8125/udp \
  cgr.dev/chainguard/newrelic-nri-statsd:latest
```

Here is the link to get more detail about it, [official documentation](https://docs.newrelic.com/docs/more-integrations/open-source-telemetry-integrations/statsd/statsd-monitoring-integration/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### perl-fips

# perl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/perl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/perl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Perl applications with FIPS.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `perl-fips` Chainguard Image provides a minimal Perl runtime suitable for workloads such as web applications, CLI utilities, interfacing with APIs, or other tasks.
For external dependencies we provide a `-dev` variant which contains the `cpan`, `cpanm` and `cpm` package managers, `apk` and the `busybox` shell and utilities.

### FIPS Support

The `perl-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

- However, due to Perl being an interpreted language there may be external libraries that are not strictly compliant with OpenSSL's FIPS provider module, any external dependency should be reviewed before being executed in a FIPS environment

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it cgr.dev/ORGANIZATION/perl-fips:latest
```

## Example: HTTP server using external library

The following build demonstrates how a standard HTTP server could be implemented using Chainguard's perl development image.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/perl-http-server && cd $_
```

Next, write a file defining your HTTP server (`app.pl`):

```perl
#!/usr/bin/env perl
use strict;
use warnings;
use HTTP::Daemon;

my $d = HTTP::Daemon->new(LocalPort => 8080) or die "Can't create server: $!";
print "Server running at: " . $d->url . "\n";

while (my $c = $d->accept) {
    while (my $r = $c->get_request) {
        # Here you can write handlers for HTTP requests
        $c->send_response(HTTP::Response->new(200, "OK", ['Content-Type' => 'text/plain'], "Hello, Perl!"));
    }
    $c->close;
    undef $c;
}
```
Write a `Dockerfile` to define our image build:

```Dockerfile
FROM cgr.dev/ORGANIZATION/perl-fips:latest-dev

COPY ./app.pl /

RUN cpanm HTTP::Daemon

ENTRYPOINT [ "perl" ]
CMD [ "/app.pl" ]
```

Build the image, tagging it `perl-http-server`:

```shell
docker build -t "localhost/perl-http-server:latest" .
```

Run the image exposing the port defined in the application code:

```sh
docker run -p 8080:8080 localhost/perl-http-server:latest
```

You should see output similar to the following on the container logs:

```
Server running at: http://127.0.0.1:8080/
```

When fetching the contents of `localhost:8080` via a tool like `curl`, you will see the following:

```
Hello, Perl!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### harbor-exporter

# harbor-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/harbor-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/harbor-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolf-based image for Harbor Exporter - application for monitoring harbor deployments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running harbor exporter. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's harbor-exporter image maintains functional parity with the [upstream image](https://hub.docker.com/r/goharbor/harbor-exporter/tags).

## Getting Started
### Kubernetes

To deploy harbor exporter on Kubernetes, you can use the Helm chart provided by goharbor. Add Helm repository:

```shell
helm repo add harbor https://helm.goharbor.io
helm repo update
```

Override the default image repository and tag in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
exporter:
  image:
    repository: cgr.dev/ORGANIZATION/harbor-exporter
    tag: latest
EOF
```

Then, install the charts with the following command:

```shell
helm install harbor harbor -f values.yaml --wait
```

## Documentation and Resources
- [Harbor Helm Chart](https://github.com/goharbor/harbor-helm/tree/main)
- [Harbor documentation](https://goharbor.io/docs/2.2.0/administration/metrics/)
- [Harbor GitHub](https://github.com/goharbor/harbor/tree/main)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-bundle-fips

# images/valkey-bundle-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/valkey-bundle-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/valkey-bundle-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey bundle with pre-installed modules for extended functionality.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Compliance

This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Compatibility Notes

The `valkey-bundle-fips` image is the FIPS-validated variant of the `valkey-bundle` image. It is based on the upstream [Valkey](https://github.com/valkey-io/valkey) project and includes several popular Valkey modules pre-installed:

- **valkey-bloom**: Probabilistic data structures (Bloom filters, Cuckoo filters, Count-Min Sketch, Top-K)
- **valkey-json**: Native JSON data type support
- **valkey-search**: Full-text search and secondary indexing
- **valkey-ldap**: LDAP authentication support

This image includes `openssl-config-fipshardened` to enable FIPS-compliant cryptographic operations.

This image differs from the standard `valkey` image in the following ways:

- Includes pre-loaded modules for extended functionality
- Uses `bundle-docker-entrypoint.sh` as the entrypoint to automatically load modules
- Configured for FIPS-compliant cryptographic operations

> [!NOTE]
> For Valkey 8.0, the bloom module uses `valkey-bloom` built with `--features valkey_8_0` for compatibility.
> For Valkey <9.0, the bloom module uses an older version of `valkey-search` for compatibility.

## Getting Started

To run `valkey-bundle-fips` with Docker:

```sh
docker run -p 6379:6379 cgr.dev/ORGANIZATION/valkey-bundle-fips:latest
```

You should see output indicating that Valkey has started with the modules loaded.

To verify the modules are loaded, connect with the Valkey CLI:

```sh
docker run --rm -it cgr.dev/ORGANIZATION/valkey-bundle-fips:latest valkey-cli -h host.docker.internal MODULE LIST
```

This will display a list of loaded modules including bloom, json, and search.

## Using Valkey Modules

### JSON Module

The JSON module provides native support for storing, updating, and querying JSON documents directly in Valkey. This eliminates the need to serialize/deserialize JSON data in your application code, enabling atomic operations on nested JSON structures and efficient memory usage through binary storage.

**Example: Store and retrieve JSON data:**

```sh
valkey-cli JSON.SET user:1 $ '{"name":"Alice","age":30}'
```
```
OK
```

```sh
valkey-cli JSON.GET user:1 $.name
```
```
"[\"Alice\"]"
```

### Bloom Filter Module

The Bloom module provides probabilistic data structures for efficient membership testing and cardinality estimation. Bloom filters allow you to check if an element "possibly exists" or "definitely does not exist" in a set, using significantly less memory than storing the actual elements.

**Example: Create a Bloom filter and test membership:**

```sh
valkey-cli BF.ADD myfilter item1
```
```
(integer) 1
```

```sh
valkey-cli BF.EXISTS myfilter item1
```
```
(integer) 1
```

### Search Module

The Search module adds full-text search and secondary indexing capabilities to Valkey. It enables complex queries across your data without external search infrastructure, supporting text search, numeric filtering, geo-spatial queries, and aggregations.

**Example: Create a search index on JSON documents:**

```sh
valkey-cli FT.CREATE idx:users ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC
```
```
OK
```

```sh
valkey-cli FT.SEARCH idx:users "@name:Alice"
```

## Users and Directories

By default, this image runs as a non-root user named `valkey` with a uid of 65532. The default working directory is `/data`, which is writable by the `valkey` user.

## Documentation and Resources

- [Valkey Documentation](https://valkey.io/docs/)
- [Valkey GitHub Repository](https://github.com/valkey-io/valkey)
- [Valkey-Bundle GitHub Repository](https://github.com/valkey-io/valkey-bundle)
- [FIPS Compliance with Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-provider-aws-fips

# secrets-store-csi-driver-provider-aws-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-provider-aws-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-provider-aws-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5220

# gha-runner-scale-set-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gha-runner-scale-set-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gha-runner-scale-set-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller for GitHub Actions self-hosted runners

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### authentik

# authentik
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/authentik` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/authentik/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Authentik](https://goauthentik.io/) is an open-source Identity Provider that provides single sign-on with support for SAML, OAuth2/OIDC, LDAP, and RADIUS protocols.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started with Docker

To run Authentik with Docker, you'll need to set up a PostgreSQL database and configure both the server and worker components. Authentik requires a shared network for the containers to communicate.

### Step 1: Create a Docker Network

```bash
docker network create authentik
```

### Step 2: Start a PostgreSQL database

```bash
docker run -d -p 5432:5432 \
  --name authentik-postgres \
  --network authentik \
  -e POSTGRES_DB=authentik \
  -e POSTGRES_USER=authentik \
  -e POSTGRES_PASSWORD=changeme \
  cgr.dev/ORGANIZATION/postgres:latest
```

### Step 3: Start the Authentik server

```bash
docker run -d -p 9000:9000 -p 9443:9443 \
  --name authentik-server \
  --network authentik \
  -e AUTHENTIK_SECRET_KEY=your-very-long-secret-key-at-least-50-characters-long \
  -e AUTHENTIK_POSTGRESQL__HOST=authentik-postgres \
  -e AUTHENTIK_POSTGRESQL__NAME=authentik \
  -e AUTHENTIK_POSTGRESQL__USER=authentik \
  -e AUTHENTIK_POSTGRESQL__PASSWORD=changeme \
  cgr.dev/ORGANIZATION/authentik:latest server
```

### Step 4: Start the Authentik worker

```bash
docker run -d \
  --name authentik-worker \
  --network authentik \
  -e AUTHENTIK_SECRET_KEY=your-very-long-secret-key-at-least-50-characters-long \
  -e AUTHENTIK_POSTGRESQL__HOST=authentik-postgres \
  -e AUTHENTIK_POSTGRESQL__NAME=authentik \
  -e AUTHENTIK_POSTGRESQL__USER=authentik \
  -e AUTHENTIK_POSTGRESQL__PASSWORD=changeme \
  -e AUTHENTIK_BOOTSTRAP_PASSWORD=bootstraptestpassword \
  -e AUTHENTIK_BOOTSTRAP_TOKEN=bootstraptesttoken \
  cgr.dev/ORGANIZATION/authentik:latest worker
```

The Authentik UI will be accessible at `http://localhost:9000`.

To view logs from the server or worker:

```bash
docker logs -f authentik-server
docker logs -f authentik-worker
```

## Getting started with Kubernetes

Authentik can be deployed to Kubernetes using [the official Helm chart](https://artifacthub.io/packages/helm/goauthentik/authentik).

### Step 1: Create a PostgreSQL instance

Startup postgres pod and expose the service inside the cluster.

```bash
kubectl run postgres-test \
  --image=cgr.dev/ORGANIZATION/postgres:latest \
  --port=5432 \
  --labels='app=postgres-test' \
  --env='POSTGRES_DB=authentik' \
  --env='POSTGRES_USER=authentik' \
  --env='POSTGRES_PASSWORD=changeme' \
  --restart=Never

kubectl expose pod postgres-test \
  --name=postgres-test \
  --port=5432 --target-port=5432 \
  --type=ClusterIP
```

Wait for Postgres pod to be ready.
```bash
kubectl wait --for=condition=ready pod \
  --selector app=postgres-test \
  --timeout=30s
```

### Step 2: Add the Authentik Helm repository

```bash
helm repo add authentik https://charts.goauthentik.io
helm repo update
```

### Step 3: Create a `values.yaml` file to override the default image:

```bash
cat <<EOF > authentik-values.yaml
global:
  image:
    repository: cgr.dev/ORGANIZATION/authentik
    tag: latest

authentik:
  secret_key: "your-very-long-secret-key-at-least-50-characters-long"
  bootstrap_password: "bootstraptestpassword"
  bootstrap_token: "bootstraptesttoken"
  postgresql:
    host: "postgres-test.default.svc.cluster.local"
    name: "authentik"
    user: "authentik"
    password: "changeme"

server:
  service:
    servicePortHttp: 9000
    servicePortHttps: 9443
EOF
```

### Step 4: Install Authentik

```bash
helm install authentik authentik/authentik -f authentik-values.yaml
```

Wait for the Authentik server and worker to be ready:

```bash
kubectl rollout status deployment/authentik-server --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/component=server --timeout=30s

kubectl rollout status deployment/authentik-worker --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/component=worker --timeout=30s
```

Port-forward the authentik-server service to access the Authentik UI:
```bash
kubectl port-forward svc/authentik-server 9000:9000
```

The UI can now be accessed at `http://localhost:9000`

### Step 5: Configuring Authentik as an OAuth2/OIDC Provider

Authentik can act as an identity provider for other applications using OAuth2 and OpenID Connect. This section demonstrates how to configure Authentik to provide authentication for Grafana.

#### Overview

To integrate Grafana with Authentik OAuth, you need to:
1. Retrieve Authentik's default flow and property mapping IDs
2. Create an OAuth2 provider with client credentials
3. Create an application in Authentik that links the provider
4. Deploy Grafana with OAuth configuration pointing to Authentik

#### Prerequisites

Before configuring the OAuth2 provider, ensure you have:
- Authentik server running and accessible
- The bootstrap token configured during installation
- `curl` and `jq` installed for API calls

Set environment variables for the API calls:

> [!NOTE]
> Use the bootstrap token from your installation

```bash
export AUTHENTIK_URL="http://localhost:9000"
export TOKEN="bootstraptesttoken"
```

#### Retrieve Required Flow and Mapping IDs

First, retrieve the default flows and property mappings that Authentik uses for OAuth:

```bash
# Get authentication flow ID (handles user login)
AUTH_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-authentication-flow") | .pk')

# Get authorization flow ID (handles OAuth consent)
AUTHZ_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-provider-authorization-implicit-consent") | .pk')

# Get invalidation flow ID (handles logout)
INVAL_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-provider-invalidation-flow") | .pk')

# Get property mappings for OAuth scopes
EMAIL_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-email") | .pk')

OPENID_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-openid") | .pk')

PROFILE_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-profile") | .pk')
```

#### Create OAuth2 Provider

Create an OAuth2 provider for Grafana with the retrieved IDs:

> [!NOTE]
> Update the `redirect_uris` URL to match your Grafana deployment URL.
> The Grafana redirect URL used in this guide is set to: 
> `http://localhost:3000/login/generic_oauth`

```bash
curl -sk -X POST "${AUTHENTIK_URL}/api/v3/providers/oauth2/" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "grafana-provider",
    "authentication_flow": "'"${AUTH_FLOW_PK}"'",
    "authorization_flow": "'"${AUTHZ_FLOW_PK}"'",
    "invalidation_flow": "'"${INVAL_FLOW_PK}"'",
    "property_mappings": [
      "'"${EMAIL_MAPPING}"'",
      "'"${OPENID_MAPPING}"'",
      "'"${PROFILE_MAPPING}"'"
    ],
    "client_type": "confidential",
    "client_id": "grafana-client-id",
    "client_secret": "grafana-client-secret",
    "access_code_validity": "minutes=1",
    "access_token_validity": "minutes=5",
    "refresh_token_validity": "days=30",
    "include_claims_in_id_token": true,
    "redirect_uris": [
      {
        "matching_mode": "strict",
        "url": "http://localhost:3000/login/generic_oauth"
      }
    ],
    "sub_mode": "hashed_user_id",
    "issuer_mode": "per_provider"
  }'
```

#### Create Application in Authentik

Retrieve the provider ID and create an application that links it:

```bash
# Get the provider ID
PROVIDER_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/providers/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.name=="grafana-provider") | .pk')

# Create the application
curl -sk -X POST "${AUTHENTIK_URL}/api/v3/core/applications/" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "grafana",
    "slug": "grafana",
    "provider": '"${PROVIDER_PK}"',
    "launch_url": "http://grafana.default.svc.cluster.local:3000",
    "open_in_new_tab": false,
    "policy_engine_mode": "any"
  }'
```

#### Deploy Grafana with OAuth Configuration

Create a Kubernetes secret for Grafana OAuth credentials:

```bash
kubectl create secret generic grafana-oauth \
  --from-literal=GF_AUTH_GENERIC_OAUTH_CLIENT_ID=grafana-client-id \
  --from-literal=GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=grafana-client-secret
```

Create a Grafana values file with OAuth configuration:

> [!NOTE]
> Update the `root_url` to match your Grafana deployment URL.
> The Grafana `root_url` used in this guide is set to: 
> `http://localhost:3000/`
>
> Also update the `signout_redirect_url` and `auth_url` to match your Authentik deployment URL.
> The Authentik `signout_redirect_url` and `auth_url` used in this guide is set to:
> `http://localhost:9000/`

```bash
cat <<EOF > grafana-values.yaml
image:
  registry: cgr.dev/ORGANIZATION
  repository: grafana
  tag: latest

envFromSecret: grafana-oauth

service:
  port: 3000
  targetPort: 3000

grafana.ini:
  server:
    root_url: http://grafana.default.svc.cluster.local:3000
  auth:
    signout_redirect_url: http://localhost:9000/application/o/grafana/end-session/
  auth.generic_oauth:
    name: authentik
    enabled: true
    disable_login_form: true
    scopes: openid profile email
    auth_url: http://localhost:9000/application/o/authorize/
    token_url: http://authentik-server.default.svc.cluster.local:9000/application/o/token/
    api_url: http://authentik-server.default.svc.cluster.local:9000/application/o/userinfo/
    role_attribute_path: contains(groups, 'Grafana Admins') && 'Admin' || contains(groups, 'Grafana Editors') && 'Editor' || 'Viewer'
EOF
```

Install Grafana using Helm:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana grafana/grafana -f grafana-values.yaml
```

Wait for Grafana to be ready:

```bash
kubectl rollout status deployment/grafana --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/name=grafana --timeout=30s
```

Port-forward the grafana service to access the Grafana UI:
```bash
kubectl port-forward svc/grafana 3000:3000
```

The UI can now be accessed at `http://localhost:3000`

#### Testing the OAuth Integration

To test the integration:

1. Access the Grafana UI at `http://localhost:3000`
2. Click "Sign in with authentik"
3. You'll be redirected to Authentik's login page
4. Log in with the bootstrap admin credentials:
   - Username: `akadmin`
   - Password: `bootstraptestpassword` (or your configured password)
5. After successful authentication, you'll be redirected back to Grafana

## Documentation and Resources
- [Authentik Documentation](https://docs.goauthentik.io/)
- [Authentik GitHub Repository](https://github.com/goauthentik/authentik)
- [Helm Chart Documentation](https://artifacthub.io/packages/helm/goauthentik/authentik)
- [Authentik Helm Chart Repository](https://github.com/goauthentik/helm)

For a complete list of configuration options, refer to the [Authentik configuration documentation](https://docs.goauthentik.io/docs/installation/configuration).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgwatch

# pgwatch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgwatch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgwatch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

pgwatch image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying Pgwatch
Pgwatch can be deployed using the community managed [pgwatch helm chart](https://github.com/cybertec-postgresql/pgwatch-charts/tree/main/helm/pgwatch).

```bash
helm repo add pgwatch https://cybertec-postgresql.github.io/pgwatch-charts
helm repo update

helm install pgwatch pgwatch/pgwatch

```
In case the upstream link is not available, the helm chart can be manually cloned and installed.

```bash
git clone https://github.com/cybertec-postgresql/pgwatch-charts.git
cd pgwatch-chart/helm/pgwatch

helm install pgwatch -n pgwatch
```

To use the Chainguard pgwatch image instead of the default implementation, configure your values to use the hardened image:

```yaml
#values.yaml
pgwatch:
  image: "cgr.dev/ORGANIZATION/pgwatch:latest"
# Additional configuration as required
```

Note that in some cases, the upstream helm chart does not automatically configure the `crc-storageclass`, causing deployment to hang. You can resolve this by manually configuring the storageClass.

```yaml
#crc-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: crc-csi-hostpath-provisioner
provisioner: rancher.io/local-path
parameters:
 hostPath: /tmp/k8s-local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: false
```

```
kubectl apply -f crc-storageclass.yaml
```

## Documentation and Resources

- [Pgwatch Helm Chart](https://github.com/cybertec-postgresql/pgwatch-charts/tree/main/helm/pgwatch)
- [Database Bootstrapping with Pgwatch](https://pgwat.ch/latest/howto/config_db_bootstrap.html)
- [Sink Bootstrapping with Pgwatch](https://pgwat.ch/latest/howto/metrics_db_bootstrap.html)
- [Upstream Repository](https://github.com/cybertec-postgresql/pgwatch/tree/master)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rekor-fips

# rekor-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rekor-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rekor-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### renovate-fips

# renovate-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/renovate-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/renovate-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This Chainguard `renovate-fips` container image is a FIPS-compliant variant of the upstream [Renovate image](https://hub.docker.com/r/renovate/renovate). It maintains full compatibility with the standard Renovate functionality while providing FIPS-validated cryptographic libraries for environments requiring FIPS 140-2 compliance.

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Check the Renovate version:

```shell
docker run --rm cgr.dev/ORGANIZATION/renovate-fips:latest --version
```

Run Renovate to scan a repository for dependency updates:

```shell
export RENOVATE_TOKEN=your_github_token_here
docker run --rm -e RENOVATE_TOKEN="${RENOVATE_TOKEN}" cgr.dev/ORGANIZATION/renovate-fips:latest --dry-run owner/repository
```

The `--dry-run` flag ensures Renovate logs what it would do without making actual changes.

## Documentation and Resources

- [Renovate Documentation](https://docs.renovatebot.com/)
- [Configuration Options](https://docs.renovatebot.com/configuration-options/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opa-fips

# opa-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opa-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opa-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open Policy Agent (OPA) is an open source, general-purpose policy engine..

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See https://github.com/open-policy-agent/opa for more documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### boky-postfix

# boky-postfix
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/boky-postfix` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/boky-postfix/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

boky-postfix is an open-source Mail Transfer Agent that reliably sends and receives email. With Rspamd integration, it uses Rspamd’s built-in DKIM signing module to cryptographically sign outgoing emails, simplifying mail authentication and improving deliverability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `boky-postfix` container image is comparable to the [boky/postfix](https://github.com/bokysan/docker-postfix) image on Docker Hub, with the following differences:

* Chainguard Postfix image replaces the unmaintained OpenDKIM with modern Rspamd, providing secure, reliable DKIM signing while maintaining full compatibility with standard Postfix configurations
* DKIM keys need to be generated manually using `rspamadm dkim_keygen` and volume-mounted for persistence across container restarts.
* `DKIM_SELECTOR` and `DKIM_AUTOGENERATE` environment variables are not supported. Rspamd uses static, pre-generated keys with config-based paths, unlike OpenDKIM's dynamic, file-based key generation via environment variables.
* Like all other Chainguard Containers, `boky-postfix` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

Run the Postfix image with gmail SMTP relay:

```bash
docker run -d --name postfix-test \
  -p 1587:587 \
  -e RELAYHOST="[smtp.gmail.com]:587" \
  -e RELAYHOST_USERNAME="your-email@gmail.com" \
  -e RELAYHOST_PASSWORD="your-app-password" \
  -e POSTFIX_smtp_tls_security_level="encrypt" \
  -e ALLOWED_SENDER_DOMAINS="gmail.com" \
  -e INBOUND_DEBUGGING=1 \
  cgr.dev/ORGANIZATION/boky-postfix:latest
```

### Services startup

Check if all services are running:

```bash
docker exec postfix-test ps aux | grep -E "(postfix|rspamd|supervisord)" | grep -v grep
```

### Verify SMTP Connection

```bash
telnet localhost 1587
```

### Email delivery

```bash
docker exec postfix-test bash -c '
echo "From: test@localhost
To: test@example.com
Subject: Test Email from Postfix
Content-Type: text/plain; charset=UTF-8

This is a test email from the Chainguard Postfix image.

This email should now display the body correctly.
The key was adding a blank line between headers and body.

Best regards,
Postfix Test" | /usr/bin/sendmail -t'
```

Check mail queue:
```bash
docker exec postfix-test mailq
```

## Configuration

### DKIM Key Management

For DKIM key generation, it follows rspamd's security model of manual key management, ensuring proper key control and DNS coordination.

#### Key Generation and Storage

- **Keys are generated manually** using `rspamadm dkim_keygen` command
- **Keys are stored** in `/var/lib/rspamd/dkim` directory
- **This directory is volume-mounted** for persistence across container restarts
- **New containers do NOT create new keys** - they use existing keys from the volume mount

#### Production Deployment

For production use:

**Generate keys once and mount them:**
  - Generate DKIM keys manually using `rspamadm dkim_keygen`
  - Mount the keys directory as a volume: `-v /host/path/dkim:/etc/rspamd/dkim`
  - Keys persist across container restarts and updates

#### DNS Configuration

After generating keys, you must manually add the public key to your domain's DNS as a TXT record. The DNS record format is provided by the `rspamadm dkim_keygen` command output. For more information, check the [rspamd's DKIM signing module documentation](https://docs.rspamd.com/modules/dkim_signing/)

## Documentation and Resources

- **[Postfix Official Documentation](https://www.postfix.org/documentation.html)**
- **[Postfix GitHub Repository](https://github.com/vdukhovni/postfix)**
- **[Ubuntu Server Postfix Installation and Configuration Guide](https://documentation.ubuntu.com/server/how-to/mail-services/install-postfix/)**
- **[Rspamd DKIM Signing Module Documentation](https://docs.rspamd.com/modules/dkim_signing/)**
- **[Install and Integrate Rspamd Guide - Linuxize](https://linuxize.com/post/install-and-integrate-rspamd/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-cli-fips

# docker-cli-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-cli-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-cli-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [Docker CLI](https://github.com/docker/cli) container image.

This image contains solely the Docker CLI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Compliance

Docker CLI has been built to use FIPS compliant cryptography internally when communicating with dockerd. This does not mean that anything built
or ran with the CLI is inherently FIPS compliant.

## Usage

When using Docker CLI, volume mount the Docker socket in the container:

```bash
docker run -v /var/run/docker.sock:/var/run/docker.sock cgr.dev/ORGANIZATION/docker-cli-fips:latest ...
```

Command line options:

```
Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Log in to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information

Management Commands:
  builder     Manage builds
  checkpoint  Manage checkpoints
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  plugin      Manage plugins
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Swarm Commands:
  config      Manage Swarm configs
  node        Manage Swarm nodes
  secret      Manage Swarm secrets
  service     Manage Swarm services
  stack       Manage Swarm stacks
  swarm       Manage Swarm

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

Global Options:
      --config string      Location of client config files (default
                           "/home/nonroot/.docker")
  -c, --context string     Name of the context to use to connect to the
                           daemon (overrides DOCKER_HOST env var and
                           default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket to connect to
  -l, --log-level string   Set the logging level ("debug", "info",
                           "warn", "error", "fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default
                           "/home/nonroot/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default
                           "/home/nonroot/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default
                           "/home/nonroot/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Run 'docker COMMAND --help' for more information on a command.

For more help on how to use Docker, head to https://docs.docker.com/go/guides/
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### boring-registry-fips

# boring-registry-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/boring-registry-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/boring-registry-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-network-policy-agent

# aws-network-policy-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-network-policy-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-network-policy-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Amazon EKS Network Policy Agent is a daemonset that is responsible for
enforcing configured network policies on the cluster. Network policy support is a feature of the
[Amazon VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s).

## Prerequisites
* You need to install Network Policy Controller in your cluster before you
can enable the feature in [Amazon VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s).
* Network Policy Agent expects the BPF FS (/sys/fs/bpf) to be mounted.
* PolicyEndpoint CRD needs to be installed in the cluster. Installing Network
Policy Controller will automatically install the CRD.

## Installation
For installation instructions, visit the [Amazon VPC CNI Install Guide](https://github.com/aws/amazon-vpc-cni-k8s?tab=readme-ov-file#setup).

## Installation using Helm chart

* Add the repo first
```shell
helm repo add eks https://aws.github.io/eks-charts
```

* Replace with Chainguard image, and enable network policy enforcement.
```shell
helm install aws-vpc-cni --namespace kube-system eks/aws-vpc-cni --set nodeAgent.image.override=cgr.dev/chainguard/aws-network-policy-agent --set enableNetworkPolicy=true
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-iamguarded

# flux-helm-controller-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-helm-controller-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-helm-controller-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

minimal zero CVE flux images

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Flux IAMGuarded is a security-enhanced variant of Flux designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Flux deployments.

## Helm Chart Installation

The Flux IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/flux
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install flux oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Helm Controller image
helmController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-helm-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Kustomize Controller image
kustomizeController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-kustomize-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Notification Controller image
notificationController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-notification-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Source Controller image
sourceController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-source-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Image Automation Controller image
imageAutomationController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-image-automation-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Image Reflector Controller image
imageReflectorController:
  image:
    registry: myregistry.example.com
    repository: mirrored/flux-image-reflector-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install flux oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/flux
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/flux:2.1.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Flux IAMGuarded installation:

```bash
kubectl get po -n flux-system
```

You should see Flux controller pods running:

```bash
NAME                                           READY   STATUS     RESTARTS    AGE
flux-automation-controller-7f68666bff-j6447    1/1     Running    0           70s
flux-helm-controller-f5f499667-2gz95           1/1     Running    0           70s
flux-kustomize-controller-79dfd8fd4d-gkd2x     1/1     Running    0           70s
flux-notification-controller-b6857989f-psgvg   1/1     Running    0           70s
flux-reflector-controller-fbb74dcc8-dlzpd      1/1     Running    0           70s
flux-source-controller-68cf5d8fdb-fsfps        1/1     Running    0           70s
```

For more information on Flux, including follow-on steps on how to validate the installation, please refer to [Getting started with Flux](https://fluxcd.io/flux/get-started/).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mlflow

# mlflow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mlflow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mlflow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [Wolfi](https://github.com/wolfi-dev)-based image for MLflow, an open source platform for the machine learning lifecycle.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### MLflow Usage

MLflow's default entrypoint is Python, enabling us to run experiments directly:

```bash
docker run -it cgr.dev/chainguard/mlflow:latest <your experiment>.py
```

Otherwise, we can override the entrypoint and interact with MLflow:

```bash
docker run -it --entrypoint mlflow cgr.dev/chainguard/mlflow:latest <options>
```

### MLflow Tracking Usage

MLflow provides a UI, MLflow Tracking, that allows the user to track 'runs' (the execution of data science code) via visualizations of metrics, parameters, and artifacts.

To start the UI, open a terminal and run:

```bash
docker run -it -p 5000:5000 --entrypoint mlflow cgr.dev/chainguard/mlflow:latest ui
```

While the UI defaults to running on port 5000, you can use a different port via passing `-p <PORT>` as a command line option. Ensure Docker also maps to the correct port.

You should now be able to access the UI at [localhost:5000](http://localhost:5000).

The Tracking API can now be leveraged to record metrics, parameters, and artifacts:

```python
import mlflow

# Set the MLflow tracking URI
mlflow.set_tracking_uri("http://localhost:5000")

# Start an experiment
mlflow.set_experiment("my_experiment")

with mlflow.start_run():
    # Log parameters, metrics, and artifacts
    mlflow.log_param("param1", value1)
    mlflow.log_metric("metric1", value2)
    mlflow.log_artifact("path/to/artifact")
    # Train and log model
    mlflow.sklearn.log_model(model, "model")
```

Ensure that the tracking URI correctly reflects where the MLflow server is running.

For additional documentation covering MLflow Tracking, see the [official docs](https://mlflow.org/docs/latest/tracking.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nfs-subdir-external-provisioner-fips

# nfs-subdir-external-provisioner-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nfs-subdir-external-provisioner-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nfs-subdir-external-provisioner-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

NFS subdir external provisioner is an automatic provisioner for Kubernetes that
uses your already configured NFS server, automatically creating Persistent
Volumes.

For more information, visit the [GitHub repository](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner).

## Install via helm
To install `nfs-subdir-external-provisioner-fips` via helm, pass in the
Chainguard image as values when deploying:

```bash
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set image.repository=cgr.dev/ORGANIZATION/nfs-subdir-external-provisioner-fips \
    --set image.tag=latest \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/exported/path
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-auth-fips

# kubernetes-dashboard-auth-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-auth-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-auth-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-auth` component handles the authentication processes
for the Kubernetes API, ensuring secure access and integration with the
Dashboard. It manages user tokens and sessions for seamless communication
between the dashboard UI and the API server.

## Usage
To deploy `kubernetes-dashboard-auth-fips` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set auth.image.repository = cgr.dev/ORGANIZATION/kubernetes-dashboard-auth-fips \
--set auth.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary
permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to
access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components,
refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ingress-nginx-controller-iamguarded

# ingress-nginx-controller-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ingress-nginx-controller-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ingress-nginx-controller-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 Ingress-NGINX Controller for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Ingress NGINX Controller IAMGuarded is a security-enhanced variant of Ingress NGINX Controller designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Ingress NGINX Controller deployments.

## Helm Chart Installation

The Ingress NGINX Controller IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-ingress-controller oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/ingress-nginx-controller-iamguarded
  digest: sha256:... # Use specific digest instead of tag

defaultBackend:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-ingress-controller oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-ingress-controller
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx-ingress-controller:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Ingress NGINX Controller IAMGuarded installation using standard Ingress NGINX Controller verification methods. The deployment functions as a standard Ingress NGINX Controller instance, so all typical Ingress NGINX Controller validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Ingress NGINX Controller IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Ingress NGINX Controller and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### litestream

# litestream
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/litestream` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/litestream/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for [litestream](https://litestream.io), to replicate SQLite databases.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. Please refer to the [Docker container guide](https://litestream.io/guides/docker/) or the [Kubernetes guide](https://litestream.io/guides/kubernetes/) for more details.

Instead of specifying `litestream/litestream`, use `cgr.dev/chainguard/litestream:latest`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyterhub-k8s-network-tools

# jupyterhub-k8s-network-tools
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyterhub-k8s-network-tools` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyterhub-k8s-network-tools/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Network diagnostic tools for use within a JupyterHub Kubernetes cluster

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
To deploy jupyterhub-k8s-network-tools with helm chart, you can use the following commands:
```sh
# Add repository
$ helm repo add jupyterhub https://hub.jupyter.org/helm-chart/

# Install chart
$ helm install my-jupyterhub jupyterhub/jupyterhub \
    --set singleuser.networkTools.image.name=cgr.dev/chainguard-private/jupyterhub-k8s-network-tools \
    --set singleuser.networkTools.image.tag=latest
```

For more information on using the network tools, refer to the official [zero to jupyterhub documentation](https://z2jh.jupyter.org/en/stable/index.html) and the [github repository](https://github.com/jupyterhub/zero-to-jupyterhub-k8s/tree/main).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb

# mongodb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MongoDB](https://www.mongodb.com/) is a document-oriented database management system. MongoDB is a popular example of a NoSQL database, and stores data in JSON-like documents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's MongoDB container image is comparable to [the official `mongo` image](https://hub.docker.com/_/mongo) available on Docker Hub. 

Like most of Chainguard's images, the MongoDB image does not operate as the root user and includes only the minimum packages needed to function. This means it doesn't include things like a shell or package manager.

## Getting Started

Here's one example of how Chainguard's MongoDB container image can be run:

```shell
docker run -d --rm -it -p 27017:27017 cgr.dev/chainguard/mongodb --bind_ip_all --noauth
```

This example includes Docker's `-d` argument, which will cause the container to run in the background, as well as the `-p` argument, which publishes the container's port `27017` to the host machine's port `27017`. It also includes MongoDB's `--bind_ip_all` and `--noauth` arguments. These bind the `mongod` process to all IP addresses and instruct it to run without security, respectively. 

> [!WARNING]
> These selections are not recommended for production environments, but they are useful for testing that the MongoDB image is working properly.

Following that, connect to the MongoDB deployment with `mongosh`, the MongoDB shell:

```shell
mongosh --port 27017
```

Once connected, you can interact with the running MongoDB instance. For example, you can insert a new document:

```
test> db.products.insertOne( { item: "card", qty: 15 } )
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('662141e9a1519b8bd2ac3fc4') }
}
```

You can also run `mongosh` methods and commands to interact with the MongoDB deployment. For example, `show collections` will list the collection you just created with the previous `insertOne` method:

```
test> show collections
products
```

## Documentation and Resources
* [MongoDB Documentation](https://www.mongodb.com/docs/)
* [Upstream `mongo` image](https://hub.docker.com/_/mongo)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promxy-fips

# promxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Promxy, FIPS compliant.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Promxy fips

The Chainguard promxy image contains the [promxy](https://github.com/jacksontj/promxy) server binary. The image is meant to be a drop-in replacement for the existing `promxy` images built based on upstream Dockerfile.

Promxy requires configuration to be passed - which can be done as follows:

```
docker run --volume /path/to/config.yaml:/config.yaml cgr.dev/chainguard/promxy
ts=2024-10-29T14:15:10.640Z caller=manager.go:941 level=info msg="Starting rule manager..."
time="2024-10-29T14:15:15Z" level=info msg="promxy starting with HTTP..."
```

To provide configuration in another path and/or provide additional command line flags, simply pass them as arguments to the image - such as:

```
docker run ... cgr.dev/chainguard/promxy --config /data/config.yaml --check-config
/data/config.yaml if valid promxy config file syntax
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-bit-watcher-fips

# fluent-bit-watcher-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-bit-watcher-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-bit-watcher-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow-fips

# kubeflow-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubeflow is a Machine Learning Toolkit for Kubernetes with FIPS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard `kubeflow-fips` images are compatible with kubeflow project images. Switching to Chainguard image should not require any changes to your existing setup.

### FIPS support

Chainguard's `kubeflow-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
There are kustomize files available for deploying these images to a Kubernetes cluster using the official Kubeflow GitHub [repository](https://github.com/kubeflow/manifests).

For each component, follow these steps:

1. Create a `kustomization.yaml` as shown.
2. Run:
```bash
kubectl apply -k .
```

### Notebook Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/jupyter/notebook-controller/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/notebook-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-notebook-controller-fips
    newTag: latest
namespace: kubeflow
```

### Profile Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/tree/master/applications/profiles/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/profile-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-profile-controller-fips
    newTag: latest
namespace: kubeflow
```

### PVCViewer Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/pvcviewer-controller/upstream/base/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/pvcviewer-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-pvcviewer-controller-fips
    newTag: latest
namespace: kubeflow
```

### Tensorboard Controller
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/tensorboard/tensorboard-controller/upstream/base/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/kubeflow/tensorboard-controller
    newName: cgr.dev/ORGANIZATION/kubeflow-tensorboard-controller-fips
    newTag: latest
namespace: kubeflow
```

### Access Management
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/profiles/upstream/overlays/kubeflow/kustomization.yaml
images:
  - name: ghcr.io/kubeflow/kubeflow/kfam
    newName: cgr.dev/ORGANIZATION/kubeflow-access-management-fips
    newTag: latest
namespace: kubeflow
```

### Admission Webhook
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/admission-webhook/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/poddefaults-webhook
    newName: cgr.dev/ORGANIZATION/kubeflow-admission-webhook-fips
    newTag: latest
namespace: kubeflow
```

### Jupyter Web App
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/tree/master/applications/jupyter/jupyter-web-app/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow-jupyter-web-app
    newName: cgr.dev/ORGANIZATION/kubeflow-jupyter-web-app-fips
    newTag: latest
namespace: kubeflow
```

### Volumes Web App
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/kubeflow/manifests/blob/master/applications/volumes-web-app/upstream/base
images:
  - name: ghcr.io/kubeflow/kubeflow/volumes-web-app
    newName: cgr.dev/ORGANIZATION/kubeflow-volumes-web-app-fips
    newTag: latest
namespace: kubeflow
```

---

## Final Step

After defining the kustomization for each component:

```bash
kubectl apply -k .
```

## Documentation & Resources
Please refer to the upstream [documentation](https://www.kubeflow.org/) for a [getting started](https://www.kubeflow.org/docs/started/) guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-for-fluent-bit

# aws-for-fluent-bit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-for-fluent-bit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-for-fluent-bit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [aws-for-fluent-bit](https://github.com/aws/aws-for-fluent-bit) Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

See the [official usage documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-using-fluentbit.html) on AWS.

Run:

```sh
docker run --rm cgr.dev/chainguard/aws-for-fluent-bit
```

## Known Issues

### The Enable_Entity option is not supported
The original AWS image uses Fluent-Bit 1.9.10 which was end of life in December 2022.

AWS released a "patch" for the 1.9.10 version which adds the `Enable_Entity` option. At the time of writing there is no equivalent patch for current versions of Fluent-Bit.

This has been raised with the Fluent-Bit project as a [feature request](https://github.com/fluent/fluent-bit/issues/10340) in the hope that they can update the patch. Until this change is made, however, this image cannot support the `Enable_Entity` option.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-elasticsearch-exporter-iamguarded-fips

# prometheus-elasticsearch-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-elasticsearch-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-elasticsearch-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Elasticsearch Exporter image for exporting various metrics about Elasticsearch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-elasticsearch-exporter-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus Elasticsearch Exporter IAMGuarded is a security-enhanced variant of Prometheus Elasticsearch Exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Prometheus Elasticsearch Exporter deployments.

## Helm Chart Installation

The Elasticsearch IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Elasticsearch image
image:
  registry: myregistry.example.com
  repository: mirrored/elasticsearch-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Elasticsearch exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-elasticsearch-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctlImage:
  registry: myregistry.example.com
  repository: mirrored/os-shell-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for copying TLS certificates
copyTlsCerts:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Kibana image (if enabled)
kibana:
  image:
    registry: myregistry.example.com
    repository: mirrored/elasticsearch-kibana
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install elasticsearch oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/elasticsearch
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/elasticsearch:16.0.2
   Digest: sha256:9ec24375344b5161756f11d49d3011655c44fa2e40244d7fbecaa0b20eee2eeb
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Elasticsearch IAMGuarded installation using standard Elasticsearch verification methods. The deployment functions as a standard Elasticsearch instance, so all typical Elasticsearch validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Elasticsearch IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Elasticsearch and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bats-fips

# bats-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bats-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bats-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Bats provides a simple way to verify that the UNIX programs you write behave as expected.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Bats Image is comparable to the [Bats Image from Docker Hub](https://hub.docker.com/r/bats/bats). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

### FIPS Support

The `bats-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

- However, due to Bash being an interpreted language there may be external libraries that are not strictly compliant with OpenSSL's FIPS provider module, any external dependency should be reviewed before being executed in a FIPS environment

## Getting started

As an example of how you can use this image, first create a test file named `test.bats`:

```
cat > test.bats <<EOF
#!/usr/bin/env bats

@test "addition using bc" {
  result="$(echo 2+2 | bc)"
  [ "$result" -eq 4 ]
}

@test "addition using dc" {
  result="$(echo 2 2+p | dc)"
  [ "$result" -eq 4 ]
}
EOF
```

Then run the following `docker` command:

```shell
docker run --rm -it \
  -v "$(pwd)":/code \
  cgr.dev/ORGANIZATION/bats-fips:latest \
  test.bats
```

Note these two arguments included in this command:

- `-v "$(pwd)":/code`: Mount the current directory (where test.bats is located) into the container at /code
- `test.bats`: This is passed as an argument to the default entrypoint (`bash bats`) to execute the test file.

## Documentation and Resources
- [Official bats-core documentation](https://bats-core.readthedocs.io/en/stable/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-iamguarded-fips

# argocd-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

argocd-iamguarded-fips is the FIPS-enabled IAMGuarded version of [Argo CD](https://argo-cd.readthedocs.io/en/stable/), a declarative continuous deployment tool for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Argo CD IAMGuarded FIPS is a FIPS 140-2 compliant, security-enhanced variant of Argo CD designed to be deployed using its companion IAMGuarded Helm chart. This image provides all Argo CD components (server, repo-server, application-controller, and cmp-server) with FIPS-validated cryptography in addition to the security benefits of IAMGuarded deployments.

## FIPS Compliance

This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Helm Chart Installation

The Argo CD IAMGuarded FIPS Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/argocd
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name, specifying the FIPS image:

```bash
helm install argocd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd \
  --namespace argocd \
  --create-namespace \
  --set "global.org=$ORGANIZATION" \
  --set "global.image.repository=argocd-iamguarded-fips"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### FIPS Image Configuration
To use the FIPS-enabled image:
- Set `global.image.repository` to `argocd-iamguarded-fips`
- All Argo CD components will use the FIPS-compliant image

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for FIPS image configuration:
```yaml
global:
  org: YOUR_ORGANIZATION
  image:
    repository: argocd-iamguarded-fips

# Or for individual image configuration:
image:
  registry: myregistry.example.com
  repository: mirrored/argocd-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install argocd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd@sha256:DIGEST \
     --namespace argocd \
     --create-namespace \
     --set "global.org=$ORGANIZATION" \
     --set "global.image.repository=argocd-iamguarded-fips"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/argocd:11.0.2
   Digest: sha256:083c999b293bd86aa63204e7a41325efa2c2ac4bca21cbd890b5eb5897d243ec
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

4. **FIPS Validation**: Verify FIPS mode is active by checking container logs for successful FIPS initialization messages.

## Validation

After deployment, validate your Argo CD IAMGuarded FIPS installation using standard Argo CD verification methods. The deployment functions as a standard Argo CD instance, so all typical Argo CD validation procedures apply. Additionally, verify FIPS mode is active in container logs.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Argo CD IAMGuarded FIPS chart provides FIPS-compliant, security-minded defaults while acknowledging the cluster-specific nature of both Argo CD and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4270

# request-4270
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4270` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4270/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Python, gdal, ffmpeg, goobject and MD5 support Bundled Image

A custom image request for `Axon`, provides a `bundled` container image,
containing most importantly, `python-3.11`, `py3.11-gdal` and `ffmpeg` with other additional required dependencies for each and support for MD5in OpenSSL.

## Image contents

This bundled image contains the following packages to be more precise:

* `bash`
* `py3.11-gdal`
* `ffmpeg`
* `openssl`

and also their dependencies.

## Running the packages

### `bash`

```shell
/bin/bash
```

### `ffmpeg`

Refer to the [ffmpeg](https://images.chainguard.dev/directory/image/ffmpeg/overview)
image documentation for more information.

Entrypoint:

```shell
/usr/bin/ffmpeg
```

Example using Docker:

```shell
docker run --rm \
    -v "${PWD}:/work" \
    -w /work \
    --entrypoint /usr/bin/ffmpeg \
    cgr.dev/chainguard-private/request-4270:latest \
    -i sample.mov \
    -vcodec h264 \
    -acodec aac \
    /tmp/sample.mp4
```

### gdal

Refer to the [gdal](https://pypi.org/project/GDAL/)Documentation for more information

Example using Docker:

```shell
docker run --rm \
  cgr.dev/chainguard-private/request-4270:latest \
  python -c '
    from osgeo import gdal

    # Create a GeoTIFF file
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create("checkerboard.tif", 50, 50, 1, gdal.GDT_Byte)
    band = dataset.GetRasterBand(1)

    # Fill the image with a checkerboard pattern
    for i in range(50):
      for j in range(50):
        if (i // 10 + j // 10) % 2 == 0:
          band.WriteRaster(j, i, 1, 1, bytes([255]))

    # Close the dataset to flush changes to disk
      dataset = None'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cadvisor

# cadvisor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cadvisor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cadvisor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[cAdvisor (Container Advisor)](https://github.com/google/cadvisor) provides container users an understanding of the resource usage and performance characteristics of their running containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

See the [RUNNING.md](https://github.com/google/cadvisor/blob/master/docs/running.md) for the instructions. For the [Kubernetes deployment](https://github.com/google/cadvisor/tree/master/deploy/kubernetes), you can use the Kustomize:

```bash
cat <<EOF >> kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/google/cadvisor/deploy/kubernetes/base?ref=master
images:
  - name: gcr.io/cadvisor/cadvisor
    newName: cgr.dev/chainguard/cadvisor
    newTag: latest
namespace: cadvisor
EOF
kubectl apply -k .
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubescape-http-request

# kubescape-http-request
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubescape-http-request` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubescape-http-request/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Simple HTTP request utility for making HTTP/HTTPS requests with customizable headers and methods

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream `quay.io/kubescape/http-request` image. All command-line options and functionality are fully compatible with the upstream version.

## Getting Started

The http_request binary is the entrypoint for this container image. It supports the following options:

```bash
# Make a simple HTTP GET request
docker run cgr.dev/ORGANIZATION/kubescape-http-request:latest \
  -method GET \
  -scheme http \
  -host example.com \
  -path /

# Make an HTTPS POST request with custom headers
docker run cgr.dev/ORGANIZATION/kubescape-http-request:latest \
  -method POST \
  -scheme https \
  -host api.example.com \
  -path /api/endpoint \
  -headers "Content-Type: application/json" \
  -path-body /path/to/body.json
```

## Documentation and Resources

The kubescape-http-request utility is part of the Kubescape project, a comprehensive Kubernetes security platform. For more information:

- [http-request Source Code](https://github.com/kubescape/http-request)
- [Kubescape Documentation](https://kubescape.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kapp-controller-fips

# kapp-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kapp-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kapp-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Continuous delivery and package management for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatekeeper

# gatekeeper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatekeeper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatekeeper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [Gatekeeper](https://open-policy-agent.github.io/gatekeeper) image for enforcing Kubernetes policies using Open Policy Agent

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `Gatekeeper` image is a drop-in replacement for the upstream `openpolicyagent/gatekeeper` controller image. It is fully compatible with the official [Gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper) and supports all core functionality, including admission webhook validation, constraint enforcement, audit, and metrics. This image is designed to be minimal, secure alternative and runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [opa/gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `Gatekeeper` helm chart

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update
helm install gatekeeper/gatekeeper --name-template=gatekeeper --namespace gatekeeper-system --create-namespace -f values.yaml --wait
```

## Documentation
- [Official Gatekeeper documentation](https://open-policy-agent.github.io/gatekeeper/website/docs/)
- [Gatekeeper Github Repository](https://github.com/open-policy-agent/gatekeeper/tree/master)
- [Gatekeeper Helm Chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pdns-recursor

# pdns-recursor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pdns-recursor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pdns-recursor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PowerDNS Recursor is a non authoritative/recursing DNS server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard pdns-recursor image is comparable to the [pdns-recursor image on Docker Hub](https://hub.docker.com/u/powerdns?page=1&search=recursor). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

## Getting Started

### Running with Docker

To run pdns-recursor using Docker, you can use the following command:

```shell
docker run \
    -p 53:53/tcp \
    -p 53:53/udp \
    -p 8082:8082 \
    cgr.dev/ORGANIZATION/pdns-recursor:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the following below resources for further usage details.

## Resources
- [Getting Started](https://doc.powerdns.com/recursor/getting-started.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-no-backend-fips

# tritonserver-no-backend-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-no-backend-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-no-backend-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

This is a **FIPS-compliant base image** of Triton Inference Server that does **not include any pre-installed inference backends**. It provides the core Triton server infrastructure (HTTP, GRPC, and metrics services) and CUDA toolkit, with FIPS 140-3 validated cryptography.

For a complete Triton FIPS image with common backends (Python, ONNX Runtime, OpenVINO, TensorRT) pre-installed, see the `tritonserver-fips` image.

### FIPS Support
The `tritonserver-no-backend-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Use Cases

This base image is ideal for:

- Custom FIPS-compliant Triton deployments requiring specific backend versions
- Minimizing image size while maintaining FIPS compliance
- Building specialized FIPS-compliant inference servers with custom backend combinations
- Multi-stage Docker builds where backends are added separately to a FIPS-compliant base

## Getting Started

### Basic Health Check

You can verify the base server functionality with an empty model repository:

```sh
docker run -d --name triton-base-fips \
  -p 8000:8000 -p 8001:8001 \
  cgr.dev/ORGANIZATION/tritonserver-no-backend-fips:latest \
  --model-repository=/models
```

Check server health:

```sh
curl http://localhost:8000/v2/health/live
curl http://localhost:8000/v2/health/ready
```

Query server metadata:

```sh
curl http://localhost:8000/v2
```

### Building Custom Images

Use this as a base image to add your own backends while maintaining FIPS compliance:

```dockerfile
FROM cgr.dev/ORGANIZATION/tritonserver-no-backend-fips:latest

# Add your custom backends or models
COPY --from=custom-backend /path/to/backend /opt/tritonserver/backends/
COPY models/ /models/

ENTRYPOINT ["/opt/tritonserver/bin/tritonserver"]
CMD ["--model-repository=/models"]
```

## What's Included

- Triton Inference Server core binary
- CUDA 12.9 toolkit
- HTTP, GRPC, and Metrics service infrastructure
- TensorRT binaries (for model conversion utilities)
- FIPS 140-3 validated OpenSSL cryptographic module

## What's NOT Included

This image does not include any inference backends. For backend support, you need to:

1. Use the full `tritonserver-fips` image with pre-installed backends, or
2. Build a custom image layering your required backends on top of this FIPS-compliant base image

## Documentation and Resources

- [Triton Inference Server Documentation](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html)
- [Triton Backend Repository](https://github.com/triton-inference-server/backend)
- [FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### emissary

# emissary
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/emissary` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/emissary/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Helm

```sh
helm repo add datawire https://app.getambassador.io
helm repo update
helm install emissary-ingress --namespace emissary datawire/emissary-ingress --set image.repository=cgr.dev/chainguard/emissary
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-microsoft-azure

# velero-plugin-for-microsoft-azure
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-microsoft-azure` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-microsoft-azure/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Velero plugin for Microsoft Azure that provides backup and restore functionality for Azure Blob Storage and Azure Disk snapshots

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `velero-plugin-for-microsoft-azure` image is fully compatible with the public [Velero plugin for Microsoft Azure](https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure). This image includes both the VolumeSnapshotter and ObjectStore plugins required for Azure integration:

* **VolumeSnapshotter**: Handles Azure Disk snapshots for persistent volume backups
* **ObjectStore**: Manages backups stored in Azure Blob Storage

The plugin is designed to be used as an init container with Velero deployments, following the standard Velero plugin architecture. There are no breaking changes from the public implementation.

## Getting Started

The `velero-plugin-for-microsoft-azure` image is designed to be used as an init container in Velero deployments. The image contains a `cp-plugin` command that copies the plugin binary to a shared volume where Velero can load it.

Here's an example of using this image with a Velero deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: velero
  namespace: velero
spec:
  template:
    spec:
      serviceAccountName: velero
      initContainers:
      - name: velero-plugin-for-microsoft-azure
        image: cgr.dev/ORGANIZATION/velero-plugin-for-microsoft-azure:latest
        volumeMounts:
        - mountPath: /target
          name: plugins
      containers:
      - name: velero
        image: cgr.dev/ORGANIZATION/velero:latest
        command:
        - /velero
        args:
        - server
        - --plugin-dir=/plugins
        volumeMounts:
        - name: plugins
          mountPath: /plugins
      volumes:
      - name: plugins
        emptyDir: {}
```

When the init container runs, it will copy the plugin binary to `/target/velero-plugin-for-microsoft-azure`, making it available to the Velero server in the `/plugins` directory.

You can also install Velero with this plugin using the official Velero CLI:

```sh
velero install \
  --provider azure \
  --plugins cgr.dev/ORGANIZATION/velero-plugin-for-microsoft-azure:latest \
  --bucket my-backup-bucket \
  --secret-file ./credentials-velero
```

## Configuration

To use this plugin, you'll need to configure Velero with Azure-specific settings. Create a `BackupStorageLocation` resource:

```yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: azure
  namespace: velero
spec:
  provider: velero.io/azure
  objectStorage:
    bucket: my-backup-bucket
    prefix: velero-backups
  config:
    resourceGroup: my-resource-group
    storageAccount: mystorageaccount
    subscriptionId: 00000000-0000-0000-0000-000000000000
```

For Azure Disk snapshots, create a `VolumeSnapshotLocation`:

```yaml
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
  name: azure
  namespace: velero
spec:
  provider: velero.io/azure
  config:
    resourceGroup: my-resource-group
    subscriptionId: 00000000-0000-0000-0000-000000000000
```

You'll also need to provide Azure credentials to Velero. Create a secret with your Azure service principal credentials:

```sh
cat > credentials-velero <<EOF
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_ID=<your-client-id>
AZURE_CLIENT_SECRET=<your-client-secret>
AZURE_RESOURCE_GROUP=<your-resource-group>
AZURE_CLOUD_NAME=AzurePublicCloud
EOF

kubectl create secret generic cloud-credentials \
  --namespace velero \
  --from-file cloud=credentials-velero
```

## Documentation and Resources

* [Velero plugin for Microsoft Azure documentation](https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure)
* [Velero supported providers documentation](https://velero.io/docs/supported-providers/)
* [Azure Backup documentation](https://learn.microsoft.com/en-us/azure/backup/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zabbix-agent2-fips

# zabbix-agent2-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zabbix-agent2-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zabbix-agent2-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-validated Wolfi-based Zabbix Agent 2 for monitoring hosts and sending metrics to Zabbix Server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `zabbix-agent2-fips` image is a FIPS-validated variant of the [Zabbix Agent 2 image](https://hub.docker.com/r/zabbix/zabbix-agent2). It is built with a FIPS 140-2 validated OpenSSL cryptographic module, runs as a non-root user (`zabbix` with UID 1997, GID 1995), and is built on Wolfi for a minimal attack surface.

### SMART Disk Monitoring

This image includes `smartmontools` for disk health monitoring but does **not** ship `sudo`. The upstream image uses sudo to allow the zabbix user to run `smartctl` with root privileges, but this increases the attack surface.

To enable SMART disk monitoring, use Linux capabilities instead of sudo:

**Docker:**
```shell
docker run -d \
  --name zabbix-agent2-fips \
  --cap-add SYS_RAWIO \
  -e ZBX_HOSTNAME="my-host" \
  -e ZBX_SERVER_HOST="zabbix-server" \
  cgr.dev/ORGANIZATION/zabbix-agent2-fips:latest
```

**Kubernetes:**
```yaml
securityContext:
  capabilities:
    add: ["SYS_RAWIO"]
```

This approach is more secure than sudo because it grants only the specific capability needed for `smartctl` without exposing the full sudo attack surface.

## Getting Started

### Docker

Run the FIPS-validated Zabbix Agent 2 container:

```shell
docker run -d \
  --name zabbix-agent2-fips \
  -e ZBX_HOSTNAME="my-host" \
  -e ZBX_SERVER_HOST="zabbix-server" \
  -e ZBX_SERVER_PORT="10051" \
  -p 10050:10050 \
  cgr.dev/ORGANIZATION/zabbix-agent2-fips:latest
```

With custom configuration file:

```shell
docker run -d \
  --name zabbix-agent2-fips \
  -v /path/to/zabbix_agent2.conf:/etc/zabbix/zabbix_agent2.conf:ro \
  -p 10050:10050 \
  cgr.dev/ORGANIZATION/zabbix-agent2-fips:latest \
  --foreground -c /etc/zabbix/zabbix_agent2.conf
```

### Kubernetes with Helm

Deploy using the [zabbix-community Helm chart](https://github.com/zabbix-community/helm-zabbix):

```shell
helm repo add zabbix-community https://zabbix-community.github.io/helm-zabbix/
helm repo update

helm install zabbix zabbix-community/zabbix -f values.yaml
```

Create a `values.yaml` file:

```yaml
zabbixAgent:
  enabled: true
  runAsDaemonSet: true
  image:
    repository: cgr.dev/ORGANIZATION/zabbix-agent2-fips
    tag: latest
zabbixServer:
  enabled: false
zabbixProxy:
  enabled: false
zabbixWeb:
  enabled: false
postgresql:
  enabled: false
```

## Documentation and Resources

- [Zabbix Agent 2 Documentation](https://www.zabbix.com/documentation/current/en/manual/concepts/agent2)
- [Zabbix Docker GitHub Repository](https://github.com/zabbix/zabbix-docker)
- [Zabbix Community Helm Chart](https://github.com/zabbix-community/helm-zabbix)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-admission-webhook

# prometheus-admission-webhook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-admission-webhook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-admission-webhook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Admission webhook for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage

For full instructions on prometheus-operator, refer to the
[official documentation](https://prometheus-operator.dev).
The GitHub repository can also be [found here](https://github.com/prometheus-operator/prometheus-operator).

To deploy Prometheus Admission Webhook via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2077)

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-operator prometheus-community/kube-prometheus-stack \
 --set prometheusOperator.admissionWebhooks.deployment.image.registry=cgr.dev \
 --set prometheusOperator.admissionWebhooks.deployment.image.repository=chainguard/prometheus-operator-admission-webhook \
 --set prometheusOperator.admissionWebhooks.deployment.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-event-exporter-fips

# kubernetes-event-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-event-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-event-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist [wolfi](https://github.com/wolfi-dev)-based FIPS image of [Kubernetes Event Exporter](https://github.com/resmoio/kubernetes-event-exporter). Exports Kubernetes events to various outputs to be used for observability or alerting purposes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The upstream project provides Kubernetes manifests which can be used to deploy
this image. Please see the [GitHub README](https://github.com/resmoio/kubernetes-event-exporter)
for more information. This directs users to the `deploy` sub-directory of the
repository.

If using these reference manifests, you'll need to ensure you update the image
reference in [02-deployment.yaml](https://github.com/resmoio/kubernetes-event-exporter/blob/master/deploy/02-deployment.yaml)
to use this Chainguard image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dragonfly-operator-fips

# dragonfly-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dragonfly-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dragonfly-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant Kubernetes operator used to deploy and manage Dragonfly instances inside your Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image is meant to work as a drop-in replacement for the
[operator image](https://www.dragonflydb.io/docs/managing-dragonfly/operator/installation).

This FIPS-compliant variant includes additional cryptographic modules and configurations to meet Federal Information Processing Standards (FIPS) requirements.

## Getting Started
The Chainguard dragonfly-operator-fips image can be deployed using the helm chart residing in the dragonfly-operator github repo. At time of writing there does not appear to be a published helm chart.

```bash
git clone https://github.com/dragonflydb/dragonfly-operator.git
cd dragonfly-operator
helm install operator charts/dragonfly-operator --set manager.image.repository=cgr.dev/ORGANIZATION/dragonfly-operator-fips --set manager.image.tag=latest
```

For more information about FIPS compliance in Chainguard images, please refer to our [FIPS documentation](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jdk

# jdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based Java JDK image using [OpenJDK](https://openjdk.org/projects/jdk/).  Used for compiling Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Like most available alternatives, Chainguard's JDK image is built directly from the [OpenJDK project](https://openjdk.org/). The Chainguard JDK image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The JDK is the standard development system for a Java application. It is used for compiling and packaging Java applications, which are then run on a JRE.

### Compiling a Minimal Java Application Example

This section outlines how you can build a Java application with the Chainguard JDK Image.

Start by creating a sample Java class named `HelloWolfi`:

```sh
cat >HelloWolfi.java <<EOL
class HelloWolfi
{
    public static void main(String args[])
    {
        System.out.println("Hello Wolfi users!");
    }
}
EOL
```

Then create a multistage Dockerfile, adding the Java class you just created:

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/chainguard/jdk

COPY HelloWolfi.java /home/build/
RUN javac HelloWolfi.java

FROM cgr.dev/chainguard/jre

COPY --from=0 /home/build/HelloWolfi.class /app/
CMD ["HelloWolfi"]
EOL
```

Following that, you can build the image:

```sh
docker build -t my-java-app .
```

Note that this example tags the image with `my-java-app`. You can now run the image by referencing this tag, as in the following command:

```sh
docker run my-java-app
```
```
Hello Wolfi users!
```

### Using the Chainguard JDK image in a Jenkins Pipeline

Using a Chainguard Image as part of a CI/CD system like Jenkins might also be a useful option. With the Jenkins Docker agent, you can define multiple steps that use different Chainguard Images. The following is an example using the Chainguard JDK image as part of a Jenkins pipeline:

```
pipeline {
    agent {
        docker { image 'cgr.dev/chainguard/jdk' }
    }
    stages {
        stage('Test') {
            steps {
                # Use javac, jdeps, jlink, ...
                sh 'javac -version'
            }
        }
    }
}
```

For a full reference on using various images in a Jenkins pipeline, please refer to the [Jenkins documentation](https://www.jenkins.io/doc/book/pipeline/docker/).

### Using the Chainguard JDK to create a custom JRE

A less common, but powerful, use case for the JDK image is creating an optimized custom JRE for your Java application. This involves using `jdeps` to produce the information about the Java modules being used and subsequently using `jlink` to analyze your application to eliminate all module code not being used by your application. This can create a drastically smaller JRE for a particular application.

Keep in mind that a JRE produced this way is a fit-for-purpose JRE, and is not broadly usable.

For reference, here are two additional articles describing the use of `jlink` to create optimized application images:

- [Creating your own runtime using jlink](https://adoptium.net/en-GB/blog/2021/10/jlink-to-produce-own-runtime/)
- [Creating a Custom JRE for your Java Applications](https://adriankodja.com/creating-a-custom-jre-for-your-java-applications)

## Documentation and Resources

- (Video) [How to Migrate a Java Application to Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
- (Video) [Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
- (Learning Lab) [Chainguard's Java Image Learning Lab](https://www.chainguard.dev/events/chainguards-java-image)
- (Blog) [Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)

The latest builds of Chainguard's JRE image pass the TCK for OpenJDK Java 21.0.3 and Java 22.0.1 as provided by [OpenJDK Community TCK License Agreement](https://openjdk.org/legal/openjdk-tck-license.pdf) (OCTLA) and are [Java Compatibility Kit (JCK) conformant](https://www.chainguard.dev/unchained/chainguards-openjdk-java-images-are-now-jck-conformant).

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5675

# request-5675
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5675` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5675/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Lightweight DICOM server for medical imaging with RESTful API and web interface

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [docker.io/orthancteam/orthanc](https://hub.docker.com/r/orthancteam/orthanc) image but only ships with customer requested plugins.

* **postgresql**: PostgreSQL database backend support
* **python**: Python scripting plugin for custom automation
* **dicomweb**: DICOMweb (WADO-RS/QIDO-RS/STOW-RS) support
* **gdcm**: Enhanced DICOM parsing with GDCM library
* **webviewer**: Built-in web-based DICOM viewer
* **ohif**: OHIF Viewer integration for advanced visualization
* **housekeeper**: Automated cleanup and maintenance tasks

> [!NOTE]
> The upstream image version (25.4.2) corresponds to the [Orthanc Builder repository](https://github.com/orthanc-server/orthanc-builder) version, while our image is tagged with the latest version of Orthanc core itself.

## Overview

Orthanc is a lightweight, open-source DICOM server for medical imaging. It provides a complete solution for managing, storing, and distributing medical images with the following key features:

* **DICOM Server**: Full DICOM Store SCP, Query/Retrieve SCP, Web-based DICOM viewer
* **RESTful API**: Complete REST API for integration with other systems
* **Web Interface**: Built-in web interface for image viewing and management
* **Plugin System**: Extensible architecture with numerous plugins available
* **Standards Compliance**: Full DICOM 3.0 and DICOMweb compliance

## Getting Started

### Basic Usage

Run Orthanc with default configuration:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  cgr.dev/ORGANIZATION/request-5675:latest
```

Access the web interface at `http://localhost:8042` (default username: `orthanc`, password: `orthanc`).

### With Persistent Storage

For production use, mount a volume for persistent data storage:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  -v orthanc-data:/var/lib/orthanc/db \
  cgr.dev/ORGANIZATION/request-5675:latest
```

### Custom Configuration

Mount a custom configuration file:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  -v /path/to/orthanc.json:/etc/orthanc/orthanc.json:ro \
  -v orthanc-data:/var/lib/orthanc/db \
  cgr.dev/ORGANIZATION/request-5675:latest
```

## Documentation and Resources

For more information about Orthanc:

* [Official Documentation](https://orthanc.uclouvain.be/book/)
* [Plugin Documentation](https://orthanc.uclouvain.be/book/plugins.html)
* [Source Code Downloads](https://orthanc.uclouvain.be/downloads/sources/index.html)
* [REST API Documentation](https://orthanc.uclouvain.be/book/users/rest.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mariadb-operator-fips

# mariadb-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mariadb-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mariadb-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MariaDB operator FIPS image is a FIPS-compliant image of the MariaDB operator, It automates the deployment, scaling, and management of MariaDB instances in Kubernetes clusters, providing declarative configuration and lifecycle management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `mariadb-operator-fips` container image is comparable to the upstream [MariaDB Operator image](https://github.com/mariadb-operator/mariadb-operator), with improved security and few-to-zero CVEs.

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

mariadb-operator-fips is a Kubernetes operator that can be deployed using Helm. Refer to the [upstream repository documentation](https://github.com/mariadb-operator/mariadb-operator) for detailed setup and usage instructions.

To use our minimal, Wolfi-based FIPS-compliant image with the official Helm chart, you'll need to override the image used by the chart and specify the Chainguard image as shown in the example below:

```shell
helm repo add mariadb-operator https://helm.mariadb.com/mariadb-operator
helm repo update

# Install the CRDs first
helm install mariadb-operator-crds mariadb-operator/mariadb-operator-crds \
  --namespace mariadb-system \
  --create-namespace

# Install the operator with chainguard FIPS image
helm install mariadb-operator mariadb-operator/mariadb-operator \
  --namespace mariadb-system \
  --set image.repository=cgr.dev/ORGANIZATION/mariadb-operator-fips:latest 
```

For complete configuration options and advanced usage scenarios, please refer to the [official mariadb-operator documentation](https://github.com/mariadb-operator/mariadb-operator).

## Documentation and Resources

- [MariaDB Operator GitHub Repository](https://github.com/mariadb-operator/mariadb-operator)
- [MariaDB Operator Helm Documentation](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/helm.md)
- [MariaDB Operator Images Documentation](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/docker.md)
- [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### headlamp-fips

# headlamp-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/headlamp-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/headlamp-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Fips image of Headlamp is an easy-to-use and extensible Kubernetes web UI designed for developers and cluster operators.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `headlamp-fips` container image is a drop-in replacement for the upstream [kubernetes-sigs/headlamp](https://github.com/kubernetes-sigs/headlamp/tree/main) image. It offers the same functionality and user experience as the upstream, including support for multiple clusters, dynamic plugin extensions, and rich Kubernetes resource views. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.  

### FIPS Support

The `headlamp-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the official [Headlamp Helm chart](https://github.com/kubernetes-sigs/headlamp/tree/main/charts/headlamp). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/headlamp-fips
  tag: latest
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `Headlamp` helm chart

```shell
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
helm repo update
helm install headlamp headlamp/headlamp --namespace kube-system -f values.yaml --wait
```

## Documentation and Resources:
- [Headlamp GitHub Repository](https://github.com/kubernetes-sigs/headlamp/tree/main)
- [Headlamp Helm Chart](https://github.com/kubernetes-sigs/headlamp/tree/main/charts/headlamp)
- [Official Website & Docs](https://headlamp.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jaeger-iamguarded

# jaeger-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jaeger-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jaeger-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CNCF Jaeger Distributed Tracing Platform - IAMGuarded variant

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Jaeger IAMGuarded is a security-enhanced variant of Jaeger designed to be deployed using its companion IAMGuarded Helm chart. This is a single container image that includes all core Jaeger component binaries, allowing flexible deployment configurations through the Helm chart.

The Helm chart can be configured to run the image with different entrypoints to deploy these components separately or together.

## Helm Chart Installation

The Jaeger IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/jaeger
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install jaeger oci://cgr.dev/$ORGANIZATION/iamguarded-charts/jaeger \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for custom registry configuration:
```yaml
# Single jaeger-iamguarded image used for all components
image:
  registry: myregistry.example.com
  repository: mirrored/jaeger-iamguarded
  digest: sha256:...

# Note: The same image is used for all deployment modes (collector, query, ingester, allInOne)
# The chart configures different entrypoints and commands for each component
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install jaeger oci://cgr.dev/$ORGANIZATION/iamguarded-charts/jaeger@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/jaeger
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/jaeger:1.65.0
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

## Validation

After deployment, validate your Jaeger IAMGuarded installation:

```bash
# Check pod status
kubectl get pods -l app.kubernetes.io/name=jaeger

# Access the Jaeger UI (if using port-forward)
kubectl port-forward svc/jaeger-query 16686:16686

# Visit http://localhost:16686 to access the Jaeger UI
```

## Security Considerations

The Jaeger IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Jaeger and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Usage Examples

### Production Deployment

For production, deploy collector and query components separately with a persistent storage backend:

```bash
helm install jaeger oci://cgr.dev/$ORGANIZATION/iamguarded-charts/jaeger \
  --set "global.org=$ORGANIZATION" \
  --set "collector.enabled=true" \
  --set "query.enabled=true" \
  --set "storage.type=elasticsearch" \
  --set "storage.elasticsearch.host=elasticsearch.default.svc.cluster.local"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mdbook

# mdbook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mdbook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mdbook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that contains [mdbook](https://rust-lang.github.io/mdBook/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage

Example: build an mdbook project in the `/work` directory

```
docker run --rm \
    -v "${PWD}":/work \
    -w /work \
    cgr.dev/chainguard/mdbook:latest
    init --force --title chainguard-images --ignore git
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-secret-sync-fips

# k8s-secret-sync-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-secret-sync-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-secret-sync-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

k8s-secret-sync provides two-way sync of JSON files to Kubernetes secret objects

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with `docker.io/jupyterhub/k8s-secret-sync`. It provides a Python-based utility for bidirectional synchronization.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started

The `k8s-secret-sync` utility provides two core operations for managing Kubernetes secrets:

- Load Operation: Read data from a Kubernetes secret and write it into a JSON file.

- Watch-Save Operation: Continuously watch a file and sync changesback to a Kubernetes secret.

## Kubernetes Deployment

When deployed in Kubernetes with JupyterHub, k8s-secret-sync typically runs as a sidecar container alongside Traefik in the autohttps deployment. In JupyterHub deployments, k8s-secret-sync is automatically deployed when using Let's Encrypt for HTTPS:

```yaml
# values.yaml for JupyterHub Helm chart
proxy:
  https:
    enabled: true
    type: letsencrypt
    hosts:
      - jupyterhub.example.com
    letsencrypt:
      contactEmail: admin@example.com
  secretSync:
    image:
      name: cgr.dev/ORGANIZATION/k8s-secret-sync-fips
      tag: latest
```

The container only deploys when **all** of these conditions are met:
- `proxy.https.enabled = true`
- `proxy.https.type = "letsencrypt"`
- `proxy.https.hosts` is configured (not empty)

## Documentation and Resources

- [JupyterHub Zero to Hero Guide](https://z2jh.jupyter.org/)
- [JupyterHub Helm Chart Documentation](https://z2jh.jupyter.org/en/stable/jupyterhub)
- [JupyterHub GitHub Repository](https://github.com/jupyterhub/zero-to-jupyterhub-k8s)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elastic-agent

# elastic-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elastic-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elastic-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elastic Agent is a unified agent for collecting, monitoring, and securing data across systems in the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `elastic-agent` image is comparable to the external [elastic-agent](https://hub.docker.com/r/elastic/elastic-agent) image, with the following key differences:

- The Chainguard image **does not** include the following binaries (normally located in `/usr/share/elastic-agent/data/elastic-agent-buildhash/components/`):
  - `cloud-defend`
  - `endpoint-security`
  - `osqueryd`
  - `pf-elastic-collector`
  - `pf-elastic-symbolizer`
  - `pf-host-agent`
  
- The Chainguard image **does not** store its binaries in `/usr/share/elastic-agent/data/elastic-agent-buildhash/components/`. Instead, it symlinks them from `/usr/bin`.

Chainguard Images are regularly updated, minimal container images with low-to-zero CVEs.

## Getting Started
The elastic-agent image can be deployed using the official Elastic Agent [Helm chart](https://github.com/elastic/elastic-agent/tree/main/deploy/helm/elastic-agent) alongside the [ECK Operator](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-installing-eck.html).

Start by retrieving credentials from an Elasticsearch deployment using the elastic ECK Operator. This example uses the secrets generated by the [ECK quickstart guide](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-enterprise-search-quickstart.html).

```bash
PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)
ES_API_KEY=$(kubectl exec -it quickstart-es-default-0 -n default -- \
curl -k -u elastic:$PASSWORD -s -X POST "https://localhost:9200/_security/api_key" \
    -H "Content-Type: application/json" \
    -d '{"name":"my-api-key","role_descriptors":{"custom_role":{"cluster":["all"],"index":[{"names":["*"],"privileges":["all"]}]}}}' | jq -r .api_key)
```

Next, create a `values.yaml` file:

```yaml
kubernetes:
  enabled: true

outputs:
  elasticsearch:
    type: ESPlainAuthAPI
    url: https://quickstart-es-http:9200
    username: elastic
    password: "$PASSWORD"
    api_key: "$ES_API_KEY"
  default:
    url: https://quickstart-es-http:9200
    username: elastic

    password: "$PASSWORD"
agent:
  imagePullPolicy: IfNotPresent
  image:
    repository: "<YOUR_IMAGE_REGISTRY>"
    tag: "<YOUR_IMAGE_TAG>"
```

Finally, deploy the elastic-agent Helm chart using the `values.yaml` file:

```
git clone https://github.com/elastic/elastic-agent.git
helm install demo ./elastic-agent/deploy/helm/elastic-agent -f values.yaml
```

## Documentation and Resources

Refer to the [official Elastic Agent documentation](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-elastic-agent-quickstart.html) and the [official Elastic Agent repository](https://github.com/elastic/elastic-agent) for more information. 

Deploy elastic-agent using the [official Elastic Agent helm chart](https://github.com/elastic/elastic-agent/tree/main/deploy/helm/elastic-agent).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-operator-fips

# postgres-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### seaweedfs

# seaweedfs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/seaweedfs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/seaweedfs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, providing S3-compatible API and filesystem interface

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream [chrislusf/seaweedfs](https://hub.docker.com/r/chrislusf/seaweedfs) Docker Hub image, running as root to maintain compatibility with the upstream Helm chart and deployment configurations.Unlike upstream which bundles busybox, this image uses dash to minimize attack surface.

## Getting Started

SeaweedFS is a distributed storage system consisting of three main components that work together:

* **Master**: Coordinates the cluster, manages volume assignments, and maintains metadata
* **Volume**: Stores actual file data as blobs
* **Filer**: Provides user-facing APIs (filesystem HTTP API and S3-compatible API)

### Deploying with Docker

To run a complete SeaweedFS cluster with Docker, you'll need to start all three components. First, create a Docker network:

```sh
docker network create seaweedfs-net
```

Start the Master server:

```sh
docker run -d \
  --name seaweedfs-master \
  --network seaweedfs-net \
  -p 9333:9333 \
  cgr.dev/ORGANIZATION/seaweedfs \
  master -ip=seaweedfs-master -port=9333
```

Start the Volume server:

```sh
docker run -d \
  --name seaweedfs-volume \
  --network seaweedfs-net \
  -p 8080:8080 \
  cgr.dev/ORGANIZATION/seaweedfs \
  volume -mserver=seaweedfs-master:9333 -port=8080 -ip=seaweedfs-volume
```

Start the Filer server with S3 API enabled:

```sh
docker run -d \
  --name seaweedfs-filer \
  --network seaweedfs-net \
  -p 8888:8888 \
  -p 8333:8333 \
  cgr.dev/ORGANIZATION/seaweedfs \
  filer -master=seaweedfs-master:9333 -ip=seaweedfs-filer -s3
```

### Deploying with Helm

For production deployments on Kubernetes, use the official [SeaweedFS Helm chart](https://github.com/seaweedfs/seaweedfs/tree/master/k8s/charts/seaweedfs). Create a values file to use the Chainguard image:

```sh
cat > values.yaml <<EOF
master:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs:latest

volume:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs:latest

filer:
  imageOverride: cgr.dev/ORGANIZATION/seaweedfs:latest
EOF
```

Install the chart:

```sh
helm repo add seaweedfs https://seaweedfs.github.io/seaweedfs/helm
helm install seaweedfs seaweedfs/seaweedfs -f values.yaml
```

## Documentation and Resources

* [SeaweedFS GitHub Repository](https://github.com/seaweedfs/seaweedfs)
* [SeaweedFS Wiki](https://github.com/seaweedfs/seaweedfs/wiki)
* [SeaweedFS Helm Chart](https://github.com/seaweedfs/seaweedfs/tree/master/k8s/charts/seaweedfs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### custom-pod-autoscaler-operator-fips

# custom-pod-autoscaler-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/custom-pod-autoscaler-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/custom-pod-autoscaler-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Operator for managing Kubernetes Custom Pod Autoscalers (CPA)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `custom-pod-autoscaler-operator` image is a drop-in replacement for the upstream [custompodautoscaler/operator](https://hub.docker.com/r/custompodautoscaler/operator) container image. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

Start by installing the Helm chart for the autoscaler operator:

```shell
VERSION=v1.4.2 # Set the latest version you want to install
helm install custom-pod-autoscaler-operator https://github.com/jthomperoo/custom-pod-autoscaler-operator/releases/download/${VERSION}/custom-pod-autoscaler-operator-${VERSION}.tgz
```

The upstream Helm Chart doesn't support overriding the image, so you will need to substitute the image after deploying the operator:

```shell
kubectl set image deployment/custom-pod-autoscaler-operator custom-pod-autoscaler-operator=cgr.dev/ORGANIZATION/custom-pod-autoscaler-operator-fips:latest
```

Now you can deploy a `CustomPodAutoscaler` resource. See the linked documentation below for more details.

## Documentation and Resources
- [Installation Guide](https://github.com/jthomperoo/custom-pod-autoscaler-operator/blob/master/INSTALL.md)
- [Usage Guide](https://github.com/jthomperoo/custom-pod-autoscaler-operator/blob/master/USAGE.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-cloudwatch-agent

# amazon-cloudwatch-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-cloudwatch-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-cloudwatch-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CloudWatch Agent enables you to collect and export host-level metrics and logs on instances running Linux or Windows server. 

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The `cloudwatch-agent` container image can be used in two ways:

1. Using Helm Charts
Below is an example of how to use the helm chart, overriding the upstream image with chainguard image:
```bash
helm repo add aws-observability https://aws-observability.github.io/helm-charts
helm repo update aws-observability
helm install amazon-cloudwatch-observability aws-observability/amazon-cloudwatch-observability \
  --create-namespace \
  --namespace amazon-cloudwatch \
  --set clusterName=my-cluster-name \
  --set region=my-cluster-region \
  --set agent.image.repository=amazon-cloudwatch-agent \
  --set agent.image.repositoryDomainMap.public=cgr.dev/chainguard \
  --set agent.image.tag=latest
```

2. Using YAML Manifests
For using YAML manifests you can follow [the official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-metrics.html). You'll be required to replace the image where you deploy the daemonset to the cluster.

## Documentation and Resources

For full instructions on amazon-cloudwatch-agent, refer to [official documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html) Please go through it to set the correct permissions. You'll be required to have push access to cloudwatch logs.

The GitHub repository can also be found on [GitHub](https://github.com/aws/amazon-cloudwatch-agent).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secrets-store-csi-driver-provider-azure

# secrets-store-csi-driver-provider-azure
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secrets-store-csi-driver-provider-azure` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secrets-store-csi-driver-provider-azure/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure Key Vault provider for Secret Store CSI driver allows you to get secret contents stored in Azure Key Vault instance and use the Secret Store CSI driver interface to mount them into Kubernetes pods.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `secrets-store-csi-driver-provider-azure` container image is comparable to Microsoft's [Azure CSI driver](https://github.com/Azure/secrets-store-csi-driver-provider-azure). Chainguard's image contains only the minimum set of dependencies needed to run the driver.

## Getting Started

The [official documentation](https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver) outlines how to set up the Azure provider for Secrets Store CSI Driver.
To get started with Chainguard's `secrets-store-csi-drive-provider-azure` image, create a custom `values.yaml` file for the Helm release:

```yaml
linux:
  image:
    repository: "cgr.dev/ORGANIZATION/secrets-store-csi-driver-provider-azure"
    tag: "latest"
```

Add the Helm chart and install the `csi-secrets-store-provider-azure` release: 

```bash
helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
helm install csi-secrets-provider csi-secrets-store-provider-azure/csi-secrets-store-provider-azure -f custom_values.yaml
```

This can now be tested by creating a Secrets Provider Class Object. The following is an example manifest:

```yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-secrets
  namespace: kube-system
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"              
    keyvaultName: <KEY VAULT NAME>
    cloudName: ""
    objects:  |
      array:
        - |
          objectName: <SECRET NAME>
          objectType: secret # object types: secret, key or cert
          objectVersion: ""                    
    tenantId: "<TENANT ID>"
```

The secret is consumed by a Kubernetes Pod. In this example, the Azure secret from a Key Vault Secret is mounted to `/mnt/secret-store`:

```yaml
kind: Pod
apiVersion: v1
metadata:
  name: demo-pod
  namespace: kube-system
spec:
  containers:
    - name: nginx
      image: cgr.dev/ORGANIZATION/busybox:latest
      command: ["/bin/sh", "-c", "sleep 864000"]
      volumeMounts:
      - name: secrets-store01-inline
        mountPath: "/mnt/secrets-store"
        readOnly: true
  volumes:
    - name: secrets-store01-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: <KEY VAULT NAME>
        nodePublishSecretRef: # Kubernetes secret that contains details used to authenticate to Azure
          name: "sscdp-azure-settings"

```

## Documentation and Resources
- [Configuring Azure secrets provider](https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver)
- [Azure Driver Helm Charts](https://github.com/Azure/secrets-store-csi-driver-provider-azure/tree/master/charts/csi-secrets-store-provider-azure)
- [Azure Driver Github](https://github.com/Azure/secrets-store-csi-driver-provider-azure)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### seaweedfs-operator-fips

# seaweedfs-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/seaweedfs-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/seaweedfs-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

seaweedfs kubernetes operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream [seaweedfs/seaweedfs-operator](https://hub.docker.com/r/chrislusf/seaweedfs-operator/tags) image. No changes to your configuration are required when switching to the Chainguard image.

### FIPS Support
The `seaweedfs-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

To deploy the SeaweedFS Operator using the Chainguard image, you can use Kubernetes manifests or Helm. The operator manages SeaweedFS clusters within your Kubernetes environment.

### Using Helm

If using Helm, override the image in your values file:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/seaweedfs-operator-fips
  tag: latest
```

To know more about deploying it via Helm chart, please refer to the [SeaweedFS Operator Helm Chart documentation](https://github.com/seaweedfs/seaweedfs-operator/tree/master?tab=readme-ov-file#helm).

## Documentation and Resources

For more information about SeaweedFS Operator, please refer to:

* [SeaweedFS Operator GitHub Repository](https://github.com/seaweedfs/seaweedfs-operator)
* [SeaweedFS Documentation](https://github.com/seaweedfs/seaweedfs/wiki)
* [SeaweedFS Operator Usage Guide](https://github.com/seaweedfs/seaweedfs-operator/blob/master/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### unbound-fips

# unbound-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/unbound-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/unbound-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Unbound is a validating, recursive, and caching DNS resolver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes 

Chainguard's `unbound` FIPS container image is a minimal, secure, and regularly updated image designed to run [Unbound](https://github.com/NLnetLabs/unbound). It leverages the security features of Chainguard Images, including low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

**This version of the image does not support use of unbound with DNSCrypt as this feature uses a cryptographic library that is not FIPS certified.**

## Getting Started

To get started with the `unbound` FIPS image, you should first create a configuration file. You can find details on the configuration options [in the official Unbound documentation](https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html).

Run the `unbound` container with the following command:

```bash
docker run -d --name unbound \
  -v $(pwd)/unbound.conf:/etc/unbound/unbound.conf \
  -p 5454:5454 \
  cgr.dev/ORGANIZATION/unbound-fips:latest
```

This command will open the port `5454` and bind it to the host machine. Now you can test the Unbound server with the following command:

```bash
dig +tcp @127.0.0.1 -p 5454 chainguard.dev
dig +udp @127.0.0.1 -p 5454 chainguard.dev
```

The first command will use TCP and the second one will use UDP. Both of these commands will return a response from the Unbound server.

## Documentation and Resources

* [Unbound Documentation](https://unbound.docs.nlnetlabs.nl/en/latest/index.html)
* [Unbound Configuration Options](https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html)
* [Unbound GitHub Repository](https://github.com/NLnetLabs/unbound)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-apisix-fips

# apache-apisix
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-apisix` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-apisix/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache APISIX is a dynamic, real-time, high-performance API Gateway.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard APISIX image is designed to be a drop-in replacement for the upstream [apache/apisix image](https://hub.docker.com/r/apache/apisix). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a package manager, while maintaining full compatibility.

### FIPS support

Chainguard's `apache-apisix-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The APISIX image can be deployed to Kubernetes via Helm, or with Docker. In the examples below, be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Installation with Helm

When deploying on Kubernetes with Helm, you pull and install the official APISIX chart from the API7 repository:

```
helm repo add apisix https://charts.apiseven.com
helm repo update
```

The chart's values.yaml contains an image section where you can specify which container to deploy:

```
image:
  repository: cgr.dev/ORGANIZATION/apache-apisix-fips
  pullPolicy: IfNotPresent
  # Overrides the image tag; defaults to the chart's appVersion
  tag: latest
```

To deploy the Chainguard image, use helm install with the above values.yaml:

```
helm upgrade --install apisix apisix/apisix \
  --namespace apisix \
  --values values.yaml
```

### Running with Docker

To run APISIX using Docker, you can use the following command:

```shell
docker run -d --name apisix \
  --network apisix \
  -p 9080:9080 -p 9443:9443 \
  -v $(pwd)/example/apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml \
  -v $(pwd)/example/apisix_log:/usr/local/apisix/logs \
  cgr.dev/ORGANIZATION/apache-apisix-fips:latest

```

See the following below resources for further usage details.

## Resources
- [Getting Started](https://apisix.apache.org/docs/apisix/getting-started/README/)
- [APISIX Installation Guide](https://apisix.apache.org/docs/apisix/installation-guide/)
- [apache/apisix on Dockerhub](https://hub.docker.com/r/apache/apisix)
- [APISIX Helm Chart](https://github.com/apache/apisix-helm-chart)
- [APISIX Github Repository](https://github.com/apache/apisix)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### knative-serving

# knative-serving
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/knative-serving` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/knative-serving/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Knative Serving builds on Kubernetes to support deploying and serving of applications and functions as serverless containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Knative Serving is comprised of multiple images:

- `cgr.dev/ORGANIZATION/knative-serving-activator`
- `cgr.dev/ORGANIZATION/knative-serving-autoscaler`
- `cgr.dev/ORGANIZATION/knative-serving-controller`
- `cgr.dev/ORGANIZATION/knative-serving-webhook`
- `cgr.dev/ORGANIZATION/knative-serving-queue`

Chainguard's Knative Serving images are comparable to the official Knative Serving images:
- [Knative Serving activator image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/serving/cmd/activator)
- [Knative Serving autoscaler image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/serving/cmd/autoscaler)
- [Knative Serving controller image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/serving/cmd/controller)
- [Knative Serving webhook image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/serving/cmd/webhook)
- [Knative Serving queue image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/serving/cmd/queue)

However, the Chainguard images do not run as the root user and contain only the minimum set of tools and dependencies needed to function. This means they do not include utilities such as a shell or a package manager.

## Getting Started
There are multiple ways of deploying Knative Serving. One option is to use the official [Knative Operator](https://github.com/knative/operator) and the other is to deploy it via CRDs.

### Deployment using the Knative Operator

To get started, deploy the operator:

```shell
helm repo add knative-operator https://knative.github.io/operator
helm repo update
helm install knative-operator knative-operator/knative-operator --namespace knative-operator --create-namespace
```

Then substitute the upstream Knative Serving images with Chainguard's images:

```shell
# This uses kourier for ingress
cat <<EOF | kubectl apply -f -
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
  ingress:
    kourier:
      enabled: true
  config:
    network:
      ingress-class: "kourier.ingress.networking.knative.dev"
  registry:
    override:
      activator: "cgr.dev/ORGANIZATION/knative-serving-activator"
      autoscaler: "cgr.dev/ORGANIZATION/knative-serving-autoscaler"
      controller: "cgr.dev/ORGANIZATION/knative-serving-controller"
      webhook: "cgr.dev/ORGANIZATION/knative-serving-webhook"
      autoscaler-hpa: gcr.io/knative-releases/knative.dev/serving/cmd/autoscaler-hpa:latest
      queue-proxy: "cgr.dev/ORGANIZATION/knative-serving-queue"
      net-kourier-controller/controller: gcr.io/knative-releases/knative.dev/net-kourier/cmd/kourier:latest
      3scale-kourier-gateway/kourier-gateway: docker.io/envoyproxy/envoy:v<KUBERNETES VERSION>-latest
EOF
```

```shell
kubectl wait --namespace knative-serving knativeserving knative-serving --for=condition=Ready --timeout=10m
```

Once Knative Serving has been deployed successfully, you can deploy your first Knative service using `kn`:

**NOTE:** The `kn` CLI tool must be installed to deploy Knative services. Please refer to `kn`'s [installation documentation](https://knative.dev/docs/getting-started/quickstart-install/#install-the-knative-cli).

```shell
kn service create hello \
  --image ghcr.io/knative/helloworld-go:latest \
  --port 8080 \
  --env TARGET=World
```

You can use the following command to retrieve the URL of the deployed service:

```shell
URL=$(kn service describe hello -ojson | jq -r '.status.url')
```

To validate the service is working, `curl` it:

```shell
curl $URL
```

You will now see the following output:

```shell
Hello World!
```

You are now up and running with Chainguard's Knative Serving images!

## Documentation and Resources

- [Configuring the Knative operator](https://knative.dev/docs/install/operator/configuring-serving-cr/#download-images-individually-without-secrets)
- [Install using CRDs](https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/)
- [Quickstart guide](https://knative.dev/docs/getting-started/quickstart-install/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-fleet-fips

# rancher-fleet-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-fleet-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-fleet-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Deploy workloads from Git to large fleets of Kubernetes clusters

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`rancher-fleet-fips` is composed of multiple images:
- `cgr.dev/ORGANIZATION/rancher-fleet-fips:latest`
- `cgr.dev/ORGANIZATION/rancher-fleet-agent-fips:latest`

Chainguard's `rancher-fleet-fips` container images are comparable to the official [rancher/fleet](https://hub.docker.com/r/rancher/fleet) and [rancher/fleet-agent](https://hub.docker.com/r/rancher/fleet-agent) images.

## Getting Started
### Installation with Helm Using `values.yaml`

There is an official documentation available in the Rancher Fleet website, you can find it [here](https://fleet.rancher.io/quickstart).

Create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/rancher-fleet-fips
  tag: latest

agentImage:
  repository: cgr.dev/ORGANIZATION/rancher-fleet-agent-fips
  tag: latest
EOF
```

Install the Helm chart for Rancher Fleet using the following command:

```shell
helm -n cattle-fleet-system install --create-namespace --wait fleet-crd fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet fleet/fleet  --values values.yaml
```

Following that, you can use `kubectl` to check whether the puds are running:

```shell
kubectl get pods -n cattle-fleet-system
```
```
NAME                               READY   STATUS    RESTARTS   AGE
fleet-agent-0                       2/2     Running   0          86s
fleet-controller-57689f8757-8d4cn   3/3     Running   0          102s
gitjob-59d66b6b8-jv2f8             1/1     Running   0          102s
```

You should now have Rancher Fleet with the Chainguard Rancher Fleet Agent running in your cluster.

## Documentation and Resources

For more information on working with Rancher Fleet, please refer to [the official documentation](https://fleet.rancher.io/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crane

# crane
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crane` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crane/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based crane image to interact with container registries. Crane is used for inspecting and manipulating container images, allowing you to view manifests, verify image layers, and check cryptographic signatures.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `crane` image is comparable to the [official Crane image](https://gcr.io/go-containerregistry/crane). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `/usr/bin/crane`, compared to upstream's entrypoint of `/ko-app/crane`.

## Getting started

You can inspect the `crane` image manifest using the `crane` image with the following command. The manifest provides a summary of key metadata about the image, including the image layers, digest information, annotations, and more.

```shell
docker run --rm cgr.dev/ORGANIZATION/crane:latest manifest cgr.dev/ORGANIZATION/crane:latest --platform=linux/amd64
```

When you run this command, you will receive output similar to the following:

```
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 968,
    "digest": "sha256:xxxxx"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 4990473,
      "digest": "sha256:xxxxx"
    }
  ],
  "annotations": {
    ......
  }
}
```

## Documentation and Resources

For more information, you can refer to the [official Crane documentation](https://gocrane.io/docs/). You might also find this [Crane CLI cheatsheet](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) to be useful.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### backup-restore-operator

# backup-restore-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/backup-restore-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/backup-restore-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Backup and Restore Operator that provides the ability to back up and restore the Rancher application running on any Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `backup-restore-operator` image is compatible with [rancher/backup-restore-operator](https://hub.docker.com/r/rancher/backup-restore-operator). The image provides the same API and functionality as the upstream operator, with enhanced security through a minimal attack surface and daily security updates.

## Getting Started

The `backup-restore-operator` is deployed using the Rancher Helm charts. The operator installs into the `cattle-resources-system` namespace and creates Custom Resource Definitions (CRDs) for Backup, Restore, and ResourceSet resources.

### Installation

First, add the Rancher Helm repository:

```bash
helm repo add rancher-charts https://charts.rancher.io
helm repo update
```

Create a values file to use the Chainguard image:

```sh
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/backup-restore-operator
  tag: latest
EOF
```

Install the CRD chart first (this is required):

```sh
helm install --wait \
  --create-namespace -n cattle-resources-system \
  rancher-backup-crd rancher-charts/rancher-backup-crd
```

Install the operator chart with your values file:

```sh
helm install --wait \
  -n cattle-resources-system \
  -f values.yaml \
  rancher-backup rancher-charts/rancher-backup
```

### Verification

Verify the operator is running:

```sh
kubectl get pods -n cattle-resources-system
```

You should see output similar to:

```
NAME                             READY   STATUS    RESTARTS   AGE
rancher-backup-xxxxx-xxxxx       1/1     Running   0          1m
```

### Creating a Backup

To create a basic backup of your Kubernetes resources, create a Backup resource:

```sh
cat > backup.yaml <<EOF
apiVersion: resources.cattle.io/v1
kind: Backup
metadata:
  name: default-backup
spec:
  resourceSetName: rancher-resource-set-full
EOF

kubectl apply -f backup.yaml
```

> [!NOTE]
> The operator creates two ResourceSets by default: `rancher-resource-set-full` includes all secrets needed for complete restore, while `rancher-resource-set-basic` excludes secrets for enhanced security. Choose based on your backup requirements.

Check the backup status:

```sh
kubectl get backup default-backup -o yaml
```

## Configuration

The operator supports various backup storage locations. For production use, configure an S3-compatible storage backend. Create a values file with S3 configuration:

```sh
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/backup-restore-operator
  tag: latest

persistence:
  enabled: true
  storageClass: default

s3:
  enabled: true
  credentialSecretName: s3-creds
  credentialSecretNamespace: cattle-resources-system
  bucketName: rancher-backups
  region: us-east-1
  endpoint: s3.amazonaws.com
EOF
```

This configuration enables persistent storage for backup metadata and sets S3 as the backup target, which is essential for disaster recovery scenarios.

For comprehensive configuration options, including encryption, retention policies, and advanced scheduling, refer to the [upstream documentation](https://github.com/rancher/backup-restore-operator).

## Documentation and Resources

- [Rancher Backup Restore Operator GitHub](https://github.com/rancher/backup-restore-operator)
- [Rancher Backup and Restore Documentation](https://ranchermanager.docs.rancher.com/how-to-guides/new-user-guides/backup-restore-and-disaster-recovery)
- [Helm Charts Repository](https://charts.rancher.io)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-blackbox-exporter-iamguarded

# prometheus-blackbox-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-blackbox-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-blackbox-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Blackbox Exporter IAMGuarded is a security-enhanced variant of the Blackbox Exporter designed to be deployed using the Kube-Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Blackbox Exporter deployments and allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, and ICMP.

## Kube-Prometheus Helm Chart Usage

This image is primarily used with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

### Blackbox Exporter Configuration

When using the Kube-Prometheus chart, you can override the Blackbox Exporter image under the `blackboxExporter` section in your `values.yaml`:

```yaml
blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### promitor-agent-scraper-fips

# promitor-agent-scraper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/promitor-agent-scraper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/promitor-agent-scraper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra-reaper

# cassandra-reaper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra-reaper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra-reaper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automated Repair Awesomeness for Apache Cassandra

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Cassandra Reaper is a tool for managing Apache Cassandra clusters. It helps operators to easily repair and run consistent backups of their clusters. It also provides a simple yet powerful web UI and a REST API for cluster monitoring and management.

## Usage

There is a Helm chart available for Cassandra Reaper [here](https://docs.k8ssandra.io/install/local/single-cluster-helm/). You just need to edit the `K8ssandraCluster` resource and add the following under the `.spec` section:

```
...
  reaper:
    containerImage:
      registry: cgr.dev
      repository: chainguard # you should provide only the repository name without the image name, it will be appended automatically
      tag: latest
    initContainerImage:
      registry: cgr.dev
      repository: chainguard
      tag: latest
    httpManagement:
      enabled: true
...
```

It is also possible to run Cassandra Reaper as a standalone Docker container:

```
docker container run -p 8080:8080 --platform linux/amd64 --pull always --rm cgr.dev/chainguard/cassandra-reaper:latest
```

You will see the Web UI at http://localhost:8080/webui.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kuberay-operator-fips

# kuberay-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kuberay-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kuberay-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A toolkit to run Ray applications on Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The KubeRay Helm charts can be found in the [ray-project/kuberay-helm](https://github.com/ray-project/kuberay-helm) repository. For instructions on deploying the operator, refer to the [kuberay-operator](https://github.com/ray-project/kuberay/blob/master/helm-chart/kuberay-operator/README.md) guide. To deploy a customizable Ray cluster, check the [ray-cluster](https://github.com/ray-project/kuberay/blob/master/helm-chart/ray-cluster/README.md) documentation.

You need to add the Ray Helm repository to your Helm installation:

```bash
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
```

Then, you can install the KubeRay operator using the following command:

```bash
helm install kuberay-operator kuberay/kuberay-operator \
     --create-namespace \
    --namespace kuberay-system \
    --set image.repository=cgr.dev/chainguard-private/kuberay-operator-fips \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats-server-config-reloader

# nats-server-config-reloader
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats-server-config-reloader` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats-server-config-reloader/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Monitors NATS configuration files and triggers reloads without restarting the server.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides a secure, minimal environment for hot-reloading NATS server configurations. It maintains functional parity with the upstream [nats-server-config-reloader image](https://hub.docker.com/r/natsio/nats-server-config-reloader) and is compatible with NATS Server. Switching to the Chainguard image should not require changes to your existing Kubernetes setup, provided the config and PID file paths are correctly mounted.

## Getting Started

The easiest way to deploy this image is with the [NATS Helm Chart](https://github.com/nats-io/k8s/tree/main/helm/charts/nats).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
 reloader:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/nats-server-config-reloader
    tag: latest
    pullPolicy: IfNotPresent
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the nats with reloader enabled

```shell
helm install nats nats/nats -f values.yaml --namespace default
```

Check that the pods are running
```shell
kubectl get pods -n default
NAME                        READY   STATUS    RESTARTS   AGE
nats-0                      2/2     Running   0          2m
nats-box-xxx-yyy            1/1     Running   0          2m
```

Also you can check the logs of container
```shell
kubectl logs nats-0 -c reloader
2025/03/14 06:41:44 Starting NATS Server Reloader v
2025/03/14 06:41:44 Watching file: /etc/nats-config/nats.conf
2025/03/14 06:41:44 Live, ready to kick pid 7 on config changes (files=1)
```

## Documentation and Resources:

For more information, please refer to [the official documentation for nats project](https://docs.nats.io/).
- [Nats Server Config Reloader Github Repository](https://github.com/nats-io/nack)
- [NATS Helm Chart](https://github.com/nats-io/k8s/tree/main/helm/charts/nats)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metallb-fips

# metallb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metallb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metallb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-ingress-defaultbackend

# kubernetes-ingress-defaultbackend
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-ingress-defaultbackend` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-ingress-defaultbackend/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that acts as a drop-in replacement for the `registry.k8s.io/defaultbackend` image. Used in some ingresses like https://github.com/kubernetes/ingress-gce and https://github.com/kubernetes/ingress-nginx

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `kubernetes-ingress-defaultbackend` container image is comparable to the [registry.k8s.io/defaultbackend](https://github.com/kubernetes/ingress-gce/tree/master/cmd/404-server) image commonly used by many Kubernetes ingress controllers. It serves a `404` page at the root path and a `200 OK` response at `/healthz`. This container image is functionally equivalent to the upstream image and runs as a non-root user. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

You can deploy `kubernetes-ingress-defaultbackend` as as part of the [ingress-nginx Helm chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/kubernetes-ingress-defaultbackend
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `kubernetes-ingress-defaultbackend` using Helm:

```shell
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx -f values.yaml --wait
```

## Documentation and Resources:
- [Official kubernetes ingress defaultbackend documentation](https://kubernetes.github.io/ingress-nginx/user-guide/default-backend/)
- [Kubernetes ingress defaultbackend Github Repository](https://github.com/kubernetes/registry.k8s.io)
- [Ingress nginx Helm Chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### telegraf

# telegraf
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/telegraf` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/telegraf/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Telegraf agent for collecting, processing, aggregating, and writing metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Telegraf

The Chainguard Telegraf image contains the `telegraf` binary.

Telegraf needs a config file to run.
The default location for this config file is at `/etc/telegraf/telegraf.conf`.
One is not provided by default with the image.

This location can be overridden with the `---config` or `--config-directory` flags.

```shell
 % docker run cgr.dev/chainguard/telegraf
2023-03-28T14:07:48Z I! Loading config file: /etc/telegraf/telegraf.conf
2023-03-28T14:07:48Z E! [telegraf] Error running agent: no outputs found, did you provide a valid config file?
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-restore-helper-fips

# velero-restore-helper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-restore-helper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-restore-helper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### scanner-test

# scanner-test
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/scanner-test` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/scanner-test/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pluto

# pluto
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pluto` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pluto/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A cli tool to help discover deprecated apiVersions in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting started
For those with access, this container image is available on `cgr.dev`:

Run the `pluto` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/pluto:latest 
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [Pluto Documentation](https://pluto.docs.fairwinds.com/)
* [Pluto GitHub Repository](https://github.com/FairwindsOps/pluto)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### git-sync

# git-sync
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/git-sync` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/git-sync/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A sidecar app which clones a git repo and keeps it in sync with the upstream.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage
For full instructions on using git-sync image as sidecar application, please refer to the [official documentation](https://github.com/kubernetes/git-sync/tree/master/docs).
The GitHub repository can also be [found here](https://github.com/kubernetes/git-sync)

- Below is a simple usage from the official docs

```bash
# make a directory (owned by you) for the volume
export DIR="/tmp/git-data"
mkdir -p $DIR

# run the container (as your own UID)
docker run -d \
    -v $DIR:/tmp/git \
    -u$(id -u):$(id -g) \
    registry/git-sync:tag \
        --repo=cgr.dev/chainguard/git-sync:latest \
        --root=/tmp/git/root \
        --period=30s

# run an nginx container to serve the content
docker run -d \
    -p 8080:80 \
    -v $DIR:/usr/share/nginx/html \
    nginx
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-api-fips

# kubernetes-dashboard-api-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-api-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-api-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The kubernetes-dashboard-api module serves crucial functions including data
aggregation, event handling, and supporting pagination for Kubernetes resources.

## Usage
To deploy `kubernetes-dashboard-api-fips` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set api.image.repository = cgr.dev/ORGANIZATION/kubernetes-dashboard-api-fips \
--set api.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary
permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to
access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components,
refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### camunda-zeebe

# camunda-zeebe
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/camunda-zeebe` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/camunda-zeebe/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Zeebe is the process automation engine powering Camunda.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy Zeebe on Kubernetes, you can follow the [official documentation](https://docs.camunda.io/docs/1.3/self-managed/zeebe-deployment/kubernetes/helm/installing-helm/).

### Helm

```shell
helm repo add camunda-platform https://helm.camunda.io
helm repo update
helm install camunda-zeebe camunda-platform/camunda-platform \
  --set zeebe.image.repository=cgr.dev/chainguard/camunda-zeebe \
  --set zeebe.image.tag=latest \
  --set zeebeGateway.image.repository=cgr.dev/chainguard/camunda-zeebe \
  --set zeebeGateway.image.tag=latest \
```

You can also jump to [official Helm Chart](https://github.com/camunda/camunda-platform-helm/tree/main/charts) if you want to do more customization.

#### Note on supported versions
 The `camunda-zeebe` image is compatible with **Helm Chart 12.x (Camunda 8.7.x)** and earlier.

  > **Important:** Chart 13.x (Camunda 8.8+) requires the mono-repo `camunda/camunda` image which has a different directory structure (`/usr/local/camunda` vs `/usr/local/zeebe`).
  > The `camunda-zeebe` image is NOT compatible with Chart 13.x.

#### Warning about logs

While testing the image, we found some `ERROR` logs that are related to the Zeebe application itself. Zeebe writes logs to container's filesystem under `/usr/local/zeebe/logs`. This is not recommended for production use. You should disable to write logs to the filesystem and use a logging driver to collect logs or write logs to stdout. Please see the [related issue](https://github.com/camunda/camunda-platform-helm/issues/2273) on the upstream repository.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### google-cloud-sdk-iamguarded-fips

# google-cloud-sdk-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/google-cloud-sdk-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/google-cloud-sdk-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS-compliant IAMGuarded image with the [Google Cloud SDK](https://cloud.google.com/sdk/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

FIPS-compliant IAMGuarded-compatible version of the Google Cloud SDK image.

## Overview

This image provides the Google Cloud SDK in a FIPS-compliant IAMGuarded-compatible format. It includes the `gcloud` command-line tool and other utilities for interacting with Google Cloud Platform services, with FIPS 140-2 validated cryptographic modules.

## Usage

```bash
docker run --rm cgr.dev/chainguard-private/google-cloud-sdk-iamguarded-fips:latest gcloud --version
```

## Configuration

The image runs with a non-root user (UID/GID 1001) and installs the Google Cloud SDK at `/opt/iamguarded/google-cloud-sdk/`. It includes FIPS-compliant cryptographic modules via the `openssl-config-fipshardened` package.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-sql-proxy-fips

# cloud-sql-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-sql-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-sql-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Cloud SQL Auth Proxy is a utility for ensuring secure connections to Cloud SQL instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `cgr.dev/chainguard/cloud-sql-proxy-fips` image is a minimal build of [Google Cloud SQL Auth Proxy](https://github.com/GoogleCloudPlatform/cloud-sql-proxy). Switching to this image should not require any changes to your existing setup.

### FIPS Support
The `cloud-sql-proxy-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

### Version Notes
Chainguard currently does not offer a v1 image for `cgr.dev/chainguard/cloud-sql-proxy-fips`, since v1 is no longer in active feature development, and any new releases are limited to maintenance. For this reason, Google's own [artifact registry](https://console.cloud.google.com/artifacts/docker/cloud-sql-connectors/us/gcr.io/cloud-sql-proxy) no longer hosts v1 images. 

## Prerequisites

To run this `cloud-sql-proxy-fips` image, you will need the following:
  - **Docker:** To run the container.
  - **Google Cloud SQL Instance:** The database instance you intend to connect to. Refer to the [official documentation on creating SQL instances](https://cloud.google.com/sql/docs/mysql/create-instance).
  - **Service Account Key (JSON):** A service account with the `Cloud SQL Client` IAM role is required to authenticate with your Cloud SQL instance. Refer to the [official documentation on creating a service account](https://cloud.google.com/sql/docs/mysql/connect-auth-proxy#create-service-account) for instructions on how to set this up and download the JSON key.

## Getting Started

This `cloud-sql-proxy-fips` image's `ENTRYPOINT` is configured to run the proxy directly. The following command shows a basic setup of running the proxy as a standalone Docker container, using a service account key for authentication:

```sh
docker run \
    --publish <host-port>:<proxy-port> \
    --mount type=bind,source="$(pwd)"/sa.json,target=/config/sa.json \
    cgr.dev/chainguard/cloud-sql-proxy-fips:latest \
    --address 0.0.0.0 \
    --port <proxy-port> \
    --credentials-file /config/sa.json <instance-connection-name>
```

In the command above:

  - `<host-port>`: The port on your host machine that your application will use to connect to the database (e.g., `3306` for MySQL, `5432` for PostgreSQL).
  - `<proxy-port>`: The port the proxy listens on inside the container.
  - `$(pwd)/sa.json`: The absolute path to your downloaded service account key file on your host machine.
  - `<instance-connection-name>`: The connection string for your Cloud SQL instance, formatted as `project_id:region:instance_name`.

After executing this command, your applications on the host machine can connect to `localhost:<host-port>` to establish a secure connection to your Cloud SQL instance through the proxy. For example, if your instance is for a `postgresql` database, you can connect using:
```sh
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres
```

## Configuration

The `cloud-sql-proxy-fips` image supports various configurations via command-line flags.

For instance, to configure the proxy to use Private IP to connect to your Cloud SQL instance, include the --private-ip flag in your command:
```sh
docker run \
    --publish <host-port>:<proxy-port> \
    --mount type=bind,source="$(pwd)"/sa.json,target=/config/sa.json \
    cgr.dev/chainguard/cloud-sql-proxy-fips:latest \
    --address 0.0.0.0 \
    --port <proxy-port> \
    --credentials-file /config/sa.json \
    --private-ip <instance-connection-name>
```

The proxy also provides configurations for using automatic IAM database authentication, Unix domain sockets for local connections, or enabling service account impersonation for flexible access control. Refer to the [Cloud SQL Auth Proxy docs](https://cloud.google.com/sql/docs/mysql/sql-proxy) for instructions and examples on available configurations.

## Documentation and Resources

  - [Official Cloud SQL Auth Proxy Documentation](https://cloud.google.com/sql/docs/mysql/sql-proxy)
  - [Cloud SQL Proxy GitHub Repository](https://github.com/GoogleCloudPlatform/cloud-sql-proxy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### smarter-device-manager-fips

# smarter-device-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/smarter-device-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/smarter-device-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cyberark-secrets-provider-for-k8s-fips

# cyberark-secrets-provider-for-k8s-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cyberark-secrets-provider-for-k8s-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cyberark-secrets-provider-for-k8s-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The CyberArk Secrets Provider for Kubernetes provides Kubernetes-based applications with access to secrets that are stored and managed in Conjur.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `cyberark-secrets-provider-for-k8s-fips` image is comparable to the [upstream image from CyberArk](https://hub.docker.com/r/cyberark/secrets-provider-for-k8s) on Docker Hub.

### FIPS Support

This Chainguard image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy an application container using Chainguard's `cyberark-secrets-provider-for-k8s-fips` image with Helm.

First, add the CyberArk Helm repository:

```bash
helm repo add cyberark https://cyberark.github.io/helm-charts
helm repo update
```

Then, deploy the secrets provider with the chart, substituting CyberArk's image with Chainguard's:

```bash
helm install secrets-provider cyberark/secrets-provider \
  -n <YOUR APPLICATION'S NAMESPACE> \
  --set secretsProvider.image=cgr.dev/ORGANIZATION/cyberark-secrets-provider-for-k8s-fips \
  --set secretsProvider.tag=latest \
  --set environment.k8sSecrets="{<YOUR K8S SECRET>}" \
  --set environment.conjur.conjurConnConfigMap=conjur-connect \
  --set environment.conjur.authnLogin="<YOUR APPLICATION'S HOST>"
```

Alternatively, you can deploy the secrets provider as an init container for your application. Please refer to the [official documentation](https://docs.cyberark.com/conjur-open-source/latest/en/content/integrations/k8s-ocp/cjr-k8s-secrets-provider-ic-lp.htm?tocpath=Integrations%7COpenShift%252FKubernetes%7CApp%20owner%253A%20Set%20up%20workloads%20in%20Kubernetes%7CSet%20up%20workloads%20(cert-based%20authn)%7CSecrets%20Provider%20for%20Kubernetes%7CInit%20container%252FSidecar%7C_____0) for more details.

## Documentation and Resources

- [Official documentation](https://docs.cyberark.com/conjur-open-source/latest/en/content/integrations/k8s-ocp/cjr-secrets-provider-lp.htm?tocpath=Integrations%7COpenShift%252FKubernetes%7CApp%20owner%253A%20Set%20up%20workloads%20in%20Kubernetes%7CSet%20up%20workloads%20(cert-based%20authn)%7CSecrets%20Provider%20for%20Kubernetes%7C_____0)
- [GitHub repository](https://github.com/cyberark/secrets-provider-for-k8s)
- [Helm chart](https://github.com/cyberark/secrets-provider-for-k8s/tree/main/helm/secrets-provider)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2-iamguarded-fips

# pgpool2-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

open-source middleware that operates between PostgreSQL servers and clients, providing features such as connection pooling, load balancing, and replication to enhance database performance and availability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `pgpool2-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Pgpool-II IAMGuarded is a security-enhanced variant of Pgpool-II, an open-source middleware that operates between PostgreSQL servers and clients, providing features such as connection pooling, load balancing, and replication to enhance database performance and availability. This image is meant to be used as part of PostgreSQL HA Helm chart.

## Helm Chart Installation

The PostgreSQL HA Helm Chart provides solution using the PostgreSQL replication manager and includes Pgpool-II:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# PostgreSQL with replication manager image
postgresql:
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-repmgr-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Pgpool-II image
pgpool:
  image:
    registry: myregistry.example.com
    repository: mirrored/pgpool2-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql-ha:16.0.3
   Digest: sha256:b8ec9be981d894c6fdbe37b9b43a5293feb22b30c97b8b9c58c7af96facb0397
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL HA IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### x509-certificate-exporter

# x509-certificate-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/x509-certificate-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/x509-certificate-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Prometheus exporter to monitor x509 certificates expiration in Kubernetes clusters or standalone

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/enix/x509-certificate-exporter). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To install the [upstream helm chart](https://gateway.envoyproxy.io/docs/install/install-helm/) with Chainguard's `x509-certificate-exporter` image you can perform the following steps.

First, add the Helm repository:

```bash
helm repo add enix https://charts.enix.io
```

If you prefer to use a `values.yaml` file then you can override the image repository and tag as follows:

```yaml
image:
  registry: cgr.dev
  repository: chainguard/x509-certificate-exporter
  tag: latest
secretsExporter:
  podAnnotations:
    prometheus.io/port: "9793"
    prometheus.io/scrape: "true"
service:
  create: false
prometheusServiceMonitor:
  create: false
prometheusRules:
  create: false
```

Once you have your `values.yaml` file you can install the Helm chart with the following command:

```bash
helm install x509-certificate-exporter enix/x509-certificate-exporter -f values.yaml
```

## Documentation and Resources

Please refer to the [upstream documentation](https://github.com/enix/x509-certificate-exporter/blob/main/deploy/charts/x509-certificate-exporter/README.md) for more information on how to use the `x509-certificate-exporter` Helm chart.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-repmgr-iamguarded

# postgres-repmgr-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-repmgr-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-repmgr-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostgreSQL HA, a cluster solution using the PostgreSQL replication manager.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PostgreSQL HA IAMGuarded is a security-enhanced variant of PostgreSQL HA, a cluster solution using the PostgreSQL replication manager. This image and chart combination includes a deployment of PostgreSQL cluster, Pgpool-II and an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL HA Helm Chart provides solution using the PostgreSQL replication manager:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
```

## Chart Compatibility

Note that only the latest version of this image is guaranteed to be compatible
with the latest version of the `postgresql-ha` helm chart. This image is
versioned with major version numbers matching that of `postgresql` (`15`, `16`,
`17`). While non-latest versions _may_ work with non-latest `postgresql-ha`
charts, it is not a guarantee.

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting

The `global.org` value is **required** and can be set either:

* Via `--set` flag during installation
* In your existing `values.yaml` file

#### Registry Configuration

For users who mirror images to custom repositories:

* Use `global.imageRegistry` to override the default `cgr.dev`
* For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:

```yaml
# PostgreSQL with replication manager image
postgresql:
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-repmgr-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Pgpool-II image
pgpool:
  image:
    registry: myregistry.example.com
    repository: mirrored/pgpool2-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:

   ```bash
   helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql-ha:16.0.3
   Digest: sha256:b8ec9be981d894c6fdbe37b9b43a5293feb22b30c97b8b9c58c7af96facb0397
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL HA IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### monstache

# monstache
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/monstache` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/monstache/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A go daemon that syncs mongodb to elasticsearch in realtime.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Monstache image is a Wolfi-based container image. It is comparable to the [Monstache image published by RWynn](https://hub.docker.com/r/rwynn/monstache) in functionality and has minimal dependencies. Similar to the `rwynn/monstache` image, this image does not come with any default configuration.

## Getting Started
Monstache is a Go daemon that syncs MongoDB to Elasticsearch in real time. It is designed for MongoDB 3.6+ and Elasticsearch 7.0+. It uses the official MongoDB golang driver and the community supported [Elasticsearch driver from olivere](https://github.com/olivere/elastic).

### Using Monstache with Docker
Let say you have a `monstache.config.toml` file in your current working directory. In order for the container to work and sync with your MongoDB and Elasticsearch instances, you need to mount your custom `monstache.config.toml` file in the container. The following example runs Monstache with a custom configuration file:

```
docker run -it --rm -v "$(pwd)/monstache.config.toml:/monstache.config.toml" cgr.dev/ORGANIZATION/monstache -f monstache.config.toml
```

### Using Monstache with Kubernetes
You can also run Monstache as a pod in your Kubernetes setup. In order for the pod to work properly and sync with your MongoDB and Elasticsearch pods, you would need to create a configmap with your custom `monstache.config.toml` and mount that configmap in your Monstache pod. The following example runs Monstache as a pod with a configmap containing your custom configuration file:

```
---
apiVersion: v1
kind: Pod
metadata:
  name: monstache-demo
spec:
  containers:
  - name: monstache
    image: cgr.dev/ORGANIZATION/monstache
    command: ["/bin/monstache", "-f", "monstache.config.toml"]
    volumeMounts:
      - name: config-volume
        mountPath: /monstache.config.toml
        subPath: monstache.config.toml
  volumes:
    - name: config-volume
      configMap:
        name: monstache-config
        items:
        - key: monstache.config.toml
          path: monstache.config.toml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: monstache-config
data:
  monstache.config.toml: |
    # Your monstache configuration here
```

## Documentation and Resources

Please refer to the official [Monstache site](https://rwynn.github.io/monstache-site/) for more information on configuration and usage.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### erlang-fips

# erlang-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/erlang-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/erlang-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ctlog

# ctlog
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ctlog` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ctlog/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ctlog is deployed as part of the sigstore stack

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Certificate Transparency Logging

The ctlog is deployed as part of the sigstore stack.  For more information
on this see [`sigstore-scaffolding`](../sigstore-scaffolding/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wiremock

# wiremock
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wiremock` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wiremock/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wiremock is a tool for mocking HTTP services.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [wiremock](https://hub.docker.com/r/wiremock/wiremock) image. Switching to Chainguard image should not require any changes to your existing setup.

NOTE: Chainguard wiremock image runs as nonroot user. Upstream image allows you to change UID by using `-e uid` with `docker run`. Chainguard Wiremock image runs with 65532 UID by default and do not contain utilities like `chown` and `gosu`.

## Getting Started

### docker
```bash
$ docker run --rm -p 8080:8080 cgr.dev/ORGANIZATION/wiremock
$ curl http://localhost:8080/__admin/health
{
  "status" : "healthy",
  "message" : "Wiremock is ok",
  "version" : "3.12.1",
  "uptimeInSeconds" : 7,
  "timestamp" : "2025-04-11T03:31:14.071866Z"
}⏎
```

### kubernetes
To install Chainguard's wiremock image on your Kubernetes cluster, you can use the official image's [Helm chart](https://github.com/wiremock/helm-charts).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/wiremock
  tag: latest
```

You can also invoke the following command to install argocd-image-updater in your cluster.

```shell
helm repo add wiremock https://wiremock.github.io/helm-charts
helm install wiremock wiremock/wiremock -f values.yaml
```

## Documentation and Resources
For more information, please refer to [the official documentation for wiremock](https://wiremock.org/docs/) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### syft-fips

# syft-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/syft-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/syft-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A tool for generating a Software Bill of Materials (SBOM) from container images and filesystems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Image Variants

### Compatibility Notes

Chainguard's `syft-fips` image is comparable to the [official Syft Image.](https://hub.docker.com/r/anchore/syft) but with the following changes:
* We use a different entrypoint `/usr/bin/syft` as compared to the upstream's endpoint `/syft`.
* We use a different `CMD` which is `help` whereas the upstream leaves it unset.
* We don't define any WorkingDir whereas the upstream sets it to `/tmp`.

### Getting Started

#### syft help
This will automatically pull the image to your local system and execute the command `syft help`:

```shell
docker run --rm cgr.dev/chainguard/syft-fips help
Generate a packaged-based Software Bill Of Materials (SBOM) from container images and filesystems

Usage:
  syft [SOURCE] [flags]
  syft [command]

Examples:
  syft scan alpine:latest                                a summary of discovered packages
  syft scan alpine:latest -o json                        show all possible cataloging details
  syft scan alpine:latest -o cyclonedx                   show a CycloneDX formatted SBOM
  syft scan alpine:latest -o cyclonedx-json              show a CycloneDX JSON formatted SBOM
  syft scan alpine:latest -o spdx                        show a SPDX 2.3 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx@2.2                    show a SPDX 2.2 Tag-Value formatted SBOM
  syft scan alpine:latest -o spdx-json                   show a SPDX 2.3 JSON formatted SBOM
  syft scan alpine:latest -o spdx-json@2.2               show a SPDX 2.2 JSON formatted SBOM
  syft scan alpine:latest -vv                            show verbose debug information
  syft scan alpine:latest -o template -t my_format.tmpl  show a SBOM formatted according to given template file

  Supports the following image sources:
    syft scan yourrepo/yourimage:tag     defaults to using images from a Docker daemon. If Docker is not present, the image is pulled directly from the registry.
    syft scan path/to/a/file/or/dir      a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

  You can also explicitly specify the scheme to use:
    syft scan docker:yourrepo/yourimage:tag            explicitly use the Docker daemon
    syft scan podman:yourrepo/yourimage:tag            explicitly use the Podman daemon
    syft scan registry:yourrepo/yourimage:tag          pull image directly from a registry (no container runtime required)
    syft scan docker-archive:path/to/yourimage.tar     use a tarball from disk for archives created from "docker save"
    syft scan oci-archive:path/to/yourimage.tar        use a tarball from disk for OCI archives (from Skopeo or otherwise)
    syft scan oci-dir:path/to/yourimage                read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    syft scan singularity:path/to/yourimage.sif        read directly from a Singularity Image Format (SIF) container on disk
    syft scan dir:path/to/yourproject                  read directly from a path on disk (any directory)
    syft scan file:path/to/yourproject/file            read directly from a path on disk (any single file)

Available Commands:
  attest      Generate an SBOM as an attestation for the given [SOURCE] container image
  cataloger   Show available catalogers and configuration
  completion  Generate the autocompletion script for the specified shell
  config      show the syft configuration
  convert     Convert between SBOM formats
  help        Help about any command
  login       Log in to a registry
  scan        Generate an SBOM
  version     show version information

Flags:
      --base-path string                          base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
  -c, --config string                             syft configuration file
      --enrich stringArray                        enable package data enrichment from local and online sources (options: all, golang, java, javascript)
      --exclude stringArray                       exclude paths from being scanned using a glob expression
      --file string                               file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
      --from stringArray                          specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
  -h, --help                                      help for syft
  -o, --output stringArray                        report output format (<format>=<file> to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
      --override-default-catalogers stringArray   set the base set of catalogers to use (defaults to 'image' or 'directory' depending on the scan source)
      --platform string                           an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')
  -q, --quiet                                     suppress all logging output
  -s, --scope string                              selection of layers to catalog, options=[squashed all-layers] (default "squashed")
      --select-catalogers stringArray             add, remove, and filter the catalogers to be used
      --source-name string                        set the name of the target being analyzed
      --source-version string                     set the version of the target being analyzed
  -t, --template string                           specify the path to a Go template file
  -v, --verbose count                             increase verbosity (-v = info, -vv = debug)
      --version                                   version for syft

Use "syft [command] --help" for more information about a command.
```

#### syft scan

Show a summary of discovered packages using `syft scan`:

```shell
docker run --rm cgr.dev/chainguard/syft-fips -q scan cgr.dev/chainguard/wolfi-base:latest
NAME                    VERSION       TYPE
apk-tools               2.14.4-r0     apk
busybox                 1.37.0-r0     apk
ca-certificates-bundle  20241010-r1   apk
glibc                   2.40-r3       apk
glibc-locale-posix      2.40-r3       apk
ld-linux                2.40-r3       apk
libcrypt1               2.40-r3       apk
libcrypto3              3.3.2-r2      apk
libgcc                  14.2.0-r3     apk
libssl3                 3.3.2-r2      apk
libxcrypt               4.4.36-r8     apk
wolfi-base              1-r6          apk
wolfi-baselayout        20230201-r15  apk
wolfi-keys              1-r8          apk
zlib                    1.3.1-r4      apk
```

### Documentation and Resources

* [Syft Documentation](https://github.com/anchore/syft/wiki)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubescape-http-request-fips

# kubescape-http-request-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubescape-http-request-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubescape-http-request-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Simple HTTP request utility for making HTTP/HTTPS requests with customizable headers and methods

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This FIPS image is a drop-in replacement for the upstream `quay.io/kubescape/http-request` image. All command-line options and functionality are fully compatible with the upstream version. 

### FIPS Support

Chainguard's  kubescape-http-request-fips container image ships with a validated  redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The http_request binary is the entrypoint for this container image. Usage is identical to the standard variant:

```bash
# Make a simple HTTP GET request
docker run cgr.dev/ORGANIZATION/kubescape-http-request-fips:latest \
  -method GET \
  -scheme http \
  -host example.com \
  -path /

# Make an HTTPS POST request with FIPS-validated TLS
docker run cgr.dev/ORGANIZATION/kubescape-http-request-fips:latest \
  -method POST \
  -scheme https \
  -host api.example.com \
  -path /api/endpoint \
  -headers "Content-Type: application/json" \
  -path-body /path/to/body.json
```

## Documentation and Resources

The kubescape-http-request utility is part of the Kubescape project, a comprehensive Kubernetes security platform. For more information:

- [http-request Source Code](https://github.com/kubescape/http-request)
- [Kubescape Documentation](https://kubescape.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-iamguarded

# postgres-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostgreSQL is a powerful, open source object-relational database system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PostgreSQL IAMGuarded is a security-enhanced variant of PostgreSQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main PostgreSQL image
image:
  registry: myregistry.example.com
  repository: mirrored/postgres-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql:16.7.2
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dns-node-cache-fips

# kubernetes-dns-node-cache-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dns-node-cache-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dns-node-cache-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that acts as a drop-in replacement for the [NodeLocal DNSCache](https://github.com/kubernetes/dns) image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is a drop-in replacement for the [kubernetes-dns-node-cache](https://github.com/kubernetes/dns) image commonly used in Kubernetes clusters for DNS caching at the node level. It is functionally equivalent to the upstream image, and switching to the Chainguard image should not require any changes to your existing setup.

### FIPS Support

The `kubernetes-dns-node-cache-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
You can deploy this image using the [nodelocal dns cache Helm chart](https://github.com/deliveryhero/helm-charts/tree/master/stable/node-local-dns). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/kubernetes-dns-node-cache-fips
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the node-local-dns helm chart
```shell
helm repo add deliveryhero https://charts.deliveryhero.io/
helm repo update
helm install node-local-dns deliveryhero/node-local-dns -f values.yaml --wait
```

## Documentation and Resources:
- [Official NodeLocal DNSCache documentation](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)
- [NodeLocal DNSCache Github Repository](https://github.com/kubernetes/dns)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spark

# spark
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spark` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spark/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Spark provides high-level APIs in Scala, Java, Python, and R, and an optimized engine that supports general computation graphs for data analysis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Spark image is comparable to Apache's [Spark image on Docker Hub](https://hub.docker.com/_/spark). Chainguard's image contains only the minimum set of dependencies needed to run Spark.

## Getting Started

Start by creating a network for your Spark nodes:

```bash
docker network create spark
```

Then we can deploy Spark with Docker:

```bash
  docker run -it \
    --net spark \
    -v /path/to/spark-default.conf:/usr/lib/spark/conf/spark-default.conf \
    cgr.dev/ORGANIZATION/spark:TAG \
    spark-shell
```

This will throw you into Spark's interactive shell.

We can submit a Spark application using another node via `spark://localhost:4440`:

```bash
  docker run \
    --net spark \
    -v /path/to/<YOUR APPLICATION>:/usr/lib/spark/work-dir/<YOUR APPLICATION>
    -v /path/to/spark-default.conf:/usr/lib/spark-default.conf \
    cgr.dev/ORGANIZATION/spark:TAG \
    spark-submit <YOUR APPLICATION> --master spark://localhost:4440
```

You should now be up and running with Spark!

## Documentation and Resources

- [Configuring Spark](https://spark.apache.org/docs/latest/configuration.html)
- [Spark Documentation](https://spark.apache.org/documentation.html)
- [Spark GitHub Repository](https://github.com/apache/spark)
- [Spark Quick Start Tutorial](https://spark.apache.org/docs/latest/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-iamguarded-fips

# thanos-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Highly available Prometheus setup with long term storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS support

The `thanos-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Thanos IAMGuarded is a security-enhanced variant of Thanos designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Thanos deployments.

## Helm Chart Installation

The Thanos IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/thanos
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install thanos oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Thanos image
image:
  registry: myregistry.example.com
  repository: mirrored/thanos-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
# MinIO chart images
minio:
  image:
    registry: myregistry.example.com
    repository: mirrored/minio-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
  client:
    image:
      registry: myregistry.example.com
      repository: mirrored/minio-client-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag
  defaultInitContainers:
    volumePermissions:
      image:
        registry: myregistry.example.com
        repository: mirrored/os-shell-iamguarded-fips
        digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install thanos oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/thanos
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/thanos:3.0.4
   Digest: sha256:083c999b293bd86aa63204e7a41325efa2c2ac4bca21cbd890b5eb5897d243ec
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Thanos IAMGuarded installation using standard Thanos verification methods. The deployment functions as a standard Thanos instance, so all typical Thanos validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Thanos IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Thanos and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### headlamp-plugin-flux-fips

# headlamp-plugin-flux-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/headlamp-plugin-flux-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/headlamp-plugin-flux-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Headlamp plugin to visualize and manage Flux GitOps resources in Kubernetes clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `headlamp-plugin-flux-fips` container image is a drop-in replacement for the upstream [headlamp-k8s/headlamp-plugin-flux](https://github.com/headlamp-k8s/plugins/pkgs/container/headlamp-plugin-flux) image. The Flux plugin provides a way to visualize Flux in Headlamp. Like the upstream image, when installed, the plugin adds a new item (**Flux**) to the Headlamp sidebar, enabling users to visualize and manage Flux GitOps resources such as GitRepositories and Kustomizations directly through the Headlamp UI. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS Support

The `headlamp-plugin-flux-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [Headlamp Helm chart](https://github.com/headlamp-k8s/headlamp/tree/main/charts/headlamp). To enable the Flux plugin, override the chart values to add an `initContainer` that copies the plugin into Headlamp’s plugin directory. 

Be sure to override the image by setting the following values in a `values.yaml` file:

```bash
initContainers:
  - name: flux-plugin
    image: cgr.dev/ORGANIZATION/headlamp-plugin-flux-fips:latest
    imagePullPolicy: Always
    command: ["/bin/sh", "-c"]
    args:
      - "mkdir -p /headlamp/plugins && cp -r /plugins/* /headlamp/plugins/ && chown -R 100:101 /headlamp/plugins"
    securityContext:
      runAsNonRoot: false
      privileged: false
      runAsUser: 0
      runAsGroup: 0
    volumeMounts:
      - mountPath: /headlamp/plugins
        name: headlamp-plugins

volumes:
  - name: headlamp-plugins
    emptyDir: {}

volumeMounts:
  - mountPath: /headlamp/plugins
    name: headlamp-plugins
```

Be sure to replace the ORGANIZATION placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, install Headlamp with these values
```bash
helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
helm repo update
helm install headlamp headlamp/headlamp --namespace headlamp --create-namespace --values values.yaml --wait
```

## Documentation and Resources
- [Headlamp Plugins Github Repository](https://github.com/headlamp-k8s/plugins/tree/main/flux)
- [Headlamp Github Repository](https://github.com/kubernetes-sigs/headlamp)
- [Headlamp Helm Charts](https://headlamp.dev/docs/latest/installation/in-cluster/#using-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-vsphere-controller

# cluster-api-vsphere-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-vsphere-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-vsphere-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes-native declarative infrastructure for vSphere

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-vsphere-controller image is compatible with the upstream [Cluster API Provider vSphere](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere). This image contains only the minimum set of dependencies needed to run the vSphere infrastructure provider components.

## Installation

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool

### Initialization

Initialize the vSphere infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure vsphere
```

You need to create a [`clusterctl.yaml`](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md#configuring-and-installing-cluster-api-provider-vsphere-in-a-management-cluster) to configure the `VSPHERE_` variables.

### Creating a vSphere-based workload cluster

Use the `clusterctl` CLI tool to generate a workload cluster configuration:

```
clusterctl generate cluster vsphere-quickstart \
  --infrastructure vsphere \
  --kubernetes-version v1.17.3 \
  --control-plane-machine-count 1 \
  --worker-machine-count 3 > cluster.yaml
```

Inspect and make any changes:

```
vi cluster.yaml
```

Finally, apply the configuration:

```
kubectl apply -f cluster.yaml
```

### Accessing the workload cluster

```
kubectl get secret/vsphere-quickstart-kubeconfig -o json \
| jq -r .data.value \
| base64 --decode \
> ./vsphere-quickstart.kubeconfig
```

Now you can access the workload cluster:

```
KUBECONFIG=vsphere-quickstart.kubeconfig kubectl get --raw='/readyz?verbose'
```

## Documentation and Resources

* [Cluster API Provider vSphere GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere)
* [Getting Started](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/docs/getting_started.md)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dynamic-localpv-provisioner-fips

# dynamic-localpv-provisioner-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dynamic-localpv-provisioner-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dynamic-localpv-provisioner-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Fips image of Dynamic LocalPV Provisioner an Kubernetes component that automates the provisioning of local persistent volumes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `dynamic-localpv-provisioner-fips` container image is a drop-in replacement for the upstream [openebs/provisioner-localpv](https://github.com/openebs/dynamic-localpv-provisioner) image. It offers the same functionality as the upstream for dynamically deploying Stateful Persistent Node-Local Volumes & Filesystems for Kubernetes. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.  

### FIPS Support

The `dynamic-localpv-provisioner-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the official [OpenEBS LocalPV Provisioner Helm chart](https://github.com/openebs/dynamic-localpv-provisioner/blob/develop/deploy/helm/charts/README.md). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
localpv:
  name: localpv-provisioner
  enabled: true
  image:
    registry: "cgr.dev"
    repository: ORGANIZATION/dynamic-localpv-provisioner-fips
    tag: latest
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `LocalPV Provisioner` helm chart

```shell
helm repo add openebs-localpv https://openebs.github.io/dynamic-localpv-provisioner
helm repo update
helm install openebs-localpv openebs-localpv/dynamic-localpv-provisioner -f values.yaml --wait
```

## Documentation and Resources:
- [OpenEBS LocalPV Provisioner GitHub Repository](https://github.com/openebs/dynamic-localpv-provisioner)
- [OpenEBS LocalPV Provisioner Helm Chart](https://github.com/openebs/dynamic-localpv-provisioner/blob/develop/deploy/helm/charts/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-blackbox-exporter

# prometheus-blackbox-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-blackbox-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-blackbox-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, ICMP and gRPC.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus Blackbox exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install blackbox-exporter prometheus-community/prometheus-blackbox-exporter \
 --set image.registry=cgr.dev \
 --set image.repository=chainguard/prometheus-blackbox-exporter \
 --set image.tag=latest
```

For more detail, please refer to the [Blackbox exporter documentation](https://github.com/prometheus/blackbox_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### librechat

# librechat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/librechat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/librechat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An open-source AI chat application.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

LibreChat is an open-source AI chat application that allows users to interact with various AI models through a unified interface. Chainguard's librechat container image is comparable to the upstream [LibreChat image available on Docker Hub](https://hub.docker.com/r/librechat/librechat).

**Important:** When deploying the Chainguard LibreChat image to Kubernetes, you must use the Chainguard IAMGuarded MongoDB Helm chart as a separate installation:

```bash
# Deploy MongoDB using Chainguard IAMGuarded chart
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --namespace librechat \
  --create-namespace \
  --set auth.rootPassword=PASSWORD

# Then deploy LibreChat with mongodb.enabled=false
helm install librechat oci://ghcr.io/danny-avila/librechat-chart/librechat \
  --namespace librechat \
  --values values.yaml  # mongodb.enabled: false in values
```

## Getting Started

LibreChat requires a MongoDB database and several environment variables for encryption and authentication. Below are examples for both Docker and Kubernetes deployments.

### Running with Docker

First, start a MongoDB container:

```bash
docker run -d --name librechat-mongo \
  -e MONGO_INITDB_DATABASE=LibreChat \
  -p 27017:27017 \
  cgr.dev/ORGANIZATION/mongodb:latest
```

Generate required secrets:

```bash
JWT_SECRET=$(openssl rand -base64 32)
JWT_REFRESH_SECRET=$(openssl rand -base64 32)
CREDS_KEY=$(openssl rand -base64 32)
CREDS_IV=$(openssl rand -base64 16)
```

Run LibreChat:

```bash
docker run -d --name librechat \
  --link librechat-mongo:mongo \
  -p 3080:3080 \
  -e MONGO_URI=mongodb://mongo:27017/LibreChat \
  -e JWT_SECRET="${JWT_SECRET}" \
  -e JWT_REFRESH_SECRET="${JWT_REFRESH_SECRET}" \
  -e CREDS_KEY="${CREDS_KEY}" \
  -e CREDS_IV="${CREDS_IV}" \
  cgr.dev/ORGANIZATION/librechat:latest
```

Access the application at `http://localhost:3080`.

### Deploying with Helm on Kubernetes

LibreChat can be deployed to Kubernetes using the official Helm chart with Chainguard images.

First, create a values file with your configuration:

```yaml
# values.yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/librechat
  tag: latest
  pullPolicy: Always

mongodb:
  enabled: false  # Use external MongoDB

librechat:
  configEnv:
    MONGO_URI: "mongodb://root:PASSWORD@mongodb:27017/LibreChat?authSource=admin"
    CREDS_KEY: ""  # Set via secret
    CREDS_IV: ""   # Set via secret
    JWT_SECRET: ""  # Set via secret
    JWT_REFRESH_SECRET: ""  # Set via secret
    ALLOW_REGISTRATION: "true"
    ALLOW_SOCIAL_LOGIN: "true"
```

Create Kubernetes secrets for sensitive values:

```bash
# Generate secret values
JWT_SECRET=$(openssl rand -base64 32)
JWT_REFRESH_SECRET=$(openssl rand -base64 32)
CREDS_KEY=$(openssl rand -base64 32)
CREDS_IV=$(openssl rand -base64 16)

# Create the secret
kubectl create secret generic librechat-credentials-env \
  --namespace=librechat \
  --from-literal=JWT_SECRET="${JWT_SECRET}" \
  --from-literal=JWT_REFRESH_SECRET="${JWT_REFRESH_SECRET}" \
  --from-literal=CREDS_KEY="${CREDS_KEY}" \
  --from-literal=CREDS_IV="${CREDS_IV}"
```

Deploy MongoDB using Helm (if not using an external database):

```bash
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --namespace librechat \
  --create-namespace \
  --set auth.rootPassword=PASSWORD
```

Install LibreChat:

```bash
helm install librechat oci://ghcr.io/danny-avila/librechat-chart/librechat \
  --namespace librechat \
  --create-namespace \
  --values values.yaml
```

Verify the deployment:

```bash
kubectl get pods -n librechat
kubectl logs -n librechat -l app.kubernetes.io/name=librechat-librechat
```

You should see logs indicating:
- `Connected to MongoDB`
- `Server listening on all interfaces at port 3080`

## Required Environment Variables

LibreChat requires the following environment variables:

| Variable | Description | Example |
|----------|-------------|---------|
| `MONGO_URI` | MongoDB connection string | `mongodb://mongo:27017/LibreChat` |
| `JWT_SECRET` | Secret for JWT token signing | Generated with `openssl rand -base64 32` |
| `JWT_REFRESH_SECRET` | Secret for refresh token signing | Generated with `openssl rand -base64 32` |
| `CREDS_KEY` | Encryption key for credentials | Generated with `openssl rand -base64 32` |
| `CREDS_IV` | Initialization vector for encryption | Generated with `openssl rand -base64 16` |

Optional environment variables for additional configuration:

- `ALLOW_REGISTRATION`: Enable user registration (default: `false`)
- `ALLOW_SOCIAL_LOGIN`: Enable social authentication (default: `false`)
- `OPENAI_API_KEY`: API key for OpenAI integration
- `ANTHROPIC_API_KEY`: API key for Anthropic Claude integration

## Documentation and Resources

- [LibreChat Official Documentation](https://docs.librechat.ai/)
- [LibreChat GitHub Repository](https://github.com/danny-avila/LibreChat)
- [LibreChat Helm Chart](https://github.com/danny-avila/LibreChat/tree/main/helm/librechat)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-event-exporter-iamguarded-fips

# kubernetes-event-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-event-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-event-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

IAMGuarded compatible image of [Kubernetes Event Exporter](https://github.com/resmoio/kubernetes-event-exporter) for exporting Kubernetes events to various outputs to be used for observability or alerting purposes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `kubernetes-event-exporter-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Kubernetes-event-exporter IAMGuarded is a security-enhanced variant of Kubernetes-event-exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Kubernetes-event-exporter deployments.

## Helm Chart Installation

The Kubernetes-event-exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kubernetes-event-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Kubernetes-event-exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/kubernetes-event-exporter-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kubernetes-event-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kubernetes-event-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kubernetes-event-exporter:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kubernetes-event-exporter IAMGuarded installation using standard Kubernetes-event-exporter verification methods. The deployment functions as a standard Kubernetes-event-exporter instance, so all typical Kubernetes-event-exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kubernetes-event-exporter IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Kubernetes-event-exporter and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### TEMPLATE

# Chainguard Image Template

This is a template README.md for new images.

1. Include a brief description of the image here, and instructions about how to use it.
1. Run `monopod readme`, which will update the top section of this file and the root README.md file.
1. Run `make tfgen`, which will update the generated root module config.

If you need to support version streams, you can leave `packages` empty in `latest.apko.yaml`, and instead add packages to the images using the `extra_packages` TF variable in `config/main.tf`.

<!-- IMAGE_SEPARATOR -->

### skopeo

# skopeo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/skopeo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/skopeo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based skopeo image for interacting with container registries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `skopeo` image is comparable to the [Skopeo image](https://quay.io/skopeo/stable). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting started

You can inspect container images using the `skopeo` image with the following command. This will show detailed information about the image manifest, configuration, and layers.

```shell
docker run --rm cgr.dev/ORGANIZATION/skopeo:latest inspect docker://chainguard/wolfi-base
```

You can also list all available tags for a container image:

```shell
docker run --rm cgr.dev/ORGANIZATION/skopeo:latest list-tags docker://chainguard/wolfi-base
```

## Documentation and Resources

For more information, you can refer to the [official Skopeo documentation](https://github.com/containers/skopeo) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-fips

# valkey-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `valkey-fips` image is designed to be a drop-in replacement for the official [Valkey image](https://hub.docker.com/r/valkey/valkey).

### FIPS Support

This Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To run Valkey with default configuration:

```shell
docker run -d -p 6379:6379 --rm --name valkey-container cgr.dev/ORGANIZATION/valkey-fips:latest
```

Note that this example names the container `valkey-container`.

With the `valkey-fips` container running, you can use Docker to test basic operations:

```shell
docker exec valkey-container valkey-cli SET mykey myvalue
docker exec valkey-container valkey-cli GET mykey
```

For data persistence, use a volume:

```shell
docker run -d -v $(pwd):/data -p 6379:6379 cgr.dev/ORGANIZATION/valkey-fips:latest
```

## Documentation and Resources

- [Valkey Documentation](https://valkey.io/docs/)
- [Valkey GitHub Repository](https://github.com/valkey-io/valkey)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mongodb-exporter-iamguarded

# prometheus-mongodb-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mongodb-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mongodb-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus MongoDB Exporter image for exporting various metrics about MongoDB compatible with Iamguarded Helm chart.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus MongoDB Exporter IAMGuarded is a security-enhanced variant of MongoDB designed to be deployed using the MongoDB IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard MongoDB deployments.

## Helm Chart Installation

The MongoDB IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MongoDB image
image:
  registry: myregistry.example.com
  repository: mirrored/mongodb-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus MongoDB exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mongodb-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# When external access to MongoDB is enabled:
externalAccess:
  # This is the image of the auto-discovery init container that
  # auto-detects LB IPs or node ports.
  autoDiscovery:
    image:
      registry: myregistry.example.com
      repository: mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag
  # Image of the init container that ensures public names can be resolved.
  dnsCheck:
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# Image of the container that enables TLS support to MongoDB.
tls:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image of the init container that sets up volume permissions.
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mongodb:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MongoDB IAMGuarded installation using standard MongoDB verification methods. The deployment functions as a standard MongoDB instance, so all typical MongoDB validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MongoDB IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MongoDB and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pvc-autoresizer

# pvc-autoresizer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pvc-autoresizer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pvc-autoresizer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

pvc-autoresizer is a Kubernetes controller that monitors persistent volume claims (PVCs) and automatically resizes them based on usage metrics collected from Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides a secure and minimal environment for running the `pvc-autoresizer controller`. It maintains functional parity with the upstream [pvc-autoresizer](https://github.com/topolvm/pvc-autoresizer/tree/main) image and is compatible with Kubernetes environments where it monitors persistent volume claims (PVCs) and automatically
resizes them based on usage metrics collected from Prometheus. Switching to the Chainguard image should not require changes to your existing Kubernetes setup.

## Getting Started

The easiest way to deploy this image is with the [pvc-autoresizer Helm Chart](https://github.com/topolvm/pvc-autoresizer/tree/main/charts/pvc-autoresizer).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/pvc-autoresizer
  pullPolicy: IfNotPresent
  tag: "latest"
```

Then, deploy the `pvc-autoresizer` using helm

```shell
helm repo add pvc-autoresizer https://topolvm.github.io/pvc-autoresizer/
helm install --create-namespace --namespace pvc-autoresizer pvc-autoresizer pvc-autoresizer/pvc-autoresizer -f values.yaml
```

### Documentation and Resources:

For more information, please refer to [the official documentation for pvc-autoresizer](https://github.com/topolvm/pvc-autoresizer/tree/main).
- [pvc-autoresizer Github Repository](https://github.com/topolvm/pvc-autoresizer/tree/main)
- [pvc-autoresizer Exporter Helm Chart](https://github.com/topolvm/pvc-autoresizer/tree/main/charts/pvc-autoresizer)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gha-runner-scale-set-controller

# gha-runner-scale-set-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gha-runner-scale-set-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gha-runner-scale-set-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller for GitHub Actions self-hosted runners

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This document outlines how to test our `gha-runner-scale-set-controller` image. You can set up ARC on Kubernetes using Helm, then create and run a workflow that uses runner scale sets. 

For more information about runner scale sets, you should refer to the official documentation, [_Quickstart for Actions Runner Controller_](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/quickstart-for-actions-runner-controller#installing-actions-runner-controller).

## Prerequisites

You can find a detailed list of prerequisites in the official documentation, (here)[https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/quickstart-for-actions-runner-controller#prerequisites).

But for the sake of simplicity, all you need is:
- A Kubernetes cluster
- Helm 3
- A GitHub repository with a workflow that uses runner scale sets

that's all.

## Testing

To test the `gha-runner-scale-set-controller` image, you can follow these steps:

1. Install the Actions Runner Controller on your Kubernetes cluster using Helm. You can find the installation instructions [here](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/quickstart-for-actions-runner-controller#installing-actions-runner-controller).

```shell
NAMESPACE="arc-systems"
helm install arc \
    --namespace "${NAMESPACE}" \
    --create-namespace \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller \
    --set image.repository=cgr.dev/chainguard/gha-runner-scale-set-controller \
    --set image.tag=latest
```

> ⚠️ Please ensure that the `arc-gha-rs-controller` pod is running in the `arc-system` namespace before proceeding to the next step.

2. To configure the runner scale set, you can follow the official documentation [here](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/quickstart-for-actions-runner-controller#configuring-a-runner-scale-set).

For that, you will need two things:
- A GitHub repository with a workflow that uses runner scale sets
- A runner registration token which we refer `GITHUB_PAT`

```shell
INSTALLATION_NAME="arc-runner-set"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/<org/repo/enterprise>" # make sure to replace this with your GitHub repository URL or GitHub Enterprise URL
GITHUB_PAT="<PAT>" # make sure to replace this with your GitHub PAT

helm install "${INSTALLATION_NAME}" \
    --namespace "${NAMESPACE}" \
    --create-namespace \
    --set githubConfigUrl="${GITHUB_CONFIG_URL}" \
    --set githubConfigSecret.github_token="${GITHUB_PAT}" \
    oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
```

> ⚠️ Please ensure that the `arc-runner-set` pod is running in the `arc-runners` namespace before proceeding to the next step.

> ⚠️ The GITHUB_PAT is not the only way to authenticate with GitHub. You can use other methods like GitHub App. You can check the values.yaml file for more information: https://github.com/actions/actions-runner-controller/blob/master/charts/gha-runner-scale-set/values.yaml

Once you did that you can create and run a workflow that uses runner scale sets like the following:

> 🤖 You can see the self-hosted runner that you registered within the project's runners tab.
> To get more detail about using self-hosted runners in workflow, [here](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-self-hosted-runners-in-a-workflow) is the official documentation you can refer to.

```yaml
name: Actions Runner Controller Demo
on:
  workflow_dispatch:

jobs:
  Explore-GitHub-Actions:
    # You need to use the INSTALLATION_NAME from the previous step
    runs-on: arc-runner-set
    steps:
    - run: echo "🎉 This job uses runner scale set runners!"

```

That's it! You have successfully tested the `gha-runner-scale-set-controller` image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### atlantis-fips

# atlantis-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/atlantis-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/atlantis-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image. Please refer to the [installation guide](https://www.runatlantis.io/docs/installation-guide.html) for more details.

Atlantis has an [official Helm chart](https://github.com/runatlantis/helm-charts/tree/main), more instructions can be found in the [deployment guide](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-config-reloader

# prometheus-config-reloader
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-config-reloader` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-config-reloader/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist image for Prometheus Config Reloader. It helps with config of Prometheus Operator which creates/configures/manages Prometheus clusters atop Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on prometheus-operator, refer to the
[official documentation](https://prometheus-operator.dev).
The GitHub repository can also be [found here](https://github.com/prometheus-operator/prometheus-operator).

### Helm
To deploy via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2059)

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-config-reloader prometheus-community/kube-prometheus-stack \
 --set prometheusOperator.prometheusConfigReloader.image.registry=cgr.dev \
 --set prometheusOperator.prometheusConfigReloader.image.repository=ORGANIZATION/prometheus-config-reloader \
 --set prometheusOperator.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bazel

# bazel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bazel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bazel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Bazel](https://bazel.build) - A fast, scalable, multi-language and extensible build system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Bazel

We can use the Bazel examples to try this image.

first clone https://github.com/bazelbuild/examples

```sh
git clone git@github.com:bazelbuild/examples.git
```

change into the Java tutorial directory

```
cd examples/java-tutorial
```

now run the chainguard image, mounting the example and overwrite the entrypoint to bash

```sh
docker run --rm -ti --entrypoint bash -v ${PWD}:/home/bazel cgr.dev/chainguard/bazel
```

once in the container you can perform a build

```sh
bazel build //:ProjectRunner
```

and now run the example

```sh
bazel-bin/ProjectRunner
```

and see the message from the example application

```sh
Hi
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kayenta

# kayenta
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kayenta` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kayenta/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Automated Canary Service

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Kayenta Image is comparable to the official Kayenta Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
Kayenta is a component that spins up when spinnaker is deployed. The instructions to deploy spinnaker are present here https://spinnaker.io/docs/setup/install/. 
To replace kayenta image with Chainguard containers, run:
```
mkdir -p ~/.hal/default/service-settings && cat > ~/.hal/default/service-settings/kayenta.yml' <<EOF
artifactId:  cgr.dev/ORGANIZATION/kayenta:latest
kubernetes:
  imagePullPolicy: IfNotPresent
```
Make sure you enable canary in your environment, by running something like this:
```
kubectl exec -i halyard -- hal config canary enable
```
Run ` hal --ready deploy apply` to deploy all spinnaker components and monitor 
Remember to replace ORGANIZATION with the your organization name. 
## Documentation and Resources
- [Spinnaker documentation](https://spinnaker.io/docs/)
- [Canary overview](https://spinnaker.io/docs/guides/user/canary/canary-overview/)
- [Kayenta github repository](https://github.com/spinnaker/kayenta)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### paranoia

# paranoia
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/paranoia` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/paranoia/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based paranoia image for inspecting certificate authorities in container images

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Paranoia can be used to list out the certificates in a container image:

```
docker run --rm cgr.dev/chainguard/paranoia:latest export alpine:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dcgm-exporter

# dcgm-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dcgm-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dcgm-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `dcgm-exporter-fips` image is designed to be a drop-in replacement for the upstream [`NVIDIA/dcgm-exporter`](https://github.com/NVIDIA/dcgm-exporter) image, with an important difference:
The upstream image contains an entrypoint script which adds `cap_sys_admin=+ep` to the `dcgm-exporter` binary at runtime when `--cap-add SYS_ADMIN` is passed to the container. This Entrypoint script needs packages like `bash` and `libcap-utils` which increases the attack surface area of the image. The Chainguard image excludes these extra packages as well as the entrypoint script while ensuring no changes in the Image behaviour.

This image contains **2 different tags**:
| Tag Version | Description | Privileges Required | DCP Metrics |
|--------------|--------------|---------------------|-------------------|
| `latest` or `4.4.*` | Runs with privileged `dcgm-exporter` binary (`cap_sys_admin=+ep`). | Requires `CAP_SYS_ADMIN` at container or pod runtime. | ✅ Enabled |
| `4.4.*-noprof` | Runs without privileged capabilities in `dcgm-exporter`. | Does **not** require `CAP_SYS_ADMIN` at runtime. | ❌ Disabled |

* Why is SYS_ADMIN capability required?
_The requirement for `SYS_ADMIN` privileges comes from DCGM, while the `dcgm-exporter` binary is simply a client. The specific use cases for how and where `DCGM` (`nv-hostengine`) and `dcgm-exporter` (`binary`) run and communicate can vary. It is required for following cases:_
   * _`DCP` metrics or **DCGM Profiling metrics** require root privileges unless configured otherwise in the kernel parameters._
   * _MIG-enabled systems_
* All components are minimal, distroless images with low-to-zero CVEs

## Usage

DCGM-Exporter is a tool based on the Go APIs to NVIDIA DCGM that allows users to gather GPU metrics and understand workload behavior or monitor GPUs in clusters. DCGM Exporter is written in Go and exposes GPU metrics at an HTTP endpoint (/metrics) for monitoring solutions such as Prometheus.

To test the functionality of NVIDIA DCGM Exporter Image, it requires an environment with connected GPUs. If you have connected GPUs, here's one way to use this image:

### Using Docker 

#### Run Image

Install [Docker Engine](https://docs.docker.com/engine/install/ubuntu/) and configure it with your credentials to pull image

Run the image:

```bash
docker run -d --rm \
   --gpus all \
   --net host \
   --cap-add SYS_ADMIN \
   cgr.dev/chainguard/dcgm-exporter:latest \
   -f /etc/dcgm-exporter/dcp-metrics-included.csv
```

#### Retrieve the metrics

```bash
$ curl localhost:9400/metrics
```

#### Output should be something like this

```bash
# HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz).
# TYPE DCGM_FI_DEV_SM_CLOCK gauge
# HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
# TYPE DCGM_FI_DEV_MEM_CLOCK gauge
# HELP DCGM_FI_DEV_MEMORY_TEMP Memory temperature (in C).
# TYPE DCGM_FI_DEV_MEMORY_TEMP gauge
...
DCGM_FI_DEV_SM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 139
DCGM_FI_DEV_MEM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 405
DCGM_FI_DEV_MEMORY_TEMP{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 9223372036854775794
...
```

### Helm Installation 

Step 1: Add and Update Helm Repository
Add the NVIDIA  DCGM Exporter repository and update it to ensure you have access to the latest charts.

```shell
$ helm repo add gpu-helm-charts \
   https://nvidia.github.io/dcgm-exporter/helm-charts

$ helm repo update
```

Step 2: Install NVIDIA DCGM Exporter

Install NVIDIA DCGM Exporter using Helm with the specified version, namespace, and optional configuration settings.

```shell
$ helm install \
  --generate-name \
  gpu-helm-charts/dcgm-exporter \
  --set image.repository=cgr.dev/chainguard/dcgm-exporter \
  --set image.tag=latest
```

Step 3: Verify Installation

```shell
$ kubectl get pods -A

NAMESPACE     NAME                                                              READY   STATUS      RESTARTS   AGE
default       dcgm-exporter-2-1603213075-w27mx                                  1/1     Running     0          2m18s
kube-system   calico-kube-controllers-8f59968d4-g28x8                           1/1     Running     1          43m
kube-system   calico-node-zfnfk                                                 1/1     Running     1          43m
kube-system   coredns-f9fd979d6-p7djj                                           1/1     Running     1          43m
kube-system   coredns-f9fd979d6-qhhgq                                           1/1     Running     1          43m
kube-system   etcd-ip-172-31-92-253                                             1/1     Running     1          43m
kube-system   kube-apiserver-ip-172-31-92-253                                   1/1     Running     2          43m
kube-system   kube-controller-manager-ip-172-31-92-253                          1/1     Running     1          43m
kube-system   kube-proxy-mh528                                                  1/1     Running     1          43m
kube-system   kube-scheduler-ip-172-31-92-253                                   1/1     Running     1          43m
kube-system   nvidia-device-plugin-1603211071-7hlk6                             1/1     Running     0          35m
prometheus    alertmanager-kube-prometheus-stack-1603-alertmanager-0            2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603-operator-6b95bcdc79-wmbkn              2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-grafana-67ff56c449-tlmxc         2/2     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-kube-state-metrics-877df67c49f   1/1     Running     0          33m
prometheus    kube-prometheus-stack-1603211794-prometheus-node-exporter-b5fl9   1/1     Running     0          33m
prometheus    prometheus-kube-prometheus-stack-1603-prometheus-0                3/3     Running     1          33m
```

For more information and setting it up with prometheus stack, refer to the official documentation:
- [Helm Installation Guide](https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/latest/kube-prometheus.html#setting-up-prometheus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### longhorn-fips

# longhorn-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/longhorn-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/longhorn-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A lightweight, reliable distributed block storage system for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Longhorn FIPS images are FIPS 140-2 compliant variants of the upstream [Longhorn](https://longhorn.io). Longhorn is a distributed block storage system for Kubernetes. These images leverage the security features of Chainguard Containers, including minimal attack surface, low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds, with the addition of FIPS-validated cryptographic modules.
   
## Versioning Strategy
These images follow semantic versioning aligned with [longhorn/longhorn](https://github.com/longhorn/longhorn) releases for consistency, even though individual components (longhorn-share-manager, longhorn-ui, backing-image-manager, longhorn-manager) may have independent upstream versions.  

#### Longhorn Backing Image Manager Compatibility
- Chainguard's variant of Longhorn Backing Image Manager does not include `telnet`, as it is not functionally required by Longhorn and the container is designed to remain minimal.
- The `backing-image-manager-fips` image switches the default key derivation from `argon2i` to `pbkdf2` to maintain FIPS 140-2 compliance.

## Available Images

Longhorn is composed of multiple container images. Currently, the following Chainguard Longhorn images are available in fips variant:
* longhorn-share-manager-fips
* longhorn-ui-fips
* longhorn-manager-fips
* backing-image-manager-fips
```shell
cgr.dev/ORGANIZATION/longhorn-share-manager-fips:latest
cgr.dev/ORGANIZATION/longhorn-manager-fips:latest
cgr.dev/ORGANIZATION/longhorn-ui-fips:latest
cgr.dev/ORGANIZATION/backing-image-manager-fips:latest
```

The `longhorn-share-manager` component provides NFS server functionality to enable ReadWriteMany (RWX) volume access in Longhorn.
The `longhorn-ui` component provides access to the dashboard for ease of administering the longhorn storage system.
The `backing-image-manager` handles creating, synchronizing and deleting backing images stored on a single Longhorn disk.
The `longhorn-manager` component is a Kubernetes controller that orchestrates volume lifecycle operations including attachment, replica management, and backup coordination across cluster nodes.

## Getting Started

To deploy Longhorn with Chainguard FIPS images, use the official Longhorn Helm chart with custom values to override the default images.

First, add the Longhorn Helm repository:

```bash
helm repo add longhorn https://charts.longhorn.io
helm repo update
```

Create a custom values file (`values-chainguard-fips.yaml`) to use Chainguard FIPS images:

```yaml
image:
  longhorn:
    shareManager:
      repository: cgr.dev/ORGANIZATION/longhorn-share-manager-fips
      tag: latest
    manager:
      repository: cgr.dev/ORGANIZATION/longhorn-manager-fips
      tag: latest
    ui:
      repository: cgr.dev/ORGANIZATION/longhorn-ui-fips
      tag: latest
    backingImageManager:
      repository: cgr.dev/ORGANIZATION/backing-image-manager-fips
      tag: latest
```

Deploy Longhorn with the custom FIPS values:

```bash
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --create-namespace \
  -f values-chainguard-fips.yaml
```
## Documentation and Resources
* Longhorn Docs - https://longhorn.io/docs/
* Longhorn Github - https://github.com/longhorn/longhorn
* Longhorn Share Manager Github - https://github.com/longhorn/longhorn-share-manager
* Longhorn Backing Image Manager Github - https://github.com/longhorn/backing-image-manager

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gpu-feature-discovery

# gpu-feature-discovery
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gpu-feature-discovery` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gpu-feature-discovery/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [gpu-feature-discovery](https://github.com/NVIDIA/gpu-feature-discovery) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

NVIDIA GPU Feature Discovery for Kubernetes is a software component that allows you to automatically generate labels for the set of GPUs available on a node
For more information, refer to the GFD documentation:
- [GFD Github README](https://github.com/NVIDIA/gpu-feature-discovery/blob/main/README.md#installing-via-helm-install)

```shell
NAME:
   GPU Feature Discovery - generate labels for NVIDIA devices

USAGE:
   GPU Feature Discovery [global options] command [command options] [arguments...]

VERSION:
   0.8.2
commit: 47a1ea6862f69844c5364c98a77aa97fe9ea7b74

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --mig-strategy value                           the desired strategy for exposing MIG devices on GPUs that support it:
                                                    [none | single | mixed] (default: "none") [$GFD_MIG_STRATEGY, $MIG_STRATEGY]
   --fail-on-init-error                           fail the plugin if an error is encountered during initialization, otherwise block indefinitely (default: true) [$GFD_FAIL_ON_INIT_ERROR, $FAIL_ON_INIT_ERROR]
   --oneshot                                      Label once and exit (default: false) [$GFD_ONESHOT]
   --no-timestamp                                 Do not add the timestamp to the labels (default: false) [$GFD_NO_TIMESTAMP]
   --sleep-interval value                         Time to sleep between labeling (default: 1m0s) [$GFD_SLEEP_INTERVAL]
   --output-file value, --output value, -o value  (default: "/etc/kubernetes/node-feature-discovery/features.d/gfd") [$GFD_OUTPUT_FILE]
   --machine-type-file value                      a path to a file that contains the DMI (SMBIOS) information for the node (default: "/sys/class/dmi/id/product_name") [$GFD_MACHINE_TYPE_FILE]
   --config-file value                            the path to a config file as an alternative to command line options or environment variables [$GFD_CONFIG_FILE, $CONFIG_FILE]
   --use-node-feature-api                         Use NFD NodeFeature API to publish labels (default: false) [$GFD_USE_NODE_FEATURE_API]
   --help, -h                                     show help
   --version, -v                                  print the version
```

Helm Installation for GPU Feature Discovery

Step 1: Add and Update Helm Repository
Add the NVIDIA GFD Helm repository and update it to ensure you have access to the latest charts.

```shell
$ helm repo add nvgfd https://nvidia.github.io/gpu-feature-discovery
$ helm repo update
```

Step 2: Install GPU Feature Discovery
Install GPU Feature Discovery using Helm with the specified version, namespace, and optional configuration settings.

This command deploys GPU Feature Discovery as a standalone chart in the gpu-feature-discovery namespace.
```shell
$ helm upgrade -i nvgfd nvgfd/gpu-feature-discovery \
  --version 0.8.2 \
  --namespace gpu-feature-discovery \
  --create-namespace
```

Step 3: Verify Installation
Verify that the GPU Feature Discovery DaemonSet is running in the specified namespace.

```shell
$ kubectl get daemonset -n gpu-feature-discovery -l app.kubernetes.io/name=gpu-feature-discovery
```
For more information, refer to the documentation:
- [Helm Installation Guide](https://github.com/NVIDIA/gpu-feature-discovery/blob/main/README.md#installing-via-helm-install)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudnative-pg-fips

# cloudnative-pg-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudnative-pg-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudnative-pg-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

CloudNative PG is a platform for managing PostgreSQL databases within Kubernetes environments.

These images consist of the CloudNative PG operator as well as PostgreSQL images that have been
extended to support the full functionality of the CloudNative PG platform.

## Deploying CloudNative PG

To deploy CloudNative PG, install the CNPG Helm chart repository:

```bash
helm repo add cnpg https://cloudnative-pg.github.io/charts
```

Deploy the operator:

```bash
helm upgrade --install cnpg \
  --namespace cnpg-system \
  --create-namespace \
  cnpg/cloudnative-pg \
  --set image.repository="cgr.dev/<REGISTRY>/cloudnative-pg-fips" \
  --set image.tag="latest"
```

And now deploy the database:

```bash
helm upgrade --install database \
  --namespace database \
  --create-namespace \
  cnpg/cluster \
  --set cluster.imageName="cgr.dev/<REGISTRY>/postgres-cloudnative-pg-fips:<POSTGRES VERSION>"
```

Note, you must provide a Postgres version (I.E. 15, 16, etc) as the operator expects the versioned
tag for migrations.

Alternatively, deploy the database with pooler enabled using Chainguard's PgBouncer image:

```bash
helm upgrade --install database \
  --namespace database \
  --create-namespace \
  cnpg/cluster \
  --set cluster.imageName="cgr.dev/<REGISTRY>/postgres-cloudnative-pg-fips:<POSTGRES VERSION>"
  --set pooler.enabled=true \
  --set pooler.template.spec.containers[0].name="pgbouncer" \
  --set pooler.template.spec.containers[0].image="cgr.dev/<REGISTRY>/pgbouncer-fips:latest"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-fips

# nginx-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Where possible, the `nginx-fips` Chainguard Image is built for compatibility with the [Docker official image for nginx](https://hub.docker.com/_/nginx/). This section outlines the major differences between the `nginx-fips` Chainguard Container and the Docker official image.

### FIPS Support

The `nginx-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

### Default port

The default port for the `nginx-fips` Chainguard Image is `8080`, rather than `80`.

### IPv6 Support

The official Docker image checks for the existence of `/proc/net/if_inet6` and automatically listens on `[::]:80` if it exists. For simplicity, we only listen on IPv4, but you can add IPv6 support by mounting a configuration file with a section similar to the following:

```
server {
    listen       8080;
    listen  [::]:8080;
    ...

```

Note that the default configuration file in the Chainguard nginx Image includes the relevant section at `/etc/nginx/conf.d/default.conf`. 

### Environment Variable Substitution

The Docker official image has support for setting environment variables that get substituted into the config file. Currently, Chainguard's `nginx-fips` container image does not have support for this.

### Users

The official Docker image starts as the root user and forks to a less privileged user. By contrast, the Chainguard `nginx-fips` Image starts as a less privileged user named `nginx` and no forking is required. 

Also note that the default nginx configuration file includes a user directive that will run the `nginx` process as the `nginx` user. See the section on custom server blocks for more information.

### User Directive Warning

Starting the container gives the following warning:

```sh
 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
```

This warning tells us that the container is already running as the user `nginx`, meaning that the directive has no effect because the default user is already `nginx`. If the container is run as root, it would switch to the `nginx` user to run the `nginx` process. We've included this directive in the default configuration for those running the container with a different user using the `--user` flag or equivalent.

### Entrypoint

The entrypoint for the `nginx-fips` Chainguard Image is `/usr/sbin/nginx`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `nginx`.

## Getting Started

> [!NOTE]
> Chainguard Academy includes a guide on [Getting Started with the nginx Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/nginx/). This guide can be adapted to show how to use the `nginx-fips` container image.

Be aware that when running the following examples, you will need to manually replace each occurrence of `ORGANIZATION` with the name of your organization.

### Test FIPS Compliance 

To test the image's compliance with the FIPS framework, you can run a provided test script with the following command:

```sh
docker run -it \
 --user root --entrypoint openssl-fips-test \
 cgr.dev/ORGANIZATION/nginx-fips
```

You should see output similar to the following:

```
Checking OpenSSL lifecycle assurance.
*** Running check: FIPS module is available...
    HMAC : (Module_Integrity) : Pass
    SHA1 : (KAT_Digest) : Pass
    SHA2 : (KAT_Digest) : Pass
    SHA3 : (KAT_Digest) : Pass
    TDES : (KAT_Cipher) : Pass
    AES_GCM : (KAT_Cipher) : Pass
    AES_ECB_Decrypt : (KAT_Cipher) : Pass
    RSA : (KAT_Signature) :     RNG : (Continuous_RNG_Test) : Pass
...
```
You can review the output for detailed information on OpenSSL module and cipher availability.

### Serve Content Using Default Configuration

The `nginx-fips` Chainguard Container provides a secure basis for serving static content, running a reverse proxy, or performing other common server tasks. To try out the image, run:

```shell
docker run -p 8080:8080 cgr.dev/ORGANIZATION/nginx-fips:latest
```

After starting the container, navigate to `localhost:8080` in your web browser. You should find the default nginx welcome page.

You can also use the `nginx-fips` Container to serve your own custom content. As an example, first create a folder to contain static HTML that will be served by nginx:

```shell
mkdir -p ~/html
```

Next, create a file called `index.html` in the `html` folder:

```shell
cat > ~/html/index.html <<EOF
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>nginx</title>
</head>
<body>
  <h2>Hello World from nginx!</h2>
</body>
</html>
EOF
```

You can then instruct the `nginx-fips` Container to serve the `index.html` file:

```shell
docker run \
 -v $(pwd)/html:/usr/share/nginx/html \
 -p 8080:8080 \
 cgr.dev/ORGANIZATION/nginx-fips:latest
```

If you navigate to `localhost:8080` in your web browser, it will return our custom HTML: `Hello World from nginx!`.

## Adding a Custom Server Block

The default nginx configuration file checks for custom server blocks as files with a `.conf` extension within the `/etc/nginx/conf.d` folder. As an example, let's create a minimal server block that will serve the `index.html` file in the `html` folder created above from a new location (`/www/data`) and from a new port (`4000`).

Create a folder to hold our block configuration:

```shell
mkdir -p ~/conf.d
```

Create a new server block configuration file within this folder:

```shell
cat > ~/conf.d/static.conf <<EOF
server {
  listen        4000;

  location / {
    autoindex on;
    root  /www/data;
  } 
}
EOF
```

The above is a server block that will be loaded within the default nginx configuration file. Static files will be served from the `/www/data` location at port `4000`.

The following command runs an nginx container, adding our `html` folder and the `conf.d` configuration folder as volumes

```shell
docker run -p 4000:4000 \
 -v $(pwd)/html:/www/data \
 -v $(pwd)/conf.d:/etc/nginx/conf.d \
 cgr.dev/ORGANIZATION/nginx-fips:latest
```

The above will serve our HTML from the `/www/data` folder on port `4000` using the additional settings defined in the default `nginx.conf` file.

## Replacing the Default nginx Configuration

To replace the main nginx configuration file, you can mount a folder containing a configuration file named `nginx.conf` at `/etc/nginx/` within the container.

First create a folder to contain our replacement configuration:

```shell
mkdir -p nginx-conf
```

Create a configuration file inside this folder:

```shell
cat > ~/nginx-conf/nginx.conf <<EOF
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    default_type  application/octet-stream;

    sendfile        on;

    server {
      listen        4000;

        location / {
            autoindex on;
            root  /www/data;
  } 
}

}
EOF
```

Start a container with our created `html` and `nginx-config` folders as volumes.

```shell
docker run -p 4000:4000 \
 -v $(pwd)/html:/www/data \
 -v $(pwd)/nginx-conf:/etc/nginx \
 cgr.dev/ORGANIZATION/nginx-fips:latest
```

You should be able to view the contents of the `index.html` file in the `html` folder at `localhost:4000`. For more on nginx configuration, refer to the [documentation at nginx.org](https://nginx.org/en/docs/example.html).

## Run in a read-only File System

If you want to serve files using a read-only filesystem, you will need to mount the `/var/run` and `/var/lib/nginx/tmp` directories. You can do this with the `--tmpfs` option:

```shell
docker run \
 --read-only \
 --tmpfs /var/lib/nginx/tmp/ --tmpfs /var/run/ \
 --cap-drop=ALL \
 -p 8080:8080 \
 cgr.dev/ORGANIZATION/nginx-fips
```

You can also run the `nginx-fips` container image in a read-only filesystem using Kubernetes. To do so, you could use a manifest like the following example:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-fips
spec:
  replicas: 1
  selector:
	matchLabels:
  	app: nginx
  template:
	metadata:
  	labels:
    	app: nginx
	spec:
  	containers:
  	- name: nginx-fips
    	image: cgr.dev/ORGANIZATION/nginx-fips:latest
    	ports:
    	- containerPort: 8080
    	securityContext:
      	readOnlyRootFilesystem: true
    	volumeMounts:
    	- name: run
      	mountPath: /var/run/
    	- name: tmp
      	mountPath: /var/lib/nginx/tmp/
  	volumes:
  	- name: run
    	emptyDir: {}
  	- name: tmp
    	emptyDir: {}
  	- name: conf
    	configMap:
      	name: nginx-conf
```

## User Directive Warning

Starting the container gives the following warning:

```shell
 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
```

This warning tells us that the container is already running as the user `nginx`, meaning that the directive has no effect because the default user is already `nginx`. If the container is run as root, it would switch to the `nginx` user to run the `nginx` process. We've included this directive in the default configuration for those running the container with a different user using the `--user` flag or equivalent.

## Documentation and Resources

* [Official nginx Documentation](https://nginx.org/en/docs/)
* [Docker Hub: Official nginx Image](https://hub.docker.com/_/nginx)
* [Chainguard Academy: Getting Started with the nginx Chainguard Container](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/nginx/)
* [Video: Getting Started with the nginx Chainguard Container](https://www.youtube.com/watch?v=KirTeDMzzxk)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### selenium

# selenium
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/selenium` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/selenium/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Components

Docker Selenium has multiple components which can act as standalone docker images

1. base
2. hub
3. node-docker
4. node-base
5. node-chromium
6. node-firefox
7. standalone
8. standalone-docker
9. standalone-chromium
10. standalone-firefox
11. event-bus
12. distributor
13. router
14. session-queue
15. sessions

## Usage

Run the container with the following command:

```bash
docker run --shm-size="2g" -p 4444:4444 -p 7900:7900 cgr.dev/chainguard/docker-selenium-standalone-chromium:latest
```

Verify Selenium is running:

```bash
curl -sL http://localhost:4444/status` should return a `200` status code, and the response body should contain `{"value":{"ready":true}}` with 1 `availability: UP` node.
```

Access Selenium:

```bash
http://localhost:4444
```

Access noVNC:

```bash
http://localhost:7900/vnc.html`:
```

- Login with the password `secret`.

Any WebDriver tests should point to Selenium on on port 4444.

The following is an example ChromeDriver test using Selenium to retrieve Chainguard's homepage:

```python
from selenium import webdriver
from time import sleep

print("Testing ChromeDriver...")

options = webdriver.ChromeOptions()

driver = webdriver.Remote(
  command_executor='http://localhost:4444/',
  options=options
)

'''Maximize window'''
driver.maximize_window()
sleep(5)

'''Retrieve Chainguards homepage'''
driver.get("https://www.chainguard.dev/")
sleep(5)

'''Exit'''
driver.close()
driver.quit()
print("ChromeDriver test successful!")
```

Please note that Chromium is ran in a headless state with the sandbox with GPU access disabled with the flags:

```
--headless --no-sandbox --disable-gpu
```

Chromium is ran headless with GPU access disabled as the container does not have GPU access.

Chromium's sandbox has been disabled as the container is sandboxed from the host environment, and because the
container is running as the root user.

This can be overridden via the environment variable `CHROMIUM_USER_FLAGS` though this is unsupported.

### Running multiple components

All of the Docker Selenium components can be deployed together using using kubernetes with helm. More documentation on helm deployment is ava

Add Helm Repo

```
helm repo add docker-selenium https://www.selenium.dev/docker-selenium
```

To use them, simply replace the appropriate `image:` path with the Chainguard specific Jaeger image. Below is an example values file for doing this with helm:
Microsoft Edge is disabled as it is not one of the offered Chainguard images

```yaml
global:
  imageRegistry: cgr.dev/ORGANIZATION
isolateComponents:
  enabled: true
nodeChrome:
  imageName: docker-selenium-node-chromium
  imageTag: latest
edgeNode:
  enabled: false
router:
  imageName: docker-selenium-router
  imageTag: latest
distribution:
  imageName: docker-selenium-distributor
  imageTag: latest
sessionMap:
  imageName: docker-selenium-sessions
  imageTag: latest
sessionQueue:
  imageName: docker-selenium-session-queue
  imageTag: latest
eventBus:
  imageName: docker-selenium-event-bus
  imageTag: latest
jaeger:
  allInOne:
    enabled: true
    image:
      repository: cgr.dev/ORGANIZATION/jaeger-all-in-one
      tag: latest
```

Install Helm Chart

```
helm upgrade --install selenium-grid charts/selenium-grid \
  --values values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5011

# request-5011
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5011` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5011/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, Wolfi-based image for Spark Operator. Facilitates the deployment and management of Apache Spark applications in Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Spark operator image is comparable to the upstream [kubeflow/spark-operator](https://github.com/kubeflow/spark-operator) image. This image expects to be deployed in a Kubernetes cluster where an instance of Apache Spark, on which it will schedule jobs, is running.

## Getting Started

The following is an example of how to install the Chainguard Spark Operator image using Helm:

```shell
helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator

helm install spark-operator spark-operator/spark-operator \
  --namespace spark \
  --create-namespace \
  --set image.repository=cgr.dev/chainguard/request-5011 \
  --set image.tag=latest
```

## Documentation and Resources

For more information, please refer to the [Spark Operator installation documentation](https://github.com/kubeflow/spark-operator?tab=readme-ov-file#quick-start).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubo-fips

# kubo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant, minimalist Wolfi-based container image for the IPFS Kubo (go-ipfs) node.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a minimal, secure, and regularly updated FIPS-compliant container for [IPFS Kubo](https://github.com/ipfs/kubo) (formerly go-ipfs). It is comparable to the [official Kubo image](https://hub.docker.com/r/ipfs/kubo/), but is built with Wolfi and includes only FIPS-validated cryptographic modules for compliance. 

**FIPS Note:** This image is intended for environments requiring FIPS 140-2/140-3 compliance. WebTransport is not supported due to FIPS requirements. Some features that rely on non-FIPS cryptography may be unavailable.

For more on FIPS support in Chainguard Images, see the [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To run an IPFS Kubo node using this FIPS-compliant image:

```sh
docker run -d --name ipfs-kubo-fips -p 4001:4001 -p 5001:5001 -p 8080:8080 cgr.dev/ORGANIZATION/kubo-fips:latest daemon
```

- `4001` is the libp2p swarm port
- `5001` is the API port
- `8080` is the HTTP gateway port

You can now interact with your node using the [IPFS CLI](https://docs.ipfs.tech/install/command-line/) or the HTTP API.

Guide to Install IPFS Kubo inside Docker, refer to the [official Kubo documentation](https://docs.ipfs.tech/how-to/run-ipfs-inside-docker/).

## Documentation and Resources

- [IPFS Documentation](https://docs.ipfs.tech/)
- [Kubo GitHub Repository](https://github.com/ipfs/kubo)
- [IPFS HTTP API Reference](https://docs.ipfs.tech/reference/http/api/)
- [Running IPFS in Docker](https://docs.ipfs.tech/how-to/run-ipfs-inside-docker/)
- [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

[Chainguard Containers](https://www.chainguard.dev/containers?utm_source=readmes) are minimal container images that are secure by default. 

In many cases, the Chainguard Containers tagged as `:latest` contain only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager. Chainguard Containers are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_ designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with a `-dev` variant.

Although the `-dev` container image variants have similar security features as their more minimal versions, they feature additional software that is typically not necessary in production environments. We recommend using multi-stage builds to leverage the `-dev` variants, copying application artifacts into a final minimal container that offers a reduced attack surface that won't allow package installations or logins.

## Learn More

To better understand how to work with Chainguard Containers, please visit [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes) and [Chainguard Courses](https://courses.chainguard.dev/?utm_source=readmes).

In addition to [Containers](https://www.chainguard.dev/containers?utm_source=readmes), Chainguard offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes). [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) to access additional products. 

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### boring-registry

# boring-registry
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/boring-registry` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/boring-registry/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the `boring-registry` [server application](https://github.com/TierMobility/boring-registry).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To run `boring-registry`:

```
$ docker run cgr.dev/chainguard/boring-registry:latest
Usage:
  boring-registry [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  migrate     Migrate modules
  server      Starts the server component
  upload      Upload modules and providers
  version     Prints the version of the Boring Registry

Flags:
      --debug                                   Enable debug logging
  -h, --help                                    help for boring-registry
      --json                                    Enable json logging
      --storage-gcs-bucket string               Bucket to use when using the GCS registry type
      --storage-gcs-prefix string               Prefix to use when using the GCS registry type
      --storage-gcs-sa-email string             Google service account email to be used for Application Default Credentials (ADC).
                                                GOOGLE_APPLICATION_CREDENTIALS environment variable might be used as alternative.
                                                For GCS presigned URLs this SA needs the iam.serviceAccountTokenCreator role.
      --storage-gcs-signedurl-expiry duration   Generate GCS signed URL valid for X seconds. Only meaningful if used in combination with --gcs-signedurl (default 30s)
      --storage-s3-bucket string                S3 bucket to use for the registry
      --storage-s3-endpoint string              S3 bucket endpoint URL (required for MINIO)
      --storage-s3-pathstyle                    S3 use PathStyle (required for MINIO)
      --storage-s3-prefix string                S3 bucket prefix to use for the registry
      --storage-s3-region string                S3 bucket region to use for the registry
      --storage-s3-signedurl-expiry duration    Generate S3 signed URL valid for X seconds. Only meaningful if used in combination with --storage-s3-signedurl (default 30s)

Use "boring-registry [command] --help" for more information about a command.
```

The `server` command can be used to start the registry server:

```
# docker run cgr.dev/chainguard/boring-registry:latest server
Usage:
  boring-registry server [flags]

Flags:
      --auth-okta-claims strings               Okta claims to validate
      --auth-okta-issuer string                Okta issuer
      --auth-static-token strings              Static API token to protect the boring-registry
  -h, --help                                   help for server
      --listen-address string                  Address to listen on (default ":5601")
      --listen-telemetry-address string        Telemetry address to listen on (default ":7801")
      --login-authz string                     The server's authorization endpoint
      --login-client string                    The client_id value to use when making requests
      --login-grant-types strings              An array describing a set of OAuth 2.0 grant types (default [authz_code])
      --login-ports ints                       Inclusive range of TCP ports that Terraform may use (default [10000,10010])
      --login-scopes strings                   List of scopes
      --login-token string                     The server's token endpoint
      --storage-module-archive-format string   Archive file format for modules, specified without the leading dot (default "tar.gz")
      --tls-cert-file string                   TLS certificate to serve
      --tls-key-file string                    TLS private key to serve
Global Flags:
      --debug                                   Enable debug logging
      --json                                    Enable json logging
      --storage-gcs-bucket string               Bucket to use when using the GCS registry type
      --storage-gcs-prefix string               Prefix to use when using the GCS registry type
      --storage-gcs-sa-email string             Google service account email to be used for Application Default Credentials (ADC).
                                                GOOGLE_APPLICATION_CREDENTIALS environment variable might be used as alternative.
                                                For GCS presigned URLs this SA needs the iam.serviceAccountTokenCreator role.
      --storage-gcs-signedurl-expiry duration   Generate GCS signed URL valid for X seconds. Only meaningful if used in combination with --gcs-signedurl (default 30s)
      --storage-s3-bucket string                S3 bucket to use for the registry
      --storage-s3-endpoint string              S3 bucket endpoint URL (required for MINIO)
      --storage-s3-pathstyle                    S3 use PathStyle (required for MINIO)
      --storage-s3-prefix string                S3 bucket prefix to use for the registry
      --storage-s3-region string                S3 bucket region to use for the registry
      --storage-s3-signedurl-expiry duration    Generate S3 signed URL valid for X seconds. Only meaningful if used in combination with --storage-s3-signedurl (default 30s)

failed to setup server: please specify a valid storage provider
```

This will require specifying a storage provider and credentials to it using the appropriate flags.

## Helm

This image is a drop-in replacement for the upstream image, and can be used in their helm chart with an invocation like:

```
helm upgrade --install boring-registry oci://ghcr.io/tiermobility/charts/boring-registry \
    --set global.image.repository=cgr.dev/chainguard/boring-registry \
    --set global.image.tag="latest" \
    --wait
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-java-instrumentation

# opentelemetry-java-instrumentation
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-java-instrumentation` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-java-instrumentation/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenTelemetry auto-instrumentation and instrumentation libraries for Java

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Opentelemetry-java-instrumentation Image is comparable to the official Opentelemetry-java-instrumentation Image from Docker Hub. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
This [blog](https://www.elastic.co/observability-labs/blog/using-the-otel-operator-for-injecting-java-agents) is a good starting point to use the `opentelemetry-java-instrumentation` image. Following that, change the image in the `Instrumentation` resource:
```
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: banana-instr
  namespace: banana
spec:
  exporter:
    endpoint: "https://my.endpoint"
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "1.0"
  java:
    image: cgr.dev/ORGANIZATION/opentelemetry-java-instrumentation:latest
    env:
      - name: OTEL_EXPORTER_OTLP_HEADERS
        value: "Authorization=Bearer MyAuth"
```

## Documentation and Resources
- [Github for upstream code](https://github.com/open-telemetry/opentelemetry-java-instrumentation)
- [Official Docs](https://opentelemetry.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trivy

# trivy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trivy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trivy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Aquasec Trivy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `trivy` container image is designed to be a drop-in replacement for the [Trivy image](https://hub.docker.com/r/aquasec/trivy). Like other Chainguard Containers, `trivy` was designed with minimalism and security in mind. For example, it doesn't come with tools like a shell or package manager.

## Getting Started

Trivy requires downloading a vulnerability database on its first run. This database is updated regularly and cached locally.

### Scanning Container Images

Scan a container image for vulnerabilities:

```shell
docker run --rm cgr.dev/ORGANIZATION/trivy image python:3.4-alpine
```

### Scanning Local Filesystem

Scan the current directory for vulnerabilities:

```shell
docker run --rm -v $(pwd):/tmp/scan cgr.dev/ORGANIZATION/trivy fs /tmp/scan
```

## Documentation and Resources

- [Trivy Documentation](https://aquasecurity.github.io/trivy/)
- [Trivy GitHub Repository](https://github.com/aquasecurity/trivy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-aws

# crossplane-aws
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-aws` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-aws/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane provider for managing Amazon Web Services (AWS) config services in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Crossplane AWS providers are comparable to [upstream AWS providers](https://github.com/crossplane-contrib/provider-upjet-aws) with the following architectural differences:

- **Upstream providers** can be deployed independently and automatically resolve their dependencies
- **Chainguard providers** require manual installation of the family provider and use `skipDependencyResolution: true` for component providers to prevent automatic upstream dependency resolution
- **Deployment pattern**: Install the Chainguard family provider first, then add individual component providers as needed
- **Functionality**: Provides equivalent AWS resource management capabilities with this modified deployment approach

## Getting Started

### Using the AWS Family Provider

For comprehensive AWS resource management, install the family provider that includes all AWS services:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-family-aws
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws:latest
```

### Using Individual Component Providers

For targeted deployments, install specific component providers alongside the family provider. Use `skipDependencyResolution: true` to prevent automatic upstream family provider installation:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-s3
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-s3:latest
  skipDependencyResolution: true
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-eks
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-eks:latest
  skipDependencyResolution: true
```

## Configuration

After installing your desired providers, configure AWS credentials using a ProviderConfig:

```bash
# Create credentials secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: aws-secret
  namespace: crossplane-system
type: Opaque
stringData:
  creds: |
    [default]
    aws_access_key_id = ${AWS_ACCESS_KEY_ID}
    aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
    aws_session_token = ${AWS_SESSION_TOKEN}
EOF

# Create ProviderConfig
cat <<EOF | kubectl apply -f -
apiVersion: aws.m.upbound.io/v1beta1
kind: ClusterProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-secret
      key: creds
EOF
```

Once configured, you can create AWS resources. Example S3 bucket creation:

```yaml
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-secure-bucket
spec:
  forProvider:
    region: us-west-2
  providerConfigRef:
    name: default
```

## Available Images

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `xpkg.upbound.io/upbound/provider-family-aws`         | `cgr.dev/ORGANIZATION/crossplane-aws`                |
| `xpkg.upbound.io/upbound/provider-aws-cloudformation` | `cgr.dev/ORGANIZATION/crossplane-aws-cloudformation` |
| `xpkg.upbound.io/upbound/provider-aws-cloudfront`     | `cgr.dev/ORGANIZATION/crossplane-aws-cloudfront`     |
| `xpkg.upbound.io/upbound/provider-aws-cloudwatchlogs` | `cgr.dev/ORGANIZATION/crossplane-aws-cloudwatchlogs` |
| `xpkg.upbound.io/upbound/provider-aws-cognitoidentity`| `cgr.dev/ORGANIZATION/crossplane-aws-cognitoidentity`|
| `xpkg.upbound.io/upbound/provider-aws-dynamodb`       | `cgr.dev/ORGANIZATION/crossplane-aws-dynamodb`       |
| `xpkg.upbound.io/upbound/provider-aws-ec2`            | `cgr.dev/ORGANIZATION/crossplane-aws-ec2`            |
| `xpkg.upbound.io/upbound/provider-aws-ecr`            | `cgr.dev/ORGANIZATION/crossplane-aws-ecr`            |
| `xpkg.upbound.io/upbound/provider-aws-efs`            | `cgr.dev/ORGANIZATION/crossplane-aws-efs`            |
| `xpkg.upbound.io/upbound/provider-aws-elasticache`    | `cgr.dev/ORGANIZATION/crossplane-aws-elasticacahe`   |
| `xpkg.upbound.io/upbound/provider-aws-eks`            | `cgr.dev/ORGANIZATION/crossplane-aws-eks`            |
| `xpkg.upbound.io/upbound/provider-aws-firehose`       | `cgr.dev/ORGANIZATION/crossplane-aws-firehose`       |
| `xpkg.upbound.io/upbound/provider-aws-iam`            | `cgr.dev/ORGANIZATION/crossplane-aws-iam`            |
| `xpkg.upbound.io/upbound/provider-aws-kinesis`        | `cgr.dev/ORGANIZATION/crossplane-aws-kinesis`        |
| `xpkg.upbound.io/upbound/provider-aws-kms`            | `cgr.dev/ORGANIZATION/crossplane-aws-kms`            |
| `xpkg.upbound.io/upbound/provider-aws-lambda`         | `cgr.dev/ORGANIZATION/crossplane-aws-lambda`         |
| `xpkg.upbound.io/upbound/provider-aws-memorydb`       | `cgr.dev/ORGANIZATION/crossplane-aws-memorydb`       |
| `xpkg.upbound.io/upbound/provider-aws-rds`            | `cgr.dev/ORGANIZATION/crossplane-aws-rds`            |
| `xpkg.upbound.io/upbound/provider-aws-route53`        | `cgr.dev/ORGANIZATION/crossplane-aws-route53`        |
| `xpkg.upbound.io/upbound/provider-aws-s3`             | `cgr.dev/ORGANIZATION/crossplane-aws-s3`             |
| `xpkg.upbound.io/upbound/provider-aws-sns`            | `cgr.dev/ORGANIZATION/crossplane-aws-sns`            |
| `xpkg.upbound.io/upbound/provider-aws-sqs`            | `cgr.dev/ORGANIZATION/crossplane-aws-sqs`            |

## Documentation and Resources

- [Crossplane AWS Provider Documentation](https://github.com/crossplane-contrib/provider-upjet-aws)
- [Crossplane Getting Started Guide](https://docs.crossplane.io/latest/get-started/get-started-with-managed-resources/)
- [AWS Provider Examples](https://github.com/crossplane-contrib/provider-upjet-aws/tree/main/examples)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-webhook-fips

# rancher-webhook-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-webhook-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-webhook-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Rancher Webhook automates tasks and integrates external systems in response to events within a Rancher-managed Kubernetes environment.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `rancher-webhook-fips` container image is comparable to the [upstream image maintained by Mittwald](https://github.com/rancher/webhook), with the following differences:

* Like all other Chainguard Containers, `rancher-webhook-fips` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting Started

This image is a drop-in replacement for the upstream image. You can update the Rancher config setting to use this image.

For example:
```
cat > rancher-webhook-fips.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: rancher-config
  namespace: cattle-system
data:
 "rancher-webhook-fips": |
   image:
     repository: cgr.dev/ORGANIZATION/rancher-webhook-fips 
     tag: ${webhook-version} 
EOF
kubectl apply -f rancher-webhook-fips.yaml
```

### Verify Webhook Deployment

```
kubectl get deployment rancher-webhook-fips -n cattle-system
```

**Expected Output:**
```
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
rancher-webhook-fips   1/1     1            1           5m30s
```

### Check Pods
```
kubectl get pods -n cattle-system | grep webhook
```

**Expected Output:**
```
rancher-webhook-fips-7d6b8c4f8d-xyz12   1/1     Running   0          5m30s
```

## Documentation and Resources
- **[Webhook Documentation](https://ranchermanager.docs.rancher.com/reference-guides/rancher-webhook)**
- **[Github Repository](https://github.com/rancher/webhook)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### git-sync-fips

# git-sync-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/git-sync-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/git-sync-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A sidecar app which clones a git repo and keeps it in sync with the upstream.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apisix-ingress-controller

# apisix-ingress-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apisix-ingress-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apisix-ingress-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal wolfi image of Apache APISIX Ingress Controller use to run APISIX Gateway as a Kubernetes Ingress to handle inbound traffic for a Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `apisix-ingress-controller` image is a minimal drop-in replacement for the upstream [apache/apisix-ingress-controller](https://hub.docker.com/r/apache/apisix-ingress-controller). It is fully compatible with the upstream project, including the Helm chart and Apache Apisix.
This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [apisix-ingress-controller Helm chart](https://github.com/apache/apisix-helm-chart/tree/master/charts/apisix-ingress-controller). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/apisix-ingress-controller
  tag: "latest"
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `apisix-ingress-controller` helm chart.

```shell
helm repo add apisix https://charts.apiseven.com
helm repo update

helm install apisix-ingress-controller apisix/apisix-ingress-controller --namespace ingress-apisix --create-namespace --values values.yaml --wait
```

## Documentation and Resources
- [Apisix Ingress Controller Github Repository](https://github.com/apache/apisix-ingress-controller)
- [Apisix Ingress Controller Helm Chart](https://github.com/apache/apisix-helm-chart/tree/master/charts/apisix-ingress-controller)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### contour

# contour
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/contour` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/contour/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Contour is an ingress controller for Kubernetes that works by deploying the Envoy proxy as a reverse proxy and load balancer. Contour supports dynamic configuration updates out of the box while maintaining a lightweight profile.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `contour` container image is comparable to the [official Contour image](https://github.com/projectcontour/contour/pkgs/container/contour). The Chainguard image runs as a non-root user (65532) and includes only the essential tools and dependencies needed to function, omitting extras like a package manager or shell.

### Envoy dependency
Contour is a Kubernetes ingress controller that deploys Envoy as a reverse proxy and load balancer. The Kubernetes manifest provided in the [Contour quick start guide](https://www.conjur.org/get-started/quick-start/oss-environment) deploys both Contour and Envoy.

If you also require a Chainguard image for Envoy, you can find this in [our image catalog](https://images.chainguard.dev/directory/image/envoy).

## Getting Started

Please refer to the [Contour getting started documentation](https://projectcontour.io/getting-started), for installation steps, which include a Kubernetes manifest.

You'll need to either create your own modified copy of the manifest or, alternatively, use a tool such as Kustomize to replace the images.

Example using Kustomize:

```bash
cat <<EOF >kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- https://projectcontour.io/quickstart/contour.yaml

images:
- name: ghcr.io/projectcontour/contour
  newName: cgr.dev/ORGANIZATION/contour
  newTag: latest
- name: docker.io/envoyproxy/envoy
  newName: cgr.dev/ORGANIZATION/envoy
  newTag: latest
EOF

kubectl apply -k .
```

If you are testing Contour in a local Kubernetes environment, such as `k3d` or `kind`, you may run into port conflict issues. To work around this, you'll need to set alternative `hostPorts` for Envoy.

Here is another example using Kustomize:

```bash
cat <<EOF >kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- https://projectcontour.io/quickstart/contour.yaml

images:
- name: ghcr.io/projectcontour/contour
  newName: cgr.dev/ORGANIZATION/contour
  newTag: latest
- name: docker.io/envoyproxy/envoy
  newName: cgr.dev/ORGANIZATION/envoy
  newTag: latest

patches:
- patch: |
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: envoy
      namespace: projectcontour
    spec:
      template:
        spec:
          containers:
          - name: envoy
            ports:
            - containerPort: 8080
              hostPort: 8082
              name: http
              protocol: TCP
            - containerPort: 8443
              hostPort: 8445
              name: https
              protocol: TCP
EOF

kubectl apply -k .
```

Following successful deployment, you should see Contour and Envoy running in the cluster:

```shell
kubectl get po -n projectcontour
```
```
NAME                            READY   STATUS      RESTARTS   AGE
contour-69c98d9c8-v8fl7         1/1     Running     0          8m42s
contour-69c98d9c8-x5s48         1/1     Running     0          8m42s
contour-certgen-v1-30-2-z7lzk   0/1     Completed   0          8m42s
envoy-ql79l                     2/2     Running     0          8m42s
```

## Documentation and Resources

For more information on Contour, including some follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-mig-manager-fips

# k8s-mig-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-mig-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-mig-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MIG Partition Editor for NVIDIA GPUs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard k8s-mig-manager Image is comparable to the official k8s-mig-manager Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager or shell.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started
To get started with Chainguard k8s-mig-manager Image, you will need:
1. GPU setup with MIG mode enabled
2. kubernetes nodes labeled `nvidia.com/gpu.deploy.mig-manager=true` and desired config, like: `nvidia.com/mig.config=all-1g.5gb`

Next, to deploy the image use the official example given in the repository [here](https://github.com/NVIDIA/mig-parted/blob/main/deployments/container/nvidia-mig-manager-example.yaml), and change the upstream image to Chainguard Image [here](https://github.com/NVIDIA/mig-parted/blob/main/deployments/container/nvidia-mig-manager-example.yaml#L26C9-L26C72):
```
image: cgr.dev/ORGANIZATION/k8s-mig-manager:latest
```
you can check the partitions by running: `nvidia-smi`

## Documentation and Resources
- [Upstream repository](https://github.com/NVIDIA/mig-parted)
- [MIG User Guide](https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-config-cli-iamguarded-fips

# keycloak-config-cli-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-config-cli-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-config-cli-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Import YAML/JSON-formatted configuration files into Keycloak - Configuration as Code for Keycloak.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Keycloak Config CLI IAMGuarded FIPS is a FIPS-compliant security-enhanced configuration management tool designed to work as a companion image with the Keycloak IAMGuarded Helm chart. This image enables configuration-as-code for Keycloak deployments by importing YAML/JSON-formatted configuration files, with full FIPS compliance.

## Helm Chart Integration

The Keycloak Config CLI IAMGuarded FIPS image is automatically deployed as part of the Keycloak IAMGuarded Helm chart installation when using FIPS-compliant images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

The Keycloak Config CLI is included when you install the Keycloak chart with configuration enabled:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "keycloakConfigCli.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Keycloak Config CLI FIPS
keycloakConfigCli:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
  configuration:
    # Your Keycloak configuration files
    "realm-config.json": |
      {
        "realm": "my-realm",
        "enabled": true
      }
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "keycloakConfigCli.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, the Keycloak Config CLI will automatically apply your configuration files to the Keycloak instance with FIPS compliance. You can verify successful configuration by checking the job logs and validating the configuration in the Keycloak admin console.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. The Keycloak Config CLI requires a running Keycloak instance and will automatically wait for it to be ready before applying configurations.

## Security Considerations

The Keycloak Config CLI IAMGuarded FIPS image provides security-minded defaults while ensuring secure configuration management with FIPS 140-2 compliance. This FIPS variant ensures all cryptographic operations meet federal standards. Store sensitive configuration data using Kubernetes secrets and reference them in your Helm values for enhanced security.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### contour-iamguarded

# contour-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/contour-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/contour-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Contour is an ingress controller for Kubernetes that works by deploying the Envoy proxy as a reverse proxy and load balancer. Contour supports dynamic configuration updates out of the box while maintaining a lightweight profile.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Contour IAMGuarded is a security-enhanced variant of Contour designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Contour deployments.

## Helm Chart Installation

The Contour IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/contour
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Contour image
contour:
  image:
    registry: myregistry.example.com
    repository: mirrored/contour-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Envoy proxy image
envoy:
  image:
    registry: myregistry.example.com
    repository: mirrored/envoy-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Nginx image
defaultBackend:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/contour:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Contour IAMGuarded installation:

```bash
kubectl get po -l app.kubernetes.io/name=contour
```

You should see Contour and Envoy pods running:

```bash
NAME                              READY   STATUS    RESTARTS   AGE
contour-contour-c66d5cb67-z7ql6   1/1     Running   0          98s
contour-envoy-cw6vs               2/2     Running   0          98s
```

For more information on Contour, including follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-aws-provider

# crossplane-aws-provider
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-aws-provider` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-aws-provider/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane provider-aws is the infrastructure provider for Amazon Web Services (AWS).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-aws-provider` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-aws](https://github.com/crossplane-contrib/provider-aws/pkgs/container/provider-aws) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-provider:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the function is healthy:
```bash
kubectl get providers
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-aws).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### task

# task
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/task` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/task/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Task is a task runner and build tool that aims to be simpler and easier to use than GNU Make

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
There is no official upstream container image for Task. This is a Chainguard image containing the Task binary with the entrypoint set to `/usr/bin/task`.

## Getting Started
Task is a task runner and build tool that uses YAML to define tasks and their dependencies.

## Usage

```yaml
# Taskfile.yml
version: '3'

tasks:
  hello:
    cmds:
      - echo "Hello, World!"

  greet:
    cmds:
      - echo "Welcome to Task!"

  build:
    deps: [hello]
    cmds:
      - echo "Building project..."
      - echo "Build complete!"
```

```bash
# Run a task from your Taskfile.yml
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task hello

# List available tasks
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task --list
```

## Volume Mounts

This image is configured with `/work` as the default working directory. The `/work` directory is pre-created with appropriate permissions (owned by the `nonroot` user, uid/gid 65532).

Mount your project directory containing the `Taskfile.yml` to `/work`:

```bash
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task <task-name>
```

## Documentation and Resources
- [Task Documentation](https://taskfile.dev/)
- [Task GitHub Repository](https://github.com/go-task/task)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### quic-go-fips

# quic-go-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/quic-go-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/quic-go-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A production-ready QUIC implementation in pure Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `quic-go-fips` image is comparable to the [official quic-go-interop image on DockerHub](https://hub.docker.com/r/martenseemann/quic-go-interop). There are, however, a number of differences between the two images that one should be aware of before migrating to the Chainguard `quic-go-fips` image:

* Chacha20 testcases have been removed from the server and client in order to comply with FIPS 140
* Implementation of certain cryptographic functions have been reworked in order to use a FIPS 140-approved standard library implementation

### FIPS Support
The `quic-go-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/

## Getting started

First, generate certificates for secure communication with the server using an utility such as `mkcert`:
```bash
mkdir -p certificates
cd certificates
mkcert -cert-file cert.pem -key-file key.priv localhost
```

Run the image using `docker` or your preferred container runtime:
```shell
docker run --rm -it \
  -e "TESTCASE=retry" \
  -e "ROLE=server" \
  -v "${PWD}:/certs" \
  -p 443:443 \
  -t cgr.dev/ORGANIZATION/quic-go-fips:latest
```

Then interact with the server by using utilities such as `cURL`:
```
curl --http3 -k --cert=cert.pem --key=key.priv https://localhost:443/yourpath
```

For more information on how to use the client role of this image (`-e ROLE=client`), refer to the [upstream documentation on how to run a simulation](https://github.com/quic-interop/quic-network-simulator/tree/master?tab=readme-ov-file#running-a-simulation) with a docker compose deployment.

## Documentation and Resources
- [General quic-go-interop documentation](https://github.com/quic-interop/quic-network-simulator/tree/master)
- [quic-go-interop documentation on how to run a simulation](https://github.com/quic-interop/quic-network-simulator/tree/master?tab=readme-ov-file#running-a-simulation)
- [quic-go library documentation](https://quic-go.net/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-default-user-credential-updater-iamguarded-fips

# rabbitmq-default-user-credential-updater-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-default-user-credential-updater-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-default-user-credential-updater-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Image with [default-user-credential-updater](https://github.com/rabbitmq/default-user-credential-updater)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `rabbitmq-default-user-credential-updater-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

RabbitMQ Default User Credential Updater IAMGuarded is a security-enhanced component of the RabbitMQ Cluster Operator deployment. This image is designed to be deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, providing secure credential management for RabbitMQ clusters with additional security benefits.

## Helm Chart Installation

The RabbitMQ Default User Credential Updater IAMGuarded image is deployed as part of the RabbitMQ Cluster Operator IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator
msgTopologyOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image (this image)
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

The RabbitMQ Default User Credential Updater IAMGuarded component is automatically used by the RabbitMQ Cluster Operator when managing RabbitMQ cluster credentials. Validation occurs implicitly when RabbitMQ clusters are successfully provisioned with secure credential management.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Default User Credential Updater IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. This component ensures secure handling of RabbitMQ credentials during cluster operations. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grype

# grype
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grype` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grype/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A vulnerability scanner for container images and filesystems

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Image Variants

Our `latest` tag uses the most recent build of the [Wolfi grype](https://github.com/wolfi-dev/os/blob/main/grype.yaml) package. The following tagged variant is available without authentication:

- `latest`: This is an image for running `grype` commands. It does not include a shell or other applications.

### Compatibility Notes

Chainguard's `grype` image is comparable to the [official grype Image.](https://hub.docker.com/r/anchore/grype) but with the following changes:
* We use a different entrypoint `/usr/bin/grype` as compared to the upstream's endpoint `/grype`.
* We use a different `CMD` which is `help` whereas the upstream leaves it unset.
* We don't define any WorkingDir whereas the upstream sets it to `/tmp`.

### Getting Started

#### grype help
This will automatically pull the image to your local system and execute the command `grype help`:

```shell
docker run --rm cgr.dev/chainguard/grype help

A vulnerability scanner for container images, filesystems, and SBOMs.

Supports the following image sources:
    grype yourrepo/yourimage:tag             defaults to using images from a Docker daemon
    grype path/to/yourproject                a Docker tar, OCI tar, OCI directory, SIF container, or generic filesystem directory

You can also explicitly specify the scheme to use:
    grype podman:yourrepo/yourimage:tag          explicitly use the Podman daemon
    grype docker:yourrepo/yourimage:tag          explicitly use the Docker daemon
    grype docker-archive:path/to/yourimage.tar   use a tarball from disk for archives created from "docker save"
    grype oci-archive:path/to/yourimage.tar      use a tarball from disk for OCI archives (from Podman or otherwise)
    grype oci-dir:path/to/yourimage              read directly from a path on disk for OCI layout directories (from Skopeo or otherwise)
    grype singularity:path/to/yourimage.sif      read directly from a Singularity Image Format (SIF) container on disk
    grype dir:path/to/yourproject                read directly from a path on disk (any directory)
    grype sbom:path/to/syft.json                 read Syft JSON from path on disk
    grype registry:yourrepo/yourimage:tag        pull image directly from a registry (no container runtime required)
    grype purl:path/to/purl/file                 read a newline separated file of purls from a path on disk

You can also pipe in Syft JSON directly:
	syft yourimage:tag -o json | grype

Usage:
  grype [command]
```

### Documentation and Resources

* [Grype's Official Getting Started](https://github.com/anchore/grype?tab=readme-ov-file#getting-started)
* [Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/reference/grype)
* [Provenance Information](https://edu.chainguard.dev/chainguard/chainguard-images/reference/grype/provenance_info/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5792

# request-5792
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5792` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5792/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The JuiceFS Container Storage Interface (CSI) Driver Image that implements the CSI specification for container orchestrators to manage the lifecycle of JuiceFS filesystems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [juicedata/juicefs-csi-driver](https://hub.docker.com/r/juicedata/juicefs-csi-driver) image. Switching to Chainguard's `juicefs-csi-driver` image should not require any changes to your existing setup. However, there are two key differences:
1. **Community Edition Only Support**
The Chainguard's `juicefs-csi-driver` includes only the Community Edition (CE) `juicefs` binaries. It **does not support Enterprise Edition (EE)** features or usage in conjunction with JuiceFS Enterprise Mount images. This includes their usage with [Official JuiceFS CSI Driver Helm Chart](https://github.com/juicedata/charts/tree/main/charts/juicefs-csi-driver) which expects support for both CE and EE. variants. If using Helm, ensure your `values.yaml` is configured accordingly:
```bash
defaultMountImage:
  ce: ""  # Override this with the appropriate CE image
  ee: ""  # This must always remain unset
```
2. **Excluded Plugins**
The Chainguard `juicefs-csi-driver` image does not include plugins for `FoundationDB`, `GlusterFS`, or `Ceph`, which are present only in the upstream `amd64` variant of `juicedata/juicefs-csi-driver` image.

## Getting Started
### Helm
This image can be used as the JuiceFS CSI Driver image in [JuiceFS CSI Driver Helm chart](https://juicedata.github.io/charts).

Add the helm repository:
```bash
helm repo add juicefs https://juicedata.github.io/charts/
helm repo update
```
Create a `values.yaml`, specifying the Chainguard image:
```yaml
# values.yaml
image:
  repository: "cgr.dev/ORGANIZATION/request-5792"
  tag: "latest"
```
To use it with custom Community Edition Mount Image:
```yaml
# values.yaml
image:
  repository: "cgr.dev/ORGANIZATION/request-5792"
  tag: "latest"
defaultMountImage:
  ce: ""<JUICEFS_CE_MOUNT_IMAGE>""  # Override this with the appropriate CE image
```

Install the chart using our customized values:
```bash
helm install juicefs-csi-driver juicefs/juicefs-csi-driver -n kube-system -f values.yaml
```

## Documentation and Resources
- [Official JuiceFS Docs](https://juicefs.com/docs/csi/introduction/)
- [Introduction to architecture](https://github.com/juicedata/juicefs-csi-driver/blob/master/docs/en/introduction.md)
- [Getting started with JuiceFS CSI Driver](https://github.com/juicedata/juicefs-csi-driver/blob/master/docs/en/getting_started.md)
- [Latest Cookbooks and Guides](https://github.com/juicedata/juicefs-csi-driver/tree/master/docs/en)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cockroach

# cockroach
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cockroach` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cockroach/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CockroachDB is a cloud-native distributed SQL database designed to build, scale, and manage modern, data-intensive applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Cockroach Image is comparable to the [official Cockroach Image from Docker Hub](https://hub.docker.com/r/cockroachdb/cockroach). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

The upstream image explicitly exposes ports 26257 (SQL) and 8080 (HTTP), while the custom image does not. Port mapping needs to be specified during runtime.

Note that Chainguard also offers a `cockroach-openssl` image which is the upstream equivalent of enabling FIPS. This image is ideal for users prioritizing security, non-root execution, and minimal runtime dependencies.

## Getting Started

In this section we will explore how you can use Chainguard's cockroach Image.

### Helm Chart

You can use the [official helm chart](https://github.com/cockroachdb/helm-charts/tree/master/cockroachdb) and replace the image in `values.yaml` with Chainguard image.

You can try running the command below to see an immediate installation of cockroach using Chainguard's image:
```
helm install cockroach cockroachdb \
  --repo https://charts.cockroachdb.com/ \
  -f values.yaml
```
With this `values.yaml`:
```
tls:
  enabled: false

image:
  repository: cgr.dev/ORGANIZATION/cockroach
  tag: latest

conf:
  single-node: true
```

### Docker

You can run the command below to see an immediate installation of cockroach using Chainguard's image:
```
docker run -d \
  --name cockroach \
  -p 26257:26257 -p 8080:8080 \
  cgr.dev/ORGANIZATION/cockroach:latest \
  start-single-node --insecure
```
## Documentation and Resources
- [Official CockroachDB Documentation](https://www.cockroachlabs.com/docs/stable/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mariadb

# mariadb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mariadb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mariadb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[MariaDB](https://mariadb.org) is one of the most popular open source relational databases.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using MariaDb

The default MariaDB port is 3306.
To run with Docker and allow empty passwords:

```sh
$ docker run -p 3306:3306 --rm -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1 cgr.dev/chainguard/mariadb
Mon Jan 23 03:47:20 UTC 2023 [Note] [Entrypoint]: Entrypoint script for MariaDB Server  started.
Mon Jan 23 03:47:20 UTC 2023 [Note] [Entrypoint]: Initializing database files

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following command:

'/usr/bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at https://mariadb.com/kb

Please report any problems at https://mariadb.org/jira

The latest information about MariaDB is available at https://mariadb.org/.

Consider joining MariaDB's strong and vibrant community:
https://mariadb.org/get-involved/

Mon Jan 23 03:47:21 UTC 2023 [Note] [Entrypoint]: Database files initialized
...
2023-01-23  3:47:23 0 [Note] Plugin 'FEEDBACK' is disabled.
2023-01-23  3:47:23 0 [Note] InnoDB: Buffer pool(s) load completed at 230123  3:47:23
2023-01-23  3:47:23 0 [Note] Server socket created on IP: '0.0.0.0'.
2023-01-23  3:47:23 0 [Note] Server socket created on IP: '::'.
2023-01-23  3:47:23 0 [Note] mariadbd: ready for connections.
Version: '10.6.11-MariaDB'  socket: '/run/mysqld/mysqld.sock'  port: 3306  MariaDB Server
```

## Users and Directories

By default, this image runs as a non-root user named `mysql` with a uid of 65532.

## Environment Variables

You can use environment variables to create a new database and user upon initialization, and also to set up the root account password.

- `MARIADB_ROOT_PASSWORD`: Sets the password for MariaDB's root superuser account. If this variable is not set, you'll need to use either `MARIADB_RANDOM_ROOT_PASSWORD` or `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD` in order to initialize the database successfully.
- `MARIADB_RANDOM_ROOT_PASSWORD`: A non-zero value sets up a random password for the root superuser account.
- `MARIADB_ALLOW_EMPTY_ROOT_PASSWORD`: A non-zero value allows for an empty root password.
- `MARIADB_DATABASE`: Creates a new database upon initialization.
- `MARIADB_USER`: Together with `MARIADB_PASSOWORD`, this environment variable can be used to create a new database user and grant them full access to the database defined by `MARIADB_DATABASE`.
- `MARIADB_PASSWORD`: This should be used in conjunction with the `MARIADB_USER` environment variable to set up the database user's password.

## Docker Compose Example

This `docker-compose.yaml` sets up a MariaDB database with a default database and user. Other services can be added to create a local multi-node environment for development and tests.

```yaml
version: "3.7"
services:
  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_RANDOM_ROOT_PASSWORD: yes
      MARIADB_USER: user
      MARIADB_PASSWORD: password
      MARIADB_DATABASE: test
    ports:
      - 3306:3306
    volumes:
      - ./:/app
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-compose

# docker-compose
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-compose` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-compose/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

minimal docker-compose image with docker-compose binary

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image contains the `docker-compose` binary. It is a drop-in replacement for the upstream `docker/compose` image.
## Getting Started
We can create a simple `docker-compose.yml` file to test the `docker-compose` image:
```yaml
services:
  web:
    image: cgr.dev/chainguard/nginx:latest
    ports:
      - "8080:8080"
```
then we can run the following command to start the service:
```bash
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/app cgr.dev/ORGANIZATION/docker-compose:latest up
```

## Documentation & Resources
Please refer to the upstream documentation for a [getting started](https://docs.docker.com/compose/gettingstarted/)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1401

# request-1401
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1401` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1401/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spark-fips

# spark-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spark-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spark-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Spark provides high-level APIs in Scala, Java, Python, and R, and an optimized engine that supports general computation graphs for data analysis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

While Chainguard's Spark FIPS image is comparable to the official [Spark image on Docker Hub](https://hub.docker.com/_/spark), Chainguard's image is also FIPS 140-3 compliant. Chainguard's image includes only the minimum set of dependencies needed to run Spark.

## FIPS Support

This image contains Bouncy Castle crypto libraries for FIPS.

The FIPS certified version of Bouncy Castle (CMVP [#4743]) is compliant with the FIPS 140-3 standard when used in accordance with the [Bouncy Castle Security Policy].

This image also ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Creating a KeyStore

Before getting up and running with Spark FIPS, you'll need to create a BCFKS KeyStore:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-fips:TAG \
  -v -keystore /tmp/keystore/keystore.bcfks \
  -storetype bcfks \
  -providername BCFIPS \
  -alias "localhost" \
  -genkeypair -sigalg SHA512withRSA -keyalg RSA \
  -dname CN="localhost" \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
  -keypass "<YOUR TLS KEY PASSWORD, can be the same>"
```

You can now use keytool to view the KeyStore:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-fips:TAG \
  -v -keystore /tmp/keystore/keystore.bcfks \
  -list \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>"
```

After the KeyStore has been generated, Spark will need to be configured to use it. As an example, you may set the properties below:

```
spark.ssl.keyStorePassword=<YOUR TLS KEYSTORE PASSWORD>
spark.ssl.keyStoreType=BCFKS
spark.ssl.keyStore=/usr/lib/spark/conf/keystore.bcfks
```

Please consult the official documentation for [configuring Spark](https://spark.apache.org/docs/latest/configuration.html) for guidance on what properties are best for your environment.

### Creating a TrustStore

To create a TrustStore and import and trust an existing CA certificate you can also use keytool:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-fips:TAG \
  -v -keystore /tmp/keystore/truststore.bckfs \
  -storetype bcfks \
  -providername BCFIPS \
  -import -file /tmp/keystore/MyCA.crt \
  -storepass "<YOUR TRUSTSTORE PASSWORD>" \
  -trustcacerts \
  -noprompt
```

Configuring Spark for use with your TrustStore can be done in your config file as with the KeyStore above. For example, the properties below may be set:

```
spark.ssl.trustStorePassword=<YOUR TRUSTSTORE PASSWORD>
spark.ssl.trustStoreType=BCFKS
spark.ssl.trustStore=/usr/lib/spark/conf/truststore.bcfks
```

If you'd like to use a TrustStore type other than BCFKS, you'll need to set the environment variables below when running Spark:

```bash
docker run \
  -e JAVA_TRUSTSTORE_OPTIONS="-Djavax.net.ssl.trustStoreType=<TRUSTSTORE TYPE>" \
  -e JDK_JAVA_OPTIONS="--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED -Djavax.net.ssl.trustStoreType=<TRUSTSTORE TYPE>" \
  cgr.dev/ORGANIZATION/spark-fips:TAG \
  ...
```

### Deploying Spark

Start by creating a network for your Spark nodes:

```bash
docker network create spark
```

Then we can deploy Spark FIPS with Docker:

```bash
  docker run -it \
    --net spark \
    -v /path/to/spark-default.conf:/usr/lib/spark/conf/spark-default.conf \
    -v /path/to/keystore.bcfks:/keystore.bcfks:/usr/lib/spark/conf/keystore.bcfks \
    -v /path/to/truststore.bcfks:/usr/lib/spark/conf/truststore.bcfks \
    cgr.dev/ORGANIZATION/spark-fips:TAG \
    spark-shell
```

This will throw you into Spark's interactive shell.

We can submit a Spark application using another node via `spark://localhost:4440`:

```bash
  docker run \
    --net spark \
    -v /path/to/<YOUR APPLICATION>:/usr/lib/spark/work-dir/<YOUR APPLICATION>
    -v /path/to/spark-default.conf:/usr/lib/spark-default.conf \
    -v /path/to/keystore.bcfks:/usr/lib/spark/conf/keystore.bcfks \
    -v /path/to/truststore.bcfks:/usr/lib/spark/conf/truststore.bcfks \
    cgr.dev/ORGANIZATION/spark-fips:TAG \
    spark-submit <YOUR APPLICATION> --master spark://localhost:4440
```

You should now be up and running with Spark FIPS!

## Documentation and Resources

- [Configuring Spark](https://spark.apache.org/docs/latest/configuration.html)
- [Spark Documentation](https://spark.apache.org/documentation.html)
- [Spark GitHub Repository](https://github.com/apache/spark)
- [Spark Quick Start Tutorial](https://spark.apache.org/docs/latest/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-kubeseal-iamguarded-fips

# sealed-secrets-kubeseal-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-kubeseal-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-kubeseal-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Kubeseal is used to for one-way encryption of secrets. While not intended to be deployed via a Helm chart, it is typically used in conjunction with Sealed Secrets to enable a GitOps-friendly workflow. Additionally, the IAMGuarded variant is designed to be compatible with the IAMGuarded variant of Sealed Secrets. The IAMGuarded combination provides additional security benefits over standard Kubeseal variants.

## FIPS Compliance
This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Encrypting Secrets with Docker

The `sealed-secrets-kubeseal-iamguarded-fips` image can be used to encrypt and/or validate the sealed secrets.

To seal a secret, run the image and mount the Kubernetes config file - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-iamguarded-fips \
  -o yaml \
  <secret.yaml >sealed-secret.yaml
```

This will encrypt contents of `secret.yaml` as `sealed-secret.yaml`.

It's also possible to validate a sealed secret using the `--validate` flag to make sure the sealed secret is correct - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-iamguarded-fips \
  --validate \
  <sealed-secret.yaml
```

### Applying Sealed Secrets

Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f sealed-secret.yaml
```

Sealed secrets controller needs to be running in the cluster for this to work. The `sealed-secrets-controller-iamguarded` Chainguard image can be used for this purpose.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-operator

# prometheus-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for Prometheus Operator. Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `prometheus-operator` container image is comparable to [Bitnami's  Prometheus Operator image](https://hub.docker.com/r/bitnami/prometheus-operator), with the following differences:

* Like all other Chainguard Containers, `prometheus-operator` features a stripped down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user

## Getting started

To deploy `prometheus-operator` using the community Helm chart, please refer to the [Helm chart documentation](https://github.com/prometheus-community/helm-charts) for comprehensive instructions, which includes [supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2059).

The following is an example of how to use the Helm chart, overriding the image with the Chainguard image:

**Create a `values.yaml`**
```shell
prometheusOperator:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/prometheus-operator
    tag: latest
```

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-operator prometheus-community/kube-prometheus-stack \
  -f values.yaml
```

For full instructions on prometheus-operator, refer to the [official documentation](https://prometheus-operator.dev). [The GitHub repository](https://github.com/prometheus-operator/prometheus-operator) may also be useful.

### Deploy a Sample Application

**To illustrate how to deploy a sample application, you can use the `kubectl create deployment` command:**

```shell
kubectl create deployment example-app \
  --image=quay.io/brancz/prometheus-example-app:v0.5.0 \
  --replicas=3 \
  --port=8080
```

**Next, expose the application using the `kubectl expose` command:**

```shell
kubectl expose deployment example-app \
  --port=8080 \
  --target-port=8080 \
  --name=example-app
```

**Next, create a ServiceMonitor resource with the following `servicemonitor.yaml` manifest:**

```shell
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  labels:
    team: frontend
spec:
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - port: web
```

Apply the `ServiceMonitor`:

```shell
kubectl apply -f servicemonitor.yaml
```

**Finally, create a Prometheus Resource with the following `prometheus.yaml` manifest. Ensure Prometheus is configured to discover the `ServiceMonitor`:**

```shell
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: frontend
```

And apply the Prometheus resource:

```shell
kubectl apply -f prometheus.yaml
```

**Check that Prometheus has discovered the target:**

```shell
kubectl port-forward svc/prometheus-operated 9090:9090
```

Then, navigate to `http://localhost:9090/targets` in your browser. You will see the example-app listed under the **Targets** section.

## Documentation and Resources

- [GitHub Repository](https://github.com/prometheus-operator/prometheus-operator)  
- [Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)  
- [Documentation](https://prometheus-operator.dev)  

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### go-fips

# go-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/go-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/go-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Go applications with FIPS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

### 1.25 changes

The 1.25 images have the following differences compared to 1.24:

 * `GOEXPERIMENT=systemcrypto` is now on by default and doesn't need to (but still can) be explicitly provided
 * The `GOFIPS` environment variable has been removed.  The recommended way to enable FIPS now is to set `GODEBUG=fips140=on` or to use to `requirefips` build tag

### 1.24 changes

The 1.24 images have switched to use [microsoft/go](https://github.com/microsoft/go) toolchain. There are a few difference compared to 1.23:

 * Additional guard-rails preventing missbuilding binaries
 * GOEXPERIMENT name changed from missnamed 'boringssl' to 'systemcrypto'
 * It still uses the same go-openssl bindings, OpenSSL and the same/existing certified Chainguard FIPS provider for OpenSSL
 * All FIPS approved algorithms are executed through the OpenSSL FIPS provider, which it supports
 * Unsupported algorithms automatically fallback to a native go implementation
 * In particular, MD5 is accessible for non-security purposes (as commonly used as a CRC, rather than a secure hash)
 * GOTOOLCHAIN environment variable is set to local to prevent accidental upgrades to a non-systemcrypto capable toolchain

For a go toolchain without any access to any historical or unapproved algorithms please use [go-msft-fips](https://images.chainguard.dev/directory/image/go-msft-fips/overview) image instead.

There are further developments needed in 1.25 to consolidate the available go toolchains with OpenSSL support (with/without FIPS, with/without fallbacks).

### Go FIPS with OpenSSL

This image provides a Go toolchain for producing FIPS compliant binaries. For this purpose, the image is compiled with [golang-fips/go (FIPS enabled Go using OpenSSL)](https://github.com/golang-fips/go) patches applied. They are further enhanced to always default to FIPS mode, without ability to opt out.

Binaries built with this edition of go on Linux:

 * Require OpenSSL at runtime
 * Require OpenSSL FIPS provider at runtime
 * Will abort execution if the above conditions are not satisfied

While Chainguard's edition of OpenSSL FIPS is recommended, the resulting binaries are vendor-agnostic and can be used at runtime with OpenSSL FIPS providers on other OpenSSL FIPS hosts.

FIPS compliance is achieved by not using any native golang cryptographic functionality and redirecting all calls to OpenSSL at runtime. Specifically the following modules are patched to redirect to the OpenSSL FIPS provider:

 * `crypto`
 * `crypto/tls`
 * subset of `golang.org/x/crypto` that use stock `crypto` primitives only

If no other cryptographic algorithms are implemented or used, certification status will depend on the runtime OpenSSL FIPS certification. For Chainguard that is [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282).

Note that the `crypto/md5` algorithm implementation is available for non-cryptographically secure use cases only. If your application uses `crypto/md5` or any other third-party golang cryptographic modules, engage with a CST testing laboratory for additional audit and certification needs.

Where otherwise possible, the Go Chainguard Image is built for compatibility with the [Docker official image for Golang](https://hub.docker.com/_/golang/). For a non-FIPS Go toolchain, see the [`go` Chainguard Image](https://images.chainguard.dev/directory/image/go/overview).

### Go Compatibility

The `go-fips` Chainguard Image uses the `glibc` implementation of the C standard library, while the Alpine version of the`golang` official Docker Image uses `musl`. See our [article on glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/) on Chainguard Academy for an overview of the differences between these implementations.

Consider executing Go binaries from one of our FIPS-enabled runtime Chainguard Images, such as the [glibc-openssl-fips Chainguard Image](https://images.chainguard.dev/directory/image/glibc-openssl-fips/overview).

In Go 1.20, we default to using the new `GODEBUG` settings of `tarinsecurepath=0` and `zipinsecurepath=0`. These can be disabled by clearing the `GODEBUG` environment variable or by setting them to `1`. Learn more about these settings in the [Go release notes](https://tip.golang.org/doc/go1.20).

## Getting Started

Working with the `go-fips` Chainguard Image has the following limitations:

- Use native architecture builds (no-cross compilation)
- Ensure default build settings are used
- Do not customize toolchain `-tags`,  `GOEXPERIMENT`, `CGO_ENABLED`

 For more information on working with this Image, check out our [Getting Started with the Go Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/getting-started-go/) guide on Chainguard Academy.

### Interactive FIPS Verification

In this example, we'll build a test application and verify that the approved  external cryptographic library and OpenSSL symbols are in use.

Run a container based on the `go-fips` image interactively:

```sh
docker run --rm -it --entrypoint bash -w /root cgr.dev/ORGANIZATION/go-fips:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

At the interactive prompt, install [`helloserver`](https://pkg.go.dev/golang.org/x/example/helloserver), a Golang demo application :

```sh
go install golang.org/x/example/helloserver@latest
```

You should see output like the following:

```
go: downloading golang.org/x/example v0.0.0-20240205180059-32022caedd6a
go: downloading golang.org/x/example/helloserver v0.0.0-20240205180059-32022caedd6a
```

We can now check the toolchain flags used to build the binary we just created:

```sh
go version -m go/bin/helloserver
```

This produces an output similar to the following:

```
go/bin/helloserver: go1.25.0
        path    golang.org/x/example/helloserver
        mod     golang.org/x/example/helloserver        v0.0.0-20250605160450-8b405629c4a5      h1:0JvruIGF0CrrXuph0bOeqKYj2LBuyxi2VVkpNL321EE=
        build   microsoft_systemcrypto=1
        build   -buildmode=exe
        build   -compiler=gc
        build   DefaultGODEBUG=asynctimerchan=1,containermaxprocs=0,decoratemappings=0,fips140=on,gotestjsonbuildtext=1,gotypesalias=0,httplaxcontentlength=1,httpmuxgo121=1,httpservecontentkeepheaders=1,multipathtcp=0,panicnil=1,randseednop=0,rsa1024min=0,tls10server=1,tls3des=1,tlsmlkem=0,tlsrsakex=1,tlssha1=1,tlsunsafeekm=1,updatemaxprocs=0,winreadlinkvolume=0,winsymlink=0,x509keypairleaf=0,x509negativeserial=1,x509rsacrt=0,x509sha256skid=0,x509usepolicies=0
        build   CGO_ENABLED=1
        build   CGO_CFLAGS=
        build   CGO_CPPFLAGS=
        build   CGO_CXXFLAGS=
        build   CGO_LDFLAGS=
        build   GOARCH=amd64
        build   GOFIPS140=latest
        build   GOOS=linux
        build   GOAMD64=v1
```

For FIPS verification, check that:

 - The `build CGO_ENABLED=1` setting is in place.
 - The `build microsoft_systemcrypto=1` is in place.
 - The `GOFIPS140=latest` is in place.

You can also verify that OpenSSL symbols are used by the binary:

```sh
go tool nm go/bin/helloserver | grep -e OpenSSL_version
```

This produces an output similar to:

```
  6a4300 T _cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version
  6a4340 T _cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version_num
  6a46a0 T _cgo_ba70ff964674_Cfunc__mkcgo_available_OpenSSL_version_num
  a0ecf0 D _g_OpenSSL_version
  a0ece8 D _g_OpenSSL_version_num
  6acb90 T _mkcgo_OpenSSL_version
  6acbc0 T _mkcgo_OpenSSL_version_num
  6acba0 T _mkcgo_available_OpenSSL_version_num
  4fbe60 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_OpenSSL_version.abi0
  4fbf00 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_OpenSSL_version_num.abi0
  4fc380 t vendor/github.com/golang-fips/openssl/v2/internal/ossl._Cfunc__mkcgo_available_OpenSSL_version_num.abi0
  9a3898 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version
  9a38a0 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_OpenSSL_version_num
  9a38e0 d vendor/github.com/golang-fips/openssl/v2/internal/ossl._cgo_ba70ff964674_Cfunc__mkcgo_available_OpenSSL_version_num
```

Note that `golang-fips/openssl` contains bindings for all available APIs, even if individual binary may not use all of them.

Finally, let's verify that failing to use the allowed OpenSSL FIPS provider will prevent operation.

First, check the operation of the `helloserver` binary:

```sh
go/bin/helloserver
```

You should see the following message:

```
2024/11/14 20:37:30 serving http://localhost:8080
```

Press `Control-C` to stop the server.

Next, link the `fipsmodule.cnf` configuration file to `/dev/null`, which effectively invalidates FIPS configuration:

```sh
cp /etc/ssl/fipsmodule.cnf fipsmodule.cnf.back
ln -sf /dev/null /etc/ssl/fipsmodule.cnf
```

Now attempt to re-run the application server:

```
go/bin/helloserver
```

You should receive an error like the following:

```
panic: opensslcrypto: FIPS mode requested (environment variable GODEBUG=fips140=on) but not available: OpenSSL 3.5.2 5 Aug 2025

goroutine 1 [running]:
crypto/internal/backend.init.0()
        /usr/lib/go/src/crypto/internal/backend/openssl_linux.go:48 +0x129
```

This shows that the `helloserver` binary panics when OpenSSL FIPS is disabled. Additionally, other software that uses OpenSSL will panic e.g. `apk update`.

You can restore the `fipsmodule.cnf` file to return to an operational state:

```sh
cp fipsmodule.cnf.back /etc/ssl/fipsmodule.cnf
```

### Web Application with Multi-Stage Build

The following build demonstrates an application that's accessible by HTTP server. The application renders a simple message that changes based on the URI. The example uses a multi-stage build, compiling a binary using the `go-fips` Chainguard Image and copying it to the `glibc-openssl-fips` Chainguard Image for execution.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/greet-server && cd $_
```

Next, run the following command to write a `main.go` file defining our web application:

```sh
cat << 'EOF' > main.go
package main

import (
	"flag"
	"fmt"
	"html"
	"log"
	"net/http"
	"os"
	"runtime/debug"
	"strings"
)

func usage() {
	fmt.Fprintf(os.Stderr, "usage: helloserver [options]\n")
	flag.PrintDefaults()
	os.Exit(2)
}

var (
	greeting = flag.String("g", "Hello", "Greet with `greeting`")
	addr     = flag.String("addr", "0.0.0.0:8080", "address to serve")
)

func main() {
	// Parse flags.
	flag.Usage = usage
	flag.Parse()

	// Parse and validate arguments (none).
	args := flag.Args()
	if len(args) != 0 {
		usage()
	}

	// Register handlers. for greeting and version
	http.HandleFunc("/", greet)
	http.HandleFunc("/version", version)

	log.Printf("serving http://%s\n", *addr)
	log.Fatal(http.ListenAndServe(*addr, nil))
}

func version(w http.ResponseWriter, r *http.Request) {
	info, ok := debug.ReadBuildInfo()
	if !ok {
		http.Error(w, "no build information available", 500)
		return
	}

	fmt.Fprintf(w, "<!DOCTYPE html>\n<pre>\n")
	fmt.Fprintf(w, "%s\n", html.EscapeString(info.String()))
}

func greet(w http.ResponseWriter, r *http.Request) {
	name := strings.Trim(r.URL.Path, "/")
	if name == "" {
		name = "Linky 🐙"
	}

	fmt.Fprintf(w, "<!DOCTYPE html>\n")
	fmt.Fprintf(w, "%s, %s!\n", *greeting, html.EscapeString(name))
}
EOF
```

Next, run the following command to write a `go.mod` file listing dependencies:

```sh
cat << 'EOF' > go.mod
module chainguard.dev/greet-server

go 1.19
EOF
```

Write a `Dockerfile` to define your image build:

```sh
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/go-fips:latest AS builder

COPY . /app
RUN cd /app && go build

FROM cgr.dev/ORGANIZATION/glibc-openssl-fips:latest
COPY --from=builder /app/greet-server /usr/bin/

EXPOSE 8080

ENTRYPOINT ["/usr/bin/greet-server"]
EOF
```

This `Dockerfile` uses a multi-stage build approach, compiling the application using the `go` Chainguard Image, then copying the binary to the `glibc-openssl-fips` Chainguard Image to serve.

Build the image, tagging it `greet-server`:

```sh
docker build . -t greet-server
```

Run the container:

```sh
docker run -p 8080:8080 greet-server
```

Visit [http://0.0.0.0:8080/](http://0.0.0.0:8080/) using a web browser on your host machine. You should see the following:

```
Hello, Linky 🐙!
```

Changes to the URI will be routed to the application. Try visiting [http://0.0.0.0:8080/Chainguard%20Customer](http://0.0.0.0:8080/Chainguard%20Customer). You should see the following output:

```
Hello, Chainguard Customer!
```

The application will also share version information at [http://0.0.0.0:8080/version](http://0.0.0.0:8080/version). We can see on that page that the binary has been compiled with OpenSSL:

```
go      go1.25.0
path    chainguard.dev/greet-server
mod     chainguard.dev/greet-server     (devel)
build   microsoft_systemcrypto=1
...
build   GOFIPS140=latest
...
```

If you're building a web application with the `go-fips` Chainguard Image, consider the [nginx-fips](https://images.chainguard.dev/directory/image/nginx-fips/overview) Chainguard Image for use as a reverse proxy.

## Documentation and Resources

- [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [Go FIPS with OpenSSL](https://github.com/golang-fips/go?tab=readme-ov-file#go-fips-with-openssl)
- [Chainguard Academy: Getting Started with the Go Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/go/)
- [Video: Migrating a Dockerfile for a Go application to use Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/videos/migrating_go/)
- [Blog Post: Statically Linking Go in 2022](https://mt165.co.uk/blog/static-link-go/)
- [Blog Post: Building minimal and low CVE images for compiled languages](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-compiled-languages)
- [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/images-compiled-programs/glibc-vs-musl/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-pytorch-backend-fips

# tritonserver-pytorch-backend-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-pytorch-backend-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-pytorch-backend-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton backend for the PyTorch TorchScript models with FIPS support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `tritonserver-pytorch-backend-fips` image is functionally comparable to the official NVIDIA [`nvcr.io/nvidia/tritonserver:*-pyt-python-py3`](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver) image. This image contains the PyTorch backend (`libtriton_pytorch.so`) and supporting libraries such as **TorchVision** and **Torch-TensorRT**, 

> [!IMPORTANT]
> This image is optimized for inference only. It does **not** include utilities for model training or conversion. Use a full PyTorch environment (e.g., the NVIDIA PyTorch image) to prepare and export models.

---

### FIPS Support

The tritonserver-pytorch-backend-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The following instructions serve a TorchScript-exported ResNet-50 model using the Triton Inference Server with the PyTorch backend.

### Step 1: Export a TorchScript model using NVIDIA’s PyTorch container

```bash
MODEL_PATH=$(pwd)/model_repository/1
mkdir -p "$MODEL_PATH"

docker run --rm -v "$MODEL_PATH:/out" nvcr.io/nvidia/pytorch:25.04-py3   python3 -c '
import torch
import torchvision.models as models
model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
model.eval()
torch.jit.script(model).save("/out/model.pt")'
```

---

### Step 2: Create the model configuration file

```bash
cat > model_repository/config.pbtxt <<EOF
name: "resnet50"
platform: "pytorch_libtorch"
max_batch_size: 1
input [
  {
    name: "input"
    data_type: TYPE_FP32
    format: FORMAT_NCHW
    dims: [3, 224, 224]
  }
]
output [
  {
    name: "output"
    data_type: TYPE_FP32
    dims: [1000]
  }
]
EOF
```

---

### Step 3: Run Triton Inference Server using the Chainguard PyTorch backend image

```bash
docker run --rm --name triton -v "$(pwd)/model_repository:/models" -p8000:8000 -p8001:8001 -p8002:8002 cgr.dev/ORGANIZATION/tritonserver-pytorch-backend-fips:latest --model-repository=/models
```

---

### Step 5: Run inference with dummy input

Once the server becomes ready, create the inference request JSON:

```bash
python3 -c '
import json
with open("infer_input.json", "w") as f:
  json.dump({
    "inputs": [{
      "name": "input",
      "shape": [1, 3, 224, 224],
      "datatype": "FP32",
      "data": [0.0] * (1 * 3 * 224 * 224)
    }],
    "outputs": [{"name": "output"}]
  }, f)
'
```

Send the request:

```bash
curl -sf localhost:8000/v2/models/resnet50/infer   -H "Content-Type: application/json"   -d @infer_input.json | jq
```

---

You should see a JSON response with output logits of shape `[1, 1000]` indicating successful inference!

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elastic-agent-fips

# elastic-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elastic-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elastic-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elastic Agent is a unified agent for collecting, monitoring, and securing data across systems in the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `elastic-agent-fips` image is comparable to the external [elastic-agent](https://hub.docker.com/r/elastic/elastic-agent) image, with the following key differences:

- The Chainguard image **does not** include the following binaries (normally located in `/usr/share/elastic-agent/data/elastic-agent-buildhash/components/`):
  - `cloud-defend`
  - `endpoint-security`
  - `osqueryd`
  - `pf-elastic-collector`
  - `pf-elastic-symbolizer`
  - `pf-host-agent`
  
- The Chainguard image **does not** store its binaries in `/usr/share/elastic-agent/data/elastic-agent-buildhash/components/`. Instead, it symlinks them from `/usr/bin`.

Chainguard Images are regularly updated, minimal container images with low-to-zero CVEs.

## Getting Started
The elastic-agent-fips image can be deployed using the official Elastic Agent [Helm chart](https://github.com/elastic/elastic-agent/tree/main/deploy/helm/elastic-agent) alongside the [ECK Operator](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-installing-eck.html).

Start by retrieving credentials from an Elasticsearch deployment using the elastic ECK Operator. This example uses the secrets generated by the [ECK quickstart guide](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-enterprise-search-quickstart.html).

```bash
PASSWORD=$(kubectl get secrets quickstart-es-elastic-user -o json |jq -r .data.elastic |base64 -d)
ES_API_KEY=$(kubectl exec -it quickstart-es-default-0 -n default -- \
curl -k -u elastic:$PASSWORD -s -X POST "https://localhost:9200/_security/api_key" \
    -H "Content-Type: application/json" \
    -d '{"name":"my-api-key","role_descriptors":{"custom_role":{"cluster":["all"],"index":[{"names":["*"],"privileges":["all"]}]}}}' | jq -r .api_key)
```

Next, create a `values.yaml` file:

```yaml
kubernetes:
  enabled: true

outputs:
  elasticsearch:
    type: ESPlainAuthAPI
    url: https://quickstart-es-http:9200
    username: elastic
    password: "$PASSWORD"
    api_key: "$ES_API_KEY"
  default:
    url: https://quickstart-es-http:9200
    username: elastic

    password: "$PASSWORD"
agent:
  imagePullPolicy: IfNotPresent
  image:
    repository: "<YOUR_IMAGE_REGISTRY>"
    tag: "<YOUR_IMAGE_TAG>"
```

Finally, deploy the elastic-agent Helm chart using the `values.yaml` file:

```
git clone https://github.com/elastic/elastic-agent.git
helm install demo ./elastic-agent/deploy/helm/elastic-agent -f values.yaml
```

## Documentation and Resources

Refer to the [official Elastic Agent documentation](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-elastic-agent-quickstart.html) and the [official Elastic Agent repository](https://github.com/elastic/elastic-agent) for more information. 

Deploy elastic-agent using the [official Elastic Agent helm chart](https://github.com/elastic/elastic-agent/tree/main/deploy/helm/elastic-agent).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jmx-exporter-iamguarded-fips

# jmx-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jmx-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jmx-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

jmx-exporter-iamguarded-fips image is a Prometheus metrics exporter for JMX (Java Management Extensions), enabling monitoring and observability for Java applications used by IAMguarded helm charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

JMX Exporter IAMGuarded FIPS is a FIPS compliant Prometheus metrics exporter for JMX (Java Management Extensions), designed to export metrics from Java applications. This security-enhanced variant is used as a metrics sidecar component in IAMGuarded Helm charts for Java-based applications that expose JMX metrics and require FIPS compliance.

JMX Exporter runs as an HTTP server and exposes Java runtime and application metrics in Prometheus format, enabling monitoring and observability for Java applications deployed in FIPS-compliant Kubernetes environments.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Helm Chart Usage

The JMX Exporter IAMGuarded FIPS image does not have its own dedicated Helm chart. Instead, it is deployed as a metrics sidecar container in IAMGuarded Helm charts for Java applications that expose JMX metrics and require FIPS compliance.

### Kafka IAMGuarded Chart

The most common usage is with the Kafka IAMGuarded Helm chart, delivered through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kafka
```

#### Installation with JMX Metrics Enabled (FIPS variant)

```bash
helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka \
  --set "global.org=$ORGANIZATION" \
  --set "metrics.jmx.enabled=true" \
  --set "metrics.jmx.image.repository=$ORGANIZATION/jmx-exporter-iamguarded-fips"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. JMX metrics are typically disabled by default and must be explicitly enabled. The FIPS variant must be explicitly specified by overriding the image repository.

#### Configuration Requirements

##### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

##### Registry Configuration
For users who mirror images to custom repositories, configure the JMX Exporter FIPS image in your `values.yaml`:

```yaml
metrics:
  jmx:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/jmx-exporter-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag
```

##### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: When using custom registries, always pin to specific image digests for reliable deployments.

2. **Enable Metrics Explicitly**: JMX metrics collection is typically opt-in. Review the chart's `values.yaml` to enable and configure the metrics endpoint.

3. **Configure JMX Rules**: The exporter uses configuration files to define which JMX metrics to expose. Consult the chart's documentation for customizing JMX scraping rules.

4. **FIPS Compliance**: This image uses FIPS 140-2 validated cryptographic modules. Ensure your entire deployment chain maintains FIPS compliance if required by your security policies.

## Validation

After deployment with JMX metrics enabled, validate the exporter by checking that metrics are exposed on the configured port (typically 5556). You can verify metrics collection by:

1. Port-forwarding to the metrics pod:
   ```bash
   kubectl port-forward <pod-name> 5556:5556
   ```

2. Accessing the metrics endpoint:
   ```bash
   curl http://localhost:5556/metrics
   ```

3. Confirming Prometheus is scraping the JMX metrics (if Prometheus integration is configured).

4. Verifying FIPS mode is enabled (check logs for FIPS-related initialization messages).

## Other Compatible Charts

While Kafka is the primary use case, this FIPS-compliant image can be used with any IAMGuarded Helm chart for Java applications that support JMX metrics collection and require FIPS compliance. Consult individual chart documentation for specific configuration requirements.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wasmtime

# wasmtime
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wasmtime` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wasmtime/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `wasmtime` tool which can be used to compile or run wasm binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kiam

# kiam
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kiam` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kiam/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### altinity-clickhouse

# altinity-clickhouse-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/altinity-clickhouse-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/altinity-clickhouse-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Altinity Stable Build for ClickHouse

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Altinity ClickHouse container image is compatible with the [Altinity ClickHouse distribution](https://hub.docker.com/r/altinity/clickhouse-server/tags). The primary difference is that Altinity initially runs as root with overly permissive file permissions (777/666), while Chainguard runs as the non-root `clickhouse` user (UID 101) by default with standard Unix permissions (755/644 for files owned by `clickhouse:clickhouse`).

## Getting Started

Altinity ClickHouse can be deployed as a standalone server using Docker or as a distributed cluster in Kubernetes using Helm.

### Docker Deployment

You can run ClickHouse server using the following `docker run` command:
```sh
password="sup3r$ecr3t!P@ss"

docker run -d --name clickhouse-server \
  -e CLICKHOUSE_PASSWORD=$password \
  -p 8123:8123 -p 9000:9000 \
  cgr.dev/ORGANIZATION/altinity-clickhouse-server
```

By default, ClickHouse requires password authentication for the `default` user.

You can use the `clickhouse-client` or HTTP interface to connect to the server.

#### Connect Using clickhouse-client
```sh
# From within the container
docker exec -it clickhouse-server clickhouse-client --password $password

# Run queries directly
docker exec clickhouse-server clickhouse-client --password $password --query "SELECT version()"
docker exec clickhouse-server clickhouse-client --password $password --query "CREATE DATABASE test_db"
docker exec clickhouse-server clickhouse-client --password $password --query "SHOW DATABASES"
```

#### Connect Using HTTP
```sh
# Ping endpoint
curl http://localhost:8123/ping

# Execute query with authentication
curl -u default:$password 'http://localhost:8123/?query=SELECT+1'

# Or using POST
echo "SELECT 'Hello, ClickHouse!'" | curl -u default:$password 'http://localhost:8123/' --data-binary @-
```

### Helm Deployment

For versions 23.3 and later, you can deploy using the Altinity Helm chart:
```sh
helm repo add altinity https://helm.altinity.com

helm install my-clickhouse altinity/clickhouse \
  --namespace clickhouse \
  --create-namespace \
  --set clickhouse.image.repository=cgr.dev/ORGANIZATION/altinity-clickhouse-server \
  --set clickhouse.image.tag=latest \
  --set clickhouse.defaultUser.password=$password
```

Wait for pods to be ready:
```sh
kubectl wait --for=condition=ready pod \
  -l "app.kubernetes.io/name=clickhouse" \
  -n clickhouse \
  --timeout=300s
```

Connect using clickhouse-client:
```sh
pod_name=$(kubectl get pods -n clickhouse \
  -l "app.kubernetes.io/name=clickhouse" \
  -o jsonpath="{.items[0].metadata.name}")
kubectl exec -it $pod_name --namespace clickhouse -- \
  clickhouse-client --password $password
```

## Documentation and Resources

* [Altinity Documentation](https://docs.altinity.com/)
* [Altinity ClickHouse Repository](https://github.com/Altinity/ClickHouse)
* [Altinity Helm Chart](https://github.com/Altinity/helm-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-exporter

# cert-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, wolfi-based image for cert-exporter: an application that exports certificate expiration metrics from disk, Kubernetes, and AWS Secrets Manager to Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cert-exporter` image is a drop-in replacement for the upstream [joe-elliott/cert-exporter](https://hub.docker.com/r/joeelliott/cert-exporter) container image. It is fully compatible with the official [cert-exporter Helm chart](https://joe-elliott.github.io/cert-exporter/) and supports all core functionality, including scanning certificates from disk, Kubernetes secrets, and exporting expiration metrics to Prometheus. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [cert-exporter Helm chart](https://github.com/joe-elliott/cert-exporter/tree/master/helm/cert-exporter). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cert-exporter
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `cert-exporter` helm chart

```shell
helm repo add cert-exporter https://joe-elliott.github.io/cert-exporter/
helm repo update
helm install cert-exporter cert-exporter/cert-exporter --namespace monitoring --create-namespace -f values.yaml --wait
```

## Documentation
- [Cert-Exporter Github Repository](https://github.com/joe-elliott/cert-exporter/tree/master)
- [Cert-Exporter Helm Chart](https://joe-elliott.github.io/cert-exporter/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-rollout-operator

# grafana-rollout-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-rollout-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-rollout-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Rollout Operator coordinates the rollout of pods between different StatefulSets within a specific namespace, and can be used to manage multi-AZ deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Grafana Rollout Operator image is meant to serve as a drop-in replacement for the official Grafana Rollout Operator image from Docker Hub. One notable difference between the Docker Hub image and Chainguard's Grafana Rollout Operator image is the location where `rollout-operator` binary is installed in the container. The Grafana Rollout Operator Image from Docker Hub has `bash` installed at `/bin/rollout-operator` while Chainguard's has it installed at the standard `/usr/bin/rollout-operator`.

## Getting Started

There is a Helm chart available for the Grafana Rollout Operator. You can install it using the following commands:

First, install the Helm chart repository:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```

Prepare the values file `values.yaml` with the following content:

```yaml
 image:
   repository: cgr.dev/ORGANIZATION/grafana-rollout-operator
   tag: latest
```

Then, install the Grafana Rollout Operator:

```bash
helm install grafana-rollout-operator grafana/grafana-rollout-operator -f values.yaml
```

Check the daemonset is running:

```bash
kubectl get deploy grafana-rollout-operator -n grafana-rollout-operator
```

This works in conjencture with [mimir-distributed](https://grafana.com/docs/helm-charts/mimir-distributed/latest/get-started-helm-charts/)

Add Labels and Annotations to ingester zones:
```bash
kubectl label sts mimir-ingester-zone-a grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-a grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-a grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-a grafana.com/prepare-downscale-http-port=80 -n mimir

kubectl label sts mimir-ingester-zone-b grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-b grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/rollout-downscale-leader=mimir-ingester-zone-a -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/prepare-downscale-http-port=80 -n mimir

kubectl label sts mimir-ingester-zone-c grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-c grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/rollout-downscale-leader=mimir-ingester-zone-b -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/prepare-downscale-http-port=80 -n mimir
```

Check for logs
```bash
kubectl logs deployment/mimir-rollout-operator -n mimir
```

It should say something like
```bash
level=debug ts=2024-05-14T17:02:34.97299692Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-a
level=debug ts=2024-05-14T17:02:34.973309878Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-b
level=debug ts=2024-05-14T17:02:34.97338692Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-c
level=debug ts=2024-05-14T17:02:34.97363967Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-a
level=debug ts=2024-05-14T17:02:34.973721503Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-b
level=debug ts=2024-05-14T17:02:34.973819586Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-c
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rclone

# rclone
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rclone` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rclone/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Rclone syncs files and directories to and from different cloud storage providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/rclone/rclone). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To start using Chainguard rclone image, we can start with checking the version and invoking some commands:
```shell
docker run --rm cgr.dev/ORGANIZATION/rclone:latest version
docker run --rm cgr.dev/ORGANIZATION/rclone:latest sync /usr/bin /tmp/newbin --copy-links
```

## Documentation and Resources
- [Official Rclone documentation](https://rclone.org/install/#docker)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bun

# bun
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bun` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bun/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `bun` container image is designed to be a drop-in replacement for the upstream [Bun runtime](https://bun.sh/).

## Getting Started

Run JavaScript files with Bun:

```shell
cat > hello.js <<EOF
console.log("Hello from Bun!");
console.log(\`Bun version: \${Bun.version}\`);
EOF

docker run --rm -v $(pwd):/app -w /app cgr.dev/ORGANIZATION/bun:latest run hello.js
```
```
Hello from Bun!
Bun version: 1.2.16
```

The `-w /app` flag sets the working directory inside the container to `/app`, which corresponds to the mounted project directory.

Execute JavaScript code directly:

```shell
docker run --rm cgr.dev/ORGANIZATION/bun:latest -e "console.log('Hello from Bun eval'); console.log(2 + 2);"
```
```
Hello from Bun eval!
4
```

## Documentation and Resources

- [Bun Documentation](https://bun.sh/docs)
- [Bun GitHub Repository](https://github.com/oven-sh/bun)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cass-config-builder

# cass-config-builder
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cass-config-builder` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cass-config-builder/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [cass-config-builder](https://github.com/datastax/cass-config-builder) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

To use this image you can follow up the official documentation of installing the Helm Chart for K8ssandra Operator, [here](https://docs.k8ssandra.io/install/).

In the [ImageConfiguration](https://docs.k8ssandra.io/install/image-config/) section which allows you to configure the K8ssandra images to use custom registries or custom images, you can use the this image for the `cass-config-builder` image config, [here](https://github.com/k8ssandra/cass-operator/blob/ff5bc87f10b890ab09eb2d5c369edf2568169dd8/config/manager/image_config.yaml#L7) as an example:

```yaml
apiVersion: config.k8ssandra.io/v1beta1
kind: ImageConfig
metadata:
  name: image-config
images:
...
  config-builder: "cgr.dev/chainguard/cass-config-builder:latest"
...
```

If you do this change right after your installation, you might need to delete the pods under the `k8ssandra-operator` namespace for the changes to take effect by the pods being recreated but please verify that the pods are up and running before proceeding with the next steps.

Next, to test the image whether it is actually working you should create `K8ssandraCluster` CR with the following spec, [here](https://docs.k8ssandra.io/install/local/single-cluster-helm/#deploy-the-k8ssandracluster):

```yaml
apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
  name: demo
  namespace: k8ssandra-operator
spec:
  cassandra:
    serverVersion: "4.0.1"
    datacenters:
      - metadata:
          name: dc1
        size: 3
        storageConfig:
          cassandraDataVolumeClaimSpec:
            storageClassName: standard # make sure that you configure this to match your environment
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 5Gi
        config:
          jvmOptions:
            heapSize: 512M
        stargate:
          size: 1
          heapSize: 256M
```

After you created the `K8ssandraCluster` CR, there should be a pod with the name `demo-dc1-default-sts-0` under the `k8ssandra-operator` namespace up and running because the `cass-config-builder` image is going to be used as an initContainer so if the pod is up and running we can confirm that the image is working as expected.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### meilisearch

# meilisearch
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/meilisearch` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/meilisearch/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal meilisearch image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage Example

Run a meilisearch container with the following command:

```
docker run \
  --rm \
  -d \
  -p 7700:7700 \
  cgr.dev/chainguard/meilisearch:latest \
  --db-path /var/data.ms \
  --dump-dir /var/data.ms/dumps \
  --http-addr 0.0.0.0:7700
```

Then you can follow the [meilisearch quick start guide](https://www.meilisearch.com/docs/learn/getting_started/quick_start#add-documents) and start adding documents.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wordpress

# wordpress
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wordpress` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wordpress/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based WordPress images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image was designed to work as a drop-in replacement for the official [WordPress FPM-Alpine](https://hub.docker.com/_/wordpress) image, with a distroless variant for increased security on production environments. 

The `latest-dev` variant should be used to install and customize WordPress with themes and plugins. It has the same features from the upstream WordPress image, with an entrypoint script to set up the database via environment variables. The `latest` variant is a production-ready distroless image that should be used to run the WordPress site in a multi-stage build.

### Example Docker Compose Setup

You can use the following `docker-compose.yml` file to set up a **development environment** to install and customize WordPress:

```yaml
services:
  app:
    image: cgr.dev/chainguard/wordpress:latest-dev
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: wp-user
      WORDPRESS_DB_PASSWORD: wp-password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - document-root:/var/www/html
    networks:
      - wolfi

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - document-root:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - wolfi

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: wp-user
      MARIADB_PASSWORD: wp-password
      MARIADB_DATABASE: wordpress
    ports:
      - 3306:3306
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge

volumes:
  document-root:
```

For this setup to work, you'll need an `nginx.conf` file with the following content:

```nginx
pid /var/run/nginx.pid;

events {
  worker_connections  1024;
}

http {
    server {
        listen 8080;
        index index.php index.html;
        root /var/www/html;
        charset utf-8;
        client_max_body_size 100M;
        timeout 300;

        location / {
            include  /etc/nginx/mime.types;
            try_files $uri $uri/ /index.php?$query_string;
        }

        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt  { access_log off; log_not_found off; }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ /\.(?!well-known).* {
            deny all;
        }
    }
}

```

After running `docker compose up`, your WordPress site will be available at `http://localhost:8000`. You can follow the installation instructions to set up your site and test your setup, but persisting customizations such as themes and plugins will require a different strategy that requires either setting up a volume for your theme and plugins or copying the custom content to the image through a Dockerfile that uses `cgr.dev/chainguard/wordpress:latest-dev` as the base image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-postgres-exporter-iamguarded-fips

# prometheus-postgres-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-postgres-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-postgres-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A PostgreSQL metric exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PostgreSQL IAMGuarded is a security-enhanced variant of PostgreSQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main PostgreSQL image
image:
  registry: myregistry.example.com
  repository: mirrored/postgres-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/postgresql:16.7.2
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### asciinema

# images/asciinema
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/asciinema` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/asciinema/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

asciinema is a CLI tool for recording and sharing terminal sessions. It records terminal sessions as lightweight text-based recordings (casts) that can be played back, converted between formats, and shared.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `asciinema` image is based on the upstream [asciinema container image](https://github.com/asciinema/asciinema) available at `ghcr.io/asciinema/asciinema`. This Chainguard image provides the same functionality as the upstream image with the following differences:

* **Base OS:** The upstream image uses `debian:trixie-slim` as its base, while this Chainguard image is built on Wolfi. This means `apt` and other Debian-specific tools are not available. If you need to install additional packages, use `apk` with the `-dev` variant.
* **Minimal Design:** This image includes only the asciinema binary and its essential runtime dependencies, significantly reducing the attack surface and CVE count compared to the Debian-based upstream.
* **Non-Root User:** The container runs as a non-root user by default, following security best practices.
* **Regular Updates:** The image receives daily automated builds to incorporate the latest security patches.

All asciinema commands and features work identically to the upstream image, including recording, playback, format conversion, and server authentication.

## Getting Started

The `asciinema` image provides a command-line tool for recording and managing terminal sessions. The following examples demonstrate common usage patterns.

### Recording a Terminal Session

To record a terminal session, you can run a command directly and save the output to a file:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema record -c 'echo "Hello, asciinema!"' /recordings/demo.cast
```

This command records the execution of `echo "Hello, asciinema!"` and saves it to `demo.cast` in your current directory. The recording uses the default v3 format.

You can also specify the output format explicitly:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema record --output-format asciicast-v2 -c 'ls -la' /recordings/demo.cast
```

### Converting Between Formats

asciinema supports converting recordings between different formats:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema convert /recordings/demo.cast /recordings/demo-v3.cast
```

This converts an older format recording to the latest v3 format. You can also convert to text or raw formats:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema convert --output-format txt /recordings/demo.cast /recordings/demo.txt
```

### Concatenating Recordings

To combine multiple recordings into a single file:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema cat /recordings/demo1.cast /recordings/demo2.cast > combined.cast
```

### Playing Recordings

While the container environment limits interactive playback capabilities, you can output recordings to standard output for further processing:

```sh
docker run --rm -v $(pwd):/recordings cgr.dev/ORGANIZATION/asciinema cat /recordings/demo.cast
```

## Configuration

### Authenticating with asciinema.org

To authenticate with asciinema.org for uploading recordings, you can use the auth command:

```sh
docker run --rm cgr.dev/ORGANIZATION/asciinema auth --server-url https://asciinema.org
```

This command generates an authentication URL that you can open in your browser to link your local CLI with your asciinema.org account.

### Using a Custom Server

asciinema supports self-hosted servers. You can configure the server URL using the `--server-url` option:

```sh
docker run --rm cgr.dev/ORGANIZATION/asciinema auth --server-url https://asciinema.example.com
```

### Environment Variables

The asciinema CLI respects the `ASCIINEMA_SERVER_URL` environment variable:

```sh
docker run --rm -e ASCIINEMA_SERVER_URL=https://asciinema.example.com cgr.dev/ORGANIZATION/asciinema auth
```

## Documentation and Resources

For more information about asciinema's features and capabilities, refer to the following resources:

* [asciinema Official Documentation](https://docs.asciinema.org/)
* [asciinema GitHub Repository](https://github.com/asciinema/asciinema)
* [asciinema File Format Specification](https://docs.asciinema.org/manual/asciicast/v3/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vela-core-fips

# vela-core-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vela-core-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vela-core-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

KubeVela is a modern software delivery platform that makes deploying and operating applications across today's hybrid, multi-cloud environments easier, faster and more reliable.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [vela-core](https://hub.docker.com/r/oamdev/vela-core) image. Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support
The `vela-core-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

You can use this image by setting the image provider on [`kubevela`'s official helm chart](https://kubevela.io/docs/installation/kubernetes/) to this image.

First, create a values.yaml, specifying the Chainguard images:

```shell
cat <<EOF > values.yaml
image:
  repository: "cgr.dev/ORGANIZATION/vela-core-fips"
  tag: "latest"
EOF
```

Initialize `vela-core` via the helm chart:

```shell
helm repo add kubevela https://kubevela.github.io/charts
helm repo update
helm install --create-namespace -n vela-system kubevela kubevela/vela-core --wait -f values.yaml
```

Then interact with `vela-core` as you would normally with `vela-cli`, as specified on the [kubevela documentation](https://kubevela.io/docs/)

```shell
# https://kubevela.io/docs/cli/vela_install/#go-back-to-cli-commands-homepage
vela install

# https://kubevela.io/docs/reference/addons/velaux/#install
vela addon enable velaux

# https://kubevela.io/docs/quick-start/
vela env init prod --namespace prod
vela up -f https://kubevela.net/example/applications/first-app.yaml
```

## Documentation and Resources

* [Official Documentation](https://kubevela.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### druid

# druid
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/druid` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/druid/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Druid is a high performance real-time analytics database.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
To deploy druid with helm chart, you can use the following command:
```sh
# Add repository
$ helm repo add druid-helm https://asdf2014.github.io/druid-helm/

# Install chart
$ helm install my-druid druid-helm/druid \
    --set image.repository=cgr.dev/chainguard/druid \
    --set image.tag=latest
```

Note: In the upstream image, druid is installed in `/opt/druid`, but in the chainguard image, druid is installed in `/usr/share/java/druid`.
For more information on using druid, refer to the official [documentation](https://druid.apache.org/docs/latest/design/) and the [github repository](https://github.com/apache/druid).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jaeger-operator

# jaeger-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jaeger-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jaeger-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal jaeger-operator container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying Jaeger-operator with Helm

Deploying Jaeger-operator with Chainguard's images is straightforward using the official jaeger-operator Helm chart.

First, add the Jaeger-operator  Helm repository:

```bash
$ helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
```
Deploy Jaeger-operator using helm:

```bash
helm install initial-release jaegertracing/jaeger-operator -n observability \
  --set image.repository=cgr.dev/chainguard/jaeger-operator \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sqlite3

# sqlite3
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sqlite3` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sqlite3/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
At the time of writing, there is no official upstream container image for
`sqlite3` for like-for-like comparison.

The Chainguard Container includes both the SQLite database engine and the `sqlite3`
command-line interface. It runs as a non-root user (`uid: 65532`) and uses the
following entrypoint: `/usr/bin/sqlite3`.

## Getting Started

Run the container with a local volume mount, and create a new `test.db`,
writing an example `users` table:

```bash
docker run --rm \
  -v $(pwd):/data -w /data \
  cgr.dev/ORGANIZATION/sqlite3:latest \
  test.db "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT);"
```

Run the container, leveraging the `test.db` from the local volume mount, and
write additional data:

```bash
docker run --rm \
  -v $(pwd):/data -w /data \
  -u $(id -u):$(id -g) \
  cgr.dev/ORGANIZATION/sqlite3:latest \
  test.db "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com');"
```

Query and return data:

```bash
docker run --rm \
  -v $(pwd):/data -w /data \
  -u $(id -u):$(id -g) \
  cgr.dev/ORGANIZATION/sqlite3:latest \
  test.db "SELECT * FROM users;"
```

Expected output:

```bash
1|Alice|alice@example.com
2|Bob|bob@example.com
3|Charlie|charlie@example.com
```

Launch an interactive shell: 

```bash
docker run --rm -it \
  -v $(pwd):/data -w /data \
  -u $(id -u):$(id -g) \
  cgr.dev/ORGANIZATION/sqlite3:latest \
  test.db
```

Expected output:

```bash
SQLite version 3.49.1 2025-02-18 13:38:58
Enter ".help" for usage hints.
sqlite>
```

## Documentation and Resources
- [SQLite official documentation](https://www.sqlite.org)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jdk-crac

# jdk-crac
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jdk-crac` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jdk-crac/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based OpenJDK image with [CRaC](https://openjdk.org/projects/crac/) support. Used for compiling Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## CRaC Application Example

This section outlines how you can build and run a Java application leveraging CRaC with the Chainguard JDK CRaC Image.

In this example, we'll be using the SpringBoot PetClinic application, with the docs provided [here](https://github.com/pushkarnk/springboot-petclinic-crac).

Start by cloning the source code for SpringBoot PetClinic:

```bash
git clone https://github.com/spring-projects/spring-petclinic && cd spring-petclinic
```

Now, edit the `pom.xml`, and add `org.crac` as a dep, under the dependencies section:

```xml
    <dependency>
      <groupId>org.crac</groupId>
      <artifactId>crac</artifactId>
      <version>1.4.0</version>
    </dependency>
```

Then create a multistage Dockerfile, copying the source you just cloned to the JDK CRaC image:

```dockerfile
FROM cgr.dev/ORGANIZATION/jdk-crac

COPY . /home/build/

RUN ./mvnw package

FROM cgr.dev/ORGANIZATION/jre-crac

COPY --from=0 /home/build/target/spring-petclinic-3.3.0-SNAPSHOT.jar /app/

CMD ["-XX:CRaCMinPid=70000", "-XX:CRaCCheckpointTo=/app/checkpoint", "-jar", "/app/spring-petclinic-3.3.0-SNAPSHOT.jar"]
```

In this example, we've set a high minimum PID as, by default, the process will run with PID 1. We must set the minimum PID as it will
conflict with the PID of the process used for restore later. It's also generally a good practice as lower PIDs are typically allocated
for other system processes and they must not clash on restore.

Following that, you can build the image:

```bash
docker build -t petclinic .
```

Note that this example tags the image with `petclinic`. You can now run the image by referencing this tag, as in the following command:

```bash
docker run --privileged -v ./checkpoint:/app/checkpoint --name petclinic-before petclinic
```

Wait until we see that it has `started on port 8080`.

Open a new terminal, and take a checkpoint:

```bash
docker exec petclinic-before jcmd spring-petclinic JDK.checkpoint
```

On moving back to the original terminal, you'll see the container has stopped. Let's resume the program from the checkpoint:

```bash
docker run --privileged -v ./checkpoint:/app/checkpoint --name petclinic-after petclinic -XX:CRaCRestoreFrom=/app/checkpoint
```

The program should have successfully restored from the checkpoint!:

```bash
2024-10-31T13:29:52.236Z  INFO 70473 --- [Attach Listener] o.s.c.support.DefaultLifecycleProcessor  : Restarting Spring-managed lifecycle beans after JVM restore
2024-10-31T13:29:52.258Z  INFO 70473 --- [Attach Listener] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-10-31T13:29:52.268Z  INFO 70473 --- [Attach Listener] o.s.c.support.DefaultLifecycleProcessor  : Spring-managed lifecycle restart completed (restored JVM running for 211 ms)
```

## Differences between our JDK and JDK CRaC images

### JDK CRaC includes CRaC CRIU

CRaC CRIU allows you to restore you Java programs using the CRaC API quickly with fewer resources.

### JDK CRaC runs as root by default

To facilitate an easier workflow for performing checkpoints/restores, the image runs as root by default. It is not possible to leverage CRaC at runtime as non-root.

If you need to use a non-root user, specify `java` via the `USER` directive in the Dockerfile.

### JDK CRaC disables rseq

Running with rseq enabled breaks restores leveraging CRaC:

```bash
pie: 70001: Error (criu/pie/restorer.c:467): failed sys_rseq(0x7f453767a4a0, 0x20, 0x0, 0x53053053) = -22
pie: 70001: Error (criu/pie/restorer.c:2055): Restorer fail 70001
Error (criu/cr-restore.c:2605): Restoring FAILED
```

If you need to re-enable rseq, pass `GLIBC_TUNABLES=glibc.pthread.rseq=1` to the `ENV` directive in the Dockerfile.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-exporter-iamguarded

# memcached-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A memcached exporter for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Memcached Exporter IAMGuarded is the Prometheus metrics exporter component of the Memcached IAMGuarded deployment. This security-enhanced variant is designed to be deployed as part of the Memcached IAMGuarded Helm chart, providing observability for your Memcached instances with additional security benefits.

## Helm Chart Installation

The Memcached Exporter IAMGuarded image is deployed as part of the Memcached IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached \
  --set "global.org=$ORGANIZATION" \
  --set "metrics.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization. Note that metrics are disabled by default and must be explicitly enabled.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Memcached image
image:
  registry: myregistry.example.com
  repository: mirrored/memcached-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter (this image)
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/memcached-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "metrics.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/memcached:1.6.38
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment with metrics enabled, validate your Memcached Exporter IAMGuarded installation by checking that metrics are exposed on the configured port (default: 9150). The exporter provides standard Prometheus metrics for monitoring your Memcached instances.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Memcached Exporter IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both Memcached and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-otel-collector

# aws-otel-collector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-otel-collector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-otel-collector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Distribution of OpenTelemetry Collector for sending data from EKS clusters to AWS monitoring services like CloudWatch and X-Ray.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `aws-otel-collector` image is designed to be a drop-in
replacement for the upstream [AWS OpenTelemetry Collector image](https://hub.docker.com/r/amazon/aws-otel-collector).

## Prerequisites

- Authenticated with AWS EKS cluster
- IAM role with permissions for the AWS services you plan to use

Below is an example using eksctl to create an IAM service account with the 
necessary permissions for CloudWatch and X-Ray integration:

```bash
kubectl create namespace otel-system
eksctl create iamserviceaccount \
    --name aws-otel-collector \
    --namespace otel-system \
    --cluster MY-CLUSTER-NAME \
    --region MY-AWS-REGION \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
    --approve
```
- For detailed IAM permission requirements, see the [AWS Distro for OpenTelemetry permissions documentation](https://aws-otel.github.io/docs/setup/permissions)

## Getting Started

### Install with Helm

The recommended method for deploying the `aws-otel-collector` with the
Chainguard image is using the official ADOT Helm chart. This example
demonstrates deployment:

```bash
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/aws-otel-collector
  tag: latest

clusterName: MY-CLUSTER-NAME

serviceAccount:
    create: false
    name: aws-otel-collector
EOF
```

Deploy the collector:

```bash
# Add the Helm repository
helm repo add snowplow-devops https://snowplow-devops.github.io/helm-charts
helm repo update

# Install the chart
helm install aws-otel-collector snowplow-devops/aws-otel-collector \
    --namespace otel-system \
    -f values.yaml
```

Once installation completes, validate aws-otel-collector is running:

```bash
kubectl get pods -n otel-system
kubectl get daemonset -n otel-system
```

The collector will automatically start collecting cluster metrics and sending
them to CloudWatch Container Insights.

### Install as an EKS Add-on

EKS allows you to install the ADOT collector as an EKS add-on. For complete
instructions on how you can do this, refer to the [ADOT EKS add-on documentation](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on/installation).

If you've chosen this installation method, be aware that you cannot specify a
custom image while installing as an EKS add-on. You'll need to patch the
`aws-otel-collector` DaemonSet to use the Chainguard image, and this is a step
you'll need to repeat each time that you re-deploy or upgrade the version using
EKS add-ons.

## Documentation and Resources

- [AWS Distro for OpenTelemetry Documentation](https://aws-otel.github.io/docs/)
- [Container Insights Setup Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-EKS-quickstart.html)
- [ADOT Collector Configuration Reference](https://aws-otel.github.io/docs/components/otlp-exporter)
- [OpenTelemetry Collector Documentation](https://opentelemetry.io/docs/collector/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-functions-python-fips

# azure-functions-python-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-functions-python-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-functions-python-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for Python code projects. It extends the Azure platform with the capability to implement code triggered by many events occurring in Azure, on-premises or other 3rd party services.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream [azure-functions/python](https://hub.docker.com/r/microsoft/azure-functions-python) image with FIPS-validated cryptographic libraries.

Key differences from the standard azure-functions-python image:
- **FIPS Compliance**: Ships with validated redistribution of OpenSSL's FIPS provider module for environments requiring FIPS 140-3 compliance

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

These changes are intended to optimize app performance while maintaining FIPS compliance and keeping the image aligned with the latest platform capabilities.

Chainguard's Azure Functions Python FIPS image is smaller in size compared to the original image and has few-to-zero CVEs.

## Getting Started

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for code projects. The Azure Functions Python FIPS image offers support for writing and running Functions code in Python with FIPS-validated cryptographic libraries.

### Creating and running a minimal Function locally

This section outlines how you can run an Azure Function application locally with the Chainguard Azure Functions Python FIPS Image.

Start by creating a sample http triggered function named `HelloWolfi`:

```sh
mkdir HelloWolfi

cat > HelloWolfi/__init__.py <<EOL
import azure.functions as func
import logging

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello, {name}!")
    else:
        return func.HttpResponse(
            "Pass a name in the query string or request body.",
            status_code=200
        )
EOL

cat > HelloWolfi/function.json <<EOL
{
    "scriptFile": "__init__.py",
    "bindings": [
      {
        "authLevel": "anonymous",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": ["get", "post"]
      },
      {
        "type": "http",
        "direction": "out",
        "name": "\$return"
      }
    ]
}
EOL
```

Then, create the **host.json** metadata file which contains configuration options for all functions in a Function App. For more information about the this file check the [host.json reference](https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json). Make sure to use version 4 of Azure Functions Extension Bundles, since version 3 and 2 are not supported.

```sh
cat > host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Information"
      },
      "console": {
          "isEnabled": true,
          "DisableColors": true
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Following that, you can create a Dockerfile to copy your Function code to the Chainguard image and build the new image.

```sh
cat > Dockerfile <<EOL
FROM cgr.dev/ORGANIZATION/azure-functions-python-fips

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-python-fips-function .
```

You can now run the image locally with the following command:

```sh
docker run -p 8080:80 wolfi-python-fips-function
```

Now that the function launched properly, you can test it by making a request to the **/api/HelloWolfi** endpoint:

```sh
curl http://127.0.0.1:8080/api/HelloWolfi?name=Chainguard
```
```
Hello, Chainguard!
```

### Verifying FIPS Mode

You can test that FIPS mode is active with the following command:

```shell
docker run --rm cgr.dev/ORGANIZATION/azure-functions-python-fips -c "openssl-fips-test"
```

This uses Chainguard's [`openssl-fips-test` tool](https://github.com/chainguard-dev/openssl-fips-test) to test whether or not OpenSSL is properly configured to use its FIPS module:

```
Checking OpenSSL lifecycle assurance.
*** Running check: FIPS module is available...
    HMAC : (KAT_Integrity) : Pass
    SHA1 : (KAT_Digest) : Pass
    SHA2 : (KAT_Digest) : Pass
    [... additional validation tests ...]
*** Running check: EVP_default_properties_is_fips_enabled returns true... passed.
*** Running check: verify unapproved cryptographic routines are not available by default (e.g. MD5)... passed.

Lifecycle assurance satisfied.
```

### Creating and running a minimal Function in an Azure Function App

The most common use case for an Azure Functions image is deploying it within an Azure Function App. You can use the Chainguard Azure Functions Python FIPS image for this purpose.
The following example demonstrates how to deploy a queue-triggered function that responds to messages in an Azure Storage Queue by creating a copy of a file in Azure Blob Storage.

Start by creating the function and its metadata file:

```sh
mkdir BlobFunction

cat > BlobFunction/__init__.py <<EOL
import azure.functions as func
import logging

def main(myQueueItem: func.QueueMessage, myInputBlob: func.InputStream, myOutputBlob: func.Out[bytes]):
    logging.warning(f'Python Queue trigger function processed: {myQueueItem.get_body().decode()}')

    # Copy the input blob to the output blob
    blob_content = myInputBlob.read()
    myOutputBlob.set(blob_content)

    logging.info(f'Blob copied successfully')
EOL

cat > BlobFunction/function.json <<EOL
{
    "scriptFile": "__init__.py",
    "bindings": [
      {
        "queueName": "python-function-queue",
        "connection": "AzureWebJobsStorage",
        "name": "myQueueItem",
        "type": "queueTrigger",
        "direction": "in"
      },
      {
        "name": "myInputBlob",
        "type": "blob",
        "path": "python-test-workitems/{queueTrigger}",
        "connection": "AzureWebJobsStorage",
        "direction": "in"
      },
      {
        "name": "myOutputBlob",
        "type": "blob",
        "path": "python-test-workitems/{queueTrigger}-Copy",
        "connection": "AzureWebJobsStorage",
        "direction": "out"
      }
    ],
    "disabled": false
}
EOL

cat > host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Warning"
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Then, create a Dockerfile to copy the Function to the Chainguard image and built the image.

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/ORGANIZATION/azure-functions-python-fips

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-queue-fips-function .
```

Next, tag your image as needed and push it to your container registry by following [these steps](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#publish-the-container-image-to-a-registry).

Once the image is published, [provision the required Azure resources](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#create-supporting-azure-resources-for-your-function) and [configure your Function App](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-python#create-and-configure-a-function-app-on-azure-with-the-image) to use the container image.

After setup, create an **Azure Storage Queue** named `python-function-queue` and a **Blob Container** named `python-test-workitems` in your storage account. Upload a file to the container.

Ensure the Function App's managed identity has the correct roles assigned to the storage account:
- **Storage Queue Data Reader**
- **Storage Blob Data Contributor**

These roles allow the function to read from the queue and write to the blob container.

Restart the Function App to apply the updated configuration. Then, add a message to the queue containing the name of the uploaded file. Within a few seconds, the function should trigger and process the file, creating a copy in the designated container.

You can monitor execution logs in Azure Application Insights (note that logs may appear with a slight delay).

## Documentation and Resources

For more information about Azure Functions in container images, please refer to the [official documentation](https://learn.microsoft.com/en-us/azure/azure-functions/functions-container-apps-hosting).

For FIPS compliance information, consult the [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-camel-karavan-devmode

# apache-camel-karavan-devmode
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-camel-karavan-devmode` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-camel-karavan-devmode/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Development container for Apache Camel Karavan low-code integration platform.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Apache Camel Karavan is a low-code data integration platform that simplifies Apache Camel development through visual design and rapid deployment of integration microservices. The DevMode container provides an enhanced development environment with:

- **JBang Integration**: Run Apache Camel routes directly using JBang without complex setup
- **Enhanced Diagnostics**: Trace windows showing Exchange Body, Headers, Properties, and variables
- **Live Development**: Automatically monitors and reloads Camel routes from the `/karavan/code` directory
- **Maven & Java 21**: Pre-configured with Maven 3.9 and OpenJDK 21 for building integrations
- **Hot Reload**: Changes to route definitions are automatically detected and applied

This image is comparable to the upstream [Apache Camel Karavan DevMode image](https://github.com/apache/camel-karavan/pkgs/container/camel-karavan-devmode).

## Getting Started

### Running with Docker

The simplest way to start developing with Karavan DevMode is using Docker with a volume mount:

```bash
# Create a directory for your Camel routes
mkdir -p karavan-code

# Create a simple test route
cat > karavan-code/test-route.yaml <<'EOF'
- route:
    from:
      uri: "timer:tick?period=5000"
      steps:
        - log:
            message: "Hello from Karavan DevMode! Time: ${date:now:yyyy-MM-dd HH:mm:ss}"
EOF

# Run the container with your routes
docker run -d --name karavan-devmode \
  -v $(pwd)/karavan-code:/karavan/code:rw \
  -p 8080:8080 \
  cgr.dev/ORGANIZATION/apache-camel-karavan-devmode:latest

# View the logs to see your route running
docker logs -f karavan-devmode
```
### Deploying to Kubernetes

Deploy Karavan DevMode to Kubernetes using the upstream manifests:

```bash
# Clone the Karavan repository
git clone https://github.com/apache/camel-karavan.git
cd camel-karavan/docs/install/karavan-kubernetes

# Apply the base Karavan resources
kubectl apply -f secret.yaml -f service-account.yaml -f role.yaml -f role-binding.yaml -f service.yaml

# Set the devmode image to use Chainguard
yq eval ".spec.template.spec.containers[0].env += [{\"name\": \"KARAVAN_DEVMODE_IMAGE\", \"value\": \"cgr.dev/ORGANIZATION/apache-camel-karavan-devmode:latest\"}]" -i deployment.yaml

# Apply the deployment
kubectl apply -f deployment.yaml
```

Validate the deployment:

```bash
# Check pod status
kubectl get pods -l app=karavan

# View logs
kubectl logs -l app=karavan -f
```

## Container Configuration

The container is pre-configured with the following environment variables:

| Variable | Value | Description |
|----------|-------|-------------|
| `JAVA_HOME` | `/usr/lib/jvm/default-jvm` | Java installation directory |
| `MAVEN_HOME` | `/usr/share/java/maven` | Maven installation directory |
| `MAVEN_CONFIG` | `/karavan/.m2` | Maven settings directory |
| `JBANG_DIR` | `/karavan/.jbang` | JBang cache directory |
| `JBANG_REPO` | `/karavan/.m2` | JBang Maven repository |
| `CODE_DIR` | `/karavan/code` | Source code directory |
| `BUILDER_PATH` | `/karavan/builder` | Build output directory |

## Documentation and Resources

- [Apache Camel Karavan GitHub Repository](https://github.com/apache/camel-karavan)
- [Apache Camel Documentation](https://camel.apache.org/)
- [Karavan Project Page](https://camel.apache.org/categories/Karavan/)
- [JBang Documentation](https://www.jbang.dev/)
- [Apache Camel Components](https://camel.apache.org/components/latest/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rust

# rust
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rust` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rust/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based Rust image for building Rust applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

- [Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/reference/rust)
- [Provenance Information](https://edu.chainguard.dev/chainguard/chainguard-images/reference/rust/provenance_info/)

This image contains the tools needed to build Rust code.
This includes:

* `rustc`
* `cargo`
* `cargo-auditable` wrapper
* `rustdoc`
* `rustlldb`
* `rust-audit-info`
* And more!

This image also includes a shell for compatibility with most `cargo` package installations.
This image **is not** intended to be used as a runtime image, only as a build tool.

### Rust Version
This will automatically pull the image to your local system and execute the command `rustc --version`:

```shell
docker run --rm cgr.dev/chainguard/rust --version
```

You should get output similar to this:

```
rustc 1.67.1 (d5a82bbd2 2023-02-07) (built from a source tarball)
```

### Cargo Auditable

By default `/usr/local/bin/cargo` contains a wrapper to always call `cargo auditable` which generates and embeds build time crate information in the compiled binaries. This enables inspecting compiled rust binaries with `rust-audit-info` which is also included in this image. Many security scanners also know how to parse this information for the purpose of detecting security vulnerabilities. For more information see [Cargo Auditable](https://github.com/rust-secure-code/cargo-auditable?tab=readme-ov-file#cargo-auditable) project.

Building without audit information is possible by invoking `/usr/bin/cargo` directly, however doing that will evade scanner support in the resulting binaries.

## Application Setup for End Users

For runtime, you can use a multi-stage Dockerfile or similar technique to run your compiled binaries on
an even more slimmed down image.
The exact image will depend on your application, but `static` or `glibc-dynamic` should work.

This sample Dockerfile shows how to get a basic build up and running on `glibc-dynamic`.
There's one build argument, `PACKAGE`, that needs to be replaced with the name of your rust package.

```Dockerfile
ARG PACKAGE=myapp

FROM cgr.dev/chainguard/rust as build
WORKDIR /app
COPY . .
RUN cargo build --release

FROM cgr.dev/chainguard/glibc-dynamic
COPY --from=build --chown=nonroot:nonroot /app/target/release/${PACKAGE} /usr/local/bin/${PACKAGE}
CMD ["/usr/local/bin/${PACKAGE}"]
```

```shell
$ docker build -t foo --build-arg PACKAGE=shop .
[+] Building 74.4s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                         0.0s
 => => transferring dockerfile: 291B                                                                                                                                                                                                         0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                            0.0s
 => => transferring context: 2B                                                                                                                                                                                                              0.0s
 => [internal] load metadata for cgr.dev/chainguard/glibc-dynamic:latest                                                                                                                                                                                0.0s
 => [internal] load metadata for cgr.dev/chainguard/rust:latest                                                                                                                                                                              0.0s
 => [internal] load build context                                                                                                                                                                                                            0.0s
 => => transferring context: 6.21kB                                                                                                                                                                                                          0.0s
 => [stage-1 1/2] FROM cgr.dev/chainguard/glibc-dynamic                                                                                                                                                                                                 0.0s
 => [build 1/4] FROM cgr.dev/chainguard/rust                                                                                                                                                                                                 0.0s
 => CACHED [build 2/4] WORKDIR /app                                                                                                                                                                                                          0.0s
 => [build 3/4] COPY . .                                                                                                                                                                                                                     0.0s
 => [build 4/4] RUN cargo build --release                                                                                                                                                                                                   73.9s
 => [stage-1 2/2] COPY --from=build --chown=nonroot:nonroot /app/target/release/shop /usr/local/bin/shop                                                                                                                                     0.1s
 => exporting to image                                                                                                                                                                                                                       0.1s
 => => exporting layers                                                                                                                                                                                                                      0.0s
 => => writing image sha256:cf84a39643bc196611fa01819a91d31e34da74128499db74b75e1da3faa77bae                                                                                                                                                 0.0s
 => => naming to docker.io/library/foo                                                                                                                                                                                                       0.0s
dlorenc@DANIELs-MacBook-Air rust-web-app % docker run foo /usr/local/bin/shop
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"shop::api","@m":"starting up"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"🔧 Configured for release."}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"address: \u001b[1;49;39m127.0.0.1\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"port: \u001b[1;49;39m8000\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"workers: \u001b[1;49;39m8\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"ident: \u001b[1;49;39mRocket\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"limits: \u001b[1;49;39mbytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 1MiB, msgpack = 1MiB, string = 8KiB\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"temp dir: \u001b[1;49;39m/tmp\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"http/2: \u001b[1;49;39mtrue\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"keep-alive: \u001b[1;49;39m5\u001b[0m\u001b[1;49;39ms\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"tls: \u001b[1;49;39mdisabled\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"shutdown: \u001b[1;49;39mctrlc = true, force = true, signals = [SIGTERM], grace = 2s, mercy = 3s\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"log level: \u001b[1;49;39mcritical\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::config::config","@m":"cli colors: \u001b[1;49;39mtrue\u001b[0m"}
{"@t":"2022-12-30T15:27:10Z","@l":"INFO","module_path":"rocket::rocket","@m":"📬 \u001b[35mRoutes\u001b[0m:"}
```

If you're interested in enterprise support, SLAs, and access to older tags, [get in touch](https://www.chainguard.dev/chainguard-images).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4461

# request-4461
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4461` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4461/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This Chainguard python-custom image includes the official Python base packages along with specialized libraries optimized for applications requiring secure XML handling and rich text rendering:

- libxslt: Provides XSLT processing capabilities.
- xmlsec: Essential for secure XML processing and digital signature verification.
- pango: Enables rich text rendering for graphical operations.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-privateca-issuer-fips

# aws-privateca-issuer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-privateca-issuer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-privateca-issuer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

AWS Private CA is an AWS service that can setup and manage private CAs, as well as issue private certificates. `cert-manager` is a Kubernetes add-on to automate the management and issuance of TLS certificates from various issuing sources. It will ensure certificates are valid, updated periodically and attempt to renew certificates at an appropriate time before expiry. This project acts as an addon (see https://cert-manager.io/docs/configuration/external/) to cert-manager that signs off certificate requests using AWS Private CA.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

AWS Private CA is an AWS service that can setup and manage private CAs, as well as issue private certificates.
`cert-manager` is a Kubernetes add-on to automate the management and issuance of TLS certificates from various issuing sources. It will ensure certificates are valid, updated periodically and attempt to renew certificates at an appropriate time before expiry.
This project acts as an addon (see https://cert-manager.io/docs/configuration/external/) to cert-manager that signs off certificate requests using AWS Private CA.

## Prerequisites

* A Kubernetes cluster preferably eks.
* Helm installed.
* AWS CLI configured with access to your AWS account.
* An AWS Private CA created and activated.
* Installing cert-manager

## Installation
For installation instructions, visit the [Amazon VPC CNI Install Guide](https://github.com/aws/amazon-vpc-cni-k8s?tab=readme-ov-file#setup).

## Installation using Helm chart

### Install cert-manager first
```shell
helm repo add jetstack https://charts.jetstack.io
helm repo update

helm install cert-manager jetstack/cert-manager \
     --namespace cert-manager \
     --create-namespace \
     --set installCRDs=true
```

### Install AWS PCA Issuer with Chainguard image

```shell
helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer
helm install awspca/aws-privateca-issuer --generate-name \
--set image.repository=cgr.dev/chainguard/aws-privateca-issuer-fips \
--set image.tag=latest
```

### Create IAM Policy and Role:

Ensure your EKS worker nodes or Kubernetes environment have the necessary IAM policies attached for accessing AWS PCA. Policies required typically include:

* `acm-pca:IssueCertificate`
* `acm-pca:GetCertificate`
* `acm-pca:DescribeCertificateAuthority`

A minimal policy to use the issuer with an authority would look like follows:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "awspcaissuer",
      "Action": [
        "acm-pca:DescribeCertificateAuthority",
        "acm-pca:GetCertificate",
        "acm-pca:IssueCertificate"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:acm-pca:<region>:<account_id>:certificate-authority/<resource_id>"
    }
  ]
}
```

### Create an `AWSPCACIssuer` to integrate with AWS PCA:

```yaml
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAIssuer
metadata:
  name: demo-awspcs-issuer
spec:
  arn: "arn:aws:acm-pca:<region>:<account_id>:certificate-authority/<CA_ID>"
  region: "<aws-region>"
```

Then, `kubectl apply -f AWSPCAIssuer.yaml`

### Verify AWSPCAIssuer installed correctly:
   
Do `kubectl describe AWSPCAIssuer`

Check the Events section and you must see the message Issuer verified if everything goes correct:

 ```bash
 Normal  Verified  46s (x2 over 46s)  awspcaissuer-controller  Issuer verified
 ```

### Create Certificate 

Create CRD Certificate with name rsa-cert-2048 for dns name rsa-2048.example.com >> Certificate.yaml For th formats other than 2048 check the examples

```yaml
---
kind: Certificate
apiVersion: cert-manager.io/v1
metadata:
  name: rsa-cert-2048
spec:
  commonName: www.rsa-2048.example.com
  dnsNames:
    - www.rsa-2048.example.com
    - rsa-2048.example.com
  duration: 2160h0m0s
  issuerRef:
    group: awspca.cert-manager.io
    kind: AWSPCAIssuer
    name: demo-awspcs-issuer
  renewBefore: 360h0m0s
  secretName: rsa-example-cert-2048
  usages:
    - server auth
    - client auth
  privateKey:
    algorithm: "RSA"
    size: 2048
---
```

Then Apply the yaml file
```bash
kubectl apply -f Certificate.yaml
```

### Verify Certificate is installed correctly

```bash
kubectl  get Certificates
```

It should output Ready as True as shown below
```bash
  NAME            READY   SECRET                  AGE
  rsa-cert-2048   True    rsa-example-cert-2048   31s
```

Please use kubectl get events for debugging.

```bash
kubectl get events  
Sample Output for Successful Certificate Request
  5s          Normal   cert-manager.io   certificaterequest/rsa-cert-2048.io-zqftp   Certificate request has been approved by cert-manager.io
  2s          Normal   Issued            certificaterequest/rsa-cert-2048.io-zqftp   certificate issued
  5s          Normal   Issuing           certificate/rsa-cert-2048                Issuing certificate as Secret does not exist
  5s          Normal   Generated         certificate/rsa-cert-2048               Stored new private key in temporary Secret resource "rsa-cert-2048-k7zxv"
  5s          Normal   Requested         certificate/rsa-cert-2048                Created new CertificateRequest resource "rsa-cert-2048-zqftp"
  2s          Normal   Issuing           certificate/rsa-cert-2048                The certificate has been successfully issued
  8m22s       Normal   Verified          awspcaissuer/rsa-cert-2048               Issuer verified
  85s         Normal   Verified          awspcaissuer/rsa-cert-2048               Issuer verified
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wso2is

# wso2is
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wso2is` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wso2is/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

WSO2 Identity Server is a powerful, modern identity and access management solution for your on-premises or cloud environment

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [wso2is/wso2is](https://hub.docker.com/r/wso2/wso2is) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

There are several ways to deploy the WSO2 Identity Server (IS) but in this example we will be using the official WSO2 IS Helm chart to deploy it on Kubernetes. The Helm chart is available in the [wso2is Helm repository](https://github.com/wso2/kubernetes-is).

To get started, create the `values.yaml` file with the following content:

```yaml
deployment:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/wso2is # Replace ORGANIZATION with your organization's name
    tag: latest
```

Then, install the WSO2 IS Helm chart using the following command:

```bash
helm repo add wso2  https://helm.wso2.com
helm install wso2is wso2/identity-server \
  --namespace wso2is --create-namespace \
  --values values.yaml
```

This will deploy the WSO2 Identity Server with the Chainguard container image. Access will depend on how ingress is configured in your cluster. Here's a quick example to validate the service's web UI via port forwarding:  

```bash
kubectl port-forward svc/wso2is-identity-server 9443:9443 -n wso2is
```

You can then access the WSO2 IS dashboard at `https://localhost:9443`.

You can learn more about the API management capabilities of WSO2 IS in the [WSO2 IS documentation](https://is.docs.wso2.com/en/latest/apis/).

## Documentation and Resources

* [wso2is Repository](https://github.com/wso2/product-is).
* [Deploy WSO2 Identity Server on Kubernetes using Helm](https://is.docs.wso2.com/en/latest/deploy/deploy-is-on-kubernetes/)
* [wso2is APIs Guide](https://is.docs.wso2.com/en/latest/apis/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chart-testing-fips

# chart-testing-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chart-testing-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chart-testing-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Tool for testing Helm charts, used for linting and testing pull requests.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This FIPS-compliant image is compatible with the upstream [chart-testing](https://quay.io/repository/helmpack/chart-testing) image. Switching to Chainguard `chart-testing-fips` image should not require any changes to your existing setup. 
The Chainguard `chart-testing-fips` image also comes with all necessary tools installed, which are FIPS-compliant too.
- `helm`
- `git`
- `yamllint`
- `yamale`
- `kubectl`

### Usage instructions

To run the `chart-testing-fips` image with Docker(`interactive-mode`), you can run the following command:

```shell
docker run -it cgr.dev/ORGANIZATION/chart-testing-fips
```
For `ct` usage instructions and how-to guide please refer to the [official usage instructions for chart-testing](https://github.com/helm/chart-testing?tab=readme-ov-file#usage)

## Documentation and Resources
For more information, please refer to [the official documentation for chart-testing project](https://github.com/helm/chart-testing) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-gcp-cloud-controller-manager-fips

# cloud-provider-gcp-cloud-controller-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-gcp-cloud-controller-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-gcp-cloud-controller-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes cloud controller manager for Google Cloud Platform (GCP), managing cloud-specific resources and integrations.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `cloud-provider-gcp-cloud-controller-manager-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Compatibility Notes

Chainguard's cloud-provider-gcp-cloud-controller-manager-fips image is compatible with the upstream [Cloud Provider GCP](https://github.com/kubernetes/cloud-provider-gcp) `cloud-controller-manager` image. This image contains only the minimum set of dependencies needed to run the Cloud Provider GCP Cloud Controller Manager.

## Usage

The GCP cloud controller manager is a Kubernetes controller that interfaces with Google Cloud Platform APIs to manage cloud-specific resources such as load balancers, persistent volumes, and node management.

You can use the `cloud-provider-gcp-cloud-controller-manager` as drop-in replacement for upstream image.

### Required Fields in `service-account.json`

Ensure your service account file contains the following fields:
`type`, `project_id`, `private_key_id`, `private_key`, `client_email`, `client_id`, `auth_uri`, `token_uri`.

### Create Configuration

```bash
kubectl create secret generic gcp-ccm-config \
  -n kube-system \
  --from-file=credentials.json=/path/to/service-account.json \
  --from-file=gce.conf=/path/to/gce.conf
```

### Deploy Cloud Controller Manager

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gcp-cloud-controller-manager
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gcp-ccm
  template:
    metadata:
      labels:
        app: gcp-ccm
    spec:
      containers:
        - name: cloud-controller-manager
          image: cgr.dev/ORGANIZATION/cloud-provider-gcp-cloud-controller-manager-fips
          command: ["/cloud-controller-manager"]
          args:
            - --cloud-provider=gce
            - --cloud-config=/etc/gcp/config/gce.conf
          env:
            - name: GOOGLE_APPLICATION_CREDENTIALS
              value: /etc/gcp/config/credentials.json
          volumeMounts:
            - name: gcp-config
              mountPath: /etc/gcp/config
              readOnly: true
      volumes:
        - name: gcp-config
          secret:
            secretName: gcp-ccm-config
```

```bash
kubectl apply -f gcp-cloud-controller-manager.yaml
```

### Test LoadBalancer Service

```yaml
apiVersion: v1
kind: Service
metadata:
  name: test-lb
spec:
  type: LoadBalancer
  selector:
    app: test-app
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
        - name: app
          image: nginx:alpine
          ports:
            - containerPort: 8080
```

```bash
kubectl apply -f test-lb-app.yaml
```

### Verify

```bash
kubectl get pods -n kube-system -l app=gcp-ccm
```

**Expected Output**:

```bash
NAME                                               READY   STATUS    RESTARTS   AGE
gcp-cloud-controller-manager-d6b768dd9-abcde       1/1     Running   0          2m
```

```bash
kubectl get svc test-lb
```

**Expected Output**:

```bash
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
test-lb   LoadBalancer   10.106.37.54   34.123.45.67    80:30190/TCP   3m
```

## Documentation and Resources

* [Upstream repository: https://github.com/kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp)
* [Kubernetes Cloud Controller Manager Documentation](https://kubernetes.io/docs/concepts/architecture/cloud-controller/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spiffe-helper

# spiffe-helper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spiffe-helper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spiffe-helper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A secure, minimal container image for the SPIFFE Helper utility that automates X.509 SVID certificate rotation for services that can't natively fetch X.509-SVIDs.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream SPIFFE Helper utility, which automates X.509 SVID certificate rotation for services that can't natively fetch X.509-SVIDs. While this image maintains functional parity with the upstream version, there are several key differences and enhancements.

For example, unlike the upstream version which uses distroless/static, this image is built on Wolfi, providing regular security updates and a minimal attack surface. Additionally, Chainguard's SPIFFE Helmer image runs as a non-root user by default, maintains compatibility with standard SPIFFE workload API socket locations, and is fully compatible with existing spiffe-helper configuration files.

## Getting Started

The SPIFFE Helper is designed to automate X.509-SVID certificate rotation for services. This guide demonstrates how to use the Chainguard SPIFFE-helper image with MySQL and SPIRE for secure TLS certificate management.

Start by cloning the Repository:

```shell
git clone https://github.com/spiffe/helm-charts-hardened.git
cd helm-charts-hardened/examples/mysql-using-spire
```

Then install SPIRE and its CRDs:

```shell
helm upgrade --install -n spire-server spire-crds spire-crds \
  --repo https://spiffe.github.io/helm-charts-hardened/ \
  --create-namespace --version 0.3.0

helm upgrade --install -n spire-server spire spire \
  --repo https://spiffe.github.io/helm-charts-hardened/ \
  --version 0.17.1 -f spire-values.yaml
```

Next, deploy the MySQL client:

```shell
kubectl apply -f mysqlclient-configmap.yaml
kubectl apply -f mysqlclient-statefulset.yaml
```

Wait for the client to be ready
```shell
kubectl wait pod mysqlclient-0 --for=condition=ready --timeout=60s
```

Retrieve the client's certificate `x500UniqueIdentifier` identifier:

```shell
# Run, and get the x500UniqueIdentifier value:
kubectl exec -it mysqlclient-0 -c main -- bash -c 'openssl x509 -in /certs/tls.crt -noout -text | grep Subject:'
```

Additionally, update the `x500UniqueIdentifier` in `custom-mysql-values.yaml` and replace the default `ghcr.io/spiffe/spiffe-helper` image with the Chainguard image:

```shell
cat > custom-mysql-values.yaml <<EOF
initdbScripts:
  usertls.sql: |
    CREATE USER 'mysqlclient'@'%' REQUIRE SUBJECT '/C=US/O=SPIRE/CN=mysqlclient.default.svc.cluster.local/x500UniqueIdentifier=a753b06724b81d4a2f14f615d40550ed';
    GRANT ALL PRIVILEGES ON *.* TO 'mysqlclient'@'%' WITH GRANT OPTION;

primary:
  extraFlags: "--ssl-ca=/certs/ca.pem --ssl-cert=/certs/tls.crt --ssl-key=/certs/tls.key --require-secure-transport=ON"

  initContainers: |
    - name: setup-helper-volume-p1
      image: busybox:1.36.1-uclibc
      imagePullPolicy: IfNotPresent
      command:
      - sh
      - -c
      - 'cp -a /bin/busybox /helper'
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-helper
        mountPath: /helper
    - name: setup-helper-volume-p2
      image: cgr.dev/chainguard/spiffe-helper:latest
      imagePullPolicy: IfNotPresent
      command:
      - /helper/busybox
      - sh
      - -c
      - '/helper/busybox cp -a /spiffe-helper /helper && /helper/busybox rm -f /helper/busybox'
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-helper
        mountPath: /helper
    - name: init-tls
      image: cgr.dev/chainguard/spiffe-helper:latest
      imagePullPolicy: Always
      command:
      - /spiffe-helper
      - -config
      - /etc/spiffe-helper.conf
      - -daemon-mode=false
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-workload-api
        mountPath: /spiffe-workload-api
        readOnly: true
      - name: spiffe-helper-configmap
        mountPath: /etc/spiffe-helper.conf
        subPath: spiffe-helper.conf
        readOnly: true
      - name: certdir
        mountPath: /certs

  sidecars: |
    - name: refresh-tls
      image: {{  include "mysql.image" . }}
      imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
      command:
      - /helper/spiffe-helper
      - -config
      - /etc/spiffe-helper.conf
      env:
      - name: MYSQL_PWD
        valueFrom:
          secretKeyRef:
            name: {{ template "mysql.secretName" . }}
            key: mysql-root-password
      securityContext: {{- omit .Values.primary.containerSecurityContext "enabled" | toYaml | nindent 8 }}
      volumeMounts:
      - name: spiffe-workload-api
        mountPath: /spiffe-workload-api
        readOnly: true
      - name: spiffe-helper-configmap
        mountPath: /etc/spiffe-helper.conf
        subPath: spiffe-helper.conf
        readOnly: true
      - name: certdir
        mountPath: /certs
      - name: spiffe-helper
        mountPath: /helper
      - name: mysql-sockdir
        mountPath: /opt/bitnami/mysql/tmp

  extraVolumeMounts:
  - name: certdir
    mountPath: /certs
  - name: mysql-sockdir
    mountPath: /opt/bitnami/mysql/tmp

  extraVolumes: |
    - name: certdir
      emptyDir: {}
    - name: spiffe-helper
      emptyDir: {}
    - name: mysql-sockdir
      emptyDir: {}
    - name: spiffe-helper-configmap
      configMap:
        name: {{ include "mysql.primary.fullname" . }}-spiffe-helper
    - name: spiffe-workload-api
      csi:
        driver: "csi.spiffe.io"
        readOnly: true
EOF
```

Following that, deploy MySQL with the above configuration:

```shell
helm upgrade --install mysql mysql \
  --version 9.15.0 \
  --repo https://charts.bitnami.com/bitnami \
  -f custom-mysql-values.yaml
```

Wait for MySQL to be ready

```shell
kubectl wait pod mysql-0 --for=condition=ready --timeout=60s
```

Now that it's running, you can test the connection:

```shell
kubectl exec -it mysqlclient-0 -- bash -c \
  'mysql -u mysqlclient --protocol tcp \
   --ssl-key /certs/tls.key \
   --ssl-cert /certs/tls.crt \
   --ssl-ca /certs/ca.pem \
   -h mysql.default.svc.cluster.local'
```

If everything is working as expected, the `mysql>` prompt will appear in your terminal:

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

## Documentation and Resources:

 - [SPIFFE helper Github Repository](https://github.com/spiffe/spiffe-helper)
 - [Official SPIFFE Documentation](https://spiffe.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nats-box

# nats-box
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nats-box` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nats-box/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A lightweight container with NATS utilities.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [nats-box](https://hub.docker.com/r/natsio/nats-box) image. Switching to Chainguard nats-box image should not require any changes to your existing setup. 
The default image is based on the `nonroot` variant. For use cases that require elevated privileges, the upstream `root` variant is also available and can be used by selecting the image with the `-root` suffix.

## Getting Started

The Chainguard Nats-box includes `nats` cli, `nsc` and `nats-top` tools.

### Docker

To run the nats-box image with Docker(interactive-mode), you can run the following command:

```shell
docker run -it cgr.dev/ORGANIZATION/nats-box
```

This will return output similar to the following:

```
             _             _               
 _ __   __ _| |_ ___      | |__   _____  __
| '_ \ / _` | __/ __|_____| '_ \ / _ \ \/ /
| | | | (_| | |_\__ \_____| |_) | (_) >  < 
|_| |_|\__,_|\__|___/     |_.__/ \___/_/\_\
                                           
nats-box v0.16.0
~ #
```

### Helm

To deploy nats-box on your Kubernetes cluster using Chainguard's nats-box image, you can use the upstream chart's [Helm repository](https://nats-io.github.io/k8s/helm/charts/).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
natsBox:
  enabled: true
  container:
    image:
      repository: ORGANIZATION/nats-box
      tag: latest # use '-root' suffix for root variant
      registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for nats-box project](https://github.com/nats-io/nats-box/blob/main/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thingsboard

# thingsboard
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thingsboard` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thingsboard/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Thingsboard images are built directly from the [Thingsboard Project](https://github.com/thingsboard/thingsboard.git). The Chainguard Thingsboard images has few-to-zero CVEs and runs as the thingsboard user.

## Getting Started

You can deploy ThingsBoard using the [ThingsBoard Community Edition Helm Chart](https://github.com/midokura/thingsboard-ce-k8s), maintained by Midokura.

1. **Launch your preferred PostgreSQL database** (either external or via another Helm chart).
2. **Configure ThingsBoard** using a `values.yaml` file like the example below.
3. **Install the Helm chart** using the configured values.

```yaml
global:
  image:
    server: cgr.dev/ORGANIZATION
    tag: latest

fullnameOverride: tb

node:
  image:
    repository: thingsboard-node

jsexecutor:
  image:
    repository: thingsboard-js-executor

mqtt:
  image:
    repository: thingsboard-mqtt

ingress:
  enabled: false

postgresql-ha:
  enabled: false

postgresqlExternal:
  hostname: postgresql
  database: thingsboard_db
  username: thingsboard_user
  password: changeme

webui:
  image:
    repository: thingsboard-web-ui
```

## Additional Documentation
[Official Thingsboard Documentation](https://thingsboard.io/docs/)
[Thingsboard helm chart](https://github.com/midokura/thingsboard-ce-k8s)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mailpit-fips

# mailpit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mailpit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mailpit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Mailpit is an email and SMTP testing tool with API for developers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `REPO_NAME` Chainguard Container is a drop-in replacement for the [upstream Mailpit image](https://hub.docker.com/r/axllent/mailpit). It provides the same functionality with the following differences:

* Runs as a non-root user by default
* FIPS-validated cryptographic modules for regulated environments

## FIPS Compliance

This image is built with FIPS-validated cryptographic modules to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Getting Started

You can run Mailpit directly with Docker:

```sh
docker run -d \
  -p 8025:8025 \
  -p 1025:1025 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

This starts Mailpit with the web UI accessible at http://localhost:8025 and the SMTP server listening on port 1025.

### Deploying with Helm

You can deploy Mailpit to Kubernetes using the [jouve Helm Chart](https://github.com/jouve/charts/tree/main/charts/mailpit).

First, create a `values.yaml` file to configure the Chainguard Container:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/REPO_NAME
  tag: latest
```

Then deploy the Helm chart:

```sh
helm repo add jouve https://jouve.github.io/charts/
helm install mailpit jouve/mailpit -f values.yaml
```

### Sending a Test Email

Once Mailpit is running, you can send a test email. These instructions are based on the [upstream documentation](https://mailpit.axllent.org/docs/install/testing/).

Create a file called `email.txt` with the following contents:

```sh
cat > email.txt <<EOF
From: sender@example.com
To: recipient@example.com
Subject: Email Subject

This is the body of the email.
It can contain multiple lines of text.
EOF
```

If using Kubernetes, port forward the services:

```sh
kubectl port-forward svc/mailpit-http 8025:80 &
kubectl port-forward svc/mailpit-smtp 1025:25 &
```

Send the email using the Mailpit sendmail command:

```sh
mailpit sendmail < email.txt
```

Navigate to http://localhost:8025 to view the email in the Mailpit web interface.

## Documentation and Resources

* [Mailpit Official Documentation](https://mailpit.axllent.org/docs/)
* [Mailpit GitHub Repository](https://github.com/axllent/mailpit)
* [Chainguard Academy](https://edu.chainguard.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### copybara-fips

# copybara-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/copybara-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/copybara-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Copybara image for transforming and moving code between repositories, enabling code synchronization workflows between different version control systems with FIPS 140-2/140-3 validated cryptography.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Copybara FIPS image is designed to be compatible with the [upstream Google Copybara](https://github.com/google/copybara) project. Key compatibility details:

- **Java Runtime**: Uses OpenJDK 21 with FIPS-enabled BouncyCastle provider
- **Git**: Includes Git for repository operations
- **Mercurial**: Includes Python-based Mercurial for Hg repository support
- **Build Tools**: Includes FIPS-enabled Buildifier and Buildozer for Bazel/Starlark file formatting

### FIPS Support

The `copybara-fips` Chainguard Container Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Copybara is a tool for transforming and moving code between repositories. It's commonly used for:

- Synchronizing code between internal and external repositories
- Moving code between different version control systems
- Maintaining forks with custom modifications

### Running Copybara

The image uses the following defaults:
- **Entrypoint**: `/usr/local/bin/copybara`
- **Command**: `migrate copy.bara.sky`
- **Working Directory**: `/usr/src/app`

To run Copybara with a custom configuration:

```bash
docker run --rm -v $(pwd):/usr/src/app \
  cgr.dev/ORGANIZATION/copybara-fips:latest \
  migrate copy.bara.sky
```

### Basic Configuration Example

Create a `copy.bara.sky` file defining your workflow:

```python
core.workflow(
    name = "default",
    origin = git.origin(
        url = "https://github.com/example/source-repo.git",
        ref = "main",
    ),
    destination = git.destination(
        url = "https://github.com/example/destination-repo.git",
        fetch = "main",
        push = "main",
    ),
    authoring = authoring.pass_thru("Copybara <copybara@example.com>"),
    origin_files = glob(["**"]),
)
```

### Validating Configuration

Before running a migration, validate your configuration:

```bash
docker run --rm -v $(pwd):/usr/src/app \
  --entrypoint /usr/local/bin/copybara \
  cgr.dev/ORGANIZATION/copybara-fips:latest \
  validate copy.bara.sky
```

## Documentation and Resources

- [Google Copybara GitHub Repository](https://github.com/google/copybara)
- [Copybara Reference Documentation](https://github.com/google/copybara/blob/master/docs/reference.md)
- [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [Moving Code Between Git Repositories with Copybara (Kubesimplify)](https://blog.kubesimplify.com/moving-code-between-git-repositories-with-copybara)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### knative-operator

# knative-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/knative-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/knative-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Combined operator for Knative.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The official Knative Operator image includes multiple components, including `operator` and  `webhook`. The Chainguard Operator Image provides images for the `operator` and `webhook` components of the Knative Operator, which are comparable to the [Knative Operator Image from Google Container Registry](https://console.cloud.google.com/gcr/images/knative-releases/global/knative.dev/operator). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

## Getting Started

The Knative Operator image of Chainguard provides the following images for each of the component of Knative Operator:

- cgr.dev/ORGANIZATION/knative-operator:latest
- cgr.dev/ORGANIZATION/knative-operator-webhook:latest

To get started with the Knative Operator, you can use the following Helm chart to install the Knative Operator on your Kubernetes cluster.

You can use the following values.yaml file to install the Knative Operator using Helm basically:

```bash
cat <<EOF > knative-operator-values.yaml
knative_operator:
  knative_operator:
    image: cgr.dev/ORGANIZATION/knative-operator
    tag: latest
  operator_webhook:
    image: cgr.dev/ORGANIZATION/knative-operator-webhook
    tag: latest
EOF
```

then run the following command:

```bash
helm repo add knative-operator https://knative.github.io/operator
helm install knative-operator knative-operator/knative-operator -f knative-operator-values.yaml
```

This will install the Knative Operator on your Kubernetes cluster.

After the installation, you can check the status of the Knative Operator by running the following command:

```bash
kubectl get pods -n knative-operator
```

Once the Knative Operator is up and running, you can start using it to install Knative components on your Kubernetes cluster like Knative Serving, Knative Eventing, and Knative Monitoring.

For example to install Knative Serving, you can use the following command:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: knative-serving
---
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
EOF
```

> **NOTE**: If you would like to do some customizations to the Knative Serving installation, you can refer to the [Knative Serving documentation](https://knative.dev/docs/install/operator/configuring-serving-cr/).

After a few seconds, you can check the status of the Knative Serving by running the following command:

```bash
bash-5.2# kubectl get knativeservings -n knative-serving
NAME              VERSION             READY   REASON
knative-serving   <version number>    True
bash-5.2#
```

## Documentation and Resources

- [Installing Knative components with Knative Operator](https://knative.dev/docs/install/operator/knative-with-operators/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### authservice

# authservice
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/authservice` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/authservice/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Move OIDC token acquisition out of your app code and into the Istio mesh

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are different ways to use the `authservice` image. You can try to run the image with the following docker-compose file:

```yaml
version: "3.9"

services:
  envoy:
    image: cgr.dev/chainguard/envoy:latest
    command: -c /etc/envoy/envoy-config.yaml --log-level warning
    ports:
      - "8080:80"
    volumes:
      - type: bind
        source: envoy-config.yaml
        target: /etc/envoy/envoy-config.yaml

  ext-authz:
    image: cgr.dev/chainguard-private/authservice:latest
    volumes:
      - type: bind
        source: authz-config.json
        target: /etc/authservice/config.json
```

> **Note**: You need to create the `envoy-config.yaml` and `authz-config.json` files in the same directory as the `docker-compose.yaml` file. You could find the contents of the files in the [GitHub repository](https://github.com/istio-ecosystem/authservice/tree/main/e2e/mock).

Then you should start the services:

```bash

docker-compose up -d
```

Once your services are up and running, you can access the `authservice` service by sending a request to the `envoy` service. The `envoy` service will forward the request to the `authservice` service.

```bash
curl http://localhost:8080
```

You should see the response from the `authservice` service:

```bash
Access allowed
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### electric

# electric
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/electric` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/electric/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Real-time sync for Postgres.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard image is comparable to the upstream [electricsql/electric](https://hub.docker.com/r/electricsql/electric) image. Chainguard's container contains only the minimum set of dependencies needed to run electricsql.  

## Getting Started

The [official Quickstart documentation](https://electric-sql.com/docs/quickstart) outlines how to run the electric image.

To get started with electric, you can use the [docker-compose.yaml](https://github.com/electric-sql/electric/blob/main/website/public/docker-compose.yaml) file provided in the [Electric GitHub repository](https://github.com/electric-sql/electric). This file contains the necessary configuration to run electric in a Docker environment.

To run electric Cluster using Docker Compose, follow these steps:

1. **Modify the compose manifest to use Chainguard's image:**:
```bash
services:
  electric:
    image: cgr.dev/ORGANIZATION/electric:latest
```

2. **Run Docker Compose**:
```bash
docker-compose up -d
```

3. **Now you can use [HTTP API](https://electric-sql.com/docs/quickstart#http-api) to interact with the electric**. But first you need to create a table and insert some data. You can do this by running the following command:
```bash
psql "postgresql://postgres:password@localhost:54321/electric"
```

**Then create a scores table**
```sql
CREATE TABLE scores (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255),
  value FLOAT
);
```

***Insert some data into the scores table**
```sql
INSERT INTO scores (name, value) VALUES
('Alice', 10.0),
('Bob', 20.0),
('Charlie', 30.0),
('David', 1.414),
('Eve', 0);
```

***Now you can query the scores table using the HTTP API**:
```bash
curl -i 'http://localhost:3000/v1/shape?table=scores&offset=-1'
```

You should see a response similar to this:
```json
[{"key":"\"public\".\"scores\"/\"1\"","value":{"id":"1","name":"Alice","value":"3.14"},"headers":{"operation":"insert","relation":["public","scores"]}}
,{"key":"\"public\".\"scores\"/\"2\"","value":{"id":"2","name":"Bob","value":"2.71"},"headers":{"operation":"insert","relation":["public","scores"]}}
,{"key":"\"public\".\"scores\"/\"3\"","value":{"id":"3","name":"Charlie","value":"-1.618"},"headers":{"operation":"insert","relation":["public","scores"]}}
,{"key":"\"public\".\"scores\"/\"4\"","value":{"id":"4","name":"David","value":"1.414"},"headers":{"operation":"insert","relation":["public","scores"]}}
,{"key":"\"public\".\"scores\"/\"5\"","value":{"id":"5","name":"Eve","value":"0"},"headers":{"operation":"insert","relation":["public","scores"]}}
]
```

That's it! You now have a running electric instance using the Chainguard Container image.

## Documentation and Resources
- [electric Documentation](https://electric-sql.com)
- [electric Github](https://github.com/electric-sql/electric)
- [electric Dockerhub](https://hub.docker.com/r/electricsql/electric)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-logstash-exporter-fips

# prometheus-logstash-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-logstash-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-logstash-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### min-toolkit-debug

# min-toolkit-debug
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/min-toolkit-debug` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/min-toolkit-debug/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wolfi container image with some debugging utilities included. Suitable for using as a debugging tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started
This container image is useful for debugging various networking and DNS issues.

To illustrate, start an interactive container using this image:

```shell
docker run --rm -it --entrypoint=bash cgr.dev/ORGANIZATION/min-toolkit-debug:latest
```

From the container's shell, you can run various diagnostic commands, like `ss`, `dig`, and `traceroute`:

```
bash-5.2# ss -tunlp
bash-5.2# dig +short google.com
bash-5.2# traceroute google.com
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### livekit-egress

# livekit-egress
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/livekit-egress` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/livekit-egress/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

livekit-egress is an open-source media egress service for real-time audio, video, and data, designed for low latency and scalability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `livekit-egress` container image is comparable to the [livekit/egress](https://github.com/livekit/egress) image, with the following differences:

* Default Audio Encoder: `libav AAC (Advanced Audio Coding) encoder`
* Default Video Encoder: `OpenH264 video encoder`

## Prerequisites

Before deploying LiveKit Egress, you'll need:

1. **LiveKit Server** - A running LiveKit server instance
2. **Redis** - For state management and coordination
3. **API Credentials** - API key and secret from your LiveKit server configuration

## Getting Started with Docker

This guide walks you through setting up a complete LiveKit Egress environment using Docker, including all required dependencies.

### Step 1: Create a Docker Network

```bash
docker network create lknet
```

### Step 2: Start Redis

LiveKit Egress requires Redis for state management:

```bash
docker run -d \
  --name redis \
  --network lknet \
  -p 6379:6379 \
  cgr.dev/ORGANIZATION/redis:latest
```

### Step 3: Configure and Start LiveKit Server

Create a configuration file for LiveKit Server:

```bash
cat <<EOF > livekit.yaml
port: 7880
rtc:
  tcp_port: 7881
redis:
  address: redis:6379
keys:
  devkey: secret
room:
  auto_create: true
EOF
```

Start LiveKit Server:

```bash
docker run -d \
  --name livekit-server \
  --network lknet \
  -p 7880:7880 \
  -p 7881:7881 \
  -v $(pwd)/livekit.yaml:/etc/livekit.yaml \
  cgr.dev/ORGANIZATION/livekit-server:latest \
  --config /etc/livekit.yaml
```

### Step 4: Configure and Start LiveKit Egress

Create the Egress configuration file:

```bash
cat <<EOF > egress.yaml
api_key: devkey
api_secret: secret
ws_url: ws://livekit-server:7880
redis:
  address: redis:6379
logging:
  level: info
EOF
```

Create an output directory for recordings:

```bash
mkdir -p ./egress-output
chmod 777 ./egress-output
```

Start LiveKit Egress with the required capabilities:

```bash
docker run -d \
  --name livekit-egress \
  --network lknet \
  --shm-size=1g \
  -e EGRESS_CONFIG_FILE=/etc/egress.yaml \
  -v $(pwd)/egress.yaml:/etc/egress.yaml \
  -v $(pwd)/egress-output:/out \
  cgr.dev/ORGANIZATION/livekit-egress:latest
```

### Step 5: Verify the Setup

Check that all services are running:

```bash
docker ps
docker logs livekit-server
docker logs livekit-egress
```

You should see logs indicating successful connections to Redis and that services are ready.

### Step 6: Setup the LiveKit CLI

Install the LiveKit CLI tool:

```bash
# macOS
brew install livekit-cli

# Linux
curl -sSL https://get.livekit.io/cli | bash

# Windows
winget install LiveKit.LiveKitCLI

# From source
git clone github.com/livekit/livekit-cli
make install
```

Set environment variables for the CLI:

```bash
export LIVEKIT_URL="ws://localhost:7880"
export LIVEKIT_API_KEY="devkey"
export LIVEKIT_API_SECRET="secret"
```

### Step 7: Start a Web Egress Recording

Create a simple web page to record:

```bash
mkdir -p ./web-content
cat <<'EOF' > ./web-content/index.html
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>LiveKit Egress Test</title>
</head>
<body>
  <h1>Hello from LiveKit Egress!</h1>
  <p>This page is being recorded.</p>
  <div id="timestamp"></div>
  <script>
    setInterval(() => {
      document.getElementById('timestamp').textContent = new Date().toISOString();
    }, 1000);
  </script>
</body>
</html>
EOF
```

Serve the web page:

```bash
docker run -d \
  --name web-server \
  --network lknet \
  -v $(pwd)/web-content:/usr/share/nginx/html:ro \
  -p 8080:8080 \
  cgr.dev/ORGANIZATION/nginx:latest
```

Create a web egress configuration:

```bash
cat <<EOF > web-egress.json
{
  "url": "http://web-server:8080",
  "preset": "H264_720P_30",
  "file_outputs": [
    {
      "file_type": "MP4",
      "filepath": "/out/web-recording.mp4",
      "disable_manifest": true
    }
  ]
}
EOF
```

Start the egress job:

```bash
lk egress start --type web web-egress.json
```

The command will output an egress ID (e.g., `EG_xxxxxxxxxxxxx`). Let it run for about 15-20 seconds, then stop it:

```bash
# Replace with your egress ID
lk egress stop --id EG_xxxxxxxxxxxxx

# Check the status
lk egress list
```

The recording will be available in `./egress-output/web-recording.mp4`.

## Getting Started with Kubernetes

This guide demonstrates how to deploy LiveKit Egress on Kubernetes using Helm charts.

### Prerequisites for Kubernetes

- Helm 3.x installed
- Redis instance (can be deployed alongside)

### Step 1: Install Redis Operator

Add the OT-Container-Kit Helm repository:

```bash
helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
helm repo update
```

Install the Redis operator:

```bash
helm install redis-operator ot-helm/redis-operator \
  --namespace default \
  --create-namespace
```

Wait for the operator to be ready:

```bash
kubectl wait --for=condition=ready pod \
  --selector name=redis-operator \
  --timeout=30s
```

### Step 2: Deploy Redis

Create a Redis instance:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: Redis
metadata:
  name: redis-livekit
spec:
  kubernetesConfig:
    image: cgr.dev/ORGANIZATION/redis:latest
    resources:
      limits:
        cpu: 500m
        memory: 512Mi
      requests:
        cpu: 250m
        memory: 256Mi
EOF
```

Wait for Redis to be ready:

```bash
kubectl wait --for=condition=ready pod \
  --selector app=redis-livekit \
  --timeout=30s
```

### Step 3: Deploy LiveKit Server

Add the LiveKit Helm repository:

```bash
helm repo add livekit https://helm.livekit.io
helm repo update
```

Create a values file for LiveKit Server:

```bash
cat <<EOF > livekit-server-values.yaml
image:
  repository: cgr.dev/ORGANIZATION/livekit-server
  tag: latest

livekit:
  redis:
    address: redis-livekit.default.svc.cluster.local:6379
  keys:
    devkey: thisisasecretkeythatislongenoughforlivekit
  rtc:
    use_external_ip: false
  room:
    auto_create: true
EOF
```

Install LiveKit Server:

```bash
helm install livekit-server livekit/livekit-server \
  --namespace default \
  -f livekit-server-values.yaml
```

Wait for LiveKit Server to be ready:

```bash
kubectl rollout status deployment/livekit-server --timeout=30s
kubectl wait --for=condition=ready pod \
  --selector app.kubernetes.io/name=livekit-server \
  --timeout=30s
```

### Step 4: Deploy LiveKit Egress

Create a values file for LiveKit Egress:

```bash
cat <<EOF > livekit-egress-values.yaml
image:
  repository: cgr.dev/ORGANIZATION/livekit-egress
  tag: latest

egress:
  apiKey: devkey
  apiSecret: thisisasecretkeythatislongenoughforlivekit
  wsUrl: ws://livekit-server.default.svc.cluster.local
  insecure: true
  redis:
    address: redis-livekit.default.svc.cluster.local:6379
EOF
```

Install LiveKit Egress:

```bash
helm install livekit-egress livekit/egress \
  --namespace default \
  -f livekit-egress-values.yaml
```

Wait for the deployment:

```bash
kubectl rollout status deployment/livekit-egress --timeout=30s
kubectl wait --for=condition=ready pod \
  --selector app.kubernetes.io/name=egress \
  --timeout=30s
```

### Step 5: Configure Output Volume (Optional)

The upstream Helm chart doesn't expose volume configuration for the egress pod. If you need to write recordings to a persistent volume, you'll need to patch the deployment:

```bash
kubectl -n default patch deployment/livekit-egress --type=json -p='[
      {"op":"add","path":"/spec/template/spec/volumes","value":[]},
      {"op":"add","path":"/spec/template/spec/volumes/-","value":{"name":"out","emptyDir":{}}},
      {"op":"add","path":"/spec/template/spec/containers/0/volumeMounts","value":[]},
      {"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/-","value":{"name":"out","mountPath":"/out"}},
      {"op":"add","path":"/spec/template/spec/securityContext","value":{"fsGroup":65532}}
    ]'
```

For persistent storage, replace `emptyDir` with a `persistentVolumeClaim`.

### Step 6: Access LiveKit Server

Port-forward to access the LiveKit server:

```bash
kubectl port-forward deployment/livekit-server 7880:7880
```

In another terminal, set up the LiveKit CLI:

```bash
export LIVEKIT_URL="ws://localhost:7880"
export LIVEKIT_API_KEY="devkey"
export LIVEKIT_API_SECRET="thisisasecretkeythatislongenoughforlivekit"
```

### Step 7: Test Egress in Kubernetes

Create a test web server in Kubernetes:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-webpage
data:
  index.html: |
    <!doctype html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>K8s Egress Test</title>
    </head>
    <body>
      <h1>Hello from Kubernetes!</h1>
      <p>Recording test in Kubernetes environment.</p>
    </body>
    </html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-web-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-web
  template:
    metadata:
      labels:
        app: test-web
    spec:
      containers:
      - name: nginx
        image: cgr.dev/ORGANIZATION/nginx:latest
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: content
          mountPath: /usr/share/nginx/html
      volumes:
      - name: content
        configMap:
          name: test-webpage
---
apiVersion: v1
kind: Service
metadata:
  name: test-web-server
spec:
  selector:
    app: test-web
  ports:
  - port: 8080
    targetPort: 8080
EOF
```

Wait for the test-web-server to be ready
```shell
kubectl rollout status deployment/test-web-server --timeout=30s
kubectl wait --for=condition=ready pod \
--selector app=test-web \
--timeout=30s
```

Create an egress configuration:

```bash
cat <<EOF > k8s-web-egress.json
{
  "url": "http://test-web-server.default.svc.cluster.local:8080",
  "preset": "H264_720P_30",
  "file_outputs": [
    {
      "file_type": "MP4",
      "filepath": "/out/k8s-recording.mp4",
      "disable_manifest": true
    }
  ]
}
EOF
```

Start the egress job:

```bash
lk egress start --type web k8s-web-egress.json
```

Let it run for 15-20 seconds, then stop it:

```bash
# Replace with your egress ID
lk egress stop --id EG_xxxxxxxxxxxxx

# Check status
lk egress list
```

### Step 8: Retrieve the Recording

To retrieve the recording from the egress pod:

```bash
# Get the egress pod name
EGRESS_POD=$(kubectl get pods -l app.kubernetes.io/instance=livekit-egress -o jsonpath='{.items[0].metadata.name}')

# Copy the recording
kubectl cp default/$EGRESS_POD:/out/k8s-recording.mp4 ./k8s-recording.mp4
```

## Documentation and Resources

- **[LiveKit Egress Overview](https://docs.livekit.io/home/egress/overview/)** - Comprehensive egress documentation
- **[Composite Recording Guide](https://docs.livekit.io/home/egress/composite-recording/)** - Room and web composite recording details
- **[Egress Examples](https://docs.livekit.io/home/egress/examples/)** - Practical code examples in multiple languages
- **[Self-Hosting Egress](https://docs.livekit.io/home/self-hosting/egress/)** - Production deployment guide
- **[Kubernetes Deployment](https://docs.livekit.io/home/self-hosting/kubernetes/)** - Kubernetes-specific instructions
- **[LiveKit CLI Documentation](https://docs.livekit.io/home/cli/)** - CLI tool reference
- **[GitHub Repository](https://github.com/livekit/egress)** - Source code and issues
- **[LiveKit Helm Charts](https://github.com/livekit/livekit-helm)** - Livekit Helm Charts

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pgbouncer-exporter

# prometheus-pgbouncer-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pgbouncer-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pgbouncer-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Prometheus exporter that collects and exposes metrics from PgBouncer, a lightweight connection pooler for PostgreSQL

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream `quay.io/prometheuscommunity/pgbouncer-exporter` Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager. Switching to Chainguard's `prometheus-pgbouncer-exporter` image should not require any changes to your existing setup. 

## Usage Instructions
To use the PgBouncer Exporter, you'll need a working `PgBouncer` setup in your Environment.

### PGBouncer configuration
The PgBouncer-Exporter [requires a configuration change](https://github.com/prometheus-community/pgbouncer_exporter/blob/master/README.md#pgbouncer-configuration) to `pgbouncer` to ignore a PostgreSQL driver connection parameter. In the `pgbouncer.ini` please include this option:
```
   ignore_startup_parameters = extra_float_digits
```

### Run with docker
```
docker run ORGANIZATION/prometheus-pgbouncer-exporter:latest <flags>
```

### Helm

To deploy `prometheus-pgbouncer-exporter` on your Kubernetes cluster using Chainguard's `prometheus-pgbouncer-exporter` image, you can use the the upstream Helm chart from the [Prometheus Community repository](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-pgbouncer-exporter).

To use the Chainguard image, override the image repository and tag in your own `values.yaml` file:
```yaml
image:
    repository: ORGANIZATION/prometheus-pgbouncer-exporter
    tag: latest
```
Deploy PgBouncer-Exporter with Helm:
```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pgbouncer-exporter prometheus-community/prometheus-pgbouncer-exporter -f values.yaml
kubectl rollout status deployment/prometheus-pgbouncer-exporter
```
Once PgBouncer-Exporter is up and running, you can validate metrics from Host:
```shell
kubectl port-forward -n pgbouncer-demo svc/prometheus-pgbouncer-exporter 8080:9127 &
curl http://localhost:8080/metrics
```

## Documentation and Resources
- [Official documentation for pgbouncer-exporter project](https://github.com/prometheus-community/pgbouncer_exporter/blob/master/README.md)
- [Metrics Documentation](https://github.com/prometheus-community/pgbouncer_exporter/tree/master?tab=readme-ov-file#metrics)
- [GoDoc / API docs](https://pkg.go.dev/github.com/prometheus-community/pgbouncer_exporter)
- [GitLab Docs (usage in Gitlab)](https://docs.gitlab.com/administration/monitoring/prometheus/pgbouncer_exporter/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-plugin-for-aws

# velero-plugin-for-aws
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-plugin-for-aws` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-plugin-for-aws/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Plugins to support Velero on AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

##  Usage

The [Velero plugin for AWS documentation](https://velero.io/plugins/) can be found on Velero's official website. Velero have a guide on [getting started with Velero plugin for AWS](https://github.com/vmware-tanzu/velero-plugin-for-aws#setup), which demonstrates how to the plugin to backup and restore your Kubernetes cluster resources to AWS S3.  

To use the Chainguard Image version of the plugin, follow the Velero instructions and replace the `velero/velero-plugin-for-aws` image with `cgr.dev/chainguard/velero-plugin-for-aws` in the Velero's install command.  

```bash
$ velero install \
    --provider aws \
    --plugins cgr.dev/chainguard/velero-plugin-for-aws:latest \
   ...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### elasticsearch-fips

# elasticsearch-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/elasticsearch-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/elasticsearch-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elasticsearch is a distributed search and analytics engine, scalable data store and vector database optimized for speed and relevance on production-scale workloads.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Notes

This build of Elasticsearch was modified to support Chainguard FIPS Java with FIPS 140-3 support.

Chainguard FIPS Java with FIPS 140-3 is based on validated
BouncyCastle FIPS 2.1 with hardware-accelerated cryptography and a
user-space entropy source.

The following modifications were applied to the Elasticsearch codebase:

* Upgrade internal entitlements to grant permissions for BC-FIPS 2.1 provider to operate
* Upgrade internal entitlements to grant permissions for BC-RNG-JENT provider to operate
* Fix internal entitlements to access default cacerts trust store certificated
* Fix internal entitlements to access default jssecacerts trust store certificated
* Fix internal entitlements to correctly read BC-FIPS approved_only mode setting via either system or security properties
* Fix internal entitlements to grant watcher access to bc-mail.
* Implement autodetection support for BCFKS keystore format (required by BC-FIPS)
* Remove FIPS unapproved TLS ciphers from default TLS config
* Remove Java obsoleted TLS ciphers from default TLS config
* Set FIPS mode to enabled by default
* Set FIPS required providers to BCFIPS, BCJSSE, BCRNG
* Set default keystore format to BCFKS by default
* Port certificate creation and autoconfiguration to use BCFKS by default
* Correctly use FIPS bouncycastle, instead of non-fips bouncy castle for encryption/decryption of certificates
* Update entrypoint to use a stock password of "changeitchangeit" (instead of empty) for the elasticsearch-keystore which is used to store passwords for the key and trust stores.

With the above changes this images achieves FIPS 140-3 compliance powered by Chainguard FIPS Java.

Automatic trust-store & keystore configuration works as well, as all
the commands are updated to use BCFKS keystore format by default. One
can use auto-configuration or the `elasticsearch-certutil` from this
image to create compliant keystore. Alternative is to export existing
keys and certificates, and reimport them into a keystore created with
keyutil from this image. If you need additional help with certificates
generation, import/export, please open a support request.

This image is tested to launch elasticsearch with `docker run`, as
well as helm chart deployments with an ECK operator upon every image
release.

## Elastic license is required to use this image!
To run Elasticsearch in FIPS mode, you will need to provide a license key. To obtain
a license for Elasticsearch, see their subscriptions page [here](https://www.elastic.co/subscriptions).

Chainguard recommends Platinum license.

## Adding plugins to the image

Elasticsearch provides a mechanism to add plugins to the image. This process
is outlined in the [Elasticsearch ECK documentation](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-custom-images.html).

Unlike the upstream Elasticsearch image, we provide all Elasticsearch utilities
in the local path so that they can be ran directly. Due to this, we do not need
to prefix `bin/` to the executable path for `elasticsearch-plugin`, and we can
just invoke it directly. Here's an example installing the `analysis-icu` plugin:

```bash
FROM cgr.dev/ORGANIZATION/elasticsearch-fips:latest
RUN elasticsearch-plugin install --batch analysis-icu
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-iamguarded

# argocd-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

argocd-iamguarded is the IAMGuarded version of [Argo CD](https://argo-cd.readthedocs.io/en/stable/), a declarative continuous deployment tool for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Argo CD IAMGuarded is a security-enhanced variant of Argo CD designed to be deployed using its companion IAMGuarded Helm chart. This image provides all Argo CD components with additional security benefits over standard Argo CD deployments.

## Helm Chart Installation

The Argo CD IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/argocd
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install argocd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd \
  --namespace argocd \
  --create-namespace \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Argo CD image
image:
  registry: myregistry.example.com
  repository: mirrored/argocd-iamguarded
  digest: sha256:... # Use specific digest instead of tag
dex:
  image:
    registry: myregistry.example.com
    repository: mirrored/dex-iamguarded
    digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
redis:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install argocd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd@sha256:DIGEST \
     --namespace argocd \
     --create-namespace \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/argocd
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/argocd:11.0.2
   Digest: sha256:083c999b293bd86aa63204e7a41325efa2c2ac4bca21cbd890b5eb5897d243ec
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Argo CD IAMGuarded installation using standard Argo CD verification methods. The deployment functions as a standard Argo CD instance, so all typical Argo CD validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Argo CD IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Argo CD and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5268

# request-5268
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5268` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5268/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-iamguarded

# keycloak-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Keycloak](https://www.keycloak.org/) IAMGuarded image for identity and access management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Keycloak IAMGuarded is a security-enhanced variant of Keycloak designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes configuration management capabilities and provides additional security benefits over standard Keycloak deployments.

## Helm Chart Installation

The Keycloak IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Keycloak image
image:
  registry: myregistry.example.com
  repository: mirrored/keycloak-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Keycloak Config CLI
keycloakConfigCli:
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Keycloak IAMGuarded installation using standard Keycloak verification methods. The deployment functions as a standard Keycloak instance, so all typical Keycloak validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Keycloak IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Keycloak and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### curl-fips

# curl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/curl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/curl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `curl-fips` image is based on the [curlimages/curl image](https://hub.docker.com/r/curlimages/curl) with FIPS 140-2 compliance enabled. 

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Test the image version:

```shell
docker run --rm cgr.dev/ORGANIZATION/curl-fips:latest --version
```

Make a basic HTTPS request:

```shell
docker run --rm cgr.dev/ORGANIZATION/curl-fips:latest https://example.com 
```

Use FIPS-approved cipher suites explicitly:

```shell
docker run --rm cgr.dev/ORGANIZATION/curl-fips:latest --ciphers AES128-GCM-SHA256 https://example.com
```

> [!WARNING] 
> Non-FIPS compliant cipher suites will be rejected when FIPS mode is enforced, potentially causing connection failures with legacy systems.

## Documentation and Resources

- [curl Documentation](https://curl.se/docs/)
- [curlimages/curl Docker Hub](https://hub.docker.com/r/curlimages/curl)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zookeeper-iamguarded-fips

# zookeeper-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zookeeper-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zookeeper-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Apache ZooKeeper](https://zookeeper.apache.org/) is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

ZooKeeper IAMGuarded is a security-enhanced variant of ZooKeeper designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard ZooKeeper deployments.

## Compatibility Notes

### FIPS Support

The `zookeeper-iamguarded-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Helm Chart Installation

The ZooKeeper IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install zookeeper oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main ZooKeeper image
image:
  registry: myregistry.example.com
  repository: mirrored/zookeeper-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install zookeeper oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/zookeeper:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your ZooKeeper IAMGuarded installation using standard ZooKeeper verification methods. The deployment functions as a standard ZooKeeper instance, so all typical ZooKeeper validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The ZooKeeper IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both ZooKeeper and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3495

# request-3495
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3495` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3495/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for vllm, a high-throughput and memory-efficient inference and serving engine for LLMs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Running `vllm-openai`

`vllm-openai` requires specific environment configurations for optimal performance with GPUs. For detailed examples and setup instructions, refer to [TESTING.md](https://github.com/chainguard-images/images-private/blob/main/images/request-3495/TESTING.md).

For additional guidance, consult the [upstream documentation](https://github.com/vllm-project/vllm) to ensure proper configuration and usage of `vllm-openai`.

Once the environment prerequisites are met, you can launch the container as follows:

```bash
docker run --runtime nvidia --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HUGGING_FACE_HUB_TOKEN=<secret>" \
    -p 8000:8000 \
    --ipc=host \
    cgr.dev/chainguard/request-3495:latest \
    --model mistralai/Mistral-7B-v0.1
```
## Testing GPU Access
To verify that vllm-openai has access to your connected GPUs, run the following command:

```bash
docker run --rm -it --gpus all cgr.dev/chainguard/request-3495:latest
Python 3.11.9 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-7082

# request-7082
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-7082` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-7082/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sonar-scanner-cli

# sonar-scanner-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sonar-scanner-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sonar-scanner-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Scanner CLI for SonarQube and SonarCloud

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

To use this image, ensure SonarQube is installed and accessible to the host where you will invoke the scanner. The scanner image will default to connecting to the SonarQube API on port 9000.

The following command shows example invocation of the image, assuming `$PWD` is the directory containing code to be scanned and `-Dsonar.host.url` is the address of a SonarQube server:

```
docker run --rm -v $PWD:/usr/src $IMAGE_NAME \
    -Dsonar.login=admin \
    -Dsonar.password=admin \
    -Dsonar.projectKey=default \
    -Dsonar.host.url=http://192.0.2.1:9000
```

 Refer to the [SonarScanner CLI documentation](https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/#sonarscanner-from-docker-image) for detailed instructions on how to configure environment variables for the running container and for additional properties that can be configured at runtime.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### semgrep

# semgrep
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/semgrep` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/semgrep/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CLI for the [Semgrep](https://semgrep.dev) static analysis tool. Semgrep is a lightweight static analysis tool for many languages. It finds bug variants with patterns that look like source code.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

The image can be run directly and sets the semgrep binary as the entrypoint:

```shell
$ docker run cgr.dev/chainguard/semgrep:latest

Usage: semgrep [OPTIONS] COMMAND [ARGS]...

  To get started quickly, run `semgrep scan --config auto`

  Run `semgrep SUBCOMMAND --help` for more information on each subcommand

  If no subcommand is passed, will run `scan` subcommand by default

Options:
  -h, --help  Show this message and exit.

Commands:
  ci                   The recommended way to run semgrep in CI
  install-semgrep-pro  Install the Semgrep Pro Engine
  login                Obtain and save credentials for semgrep.dev
  logout               Remove locally stored credentials to semgrep.dev
  lsp                  [EXPERIMENTAL] Start the Semgrep LSP server
  publish              Upload rule to semgrep.dev
  scan                 Run semgrep rules on files
  shouldafound         Report a false negative in this project.

```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### auditbeat

# auditbeat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/auditbeat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/auditbeat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Auditbeat is a lightweight shipper that you can install on your servers to audit the activities of users and processes on your systems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [elastic/auditbeat](https://hub.docker.com/r/elastic/auditbeat) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker

> [!NOTE]
> These Docker instructions assume you have a running instance of Elasticsearch and Kibana with which `auditbeat` can interact.

You can run the following command to test Chainguard's auditbeat image:

```shell
docker run \
    --cap-add="AUDIT_CONTROL" \
    --cap-add="AUDIT_READ" \
    --rm \
    cgr.dev/ORGANIZATION/auditbeat:latest setup -E "setup.kibana.host=<your_kibana_host>:5601" -E output.elasticsearch.hosts=["<your_elastic_host>:9200"]
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

### Kubernetes

> [!NOTE]
> Applying the manifests from the following documentation assumes an existing Elasticsearch deployment on your cluster.

You can follow the [official documentation for running Auditbeat on Kubernetes](https://www.elastic.co/guide/en/beats/auditbeat/current/running-on-kubernetes.html) to run Auditbeat.  Once you've downloaded the manifest from Elastic, you can modify it as needed.

Start by modifying the Daemonset resource in the downloaded manifest named `auditbeat-kubernetes.yaml`:

```shell
apiVersion: apps/v1
kind: DaemonSet
spec:
  template:
    spec:
      containers:
        - name: auditbeat
          image: cgr.dev/ORGANIZATION/auditbeat:latest
```

Then use the following command to deploy Auditbeat to Kubernetes:

```shell
kubectl create -f auditbeat-kubernetes.yaml
```
```
serviceaccount/auditbeat created
clusterrole.rbac.authorization.k8s.io/auditbeat created
role.rbac.authorization.k8s.io/auditbeat created
role.rbac.authorization.k8s.io/auditbeat-kubeadm-config created
clusterrolebinding.rbac.authorization.k8s.io/auditbeat created
rolebinding.rbac.authorization.k8s.io/auditbeat created
rolebinding.rbac.authorization.k8s.io/auditbeat-kubeadm-config created
configmap/auditbeat-config created
configmap/auditbeat-daemonset-modules created
daemonset.apps/auditbeat created
```

### Helm

You can use the [official Elastic Stack Helm chart](https://artifacthub.io/packages/helm/elastic/eck-stack) in conjunction with an Elastic Operator and replace the image in `values.yaml` with the Chainguard image to install Auditbeat.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
eck-beats:
  config:
    # The below is a common example, full auditbeat config options can be found here:
    # https://www.elastic.co/guide/en/beats/auditbeat/current/configuring-howto-auditbeat.html
    auditbeat.modules:
    - module: file_integrity
      paths:
      - /hostfs/bin
      - /hostfs/usr/bin
      - /hostfs/sbin
      - /hostfs/usr/sbin
      - /hostfs/etc
      exclude_files:
      - '(?i)\.sw[nop]$'
      - '~$'
      - '/\.git($|/)'
      scan_at_start: true
      scan_rate_per_sec: 50 MiB
      max_file_size: 100 MiB
      hash_types: [sha1]
      recursive: true
    - module: auditd
      audit_rules: |
        # Executions
        -a always,exit -F arch=b64 -S execve,execveat -k exec

        # Unauthorized access attempts (amd64 only)
        -a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -k access
        -a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -k access

    processors:
    - add_cloud_metadata: {}
    - add_host_metadata: {}
    - add_process_metadata:
        match_pids: ['process.pid']
  daemonSet:
    podTemplate:
      spec:
        containers:
          - name: auditbeat
            image: cgr.dev/ORGANIZATION/auditbeat:latest
  enabled: true
  type: auditbeat
```

Install the Elastic Operator if it's not already running:

```bash
helm repo add elastic https://helm.elastic.co
```
```
"elastic" has been added to your repositories
```

Update the chart repositories:

```shell
helm repo update
```
```
...Successfully got an update from the "elastic" chart repository
Update Complete. ⎈Happy Helming!⎈
```

Install the `elastic-operator` Helm chart:

```bash
helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace
```
```
NAME: elastic-operator
LAST DEPLOYED: <DATE>
NAMESPACE: elastic-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

Install the `eck-stack` chart with your custom `values.yaml` file:

```bash
helm install eck-stack elastic/eck-stack -n elastic-stack --create-namespace --values values.yaml
```
```
NAME: eck-stack
LAST DEPLOYED: <DATE>
NAMESPACE: elastic-stack
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Elasticsearch ECK-Stack <VERSION> has been deployed successfully!
```

## Documentation and Resources

* [Official auditbeat (Elastic beats subpackage) repository](https://github.com/elastic/beats).
* [Auditbeat installation and configuration quick start](https://www.elastic.co/guide/en/beats/auditbeat/current/auditbeat-installation-configuration.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### go-ipfs

# go-ipfs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/go-ipfs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/go-ipfs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### lvm-driver

# lvm-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/lvm-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/lvm-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dynamically provision Stateful Persistent Node-Local Volumes & Filesystems for Kubernetes that is integrated with a backend LVM2 data storage stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### IMPORTANT NOTE: 

As of now, the upstream helm chart is a version ahead of the lvm-driver app that they use. 
That is, `v1.6.2` version of the helm chart while the `appVersion` is `v1.6.1` while `v1.6.1` of helm chart has been retracted. The upstream discussion can be found [here](https://github.com/openebs/openebs/pull/3780#discussion_r1774669126). However our image comes up with `v1.6.2` of lvm-driver which [brings the change](https://github.com/openebs/lvm-localpv/blob/45e0fbdd6af38f3025132fff5b6d10c3c2eec1fb/pkg/lvm/volume.go#L38) of using `OPENEBS_NAMESPACE` instead of `LVM_NAMESPACE`. As a workaround and till upstream fixes chart version with the app, you might have to fix this with an additional step that is described later.

### Prerequisites

There are some prerequisites that need to be met before enabling lvm-localpv support in OpenEBS:

1. All the nodes must have LVM2 utils package installed
   - You can install the package using the following command:
     ```bash
     sudo apt-get update && sudo apt-get install lvm2 -y
     ```
2. All the nodes must have dm-snapshot Kernel Module loaded - (Device Mapper Snapshot)
   - You can check if the module is loaded using the following command:
     ```bash
     lsmod | grep dm_snapshot
     ```
   - If the module is not loaded, you can load it using the following command:
     ```bash
     sudo modprobe dm_snapshot
     ```
3. SSH into each worker node and install open-iSCSI:
     ```bash
      sudo apt-get update
      sudo apt-get install -y open-iscsi
      sudo systemctl enable --now iscsid
      sudo systemctl status iscsid
      ```

> **NOTE:** The commands above are for Ubuntu, please replace them with the appropriate commands for your OS.

You can find more information on the project repository [here](https://github.com/openebs/lvm-localpv#prerequisites).

### Installing using Helm 
There is an official Helm chart for deploying the OpenEBS with lvm-localpv support enabled. 

You can find the chart [here](https://artifacthub.io/packages/helm/openebs/openebs).

You can use the following command to install the OpenEBS with lvm-localpv support enabled using Chainguard's image:

#### Add helm chart
```bash
helm repo add openebs https://openebs.github.io/charts
helm repo update
```

#### Install OpenEBS with lvm-localpv

```bash
helm install openebs --namespace openebs openebs/openebs \
      --set lvm-localpv.enabled="true" \
      --set lvm-localpv.lvmPlugin.image.registry="cgr.dev/" \
      --set lvm-localpv.lvmPlugin.image.repository="chainguard/lvm-driver" \
      --set lvm-localpv.lvmPlugin.image.tag="latest" --create-namespace
```

#### Workaround to fix usage of `OPENEBS_NAMESPACE` discussed earlier

```bash
kubectl edit daemonset openebs-lvm-localpv-node -n openebs
```

You can then edit the references of `LVM_NAMESPACE` with `OPENEBS_NAMESPACE` and then wait for the pods to rollout. 

### Verify

Once done, you can verify with the below command and logs should look like them:

```bash
kubectl logs  openebs-lvm-localpv-node-rdq9w -n openebs -c openebs-lvm-plugin
```

Here's how logs might appear

```bash
I1017 11:31:48.938020       1 main.go:149] LVM Driver Version :- 1.6.2 - commit :- 45e0fbdd6af38f3025132fff5b6d10c3c2eec1fb
I1017 11:31:48.938074       1 main.go:150] DriverName: local.csi.openebs.io Plugin: agent EndPoint: unix:///plugin/csi.sock NodeID: ip-10-0-3-185.us-east-2.compute.internal SetIOLimits: false ContainerRuntime: containerd RIopsPerGB: [] WIopsPerGB: [] RBpsPerGB: [] WBpsPerGB: []
I1017 11:31:48.938098       1 driver.go:49] enabling volume access mode: SINGLE_NODE_WRITER
I1017 11:31:48.938851       1 grpc.go:190] Listening for connections on address: &net.UnixAddr{Name:"//plugin/csi.sock", Net:"unix"}
I1017 11:31:48.939748       1 builder.go:84] Creating event broadcaster
I1017 11:31:48.939848       1 builder.go:90] Creating lvm snapshot controller object
I1017 11:31:48.939880       1 builder.go:99] Adding Event handler functions for lvm snapshot controller
I1017 11:31:48.939897       1 start.go:72] Starting informer for lvm snapshot controller
I1017 11:31:48.939916       1 start.go:74] Starting Lvm snapshot controller
I1017 11:31:48.939929       1 snapshot.go:195] Starting Snap controller
I1017 11:31:48.939937       1 snapshot.go:198] Waiting for informer caches to sync
I1017 11:31:48.940171       1 builder.go:84] Creating event broadcaster
I1017 11:31:48.940327       1 builder.go:90] Creating lvm volume controller object
I1017 11:31:48.940446       1 builder.go:101] Adding Event handler functions for lvm volume controller
I1017 11:31:48.940617       1 start.go:73] Starting informer for lvm volume controller
I1017 11:31:48.940762       1 start.go:75] Starting Lvm volume controller
I1017 11:31:48.940835       1 volume.go:295] Starting Vol controller
I1017 11:31:48.941021       1 volume.go:298] Waiting for informer caches to sync
I1017 11:31:48.963647       1 builder.go:95] Creating lvm node controller object
I1017 11:31:48.968900       1 builder.go:110] Adding Event handler functions for lvm node controller
I1017 11:31:48.970674       1 start.go:98] Starting informer for lvm node controller
I1017 11:31:48.970704       1 start.go:101] Starting Lvm node controller
I1017 11:31:48.970711       1 lvmnode.go:223] Starting Node controller
I1017 11:31:48.970716       1 lvmnode.go:226] Waiting for informer caches to sync
I1017 11:31:49.040068       1 snapshot.go:202] Starting Snap workers
I1017 11:31:49.040111       1 snapshot.go:209] Started Snap workers
I1017 11:31:49.042803       1 volume.go:302] Starting Vol workers
I1017 11:31:49.042996       1 volume.go:309] Started Vol workers
I1017 11:31:49.086469       1 lvmnode.go:231] Starting Node workers
I1017 11:31:49.086494       1 lvmnode.go:238] Started Node workers
I1017 11:31:49.287634       1 lvmnode.go:90] lvm node controller: creating new node object for &{TypeMeta:{Kind: APIVersion:} ObjectMeta:{Name:ip-10-0-3-185.us-east-2.compute.internal GenerateName: Namespace:openebs SelfLink: UID: ResourceVersion: Generation:0 CreationTimestamp:0001-01-01 00:00:00 +0000 UTC DeletionTimestamp:<nil> DeletionGracePeriodSeconds:<nil> Labels:map[] Annotations:map[] OwnerReferences:[{APIVersion:v1 Kind:Node Name:ip-10-0-3-185.us-east-2.compute.internal UID:1294e0df-187f-4ef6-927e-95d8e64e064d Controller:0xc00032f9a6 BlockOwnerDeletion:<nil>}] Finalizers:[] ManagedFields:[]} VolumeGroups:[]}
I1017 11:31:49.299925       1 lvmnode.go:94] lvm node controller: created node object openebs/ip-10-0-3-185.us-east-2.compute.internal
I1017 11:31:49.299952       1 lvmnode.go:306] Successfully synced 'openebs/ip-10-0-3-185.us-east-2.compute.internal'
I1017 11:31:49.301261       1 lvmnode.go:153] Got add event for lvm node openebs/ip-10-0-3-185.us-east-2.compute.internal
I1017 11:31:49.461978       1 grpc.go:72] GRPC call: /csi.v1.Identity/GetPluginInfo requests {}
I1017 11:31:49.463759       1 grpc.go:81] GRPC response: {"name":"local.csi.openebs.io","vendor_version":"1.6.2"}
I1017 11:31:49.477923       1 grpc.go:72] GRPC call: /csi.v1.Node/NodeGetInfo requests {}
I1017 11:31:49.479442       1 lvmnode.go:306] Successfully synced 'openebs/ip-10-0-3-185.us-east-2.compute.internal'
I1017 11:31:49.485697       1 grpc.go:81] GRPC response: {"accessible_topology":{"segments":{"kubernetes.io/hostname":"ip-10-0-3-185.us-east-2.compute.internal","openebs.io/nodename":"ip-10-0-3-185.us-east-2.compute.internal"}},"node_id":"ip-10-0-3-185.us-east-2.compute.internal"}
I1017 11:32:49.267418       1 lvmnode.go:306] Successfully synced 'openebs/ip-10-0-3-185.us-east-2.compute.internal'
I1017 11:33:49.297315       1 lvmnode.go:306] Successfully synced 'openebs/ip-10-0-3-185.us-east-2.compute.internal
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cfssl-self-sign-fips

# cfssl-self-sign-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cfssl-self-sign-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cfssl-self-sign-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-snmp-exporter

# prometheus-snmp-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-snmp-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-snmp-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

SNMP Exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Prometheus SNMP Exporter Image is comparable to the [official Prometheus SNMP Exporter Image from quay.io](https://quay.io/repository/prometheus/snmp-exporter However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

To get started with Chainguard's Prometheus SNMP Exporter Image, we can use official Prometheus Helm chart to deploy it.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/prometheus-snmp-exporter
  tag: latest
```

Deploy the Helm chart:

```shell

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus-snmp-exporter prometheus-community/prometheus-snmp-exporter \
  --values values.yaml
```

To learn more about the Prometheus SNMP Exporter usage, you can refer to the [official documentation](https://github.com/prometheus/snmp_exporter#usage).

## Documentation and Resources

- [Prometheus SNMP Exporter GitHub Repository](https://github.com/prometheus/snmp_exporter)
- [End-to-End Guide to Prometheus SNMP Exporter Deployment in Kubernetes](https://telemetry-compass.com/2025/05/15/end-to-end-guide-to-prometheus-snmp-exporter-deployment-in-kubernetes-part-2/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton-cli

# tekton-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Tekton Pipelines CLI project provides a command-line interface (CLI) for interacting with Tekton, an open-source framework for Continuous Integration and Delivery (CI/CD) systems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

The [Tekton CLI](https://tekton.dev/docs/cli/) is a command-line interface for Tekton.

## Usage

These images a drop-in replacement for the upstream images.

You can use an [upstream release](https://github.com/tektoncd/pipeline/releases) and replace the released images with those from Chainguard.

```bash
docker run cgr.dev/chainguard/tekton-cli version
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-service-operator-fips

# azure-service-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-service-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-service-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Instead of deploying and managing your Azure resources separately from your Kubernetes application, ASO allows you to manage them together, automatically configuring your application as needed. For example, ASO can set up your Redis Cache or PostgreSQL database server and then configure your Kubernetes application to use them.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation and usage

Please refer to the official [Installation](https://azure.github.io/azure-service-operator/#installation) guide.
The official way of managing the installation of the Azure Service Operator is via the official Helm chart, as explained in the guide linked above.

Another way of installing it is via Kubernetes manifests, as documented in the [Installation: From YAML](https://azure.github.io/azure-service-operator/guide/installing-from-yaml/) official guide.

## Compatibility notes

### FIPS support

The controller manager binary in this image is compiled with [golang-fips/go (FIPS enabled Go using OpenSSL)]](https://github.com/golang-fips/go).

FIPS compliance is achieved by not using any native golang cryptographic functionality and redirecting all calls to OpenSSL at runtime. Specifically the following modules are patched to redirect to the OpenSSL FIPS provider:

 * `crypto`
 * `crypto/tls`
 * subset of `golang.org/x/crypto` that use stock `crypto` primitives only

If no other cryptographic algorithms are implemented or used, certification status will depend on the runtime OpenSSL FIPS certification. For Chainguard that is [#4282](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4282).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-vsphere

# cloud-provider-vsphere
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-vsphere` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-vsphere/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image of the [Kubernetes cloud provider interface for vSphere](https://cloud-provider-vsphere.sigs.k8s.io/)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `cloud-provider-vsphere` image is compatible with the upstream [vSphere Cloud Provider Interface](https://github.com/kubernetes/cloud-provider-vsphere). This image contains only the minimum set of dependencies needed to run the vSphere infrastructure provider components.

Follow the [Broadcom/VMware deployment documentation](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/container-storage-plugin/3-0/getting-started-with-vmware-vsphere-container-storage-plug-in-3-0/vsphere-container-storage-plug-in-deployment/preparing-for-installation-of-vsphere-container-storage-plug-in.html#GUID-0C202FC5-F973-4D24-B383-DDA27DA49BFA-en) for installing the vSphere cloud provider interface.

## Prerequisites
- Supported vCenter Server and ESXi environment.
- Supported Kubernetes version for the driver release you choose.
- vCenter user account with the required privileges as defined in the upstream docs.
- Network/DNS reachability from all cluster nodes to vCenter.
- helm

## Usage

### Deploy the vSphere Cloud Provider Interface via Helm

> [!NOTE]
> If your vSphere environment contains only a single vCenter Server where the default `vsphere.conf` is acceptable, a basic helm chart deployment should be sufficient for your needs.
> If your vSphere environment contains multiple vCenter Servers or the default parameters contained within the vsphere.conf must be changed, follow the upstream's [Advanced Configuration](https://github.com/kubernetes/cloud-provider-vsphere/blob/master/docs/book/tutorials/kubernetes-on-vsphere-with-helm.md#deploying-vsphere-cpi-for-advanced-configurations) Helm deployment guide.

1. Add the `cloud-provider-vsphere` Helm chart repo and update Helm client
```shell
helm repo add vsphere-cpi https://kubernetes.github.io/cloud-provider-vsphere
helm repo update
```

2. Create your `values.yaml` file
```yaml
cat <<EOF > /tmp/values.yaml
daemonset:
  image:
    repository: cgr.dev/ORGANIZATION/cloud-provider-vsphere:latest
    tag: latest
EOF
```

3. Install `cloud-provider-sphere`
```shell
helm install vsphere-cpi -f /tmp/values.yaml vsphere-cpi/vsphere-cpi
```

## Documentation and Resources
- [Upstream cloud-provider-vsphere repository](https://github.com/kubernetes/cloud-provider-vsphere)
- [K8S Docs - vSphere Cloud Provider](https://cloud-provider-vsphere.sigs.k8s.io/)
- [K8S Docs - Deploying vSphere CPI w/ Helm](https://cloud-provider-vsphere.sigs.k8s.io/tutorials/kubernetes-on-vsphere-with-helm)
- [K8S Docs - Deploying K8S cluster on vSphere](https://cloud-provider-vsphere.sigs.k8s.io/tutorials/kubernetes-on-vsphere-with-helm)
- [Broadcom/VMware Docs - vSphere](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere/9-0.html)
- [Braodcom/VMware Docs - Install vSphere Cloud Provider Interface](https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/container-storage-plugin/3-0/getting-started-with-vmware-vsphere-container-storage-plug-in-3-0/vsphere-container-storage-plug-in-deployment/preparing-for-installation-of-vsphere-container-storage-plug-in.html#GUID-0C202FC5-F973-4D24-B383-DDA27DA49BFA-en)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### camunda-keycloak-fips

# camunda-keycloak-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/camunda-keycloak-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/camunda-keycloak-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Camunda Keycloak](https://github.com/camunda/keycloak/) image for identity and access management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Camunda Keycloak FIPS image is comparable to the [camunda/keycloak image on Docker Hub](https://hub.docker.com/r/camunda/keycloak), designed to be deployed using the Keycloak IAMGuarded Helm chart in FIPS environments. This Keycloak image variant provides additional JARs that allow for the use of AWS Identity and Access Management (IAM) Roles for Service Accounts (IRSA) for database authentication.

Unlike the [camunda/keycloak image](https://hub.docker.com/r/camunda/keycloak), Chainguard's image does not include any custom themes.

## FIPS Requirements

- DB connection password must be at least 112 bits.
- A keystore file must be provided to enable FIPS mode.
- Keystore password must be at least 112 bits.

## Helm Chart Installation

The Keycloak IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "image.repository=$ORGANIZATION/camunda-keycloak-fips"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### AWS Wrapper Configuration
In order to connect to Postgres using JDBC, we have to use the AWS wrapper. To do so, use the following values:
```yaml
extraEnvVars:
- name: KEYCLOAK_JDBC_PARAMS
  value: wrapperPlugins=iam
- name: KEYCLOAK_JDBC_DRIVER
  value: aws-wrapper:postgresql
- name: KC_DC_URL
  value: "jdbc:aws-wrapper:postgresql://postgresql.default.svc.cluster.local:5432/iamguarded_keycloak?currentSchema=public"
```

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Keycloak image
image:
  registry: myregistry.example.com
  repository: mirrored/camunda-keycloak-fips
  digest: sha256:... # Use specific digest instead of tag

# Keycloak Config CLI
keycloakConfigCli:
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication
Ensure proper pull credentials are configured through one of the following methods:

**Option 1: Using Helm values with `global.imagePullSecrets`**
```yaml
# values.yaml
global:
  imagePullSecrets:
    - name: chainguard-pull-secret
```

**Option 2: Create a Kubernetes pull secret**
```bash
# Step 1: Authenticate with chainctl and generate a pull token
chainctl auth login
chainctl auth configure-docker --pull-token --save --ttl=24h

# Step 2: Create the Kubernetes secret
kubectl create secret docker-registry chainguard-pull-secret \
  --docker-server=cgr.dev \
  --docker-username=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Username') \
  --docker-password=$(echo cgr.dev | docker-credential-cgr get | jq -r '.Secret') \
  -n <your-namespace>

# Step 3: Reference the secret in your Helm installation
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION" \
  --set "image.repository=$ORGANIZATION/camunda-keycloak-fips" \
  --set "global.imagePullSecrets[0].name=chainguard-pull-secret"
```

**Option 3: Cluster node-scoped registry permissions** (cluster-dependent)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "image.repository=$ORGANIZATION/camunda-keycloak-fips"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Camunda Keycloak FIPS installation is using standard Keycloak verification methods. The deployment functions as a standard Keycloak instance, so all typical Keycloak validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Keycloak IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Keycloak and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Configuration
Keycloak provides a mechanism to configure and customize the image. This process
is outlined in the [Keycloak image documentation](https://github.com/keycloak/keycloak/blob/main/docs/guides/server/containers.adoc).

There are subtle differences in the executable paths used in the Chainguard
image. Below is the example copied from the documentation, updated with the
correct paths:

```bash
FROM cgr.dev/chainguard/camunda-keycloak-fips:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /usr/share/java/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /usr/share/java/keycloak/bin/kc.sh build

FROM cgr.dev/chainguard/camunda-keycloak-fips:latest
COPY --from=builder /usr/share/java/keycloak/ /usr/share/java/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/usr/share/java/keycloak/bin/kc.sh"]
```

## Disclaimer

This image is equipped with the essential components for Keycloak to operate in
FIPS mode. However, it's important for users to ensure they use it in line with
FIPS compliance standards.

This includes tasks such as keystore generation, configuration, and launching
Keycloak with the correct configuration parameters. More guidance is provided in
the sections below.

## Keystore

Keycloak requires a bcfips-compatible keystore to manage its SSL/TLS
certificates.

Although Keycloak supports various keystore types, only BCKFS offers the
capability to operate in approved _(strict)_ mode under FIPS standards, ensuring
only approved ciphers are used.

### BCKFS Keystore creation

To create keystore you can use keytool from this image like so:

```bash
kubectl run -q --rm --attach create-keystore \
  --image=cgr.dev/ORGANIZATION/camunda-keycloak-fips --restart=Never --command -- \
    sh -c ' \
      keytool -v -keystore "/tmp/server.keystore" \
      -storetype bcfks \
      -providername BCFIPS \
      -alias "localhost" \
      -genkeypair -sigalg SHA512withRSA -keyalg RSA \
      -dname CN="localhost" \
      -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
      -keypass "<YOUR TLS KEY PASSWORD, can be the same>"; \
      cat /tmp/server.keystore' > server.keystore
```

### BCKFS Truststore creation

To create a truststore and import and trust an existing CA certificate you can also use keytool:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/camunda-keycloak-fips \
  -v -keystore /tmp/keystore/truststore.bckfs \
  -storetype bcfks \
  -providername BCFIPS \
  -import -file /tmp/keystore/MyCA.crt \
  -storepass "<YOUR TRUSTSTORE PASSWORD>" \
  -trustcacerts \
  -noprompt
```

You can similarly use the keycloak container as an init container in your helm
`values.yaml` to import certificates to a BCKFS truststore. When doing this you
may need to set the environment of *just* the init container`JAVA_TOOL_OPTS` to
set the `--module-path` init container and configure the truststore for
keycloak using the `javax.net.ssl` properties using JAVA_OPTS. The need for
JAVA_TOOL_OPTIONS for Java tooling with the BCFIPS provider is documented in
section 2.1.1 in the [Bouncy Castle FIPS Java API User Guide](https://downloads.bouncycastle.org/fips-java/docs/BC-FJA-UserGuide-2.0.0.pdf):

```yaml
extraEnvVars:
- name: JAVA_OPTS
  value: "-Djavax.net.ssl.trustStore=/opt/iamguarded/keycloak/certs/keycloak.truststore.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=FIPS"
  env:
  - name: JAVA_TOOL_OPTIONS
    value: "--module-path=/usr/share/java/bouncycastle-fips -Djava.class.path=/usr/share/java/bouncycastle-fips/bc-fips.jar"
```
** Note on `--truststore-paths` **

Currently it is not possible to use the `--truststore-paths` option when using `--features=fips
--fips-mode=strict`, see this [issue](https://github.com/keycloak/keycloak/issues/28526)

### Deployment

To deploy Keycloak on Kubernetes, you can use the iamguarded helm chart alongside the [KeyCloak FIPS documentation](https://www.Keycloak.org/server/fips).

You will need to do all of the prerequisites mentioned above, and then you need to pass the necessary values to the Helm chart.

Once you create your `server.keystore` using the `BCFIPS` provider, create a Secret object in your Kubernetes cluster to _mount_ it into the Keycloak container later on:

```shell
kubectl create secret generic keycloak-keystore --from-file=server.keystore
```

Set the values to override the necessary fields:

```shell
cat <<EOF > keycloak_values.yaml
extraVolumes:
  - name: "keycloak-keystore"
    secret:
      secretName: "keycloak-keystore"
      items:
        - key: "server.keystore"
          path: "server.keystore"
extraVolumeMounts:
  - name: "keycloak-keystore"
    mountPath: "/usr/share/java/keycloak/conf"
    readOnly: true
auth:
  adminUser: "<ADMIN_USER>"
  adminPassword: "<ADMIN_PASSWORD>"
image:
  registry: cgr.dev
  repository: ORGANIZATION/camunda-keycloak-fips
  tag: latest
extraStartupArgs: "--features=fips --fips-mode=strict --https-key-store-password=<KEYSTORE_PASSWORD>"
# If using the chart's postgres, set a long password
postgresql:
  auth:
    password: <LONG_DATABASE_PASSWORD>
EOF
```

### FIPS validation

If you want to validate the FIPS mode as we did in image tests, you can increase the log level to `TRACE`. You'll see debug logs such as the below if Keycloak is running in FIPS mode:

```bash
--log-level='INFO,org.keycloak.common.crypto:TRACE,org.keycloak.crypto:TRACE'
```

Then you will see the following logs:

```bash
trustStoreType: FIPS
FIPS-JVM: enabled
Approved Mode
BouncyCastleFipsProvider
```

## Debugging

#### Invalid Keystore Format with BCFKS in `production` mode

**Error Message**:
```bash
# kc.sh start --features=fips --hostname=localhost --https-key-store-password='**********'
ERROR: Failed to start server in (production) mode
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: Invalid keystore format
```
**Solution:**
BCFKS Keystores default to strict mode, and it's likely you omitted
`--fips-mode=strict` in your arguments. If you wish to run in non-strict mode
with BCFKS, you need to include `--https-key-store-type=bcfks`.

This is called out in the [official documentation](https://www.keycloak.org/server/fips),
but perhaps could benefit from additional clarification.

#### Keystore corrupted error upon launch

**Error Message**:
```bash
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: BCFKS KeyStore corrupted: MAC calculation failed.
ERROR: BCFKS KeyStore corrupted: MAC calculation failed.
```

**Solution:**
The error indicates that a Keystore was detected, but there was an issue
parsing it. Usually this means that the password used to create the keystore
does not match what was provided as the `--https-key-store-password` argument
to Keycloak.

#### Key material not provided error in `production` mode

**Error Message**:
```bash
ERROR: Failed to start server in (production) mode
ERROR: Key material not provided to setup HTTPS. Please configure your
keys/certificates or start the server in development mode.
```

**Solution:**
This error usually indicates that a `.keystore` was not detected in the
`/usr/share/java/keycloak/conf` directory. Ensure you have created a Keystore
and it is accessible to the container in the expected directory.

#### Password must be at least 112 bits

**Error Message**:
```bash
Failed to add user '<admin-user>' to realm 'master': org.keycloak.models.ModelException:
password must be at least 112 bits
FipsUnapprovedOperationError: password must be at least 112 bits
```

**Solution:**
This is expected whenever Keycloak is running in `strict` (approved) mode for
FIPS. Choose a longer admin password which is compliant. Refer to the Keycloak
FIPS [documentation](https://www.keycloak.org/server/fips) for more information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-dns-iamguarded

# external-dns-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-dns-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-dns-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image to configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

external-dns IAMGuarded is a security-enhanced variant of external-dns designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard external-dns deployments.

## Helm Chart Installation

The external-dns IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install external-dns oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main external-dns image
image:
  registry: myregistry.example.com
  repository: mirrored/external-dns-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```
#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install external-dns oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/external-dns:8.8.2
   Digest: sha256:c36ed7e1c6c82782fa91aabeacf0107fd1c2bfeaca601109281845124cba8481
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your external-dns IAMGuarded installation using standard external-dns verification methods. The deployment functions as a standard external-dns instance, so all typical external-dns validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The external-dns IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both external-dns and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-adapter

# prometheus-adapter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-adapter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-adapter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[prometheus-adapter](https://github.com/kubernetes-sigs/prometheus-adapter) is a Prometheus project used to collect Prometheus metrics in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm
To deploy Prometheus Adapter using the community helm chart, pass in the
Chainguard image when deploying:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install adapter prometheus-community/prometheus-adapter \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-adapter \
 --set image.tag=latest
```

For more detail, please refer to the [Prometheus Adapter documentation](https://github.com/kubernetes-sigs/prometheus-adapter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-iamguarded

# redis-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Redis](https://github.com/redis/redis) Redis is an in-memory data structure store, used as a database, cache, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Redis IAMGuarded is a security-enhanced variant of Redis designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Redis deployments.

## Helm Chart Installation

The Redis IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Redis server image
image:
  registry: myregistry.example.com
  repository: mirrored/redis-server-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Redis Sentinel image for high availability
sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-sentinel-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctl:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Redis exporter for metrics
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# kubectl image for management operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/redis:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Redis IAMGuarded installation using standard Redis verification methods. The deployment functions as a standard Redis instance, so all typical Redis validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Redis IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Redis and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

### Redis Cluster

For sharded, distributed Redis deployments, use the Redis Cluster chart:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster
```

#### Basic Installation

```bash
helm install redis-cluster oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

#### Configuration

The Redis Cluster chart uses the following images from this module:

- **redis-cluster-iamguarded**: Main Redis Cluster nodes
- **os-shell-iamguarded**: Volume permissions initialization
- **prometheus-redis-exporter-iamguarded**: Metrics collection (when enabled)

Example configuration with custom registry:

```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/redis-cluster-iamguarded
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:...
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-node-driver-registrar

# kubernetes-csi-node-driver-registrar
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-node-driver-registrar` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-node-driver-registrar/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 Sidecar container that registers a CSI driver with the kubelet using the kubelet plugin registration mechanism. 

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Run it

Generally speaking, the `kubernetes-csi-node-driver-registrar` is a low level Kubernetes component used to register drivers, and not meant to be managed directly. However, all the steps outlined in the [upstream repo](https://github.com/kubernetes-csi/node-driver-registrar) apply just as well to the Chainguard Image version.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-helm-controller

# cluster-api-helm-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-helm-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-helm-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CAAPH uses Helm charts to manage the installation and lifecycle of Cluster API add-ons.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-helm-controller image is compatible with the upstream [Cluster API Addon Provider Helm](https://github.com/kubernetes-sigs/cluster-api-addon-provider-helm). This image contains only the minimum set of dependencies needed to run the Helm controller components.

## Getting Started

The Cluster API Helm Controller allows you to manage Helm charts as addons for your Cluster API managed clusters. It provides a way to declaratively install and manage Helm charts on workload clusters.

### Prerequisites

- A management cluster with Cluster API installed
- `clusterctl` CLI tool
- Access to the cluster-api-helm-controller image

### Installation

Initialize the Helm addon provider using clusterctl:

```bash
clusterctl init --addon helm
```

Or manually install using the Chainguard image:

```bash
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: caaph-controller-manager
  namespace: caaph-system
spec:
  replicas: 1
  selector:
    matchLabels:
      control-plane: controller-manager
  template:
    metadata:
      labels:
        control-plane: controller-manager
    spec:
      containers:
      - name: manager
        image: cgr.dev/ORGANIZATION/cluster-api-helm-controller:latest
        command:
        - /manager
        args:
        - --leader-elect
EOF
```

### Usage Example

Create a HelmChartProxy resource to install a Helm chart on your workload clusters:

```yaml
apiVersion: addons.cluster.x-k8s.io/v1alpha1
kind: HelmChartProxy
metadata:
  name: nginx-ingress
spec:
  clusterSelector:
    matchLabels:
      environment: production
  repoURL: https://kubernetes.github.io/ingress-nginx
  chartName: ingress-nginx
  version: "4.7.1"
  namespace: ingress-nginx
  createNamespace: true
  valuesTemplate: |
    controller:
      service:
        type: LoadBalancer
```

## Documentation and Resources

* [Cluster API Addon Provider Helm GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-addon-provider-helm)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Helm Documentation](https://helm.sh/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k6-fips

# k6-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k6-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k6-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Load testing tool for testing APIs, microservices, and websites.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's k6-fips image is comparable to the [upstream k6 image](https://github.com/grafana/k6) from Grafana. Please note that to ensure FIPS compliance, all usage of the MD5 hashing algorithm has been removed. Switching to the Chainguard image should not require any significant changes to your existing setup.

## Getting Started
Create and initialize a new script by running the following command:

```
docker run --rm -u $(id -u) -v $PWD:/app -w /app cgr.dev/ORGANIZATION/k6-fips:latest new
```
This command creates a new script file named `script.js` in the current directory. You can also specify a different file name as an argument to the `k6 new` command, for example `k6 new my-test.js`.

Run `k6-fips` with the following command:
```
docker run --rm -i cgr.dev/ORGANIZATION/k6-fips:latest run - <script.js
```

> [!NOTE]
> When using the `k6-fips` image, the script file will not be available to the container as it runs, meaning that just passing the script name won't work. Instead you must tell k6 to read `stdin` by passing the file name as `-`. Then you pipe the actual file into the container with `<` or equivalent. This will cause the file to be redirected into the container and be read by k6.

## Documentation and Resources
- [Run k6 scripts with TestRun CRD](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/)
- [Running k6](https://grafana.com/docs/k6/latest/get-started/running-k6/)
- [Using k6](https://grafana.com/docs/k6/latest/using-k6/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clamav-fips

# clamav-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clamav-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clamav-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ClamAV® is an open source antivirus engine for detecting trojans, viruses, malware & other malicious threats.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [ClamAV image on Docker Hub](https://hub.docker.com/r/clamav/clamav/). Switching to Chainguard's image should not require any changes to your existing setup. This image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager.

### FIPS support

Chainguard's `clamav-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module and comes pre-configured with `FIPSCryptoHashLimits yes` in both `clamd.conf` and `freshclam.conf`. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

While the official documentation does not provide a clear way to deploy the image on Kubernetes, you can use the following commands to deploy ClamAV on your Kubernetes cluster with Helm.

Start by creating a `values.yaml` file:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

clamdConfigDict:
  FIPSCryptoHashLimits: "yes"
  LocalSocket: /run/clamav/clamd.sock
  LogFile: /var/log/clamav/clamd.log
  LogTime: "yes"
  PidFile: /run/clamav/clamd.pid
  TCPSocket: 3310
  User: clamav

freshclamConfigDict:
  DatabaseMirror: database.clamav.net
  DatabaseOwner: clamav
  FIPSCryptoHashLimits: "yes"
  NotifyClamd: /etc/clamav/clamd.conf
  PidFile: /run/clamav/freshclam.pid
  ScriptedUpdates: "yes"
  UpdateLogFile: /var/log/clamav/freshclam.log
EOF
```

Now, you can install the Helm Chart:

```shell
helm install clamav oci://ghcr.io/wiremind/wiremind-helm-charts/clamav:3.7.1 -f values.yaml
```

**Important:** Ensure that on startup, your clamav config files have `FIPSCryptoHashLimits: yes` in them. If clamav is started without this in the config file, fips mode may not be enabled!

When the Pod(s) are running, you can use the following command to scan a file:

```shell
# Port-forward to the ClamAV service
kubectl port-forward service/clamav 3310 &
# Download a test file from EICAR
wget https://secure.eicar.org/eicar.com.txt -O eicar-com.txt
# Extract the content of the file to a variable
EICAR_CONTENT=$(cat eicar-com.txt)
# Get the Pod name to execute the scan
POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=clamav -o jsonpath='{.items[0].metadata.name}')
# Execute the test inside the ClamAV pod:
kubectl exec -it ${POD_NAME} -- sh -c "echo '${EICAR_CONTENT}' > /tmp/eicar.txt && clamscan /tmp/eicar.txt"
# Expected output will be similar to: "Eicar-Signature FOUND"
```

### Deploying in FIPS Mode

The `clamav-fips` image is ready to use in FIPS-enabled environments without additional configuration. ClamAV 1.5.0+ automatically detects FIPS-mode environments and applies the following FIPS-compatible features:

- Restricts MD5 and SHA1 usage for signature verification (via `FIPSCryptoHashLimits yes`)
- Uses SHA2-256 for the clean-file scan cache
- Verifies CVD signature databases using FIPS-compatible external `.sign` signature files

**Verifying FIPS Mode**

To verify FIPS mode is properly configured:

```bash
# For Kubernetes deployments
kubectl exec clamav-0 -- cat /var/log/clamav/clamd.log | grep "FIPS crypto hash limits enabled"
kubectl exec clamav-0 -- cat /etc/clamav/clamd.conf | grep FIPS

FIPSCryptoHashLimits yes

# For Docker deployments
docker exec <container-id> cat /var/log/clamav/clamd.log | grep "FIPS crypto hash limits enabled"
docker exec <container-id> cat /etc/clamav/clamd.conf | grep FIPS

FIPSCryptoHashLimits yes
```

For more details on ClamAV FIPS features, see the [ClamAV 1.5.0 release announcement](https://blog.clamav.net/2025/10/clamav-150-released.html).

## Update the Database Definitions

ClamAV automatically updates its database definitions on Pod startup. But if you want to update the definitions manually, you can exec into the Pod and run the `freshclam` command, and expect the `Database test passed.` log messages. Jump to linked documentation for more information.

## Documentation and Resources

You can learn more about ClamAV via the [official documentation](https://docs.clamav.net). Additionally, you can find the [Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/clamav/clamav). To update the database definitions, you can refer to the [Updating Signature Databases](https://docs.clamav.net/manual/Usage/SignatureManagement.html#freshclam) documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mongodb-kubernetes-operator-fips

# mongodb-kubernetes-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mongodb-kubernetes-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mongodb-kubernetes-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard's MongoDB Kubernetes Operator image enables you to deploy a MongoDB community instance to a Kubernetes cluster, as well as support replica sets, scaling the replicas up or down, version upgrades, custom roles, and TLS security.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's MongoDB Kubernetes Operator image is comparable to the [MongoDB Kubernetes Operator image](https://github.com/mongodb/mongodb-kubernetes-operator) maintained by MongoDB. 

Chainguard's MongoDB Kubernetes Operator expects `/bin/sh` to be available in the MongoDB container image. If you're not using the `-dev` variant, you'll need to ensure your MongoDB image includes `bash` or a `bash-binsh` symlink to provide compatibility.

For TLS to work with our FIPS image, we had to add a patch to swap MD5 with SHA-256, since using MD5 caused a crash due to OpenSSL rejecting unsupported algorithms under FIPS mode (`EVP_DigestInit_ex` failure from `md5Hex` in SCRAM credential generation).

Note that the upstream image runs the container as `uid=2000` and `gid=0`, but we've verified that the image works correctly with `uid=65532` and `gid=65532`, so we've configured it to run as non-root.

Additionally, the upstream components of the MongoDB Kubernetes Operator use different versioning schemes. For example, the main operator uses versions like `0.12.x`, while the version hook component uses `1.0.x`. You can see this in the upstream [`release.json`](https://github.com/mongodb/mongodb-kubernetes-operator/blob/0c46290/release.json#L2). In contrast, Chainguard images for all related components (e.g., the operator and version hook) will share the same tag, aligned with the main operator version. This is due to our Git-based automation, and because upstream does not provide separate Git tags for components like the version hook ([see tags](https://github.com/mongodb/mongodb-kubernetes-operator/tags)). While this differs from upstream's tagging scheme, all components are still built from the same source and version-aligned internally. Be aware that users will not see separate tags per component.

## Getting Started

To get started with Chainguard's MongoDB Kubernetes Operator image, begin by installing the CRDs:

```sh
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes-operator/refs/heads/master/config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
```

To launch the MongoDB Kubernetes Operator in a Docker container, use the following command:

```sh
docker run --rm \
    --net=host \
    -v ~/.kube/config:/root/.kube/config:ro \
    -e KUBECONFIG=/root/.kube/config \
    -e AGENT_IMAGE="quay.io/mongodb/mongodb-agent-ubi:108.0.2.8729-1" \
    -e VERSION_UPGRADE_HOOK_IMAGE="quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook:1.0.9" \
    -e READINESS_PROBE_IMAGE="quay.io/mongodb/mongodb-kubernetes-readinessprobe:1.0.22" \
    -e WATCH_NAMESPACE="*" \
    cgr.dev/ORGANIZATION/mongodb-kubernetes-operator-fips:latest
```

To deploy the MongoDB Kubernetes Operator in your cluster, create the required service account and role:

```sh
cat <<EOF > service_account.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mongodb-kubernetes-operator
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: mongodb-kubernetes-operator
  namespace: default
rules:
- apiGroups: [""]
  resources: ["configmaps", "secrets"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments", "statefulsets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["mongodbcommunity.mongodb.com"]
  resources: ["mongodbcommunity", "mongodbcommunity/status", "mongodbcommunity/spec", "mongodbcommunity/finalizers"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: mongodb-kubernetes-operator-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: mongodb-kubernetes-operator
  namespace: default
roleRef:
  kind: Role
  name: mongodb-kubernetes-operator
  apiGroup: rbac.authorization.k8s.io
EOF
```

Next, create a deployment manifest that will deploy the operator with the Chainguard image:

```sh
cat <<EOF > manager.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    email: support@mongodb.com
  labels:
    owner: mongodb
  name: mongodb-kubernetes-operator
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mongodb-kubernetes-operator
  strategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: mongodb-kubernetes-operator
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: name
                operator: In
                values:
                - mongodb-kubernetes-operator
            topologyKey: kubernetes.io/hostname
      containers:
      - command:
        - /usr/local/bin/entrypoint
        env:
        - name: WATCH_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: OPERATOR_NAME
          value: mongodb-kubernetes-operator
        - name: AGENT_IMAGE
          value: quay.io/mongodb/mongodb-agent-ubi:108.0.2.8729-1
        - name: VERSION_UPGRADE_HOOK_IMAGE
          value: quay.io/mongodb/mongodb-kubernetes-operator-version-upgrade-post-start-hook:1.0.9
        - name: READINESS_PROBE_IMAGE
          value: quay.io/mongodb/mongodb-kubernetes-readinessprobe:1.0.22
        - name: MONGODB_IMAGE
          value: mongodb-community-server
        - name: MONGODB_REPO_URL
          value: quay.io/mongodb
        image: cgr.dev/ORGANIZATION/mongodb-kubernetes-operator-fips:latest
        imagePullPolicy: Always
        name: mongodb-kubernetes-operator
        resources:
          limits:
            cpu: 1100m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 200Mi
        securityContext:
          readOnlyRootFilesystem: true
          runAsUser: 2000
          allowPrivilegeEscalation: false
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      serviceAccountName: mongodb-kubernetes-operator
EOF
```

Finally, apply the service account and deployment:

```sh
kubectl apply -f service_account.yaml
kubectl apply -f manager.yaml
```
## Secure MongoDB resource connections using TLS

Add the `cert-manager` repository to your `helm` repository list and ensure it's up to date:

```sh
helm repo add jetstack https://charts.jetstack.io
helm repo update
```

Install `cert-manager`:

```sh
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
```

Create a TLS-secured MongoDBCommunity resource:

```sh
helm repo add mongodb https://mongodb.github.io/helm-charts

helm upgrade --install mongodb-kubernetes-operator mongodb/community-operator \
  --set operator.operatorImageName="ORGANIZATION/mongodb-kubernetes-operator-fips" \
  --set operator.version="latest" \
  --set registry.operator="cgr.dev" \
  --set community-operator-crds.enabled=true
```

Install mkcert and generate a certificate authority:

```sh
brew install mkcert # for Mac
#for Linux / Windows systems refer to https://github.com/FiloSottile/mkcert
mkcert -install
```

Run the following command and note the location of the generated root CA key and cert:

```sh
mkcert --CAROOT
```

Use the files that you found in the previous step. For example if the location is `/root/.local/share/mkcert`:

```sh
kubectl create configmap ca-config-map --from-file=ca.crt=/root/.local/share/mkcert/rootCA.pem

kubectl create secret tls ca-key-pair  --cert=/root/.local/share/mkcert/rootCA.pem  --key=/root/.local/share/mkcert/rootCA-key.pem
```

Create the Cert Manager issuer and secret:

```sh
cat <<EOF > cert-manager-issuer.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-issuer
spec:
  ca:
    secretName: ca-key-pair
EOF

cat <<EOF > cert-manager-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cert-manager-certificate
  namespace: default
spec:
  secretName: mongodb-tls
  issuerRef:
    name: ca-issuer
    kind: Issuer
  commonName: "*.mongodb-replica-set-svc.default.svc.cluster.local"
  dnsNames:
  - "*.mongodb-replica-set-svc.default.svc.cluster.local"
  - localhost
  ipAddresses:
  - 127.0.0.1
  - 0.0.0.0
EOF

kubectl apply -f cert-manager-issuer.yaml
kubectl apply -f cert-manager-certificate.yaml
```

Deploy MongoDB:

```sh
cat <<EOF > mongo.yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: "ThisIsA$uperStr0ngPassw0rd!123"

---
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: mongodb-replica-set
spec:
  type: ReplicaSet
  members: 3
  version: "6.0.5"
  security:
    tls:
      enabled: true
      certificateKeySecretRef: 
        name: mongodb-tls
      caConfigMapRef: 
        name: ca-config-map
    authentication:
      modes: ["SCRAM-SHA-256"]
  users:
    - name: my-user
      db: admin
      passwordSecretRef:
        name: my-user-password
      scramCredentialsSecretName: my-scram
      roles:
        - { name: clusterAdmin,           db: admin }
        - { name: userAdminAnyDatabase,   db: admin }
        - { name: readWriteAnyDatabase,   db: admin }
        - { name: dbAdminAnyDatabase,     db: admin }
  statefulSet:
    spec:
      template:
        spec:
          containers:
            - name: mongodb-agent
              env:
                - name: GODEBUG
                  value: "fips140=off"
EOF

kubectl apply -f mongo.yaml
```
Wait for the replicaset to be available. Once `kubectl wait mongodbcommunity/mongodb-replica-set --for=jsonpath='{.status.phase}'=Running` becomes available, you can get your connection string, username, and password by running the following:

```sh
kubectl get secret mongodb-replica-set-admin-my-user -o json | jq -r '.data | with_entries(.value |= @base64d)' > conn.json

USERNAME=$(jq -r '.username' conn.json)
PASSWORD=$(jq -r '.password' conn.json)
```

This is an example to connect to the MongoDB cluster with Mongo shell. Use the CA from `mkcert` and the certificate from the previous step. 

```sh
kubectl port-forward svc/mongodb-replica-set-svc 27017:27017 &

mongosh --tlsCAFile /root/.local/share/mkcert/rootCA.pem "mongodb://$USERNAME:$PASSWORD@localhost:27017/admin?directConnection=true&ssl=true"
```

## Documentation and Resources
- [Deploy and configure MongoDB resources](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/deploy-configure.md)
- [Create a database user with SCRAM authentication](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/users.md)
- [Secure MongoDB resource connections using TLS](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/secure.md)
- [Enable External Access to a MongoDB Deployment](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/external_access.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bento

# bento
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bento` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bento/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Bento is a high performance and resilient stream processor, able to connect various sources and sinks in a range of brokering patterns and perform hydration, enrichments, transformations and filters on payloads.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `bento` container is a lean, Wolfi-based container image. It is functionally equivalent to the [https://github.com/warpstreamlabs/bento/pkgs/container/bento](https://github.com/k8s-gateway/k8s_gateway/pkgs/container/k8s_gateway/461346086?tag=latest) while maintaining minimal dependencies and enhanced security.

## Getting Started
A default configuration is included in the Bento image and can be run like this:
```
docker run -d --rm -p 4195:4195 cgr.dev/ORGANIZATION/bento:latest
```
Bento also allows you to generate a configuration template using the create command:
```
docker run --rm cgr.dev/ORGANIZATION/bento:latest create generate/log/drop > config.yaml
```
To explore more configuration templates:
```
docker run --rm cgr.dev/ORGANIZATION/bento:latest list
```
You can then run a custom configuration like this:
```
docker run -d --rm -p 4195:4195 -v "$PWD/config.yaml":/config.yaml \
  cgr.dev/ORGANIZATION/bento:latest -- run /config.yaml
```

## Documentation and Resources
- [Upstream repository](https://github.com/warpstreamlabs/bento)
- [Official documentation](https://warpstreamlabs.github.io/bento/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-496

# request-496
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-496` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-496/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-yet-another-cloudwatch-exporter

# prometheus-yet-another-cloudwatch-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-yet-another-cloudwatch-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-yet-another-cloudwatch-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for AWS CloudWatch.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [yet-another-cloudwatch-exporter](https://quay.io/repository/prometheuscommunity/yet-another-cloudwatch-exporter) image. Switching to Chainguard's yet-another-cloudwatch-exporter image should not require any changes to your existing setup.

## Usage Instructions
The exporter will need to be running in an environment which has access to AWS. The exporter uses the AWS SDK for Go and supports providing authentication via AWS's default credential chain. Regardless of the method used to acquire the credentials, some permissions are needed for the exporter to work.

### Helm

To deploy prometheus-yet-another-cloudwatch-exporter on your Kubernetes cluster using Chainguard's prometheus-yet-another-cloudwatch-exporter image, you can use the upstream chart's [Helm repository](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-yet-another-cloudwatch-exporter).

You can override the image by setting the following values in a `values.yaml` file:

```yaml
  image:
    repository: ORGANIZATION/prometheus-yet-another-cloudwatch-exporter
    tag: latest
    registry: cgr.dev
```

## Documentation and Resources
For more information, please refer to [the official documentation for yet-another-cloudwatch-exporter project](https://github.com/prometheus-community/yet-another-cloudwatch-exporter/blob/master/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rsyslog-fips

# rsyslog-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rsyslog-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rsyslog-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[rsyslog](https://github.com/rsyslog/rsyslog) is a software utility used for log processing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `rsyslog-fips` image is a minimal container image that provides main `rsyslog` package. This image also provides the rsyslog plugins as tags.

Since there is no such official image for `rsyslog`, this image is custom-built by Chainguard.

## Getting Started

The default ports are `514` (tcp/udp) and `1601` (tcp) for RELP.

Note that you may need to set up volumes.

To run with Docker using the default configuration:

```shell
docker run --rm cgr.dev/ORGANIZATION/rsyslog-fips:latest
```

### Plugins

To access rsyslog plugins, you can use the following tagging format:

```sh
docker run --rm cgr.dev/ORGANIZATION/rsyslog-fips:<VERSION>-<PLUGIN>
```

There is a special `all` tag which includes all the plugins.

## Documentation and Resources
You can learn more about rsyslog from the [official documentation](https://www.rsyslog.com/doc/index.html). For configuration information, refer to [rsyslog's configuration documentation](https://www.rsyslog.com/doc/configuration/index.html), as well as the `/etc/rsyslog.conf` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault-csi-provider-fips

# vault-csi-provider-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault-csi-provider-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault-csi-provider-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

HashiCorp Vault Provider for Secret Store CSI Driver

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility notes 

This FIPS-Compliant image is compatible with the [HashiCorp Vault CSI Provider image](https://github.com/hashicorp/vault-csi-provider). Switching to Chainguard's image should not require any changes to your existing configuration.
By default, this image runs as a non-root user, with temporary root privileges enabled for specific needs like communicating with a privileged socket.

### Differences to hashicorp/vault-csi-provider image
This image is not completely identical to the `hashicorp/vault-csi-provider` image. In particular:
 - The `vault-csi-provider` binary is stored in `/usr/bin`, with symlink to the binary placed in `/bin` for compatibility
 - The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the Hashicorp image uses Alpine (which is musl based)

## Getting started 
# Using Vault CSI Provider

The image is not meant to be run as standalone and has to be run inside a Kubernetes cluster.
Vault CSI Provider image is meant to be used as part of [Hashicorp Vault](https://developer.hashicorp.com/vault) deployment, using the [hashicorp/vault](https://github.com/hashicorp/vault-helm) Helm chart.

To use the Chainguard image, configure the [hashicorp/vault](https://github.com/hashicorp/vault-helm) Helm chart to enable the specify the image in the values. Such as:

```yaml
# disable vault-agent injection
injector:
  enabled: false
csi:
  enabled: true
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault-csi-provider-fips"
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
# other values for Vault
# ...
```

It is recommended to also use Chainguard images for `vault` and `vault-k8s` images - for example:

```yaml
# disable vault-agent injection
injector:
  enabled: false
csi:
  enabled: true
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault-csi-provider-fips"
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
server:
  image:
    # NOTE: replace the ORGANIZATION with name used for your organization within the Chainguard registry
    repository: "cgr.dev/ORGANIZATION/vault-fips" # FIPS compliant variant
    # NOTE: "latest" tag should be replaced with specific tag for version of vault-csi-provider to use
    tag: "latest"
# other values for Vault
# ...
```
**NOTE**: [Secrets Store CSI Driver](https://secrets-store-csi-driver.sigs.k8s.io/) first needs to be installed in the cluster before adding the Vault CSI Provider.

## Documentation and resources
The [Vault CSI Provider Installation](https://developer.hashicorp.com/vault/docs/platform/k8s/csi/installation) document provides a step-by-step instruction for installing the Vault CSI Provider and configuring Vault to allow Kubernetes-based authentication.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gptscript

# gptscript
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gptscript` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gptscript/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [gptscript](https://github.com/gptscript-ai/gptscript) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Before using our gptscript image, you'll need an [OpenAI API key](https://platform.openai.com/api-keys).

After retrieving your key, run the container with the following command:

```bash
docker run -e "OPENAI_API_KEY=<YOUR OPENAI API KEY>" cgr.dev/chainguard/gptscript:latest
```

Azure OpenAI may also be used:

```bash
docker run \
  -e "OPENAI_API_KEY=<YOUR API KEY>" \
  -e "OPENAI_BASE_URL=<YOUR ENDPOINT>" \
  -e "OPENAI_API_TYPE=AZURE" \
  -e "OPENAI_AZURE_DEPLOYMENT=<YOUR DEPLOYMENT NAME>" \
  cgr.dev/chainguard/gptscript:latest
```

To run a basic hello world test, run the following:

```bash
docker run -e "OPENAI_API_KEY=<YOUR OPENAI API KEY>" cgr.dev/chainguard/gptscript:latest  https://get.gptscript.ai/echo.gpt --input 'Hello, World!'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secretgen-controller

# secretgen-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/secretgen-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/secretgen-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

secretgen-controller provides CRDs to specify what secrets need to be on Kubernetes cluster (to be generated or not)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `secretgen-controller` container image is compatible with the upstream [ghcr.io/carvel-dev/secretgen-controller](https://github.com/carvel-dev/secretgen-controller/pkgs/container/secretgen-controller), with the following differences:

* Built on a minimal, distroless base for enhanced security
* Regularly updated with the latest security patches
* Significantly reduced attack surface with minimal dependencies

## Getting Started

### Install with kubectl

```bash
kubectl apply -f https://github.com/carvel-dev/secretgen-controller/releases/latest/download/release.yml
```

Then patch the deployment to use the Chainguard image:

```bash
kubectl patch deployment secretgen-controller \
  -n secretgen-controller \
  --type='json' \
  -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "cgr.dev/ORGANIZATION/secretgen-controller:latest"}]'
```

### Generate a Password

Create a `Password` resource to generate a random password:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: Password
metadata:
  name: my-password
  namespace: default
spec:
  length: 40
  secretTemplate:
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: $(value)
```

Apply the resource:

```bash
kubectl apply -f password.yaml
```

View the generated secret:

```bash
kubectl get secret my-password -o jsonpath='{.data.password}' | base64 -d
```

### Generate an RSA Key

Create an `RSAKey` resource to generate an RSA private/public key pair:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: RSAKey
metadata:
  name: my-rsa-key
  namespace: default
spec:
  secretTemplate:
    type: Opaque
```

Apply and view the generated keys:

```bash
kubectl apply -f rsa-key.yaml
kubectl get secret my-rsa-key -o jsonpath='{.data.privateKey}' | base64 -d
kubectl get secret my-rsa-key -o jsonpath='{.data.publicKey}' | base64 -d
```

### Generate an SSH Key

Create an `SSHKey` resource to generate an SSH key pair:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: SSHKey
metadata:
  name: my-ssh-key
  namespace: default
spec:
  secretTemplate:
    type: Opaque
```

Apply and view the generated keys:

```bash
kubectl apply -f ssh-key.yaml
kubectl get secret my-ssh-key -o jsonpath='{.data.ssh-privatekey}' | base64 -d
kubectl get secret my-ssh-key -o jsonpath='{.data.ssh-publickey}' | base64 -d
```

### Generate a Certificate

Create a `Certificate` resource to generate a self-signed certificate:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: Certificate
metadata:
  name: my-certificate
  namespace: default
spec:
  commonName: example.com
  alternativeNames:
    - "*.example.com"
  secretTemplate:
    type: kubernetes.io/tls
```

Apply and view the generated certificate:

```bash
kubectl apply -f certificate.yaml
kubectl get secret my-certificate -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
```

## Documentation and Resources

- **[Official Documentation](https://github.com/carvel-dev/secretgen-controller/tree/develop/docs)**
- **[GitHub Repository](https://github.com/carvel-dev/secretgen-controller)**
- **[Installation Guide](https://github.com/carvel-dev/secretgen-controller/blob/develop/docs/install.md)**
- **[Walkthrough Examples](https://github.com/carvel-dev/secretgen-controller/blob/develop/docs/walkthrough.md)**
- **[Carvel Project](https://carvel.dev/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bank-vaults-fips

# bank-vaults-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bank-vaults-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bank-vaults-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### liberica-jdk-fips

# liberica-jdk-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/liberica-jdk-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/liberica-jdk-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Free and open source Progressive Java Runtime for modern Java deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `liberica-jdk-fips` image is a production-ready distribution of OpenJDK provided by Liberica. This image is part of the Chainguard Images collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production. `liberica-jdk-fips` is comparable to the upstream [liberica-openjdk-alpine](https://hub.docker.com/r/bellsoft/liberica-openjdk-alpine) image, with the following differences:

* Like all other Chainguard Images, `liberica-jdk-fips` features a stripped down, minimal design
* This base image comes with BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs
* It does not run as the root user

Most importantly, the `liberica-jdk-fips` image contains the OpenSSL FIPS Provider Module. For more information, refer to our [FIPS image documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/)

### About FIPS Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

To test the `liberica-jdk-fips` image, start by pulling down the image:

```shell
docker pull cgr.dev/ORGANIZATION/liberica-jdk-fips:latest
```

Be sure to replace `ORGANIZATION` with your organization's name.

Next, run a container using the image:

```sh
docker run -it --rm cgr.dev/ORGANIZATION/liberica-jdk-fips:latest java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Finally, run a Java Application, such as this `HelloWorld.java` example:

```java
    public class HelloWorld {
         public static void main(String[] args) {
              System.out.println("Hello, World!");
         }
    }
```

Compile and run the application inside the container:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/liberica-jdk-fips:latest javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/liberica-jdk-fips:latest java HelloWorld
```

You will receive the output `Hello, World!`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-mailroom-fips

# gitlab-mailroom-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-mailroom-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-mailroom-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GitLab Mailroom is a daemon that monitors IMAP and POP3 mailboxes for incoming emails and forwards them to GitLab. It enables email-based workflows such as creating issues via email, replying to issues, and Service Desk functionality.

To get more information about the image, please visit the GitLab [repository](https://gitlab.com/gitlab-org/ruby/gems/gitlab-mail_room).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab-mailroom-fips` image is a FIPS compliant variant of the GitLab Mailroom container, designed for organizations with federal compliance requirements. Key differences from the standard image:

* Runs as a non-root user by default
* Tagged with the gitlab-mailroom gem version
* Enforces FIPS-validated cryptographic modules for all cryptographic operations

Note that this image does not include `bundler` and `gcc`.

> [!IMPORTANT]
> This FIPS variant is designed for environments requiring FIPS 140-2 compliance. For standard deployments without compliance requirements, use the non-FIPS `gitlab-mailroom` image.

## Getting Started

The `gitlab-mailroom-fips` image operates identically to the standard image but with FIPS cryptographic enforcement enabled.

### Basic Usage with Docker

To test the FIPS-enabled image:

```sh
docker run cgr.dev/ORGANIZATION/gitlab-mailroom-fips:latest
```

The container will start with FIPS mode automatically enabled through pre-configured environment variables.

### Using with GitLab Helm Chart

Configure the FIPS variant in your GitLab Helm chart `values.yaml`:

```yaml
global:
  appConfig:
    incomingEmail:
      enabled: true
      address: "incoming@example.com"
      host: "imap.example.com"
      port: 993
      ssl: true
      user: "mailroom@example.com"
      password:
        secret: gitlab-mailroom-password
        key: password
      mailbox: "inbox"
      idleTimeout: 60
      inboxMethod: "imap"
      deliveryMethod: "sidekiq"

gitlab:
  mailroom:
    enabled: true
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-mailroom-fips
      tag: latest
```

### Verifying FIPS Mode

To verify that FIPS mode is active in your deployment:

```sh
kubectl exec -n gitlab deployment/gitlab-mailroom -- env | grep FIPS
```

You should see output confirming FIPS environment variables are set:

```
FIPS_MODE=1
OPENSSL_FORCE_FIPS_MODE=1
GNUTLS_FORCE_FIPS_MODE=3
GOLANG_FIPS=1
```

## Configuration

The `gitlab-mailroom-fips` container includes all standard configuration options plus FIPS-specific environment variables.

### FIPS Environment Variables

The following environment variables are pre-configured to enable FIPS 140-2 compliance:

- `FIPS_MODE=1`: Enables FIPS mode globally
- `OPENSSL_FORCE_FIPS_MODE=1`: Forces OpenSSL to operate in FIPS mode
- `GNUTLS_FORCE_FIPS_MODE=3`: Enables GnuTLS FIPS mode in lax mode (allows FIPS-approved algorithms)
- `GOLANG_FIPS=1`: Enables FIPS mode for Go cryptographic operations

These variables are set automatically and do not need to be configured manually.

### Standard Configuration

All standard mail_room configuration options apply. The service expects its configuration at `/var/opt/gitlab/mail_room.yml`.

Example FIPS-compliant configuration:

```yaml
mailboxes:
  - email: "incoming@example.com"
    host: "imap.example.com"
    port: 993
    ssl: true
    start_tls: false
    name: "inbox"
    idle_timeout: 60
    delivery_method: sidekiq
    delivery_options:
      redis_url: "redis://redis:6379"
      namespace: "resque:gitlab"
      queue: "incoming_email"
      worker: "EmailReceiverWorker"
```

### SSL/TLS Cipher Considerations

When using the FIPS variant, ensure your IMAP/POP3 servers support FIPS-approved cipher suites. The FIPS cryptographic module restricts available ciphers to those validated under FIPS.

## Documentation and Resources

For more information about GitLab Mailroom and FIPS compliance:

* [GitLab Incoming Email Documentation](https://docs.gitlab.com/ee/administration/incoming_email.html)
* [GitLab FIPS Compliance Documentation](https://docs.gitlab.com/ee/development/fips_compliance.html)
* [GitLab Mailroom Source Code](https://gitlab.com/gitlab-org/ruby/gems/gitlab-mail_room)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openresty-fips

# openresty-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openresty-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openresty-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenResty is a high Performance Web Platform Based on Nginx and LuaJIT.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support

The `openresty-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Usage

To start an OpenResty container with this image, you can use the following command:

```sh
docker run --name openresty -p 80:80 cgr.dev/chainguard/openresty-fips
```

This will start OpenResty in non-daemon mode with the openresty's default Nginx [configuration file](https://github.com/openresty/docker-openresty/blob/master/nginx.conf).

To adhere to stricter security guidelines, in Chainguard's OpenResty image, the default locations for writable files are moved as follows:
- logs: `/var/log/openresty/`
- `nginx.conf`: `/etc/nginx/nginx.conf`
- `default.conf`: `/etc/nginx/conf.d/default.conf`
- `*_temp` directories: `/var/run/openresty/`

### Configuration

You can mount your custom configuration files to the container.

```sh
docker run --name openresty -p 80:80 -v /path/to/your/nginx.conf:/etc/nginx/nginx.conf cgr.dev/chainguard/openresty-fips
```

For more information, refer to the official [OpenResty documentation](https://openresty.org/en/) and the [OpenResty image documentation](https://github.com/openresty/docker-openresty/tree/master).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pushgateway

# prometheus-pushgateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pushgateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pushgateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Prometheus Pushgateway Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `prometheus-pushgateway` container image is designed to be a drop-in replacement for the upstream [Prometheus Pushgateway image](https://hub.docker.com/r/prom/pushgateway).

## Getting Started

### Docker

Run the Pushgateway with Docker:

```shell
docker run -d --name pushgateway -p 9091:9091 cgr.dev/ORGANIZATION/prometheus-pushgateway:latest
```

Push a metric to the gateway. The URL format is `/metrics/job/<job_name>`:

```shell
echo 'my_job_batch_size 100' | curl -X POST --data-binary @- http://localhost:9091/metrics/job/my_job
```

Verify the metric was received:

```shell
curl http://localhost:9091/metrics | grep my_job_batch_size
```

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/prometheus-pushgateway
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pushgateway prometheus-community/prometheus-pushgateway -f values.yaml
```

## Documentation and Resources

- [Prometheus Pushgateway Documentation](https://prometheus.io/docs/instrumenting/pushing/)
- [Prometheus Documentation](https://prometheus.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-arangodb-fips

# kube-arangodb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-arangodb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-arangodb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant ArangoDB Kubernetes Operator for managing ArangoDB database deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kube-arangodb-fips` image contains the ArangoDB Kubernetes Operator with FIPS compliant cryptographic modules, designed for environments requiring enhanced security standards. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Add the ArangoDB Helm repository:

```bash
helm repo add arangodb https://arangodb.github.io/kube-arangodb
helm repo update
```

Create a values.yaml file to configure the `kube-arangodb-fips` operator with the Chainguard FIPS image:

```yaml
# values.yaml
operator:
  image: cgr.dev/ORGANIZATION/kube-arangodb-fips
  imageTag: latest`
```

Deploy the FIPS-compliant operator using Helm:

```bash
helm install kube-arangodb arangodb/kube-arangodb \
  --namespace kube-arangodb --create-namespace \
  -f values.yaml \
  --wait
```

> [!NOTE]
> Replace `ORGANIZATION` with the name used for your organization's private repository within the Chainguard Registry.

## Documentation and Resources

* [ArangoDB Kubernetes Operator Documentation](https://arangodb.github.io/kube-arangodb/docs/)
* [kube-arangodb GitHub Repository](https://github.com/arangodb/kube-arangodb)
* [Using the ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator.html)
* [API Reference for ArangoDeployment](https://arangodb.github.io/kube-arangodb/docs/api/ArangoDeployment.V1.html)
* [FIPS 140-2 Standards](https://csrc.nist.gov/projects/cryptographic-module-validation-program/standards)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### graphicsmagick

# graphicsmagick
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/graphicsmagick` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/graphicsmagick/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image with GraphicsMagick, a collection of tools allowing you to read, write, and manipulate images in a variety of formats.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's GraphicsMagick image does not have a specific external counterpart. Like all other Chainguard images, it contains only the minimum set of dependencies needed to function, and does not include things like a shell or package manager.

## Getting Started

The Chainguard GraphicsMagick image contains the `gm` binary. The image is intended to be run as CLI to manipulate images.

For example, you can use a command like the following to get information about an image:

```shell
docker run \
  -v ./images:/images \
  cgr.dev/ORGANIZATION/graphicsmagick \
  identify /images/linky.png
/images/linky.png PNG 638x636+0+0 PseudoClass 256c 8-bit 69.4Ki 0.000u 0m:0.000001s
```

Commands like the following can convert an image into another format:

```shell
docker run \
  -v ./images:/images \
  cgr.dev/ORGANIZATION/graphicsmagick \
  convert /images/linky.png /images/linky.jpg
```

To prevent permissions issues, you can use the `--user $(id -u)` `docker` option to run the container with same UID as current user. For example:

```shell
docker run \
  --user $(id -u) \
  -v ./images:/images \
  cgr.dev/ORGANIZATION/graphicsmagick \
  convert /images/linky.png /images/linky.jpg
```

> [!NOTE]
> In order to manipulate image files, they need to be mounted into the running container via a volume, as shown in each of these examples.

## Documentation and Resources

* [GraphicsMagick Command-line Utilities](http://www.graphicsmagick.org/utilities.html)
* [GraphicsMagick Reference Information](http://www.graphicsmagick.org/reference.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1877

# request-1877
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1877` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1877/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-mig-manager

# k8s-mig-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-mig-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-mig-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MIG Partition Editor for NVIDIA GPUs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard k8s-mig-manager Image is comparable to the official k8s-mig-manager Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager or shell.

## Getting Started
To get started with Chainguard k8s-mig-manager Image, you will need:
1. GPU setup with MIG mode enabled
2. kubernetes nodes labeled `nvidia.com/gpu.deploy.mig-manager=true` and desired config, like: `nvidia.com/mig.config=all-1g.5gb`

Next, to deploy the image use the official example given in the repository [here](https://github.com/NVIDIA/mig-parted/blob/main/deployments/container/nvidia-mig-manager-example.yaml), and change the upstream image to Chainguard Image [here](https://github.com/NVIDIA/mig-parted/blob/main/deployments/container/nvidia-mig-manager-example.yaml#L26C9-L26C72):
```
image: cgr.dev/ORGANIZATION/k8s-mig-manager:latest
```
you can check the partitions by running: `nvidia-smi`

## Documentation and Resources
- [Upstream repository](https://github.com/NVIDIA/mig-parted)
- [MIG User Guide](https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flannel-cni-plugin

# flannel-cni-plugin
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flannel-cni-plugin` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flannel-cni-plugin/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A plugin designed to work in conjunction with flannel, a network fabric for containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chaingaurd's `flannel-cni-plugin` container image is comparable to [the flannel-cni-plugin image](https://hub.docker.com/r/flannel/flannel-cni-plugin). Like most other Chainguard container images, the `flannel-cni-plugin` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's `flannel-cni-plugin` container image can be installed via the [flannel helm chart](https://github.com/flannel-io/flannel/tree/master/chart/kube-flannel).

Create a `values.yaml` file with the following values

```
flannel
  image_cni
    repository: cgr.dev/ORGANIZATION/flannel-cni-plugin
    tag       : latest
```

Install then helm chart:

```
helm repo add flannel https://flannel-io.github.io/flannel/
helm install flannel --set podCidr="10.244.0.0/16" --namespace kube-flannel flannel/flannel -f values.yaml
```

Check for flannel config inside the pod:

```
  FLANNEL_POD=$(kubectl get pods -n flannel-system -l app=flannel -o jsonpath='{.items[0].metadata.name}')
  kubectl exec -n flannel-system "$FLANNEL_POD" -c kube-flannel -- ls /etc/kube-flannel/net-conf.json
```

## Documentation and Resources
* [Upstream Operation Guide](https://github.com/flannel-io/cni-plugin?tab=readme-ov-file#operation)
* [Flannel Documentation](https://github.com/flannel-io/flannel/blob/master/Documentation/configuration.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-redis-exporter

# prometheus-redis-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-redis-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-redis-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Redis Exporter image for exporting metrics to Redis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus Redis Exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prometheus-redis-exporter prometheus-community/prometheus-redis-exporter \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-redis-exporter \
 --set image.tag=latest
```

For more detail, please refer to the [Redis Exporter documentation](https://github.com/oliver006/redis_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nextflow

# nextflow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nextflow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nextflow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nextflow is a domain-specific language (DSL) for data-driven computational pipelines.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Nextflow pipelines. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's Nextflow image maintains functional parity with the upstream image.

## Getting Started

Start by pulling the image from your registry:

```shell
docker pull cgr.dev/ORGANIZATION/nextflow:latest
```

Then run a simple pipeline

```shell
docker run --rm -it cgr.dev/chainguard/nextflow:latest nextflow run hello
```
This will download and run the "Hello World" pipeline from the Nextflow examples repository.

You can also get help with any command when using the Nextflow CLI by following any command with `help`. For example, the following command displays help for the general Nextflow CLI options and the available top-level commands:

```shell
docker run --rm -it cgr.dev/chainguard/nextflow:latest nextflow help
```

## Documentation and Resources

Please refer to the official [Getting Started](https://nextflow.io/docs/latest/your-first-script.html#your-first-script) guide for more information.

 - [Nextflow Github Repository](https://github.com/nextflow-io/nextflow)
 - [Nextflow Documentation](https://nextflow.io/docs/latest/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### coredns

# coredns
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/coredns` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/coredns/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal image of CoreDNS for secure and flexible DNS-based service discovery in kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `coredns` image is a drop-in replacement for the upstream [coredns/coredns](https://hub.docker.com/r/coredns/coredns) container image. It is fully compatible with the official [CoreDNS Helm chart](https://github.com/coredns/helm) and supports all standard CoreDNS plugins and functionality, including k8s service discovery and DNS forwarding. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [coredns Helm chart](https://github.com/coredns/helm). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/coredns
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `coredns` helm chart

```shell
helm repo add coredns https://coredns.github.io/helm
helm repo update
helm install coredns coredns/coredns --namespace=kube-system --create-namespace -f values.yaml --wait
```

## Documentation and Resources
- [coreDNS Github Repository](https://github.com/coredns/coredns)
- [coreDNS Helm Chart](https://github.com/coredns/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flannel-cni-plugin-fips

# flannel-cni-plugin-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flannel-cni-plugin-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flannel-cni-plugin-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A plugin designed to work in conjunction with flannel, a network fabric for containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chaingaurd's `flannel-cni-plugin-fips` container image is comparable to [the flannel-cni-plugin image](https://hub.docker.com/r/flannel/flannel-cni-plugin). Like most other Chainguard container images, the `flannel-cni-plugin` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

### FIPS Support

The `flannel-cni-plugin-fips` Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The Chainguard's `flannel-cni-plugin-fips` container image can be installed via the [flannel helm chart](https://github.com/flannel-io/flannel/tree/master/chart/kube-flannel).

Create a `values.yaml` file with the following values

```
flannel
  image_cni
    repository: cgr.dev/ORGANIZATION/flannel-cni-plugin-fips
    tag       : latest
```

Install then helm chart:

```
helm repo add flannel https://flannel-io.github.io/flannel/
helm install flannel --set podCidr="10.244.0.0/16" --namespace kube-flannel flannel/flannel -f values.yaml
```

Check for flannel config inside the pod:

```
  FLANNEL_POD=$(kubectl get pods -n flannel-system -l app=flannel -o jsonpath='{.items[0].metadata.name}')
  kubectl exec -n flannel-system "$FLANNEL_POD" -c kube-flannel -- ls /etc/kube-flannel/net-conf.json
```

## Documentation and Resources
* [Upstream Operation Guide](https://github.com/flannel-io/cni-plugin?tab=readme-ov-file#operation)
* [Flannel Documentation](https://github.com/flannel-io/flannel/blob/master/Documentation/configuration.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-corretto-jre-fips

# amazon-corretto-jre-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-corretto-jre-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-corretto-jre-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Amazon Corretto is a no-cost, multi-platform, production-ready distribution of corresponding version of OpenJDK

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`amazon-corretto-jre-fips` is comparable to the upstream [corretto](https://hub.docker.com/_/amazoncorretto) image, with the following differences:

* Like all other Chainguard Containers, `amazon-corretto-jre-fips` features a stripped down, minimal design
* This base image comes with apk and BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs
* It does not run as the root user

Most importantly, the `amazon-corretto-jre-fips` image contains the OpenSSL FIPS Provider Module. For more information, refer to our [FIPS image documentation](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/)

### About FIPS Container Images

FIPS (short for Federal Information Processing Standards) are standards developed by the National Institute of Standards and Technology (NIST) in accordance with the Federal Information Security Management Act (FISMA) and approved by the Secretary of Commerce. FIPS compliance ensures that cryptographic security services within applications meet strict security and integrity standards, and are implemented and configured correctly.

Chainguard offers a variety of language-specific FIPS Images configured out of the box for FIPS development in a given language. We also offer a number base FIPS images for specific applications, such as [PostgreSQL](https://images.chainguard.dev/directory/image/postgres-fips/overview), [Elasticsearch](https://images.chainguard.dev/directory/image/elasticsearch-fips/overview), and [nginx](https://images.chainguard.dev/directory/image/nginx-fips/overview).

Be aware that if you run `apk add` to install a package onto a Chainguard FIPS Image, there's no guarantee that these packages will function properly; they may throw errors if the package has certain dependencies that aren't available in the image. Additionally, even if they do function properly there's no guarantee that added packages will use FIPS-validated cryptography.

Please refer to Chainguard's [FIPS Commitment](https://www.chainguard.dev/legal/fips-commitment) for more information.

## Getting Started

To test the Chainguard version of Amazon Corretto JRE with FIPS, you can use the following examples:

### Running a Simple Java Application

Create a Java application, such as this `HelloWorld.java` example:

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```

Compile the application:

```shell
javac HelloWorld.java
```

Create a Dockerfile to build the image:

```Dockerfile
FROM cgr.dev/chainguard/amazon-corretto-jre-fips:latest
COPY HelloWorld.class /app/
WORKDIR /app
CMD ["java", "HelloWorld"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the application output:

```
Hello, World!
```

### Running a Java Application with Dependencies

If your Java application has dependencies, you can use a build tool like Maven. Create a `pom.xml` file for your project and a Java application:

```xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</project>
```

```java
import org.apache.commons.lang3.StringUtils;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(StringUtils.capitalize("hello, world!"));
    }
}
```

Create a Dockerfile to build the image:

```Dockerfile
FROM maven:3.8.4-openjdk-11 AS build
COPY pom.xml /app/
COPY src /app/src
WORKDIR /app
RUN mvn package

FROM cgr.dev/chainguard/amazon-corretto-jre-fips:latest
COPY --from=build /app/target/hello-world-1.0-SNAPSHOT.jar /app/hello-world.jar
WORKDIR /app
CMD ["java", "-jar", "hello-world.jar"]
```

Build and run the Docker image:

```shell
docker build -t hello-world .
docker run --rm hello-world
```

You will see the output returned by the application:

```
Hello, world!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falco-exporter

# falco-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falco-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falco-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus Metrics Exporter for Falco output events

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy [falco-exporter](https://github.com/falcosecurity/falco-exporter) on Kubernetes, you can follow the [official documentation](https://github.com/falcosecurity/falco-exporter?tab=readme-ov-file#deploy-in-kubernetes).

You need to [install the Falco](https://github.com/falcosecurity/charts/tree/master/charts/falco) with the [gRPC Output](https://falco.org/docs/grpc/) enabled:

```shell
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
    --create-namespace \
    --namespace falco \
    --set falco.grpc.enabled=true \
    --set falco.grpc_output.enabled=true
```

Note: If you don't enable the gRPC output, falco-exporter will not be able to get ready state.

Install the falco-exporter:

```shell
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco-exporter falcosecurity/falco-exporter \
  --create-namespace \
  --namespace falco-exporter \
  --set image.registry=cgr.dev \
  --set image.repository=cgr.dev/chainguard/falco-exporter \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### etcd-iamguarded-fips

# etcd-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/etcd-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/etcd-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[etcd](https://etcd.io/) Distributed reliable key-value store for the most critical data of a distributed system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `etcd-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Etcd IAMGuarded is a security-enhanced variant of Etcd designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Etcd deployments.

## Helm Chart Installation

The Etcd IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/etcd
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install etcd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Etcd image
image:
  registry: myregistry.example.com
  repository: mirrored/etcd-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install etcd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/etcd:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Etcd IAMGuarded installation using standard Etcd verification methods. The deployment functions as a standard Etcd instance, so all typical Etcd validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Etcd IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Etcd and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-kubernetes

# newrelic-kubernetes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-kubernetes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-kubernetes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-kubernetes](https://github.com/newrelic/nri-kubernetes) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle). chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: chainguard/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/chainguard/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: chainguard/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: chainguard/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ko

# ko
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ko` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ko/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image to build and deploy Go applications using [ko](https://ko.build/)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage
This is an image that contains ko, go, and build-base.

This image is designed for use in situations where you would like to use `ko` with codebases that have C dependencies where `cgo` must be used. In these cases, statically linking against musl instead of glibc results in smaller binaries.

### Using with CGO

Navigate to the `example/` directory:

```
cd example/
```

Then run:

```
docker run --rm -it \
  -v ${PWD}:/work \
  --workdir=/work \
  -e KO_DOCKER_REPO=example.com \
  -e CGO_ENABLED=1 \
  cgr.dev/chainguard/ko build ./ \
    --push=false \
    --preserve-import-paths
```

This will build the example program, but not push it, due to `--push=false`.

To push, you will need to mount in your Docker config to provide auth by adding:

```
  -v $DOCKER_CONFIG:/docker-config \
  -e DOCKER_CONFIG=/docker-config \
```

If you're using Docker credential helpers, those will need to be made available in the container as well so that `ko` can invoke them.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-fips

# redis-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Redis image is comparable to [the official Redis image on Docker Hub](https://hub.docker.com/_/redis). 

Unlike many other Chainguard images, the Redis image includes a shell, allowing
you to interact with the Redis database using the Redis command-line interface,
`redis-cli`. 

By default this image runs as a non-root user named `redis` with a uid of
`65532`. Typically, Redis does not have a default data directory and instead
defaults to whatever the working directory is for the Redis process.
The Chainguard Redis image provides a default working directory of `/data` that
is writeable by the `redis` user.

### Important license update

Redis version 7.4 and subsequent releases are no longer licensed under
BSD-3-Clause; instead, the Redis project has adopted a dual licensing model.
This means users have the choice to adopt either the Redis Source Available
License v2 (RSALv2) or the Server Side Public License v1 (SSPLv1).

Please give careful consideration to these licensing conditions when using
Redis. For more details, refer to the [upstream license information](https://github.com/redis/redis/blob/unstable/LICENSE.txt).

## Getting Started

## Redis Version
This will automatically pull the image to your local system and execute the
command `redis --version`:

To run the Chainguard Redis image with Docker using default configuration you
could run the following command:

```bash
docker run -p 6379:6379 --rm cgr.dev/ORGANIZATION/redis-fips
```

This command forwards port `6379` (the default port for Redis) on the host
machine to port `6379` on the container:

```
1:C 25 Oct 2024 17:12:32.419 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 25 Oct 2024 17:12:32.419 * Redis version=7.4.1, bits=64, commit=74b289a0, modified=1, pid=1, just started
1:C 25 Oct 2024 17:12:32.419 # Warning: no config file specified, using the default config. In order to specify a config file use /usr/bin/redis-server /path/to/redis.conf
1:M 25 Oct 2024 17:12:32.420 * monotonic clock: POSIX clock_gettime
1:M 25 Oct 2024 17:12:32.420 * Running mode=standalone, port=6379.
1:M 25 Oct 2024 17:12:32.421 * Server initialized
1:M 25 Oct 2024 17:12:32.421 * Ready to accept connections tcp
```

Following that, you can open another terminal and use `redis-cli` locally. Any
commands you run through it will be forwarded to the `redis` process in the
container:

```bash
redis-cli set test 10
OK
redis-cli get test
"10"
redis-cli
127.0.0.1:6379>
```

Alternatively, to test out Redis within the container, you can run the following
command to access the container's shell:

```sh
docker run -it --entrypoint sh cgr.dev/ORGANIZATION/redis-fips
```

Then run the `redis-server` command to start the `redis` process, and include
the `--daemonize yes` option to prevent it from taking over the terminal:

```bash
/data $ redis-server --daemonize yes
```

Following that, you can run `redis-cli`, the Redis command-line interface, and
begin testing the database:

```bash
/data $ redis-cli
127.0.0.1:6379> set test 20
OK
127.0.0.1:6379> get test
"20"
```

## Configuration

If you supply a different configuration file or change the user, UID, or
`WORKDIR` instruction, you'll need to ensure the user running the `redis`
process has permissions to access the relevant `redis.conf` and `dumb.rb` files.

When running in Docker using a volume, the Chainguard Redis image will
automatically use a custom configuration instead of the default one. Here's an
example that mounts a host volume containing a custom Redis configuration to the
`/data` directory in the container:

```bash
docker run -d -v $(pwd):/data -p 6379:6379 cgr.dev/ORGANIZATION/redis-fips
```

This example forwards the local port `6379` to the container's port `6379`,
the `redis` process's default port. 

Following that, you can run `redis-cli` commands from your local machine which
are then forwarded to the container:

```bash
redis-cli set foo bar
OK
redis-cli get foo
"bar"
```

You can also open the `redis-cli` prompt locally and forward commands to the
container:

```bash
redis-cli
127.0.0.1:6379> get foo
"bar"
```

## Documentation and Resources

* [Official Redis Documentation](https://redis.io/docs/latest/)
* (eBook) [How To Manage a Redis Database](https://www.digitalocean.com/community/books/how-to-manage-a-redis-database-ebook)
* (Tutorial) [How to Port a Sample Application to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/) — this article works through porting a small but complete application (built on NodeJS and Redis) to use Chainguard Images
* [Vulnerability Comparison: redis](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/redis/) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### percona-server-fips

# percona-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/percona-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/percona-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Percona Server for MySQL is a free, fully compatible, enhanced, and open source drop-in replacement for any MySQL database. It provides superior performance, scalability, and instrumentation.'

To get more information about the image, please visit the GitHub [repository](https://github.com/percona/percona-server).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard percona-server-fips image is comparable to the [percona-server image on Docker Hub](https://hub.docker.com/r/percona/percona-server). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

### FIPS Support

The `percona-server-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

You can validate the FIPS environment by passing `--log-error-verbosity=3` and `--ssl-fips-mode=STRICT`, and looking for 

```
A FIPS-approved version of the OpenSSL cryptographic library has been detected in the operating system with a properly configured FIPS module available for loading. Percona Server for MySQL will load this module and run in FIPS mode.
```

in the logs that follow.

## Usage

To get started with Percona Server for MySQL promptly, this Quickstart guide emphasizes using Docker or installing with APT or YUM. Also you can follow along the Quickstart guide on the [Percona website](https://docs.percona.com/percona-server/innovation-release/quickstart-overview.html) for more details.

### Docker

#### Starting a Detached Container

Start a container with the `--detached` or `-d` option to run it in the background. In detached mode, the container exits when the main process used to run it exits.

Start a container named `ps` with the latest version of Percona Server for MySQL 8.3. This example sets the root password to `root` (not secure).

```bash
$ docker run -d \
  --name ps \
  -e MYSQL_ROOT_PASSWORD=root \
  cgr.dev/ORGANIZATION/percona-server-fips:latest
```

By default, Docker pulls the image from Docker Hub if it is not available locally.

To view the container’s logs, use:

```bash
$ docker logs ps --follow
```

<details>

<summary>Expected Output:</summary>

```bash
You can access the server when you see the "ready for connections" message in the log.
```
</details>

You can pass options with the docker run command. Example: Set UTF-8 as the default character set and collation for all databases.

```bash
$ docker run -d \
  --name ps \
  -e MYSQL_ROOT_PASSWORD=root \
  cgr.dev/ORGANIZATION/percona-server-fips:latest \
  --character-set-server=utf8 \
  --collation-server=utf8_general_ci
```

#### Accessing the Percona Server Container

Use the docker exec command to get a shell inside the container. Example:

```bash
$ docker exec -it ps /bin/bash
```

For troubleshooting, the error log is located in /var/log/ or /var/log/mysql/, typically named error.log or mysqld.log.

View the error log with:

```bash
$ more /var/log/mysql/error.log
```

<details>

<summary>Expected Output:</summary>

```bash
...
2017-08-29T04:20:22.190474Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2017-08-29T04:20:22.190520Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
...
```

</details>

#### Accessing the Database
You can access the database using docker exec or the mysql command inside the container’s shell.

```bash
$ docker exec -ti ps mysql -uroot -proot
```

<details>

<summary>Expected Output:</summary>

```bash
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
...
```

</details>

You can also use the MySQL command-line client inside the container’s shell to access the database:

```bash
$ mysql -uroot -proot
```

<details>

<summary>Expected Output:</summary>

```bash
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.3.0-1 Percona Server (GPL), Release 21, Revision c59f87d2854

Copyright (c) 2009-2022 Percona LLC and/or its affiliates
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

</details>

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3805

# request-3805
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3805` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3805/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pypy

# pypy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pypy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pypy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PyPy is a fast and compliant implementation of the Python language.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [pypy/pypy](https://hub.docker.com/_/pypy) image, with the following differences:

- Like all other Chainguard Images, `pypy` features a stripped down, minimal design
- It has few-to-zero CVEs
- It does not run as the root user

## Getting Started

The PyPy Chainguard Image provides a minimal PyPy runtime suitable for workloads such as web applications, CLI utilities, interfacing with APIs, or other tasks.
Currently Pypy only supports pypy-3.11 and pypy-3.10 which are also available as chainguard images. 

## Variants

We have two image variants available:

- A `pypy:latest-dev` variant that contains the `pip`, `pypy`, and `apk` package managers and the `bash`, `ash`, and `sh` shells.
- A minimal runtime variant that removes shells and package managers for additional security.
To pull the minimal runtime variant from `cgr.dev`, run the following:

```sh
docker pull cgr.dev/ORGANIZATION/pypy:latest
```
The minimal runtime can be used to run an application that doesn't need non system wide packages and or a linux shell. 
An example hash.py function is given below;
```python
import hashlib

def generate_hash(text: str, algorithm: str = "sha256") -> str:
    """
    Generate a hash of the given text using the specified algorithm.

    :param text: The input string to hash.
    :param algorithm: The hashing algorithm (e.g., 'md5', 'sha1', 'sha256', 'sha512').
    :return: The hexadecimal hash string.
    """
    try:
        hasher = hashlib.new(algorithm)
        hasher.update(text.encode("utf-8"))
        return hasher.hexdigest()
    except ValueError:
        return f"Error: Unsupported hashing algorithm '{algorithm}'"

# Example usage
print(generate_hash("Hello, World!", "sha256"))
print(generate_hash("Hello, World!", "md5"))
print(generate_hash("Hello, World!", "sha1"))
```
To execute the code above in a pypy container, run the following
```Dockerfile
FROM cgr.dev/ORGANIZATION/pypy:latest

WORKDIR /app

COPY app.py app.py

ENTRYPOINT ["pypy3", "-c", "/app/hash.py"]
```
To pull the dev variant, run this command:

```sh
docker pull cgr.dev/ORGANIZATION/pypy:latest-dev
```

To access the shell in the `pypy:latest-dev` image, you'll need to include an `--entrypoint` option, as in the following example:

```sh
docker run -it --entrypoint /bin/bash cgr.dev/ORGANIZATION/pypy:latest-dev
```

### Usage with Dockerfiles

If you require additional packages that can be installed with the `pip` package manager, we recommend using a multistage build. This process involves installing packages in a virtual environment using the `latest-dev` variant, then copying this environment over to the minimal runtime image. 

The following is a minimal example of a Dockerfile that uses a multistage build to run an `app.py` script after installing dependencies:

```yaml
#!/usr/bin/env python

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"
```

```Dockerfile
# syntax=docker/dockerfile:1

FROM cgr.dev/ORGANIZATION/pypy:latest-dev as dev

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install flask

FROM cgr.dev/ORGANIZATION/pypy:latest

WORKDIR /app

COPY app.py app.py

ENTRYPOINT ["pypy3", "-m", "flask", "--app", "/app/hello.py", "run", "--host", "0.0.0.0"]
```

## Documentation and Resources
For more information, please refer to the following resources:

* [Official documentation for PyPy](https://pypy.org/)
* [PyPy github repository](https://github.com/pypy/pypy/)
* [RPython framework](https://rpython.readthedocs.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trufflehog

# trufflehog
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trufflehog` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trufflehog/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

TruffleHog is a tool that allows you to discover, classify, validate, and analyze leaked credentials.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/trufflesecurity/trufflehog). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To quickly scan a remote GitHub repository for secrets, use the following command:

```shell
docker run --rm -it -v "$PWD:/pwd" cgr.dev/ORGANIZATION/trufflehog:latest github --repo https://github.com/trufflesecurity/test_keys
```

This command runs TruffleHog in a Docker container and scans the specified repository for exposed secrets like API keys or passwords. The repository test_keys contains intentionally exposed test credentials, so you can use it to verify that the tool is working.

The following output is an example of the results you might see after running the command:

```
2025-02-25T20:59:23Z	info-0	trufflehog	running source	{"source_manager_worker_id": "FyaZ4", "with_units": true}
2025-02-25T20:59:23Z	info-0	trufflehog	Completed enumeration	{"source_manager_worker_id": "FyaZ4", "num_repos": 1, "num_orgs": 0, "num_members": 0}
2025-02-25T20:59:24Z	info-0	trufflehog	scanning repo	{"source_manager_worker_id": "FyaZ4", "unit_kind": "repo", "unit": "https://github.com/trufflesecurity/test_keys.git", "repo": "https://github.com/trufflesecurity/test_keys.git"}
...
... <INTENTIONALLY EXPOSED SECRETS LISTED HERE>
...
2025-02-25T20:59:25Z	info-0	trufflehog	finished scanning	{"chunks": 14, "bytes": 6959, "verified_secrets": 4, "unverified_secrets": 2, "scan_duration": "2.274323584s", "trufflehog_version": "3.88.13", "verification_caching": {"Hits":0,"Misses":6,"HitsWasted":0,"AttemptsSaved":0,"VerificationTimeSpentMS":5787}}
```

## Documentation and Resources
Refer to upstream [Quick Start documentation](https://github.com/trufflesecurity/trufflehog/tree/main?tab=readme-ov-file#rocket-quick-start) to learn more about usage of this image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mysql-client

# mysql-client
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mysql-client` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mysql-client/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A simple SQL shell with input line editing capabilities, to interact with MySQL

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image only contains the `mysql` client binary. It is intended to be used to connect to external MySQL servers running outside of the container.

For example, to connect via a socket on a shared volume, start a server:

```sh
docker run -d -t \
    -v <some volume>:/var/lib/mysql \
    cgr.dev/ORGANIZATION/mysql:latest
```

Then run the client and connect via the shared volume and socket:

```sh
docker run --rm -t \
     -v <some volume>:/var/lib/mysql \
     cgr.dev/ORGANIZATION/mysql-client:latest \
     -S /var/lib/mysql/mysql.sock \
     mysql -e "show tables" -u root
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cortex

# cortex
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cortex` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cortex/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cortex provides horizontally scalable, highly available, multi-tenant, long term storage for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on using cortex, refer to the
[official documentation](https://cortexmetrics.io/docs/).
The GitHub repository can also be [found here](https://github.com/cortexproject/cortex).

### Helm
To deploy cortex via helm, please refer to the
[official helm charts documentation](https://cortexproject.github.io/cortex-helm-chart/) and the [helm charts repository](https://github.com/cortexproject/cortex-helm-chart)
for comprehensive instructions, which includes
[supported parameters](https://github.com/cortexproject/cortex-helm-chart/blob/master/values.yaml)

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add cortex-helm https://cortexproject.github.io/cortex-helm-chart
helm repo update

helm install cortex --namespace cortex cortex-helm/cortex \
 --set image.repository=cgr.dev/chainguard/cortex \
 --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-operator-fips

# keycloak-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes Operator based on the Operator SDK for installing and managing Keycloak with FIPS support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

While Chainguard's Keycloak Operator FIPS image is comparable to the official [Keycloak Operator on Docker Hub](https://hub.docker.com/r/keycloak/keycloak-operator), Chainguard's image is also FIPS 140-3 compliant. Switching to the Chainguard image should not require any changes to your existing setup but you must create compatible (BCFKS) Keystore and use `--module-path=/usr/share/java/bouncycastle-fips` as `JAVA_TOOL_OPTIONS`. 

## FIPS Support

This image contains Bouncy Castle crypto libraries for FIPS.

The FIPS certified version of Bouncy Castle is compliant with the FIPS 140-3 standard when used in accordance with the Bouncy Castle Security Policy.

This image also ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

Please ensure that `--module-path=/usr/share/java/bouncycastle-fips` is used at runtime, with such path copied from this image.

## Getting Started

### 1. Install CRDs

Please replace the version with latest release of keycloak at the time of usage.

```bash
kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/26.2.5/kubernetes/keycloaks.k8s.keycloak.org-v1.yml
kubectl apply -f https://raw.githubusercontent.com/keycloak/keycloak-k8s-resources/26.2.5/kubernetes/keycloakrealmimports.k8s.keycloak.org-v1.yml
```

### 2. Generate a BCFKS Truststore

You must generate a BCFKS truststore using the FIPS image and signed by a CA and mount it into the operator pod. A sample workflow:

```bash
KEYSTORE_PASSWORD="AbCdEfG0!12345678NotReal"
NAMESPACE="keycloak-test"
TMPDIR="$(mktemp -d)"

openssl req -x509 -newkey rsa:2048   -keyout "${TMPDIR}/ca.key"   -out "${TMPDIR}/ca.crt"   -days 365 -nodes   -subj "/CN=localhost/O=KeycloakOperator/C=US"

kubectl run -n "$NAMESPACE" create-bcfks --rm -i --restart=Never   --image=cgr.dev/ORGANIZATION/keycloak-operator-fips:latest   --command -- sh -c "
    cat > /tmp/ca.crt <<EOF
$(cat ${TMPDIR}/ca.crt)
EOF
    keytool -importcert -keystore /tmp/server.bcfks -storetype BCFKS       -providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider       -providerpath /usr/share/java/quarkus-app/lib/main/org.bouncycastle.bcprov-jdk18on-1.80.jar       -alias rootca -file /tmp/ca.crt -storepass '${KEYSTORE_PASSWORD}' -noprompt &&     base64 /tmp/server.bcfks" > "${TMPDIR}/server.bcfks.b64"

base64 -d "${TMPDIR}/server.bcfks.b64" > "${TMPDIR}/server.bcfks"

kubectl create secret generic operator-truststore   --from-file=server.bcfks="${TMPDIR}/server.bcfks" -n "$NAMESPACE"
```

### 3. Deploy the Keycloak Operator (FIPS)

Example patch for the deployment YAML:

```yaml
containers:
- name: keycloak-operator
  image: cgr.dev/ORGANIZATION/keycloak-operator-fips:latest
  env:
  - name: JAVA_TOOL_OPTIONS
    value: "--module-path=/usr/share/java/bouncycastle-fips"
  volumeMounts:
  - name: truststore-volume
    mountPath: /mnt
volumes:
- name: truststore-volume
  secret:
    secretName: operator-truststore
```

```bash
kubectl apply -f keycloak-operator-fips-deployment.yaml
```

## Additional Resources

- [Keycloak Operator Documentation](https://www.keycloak.org/operator/installation)
- [FIPS-enabled Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [BouncyCastle FIPS Docs](https://www.bouncycastle.org/fips-java/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### geoserver

# geoserver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/geoserver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/geoserver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GeoServer is an open source Java-based server that allows you to share, process, and edit geospatial data.
It implements industry-standard OGC protocols including WMS (Web Map Service), WFS (Web Feature Service),
and WCS (Web Coverage Service) for serving maps and spatial data to various clients.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard GeoServer image is comparable to the [official GeoServer Docker image](https://github.com/geoserver/docker). Like most Chainguard Containers, it is designed with minimalism and security in mind:

- Runs as a non-root user (uid/gid 65532)
- Built on Tomcat 9 with OpenJDK 17
- Compatible with official GeoServer environment variables
- Includes only essential runtime dependencies

## Getting Started

### Running GeoServer Locally

To run GeoServer locally with the default demo data:

```shell
docker run -d -p 8080:8080 cgr.dev/ORGANIZATION/geoserver:latest
```

Access the GeoServer web interface at `http://localhost:8080/geoserver` with default credentials:
- **Username**: `admin`
- **Password**: `geoserver`

### Mounting a Custom Data Directory

To persist your GeoServer data and configuration:

```shell
docker run -d -p 8080:8080 \
  -v /path/to/data:/opt/geoserver_data \
  cgr.dev/ORGANIZATION/geoserver:latest
```

### Production Configuration

For production deployments, skip the demo data:

```shell
docker run -d -p 8080:8080 \
  -e SKIP_DEMO_DATA=true \
  -v /path/to/data:/opt/geoserver_data \
  cgr.dev/ORGANIZATION/geoserver:latest
```

### Deploying with Helm

GeoServer can be deployed to Kubernetes using the [NCSA Helm chart](https://artifacthub.io/packages/helm/ncsa/geoserver):

```shell
helm repo add ncsa https://opensource.ncsa.illinois.edu/charts/
helm repo update

helm install geoserver ncsa/geoserver \
  --set image.repository=cgr.dev/ORGANIZATION/geoserver \
  --set image.tag=latest
```

This approach is tested in our CI/CD pipeline and ensures compatibility with standard Kubernetes deployments.

### Installing Extensions

GeoServer supports various extensions that can be installed at startup:

```shell
docker run -d -p 8080:8080 \
  -e INSTALL_EXTENSIONS=true \
  -e STABLE_EXTENSIONS="ysld,ogcapi-features,wps" \
  cgr.dev/ORGANIZATION/geoserver:latest
```

Available extensions can be found at the [GeoServer extensions page](https://docs.geoserver.org/stable/en/user/extensions/index.html).

## Environment Variables

The Chainguard GeoServer image supports the following key environment variables:

- `GEOSERVER_DATA_DIR`: Path to GeoServer data directory (default: `/opt/geoserver_data/`)
- `SKIP_DEMO_DATA`: Skip loading demo data (default: `false`, set to `true` for production)
- `INSTALL_EXTENSIONS`: Enable extension installation (default: `false`)
- `STABLE_EXTENSIONS`: Comma-separated list of stable extensions to install
- `COMMUNITY_EXTENSIONS`: Comma-separated list of community extensions to install
- `CORS_ENABLED`: Enable CORS support (default: `false`)
- `POSTGRES_JNDI_ENABLED`: Enable PostgreSQL JNDI configuration (default: `false`)

For a complete list of environment variables, refer to the [official GeoServer Docker documentation](https://docs.geoserver.org/stable/en/user/installation/docker.html).

## Documentation and Resources

- [GeoServer Official Documentation](https://docs.geoserver.org/)
- [GeoServer Docker Container Guide](https://docs.geoserver.org/stable/en/user/installation/docker.html)
- [GeoServer GitHub Repository](https://github.com/geoserver/geoserver)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kratos

# kratos
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kratos` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kratos/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A microservice-oriented governance framework written in Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The Kratos Chainguard container includes the Kratos CLI and runtime, making it easy to create and run Kratos applications. Here's how to get started:

### Creating a New Kratos Project

```bash
# Create a new Kratos project
docker run --rm -v $(pwd):/workspace cgr.dev/ORGANIZATION/kratos new helloworld

# Navigate to the project directory
cd helloworld
```

### Running a Kratos Application

```bash
# Run the application using the Kratos container
docker run --rm -p 8000:8000 -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/kratos run
```

Your Kratos application will be available at `http://localhost:8000/helloworld/kratos`.

## Compatibility Notes

The Kratos Chainguard container is designed to be compatible with standard Kratos applications:

- **Go version**: Built with the latest stable Go version
- **Protobuf**: Includes protoc and necessary plugins
- **Dependencies**: Common Kratos dependencies are pre-installed
- **Architecture**: Supports both amd64 and arm64 architectures

## Documentation and Resources

For more information about Kratos and how to use it effectively:

- [Kratos Official Documentation](https://go-kratos.dev/docs/)
- [Kratos Examples Repository](https://github.com/go-kratos/examples)
- [Kratos GitHub Repository](https://github.com/go-kratos/kratos)
- [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes) for container best practices

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nodetaint

# nodetaint
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nodetaint` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nodetaint/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [nodetaint](https://github.com/wish/nodetaint) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To install on you Kubernetes, you can use the `Helm`:

```shell
git clone https://github.com/wish/nodetaint && cd nodetaint

helm install nodetaint ./chart \
  --namespace nodetaint \
  --create-namespace \
  --set image.registry=${IMAGE_REGISTRY} \
  --set image.repository=${IMAGE_REPOSITORY} \
  --set image.tag=${IMAGE_TAG}
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-aws-fips

# crossplane-aws-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-aws-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-aws-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Crossplane providers for managing Amazon Web Services (AWS) services on Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Crossplane AWS providers are comparable to the [official AWS Crossplane providers](https://github.com/crossplane-contrib/provider-upjet-aws) with the following architectural differences:

- **Deployment pattern**: Deploy Chainguard's AWS family provider first, then deploy individual providers for services as needed.
- **Package management**: Chainguard's providers can not be installed with the Crossplane package manager.

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

### Deployment

**Upstream providers** can be deployed individually and will automatically resolve their dependencies whereas **Chainguard's providers** require manual installation of dependencies. When deploying Chainguard's AWS Crossplane providers, `skipDependencyResolution: true` must be set in the resource for the provider you are deploying.

This is because the Crossplane package manifest used by Crossplane providers contain references to other dependencies, including the registry and repository of the dependency. Our customers use various repositories and registries and there isn't an effective way to account for all of them.

Because of this limitation, using the Crossplane package manager with these providers is not possible.

## Getting Started

### Deploy the AWS Family Provider

To manage resources on AWS with Crossplane, begin by deploying Chainguard's AWS family provider:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-family-aws
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-fips:latest
```

### Installing providers

Install the providers your deployment needs alongside the family provider. Use `skipDependencyResolution: true` to prevent upstream dependencies from being automatically installed:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-s3
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-s3-fips:latest
  skipDependencyResolution: true
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-eks
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-eks-fips:latest
  skipDependencyResolution: true
```

## Configuration

After installing your desired providers, configure AWS credentials using a ProviderConfig:

```bash
# Create credentials secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: aws-secret
  namespace: crossplane-system
type: Opaque
stringData:
  creds: |
    [default]
    aws_access_key_id = ${AWS_ACCESS_KEY_ID}
    aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
    aws_session_token = ${AWS_SESSION_TOKEN}
EOF

# Create ProviderConfig
cat <<EOF | kubectl apply -f -
apiVersion: aws.m.upbound.io/v1beta1
kind: ClusterProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-secret
      key: creds
EOF
```

Once configured, you can create AWS resources. Example S3 bucket creation:

```yaml
apiVersion: s3.aws.m.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-secure-bucket
spec:
  forProvider:
    region: us-west-2
  providerConfigRef:
    name: default
```

## Available Images

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `xpkg.upbound.io/upbound/provider-family-aws`         | `cgr.dev/ORGANIZATION/crossplane-aws-fips`                |
| `xpkg.upbound.io/upbound/provider-aws-cloudformation` | `cgr.dev/ORGANIZATION/crossplane-aws-cloudformation-fips` |
| `xpkg.upbound.io/upbound/provider-aws-cloudfront`     | `cgr.dev/ORGANIZATION/crossplane-aws-cloudfront-fips`     |
| `xpkg.upbound.io/upbound/provider-aws-cloudwatchlogs` | `cgr.dev/ORGANIZATION/crossplane-aws-cloudwatchlogs-fips` |
| `xpkg.upbound.io/upbound/provider-aws-cognitoidentity`| `cgr.dev/ORGANIZATION/crossplane-aws-cognitoidentity`|
| `xpkg.upbound.io/upbound/provider-aws-dynamodb`       | `cgr.dev/ORGANIZATION/crossplane-aws-dynamodb-fips`       |
| `xpkg.upbound.io/upbound/provider-aws-ec2`            | `cgr.dev/ORGANIZATION/crossplane-aws-ec2-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-ecr`            | `cgr.dev/ORGANIZATION/crossplane-aws-ecr-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-efs`            | `cgr.dev/ORGANIZATION/crossplane-aws-efs-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-elasticache`    | `cgr.dev/ORGANIZATION/crossplane-aws-elasticacahe-fips`   |
| `xpkg.upbound.io/upbound/provider-aws-eks`            | `cgr.dev/ORGANIZATION/crossplane-aws-eks-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-firehose`       | `cgr.dev/ORGANIZATION/crossplane-aws-firehose-fips`       |
| `xpkg.upbound.io/upbound/provider-aws-iam`            | `cgr.dev/ORGANIZATION/crossplane-aws-iam-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-kinesis`        | `cgr.dev/ORGANIZATION/crossplane-aws-kinesis-fips`        |
| `xpkg.upbound.io/upbound/provider-aws-kms`            | `cgr.dev/ORGANIZATION/crossplane-aws-kms-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-lambda`         | `cgr.dev/ORGANIZATION/crossplane-aws-lambda-fips`         |
| `xpkg.upbound.io/upbound/provider-aws-memorydb`       | `cgr.dev/ORGANIZATION/crossplane-aws-memorydb-fips`       |
| `xpkg.upbound.io/upbound/provider-aws-rds`            | `cgr.dev/ORGANIZATION/crossplane-aws-rds-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-s3`             | `cgr.dev/ORGANIZATION/crossplane-aws-s3-fips`             |
| `xpkg.upbound.io/upbound/provider-aws-sns`            | `cgr.dev/ORGANIZATION/crossplane-aws-sns-fips`            |
| `xpkg.upbound.io/upbound/provider-aws-sqs`            | `cgr.dev/ORGANIZATION/crossplane-aws-sqs-fips`            |

## Documentation and Resources

- [Crossplane AWS Provider Documentation](https://github.com/crossplane-contrib/provider-upjet-aws)
- [Crossplane Getting Started Guide](https://docs.crossplane.io/latest/get-started/get-started-with-managed-resources/)
- [AWS Provider Examples](https://github.com/crossplane-contrib/provider-upjet-aws/tree/main/examples)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### custom-pod-autoscaler-operator

# custom-pod-autoscaler-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/custom-pod-autoscaler-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/custom-pod-autoscaler-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Operator for managing Kubernetes Custom Pod Autoscalers (CPA)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `custom-pod-autoscaler-operator` image is a drop-in replacement for the upstream [custompodautoscaler/operator](https://hub.docker.com/r/custompodautoscaler/operator) container image. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

Start by installing the Helm chart for the autoscaler operator:

```shell
VERSION=v1.4.2 # Set the latest version you want to install
helm install custom-pod-autoscaler-operator https://github.com/jthomperoo/custom-pod-autoscaler-operator/releases/download/${VERSION}/custom-pod-autoscaler-operator-${VERSION}.tgz
```

The upstream Helm Chart doesn't support overriding the image, so you will need to substitute the image after deploying the operator:

```shell
kubectl set image deployment/custom-pod-autoscaler-operator custom-pod-autoscaler-operator=cgr.dev/ORGANIZATION/custom-pod-autoscaler-operator:latest
```

Now you can deploy a `CustomPodAutoscaler` resource. See the linked documentation below for more details.

## Documentation and Resources
- [Installation Guide](https://github.com/jthomperoo/custom-pod-autoscaler-operator/blob/master/INSTALL.md)
- [Usage Guide](https://github.com/jthomperoo/custom-pod-autoscaler-operator/blob/master/USAGE.md)
- [Helm Chart](https://github.com/jthomperoo/custom-pod-autoscaler-operator/tree/master/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-azure

# crossplane-azure
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-azure` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-azure/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane lets you build a control plane with Kubernetes-style declarative and API-driven configuration and management for anything

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

These images provide Crossplane providers for Azure.

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `xpkg.upbound.io/upbound/provider-azure` | `cgr.dev/chainguard/crossplane-azure` |
| `xpkg.upbound.io/upbound/provider-azure-authorization` | `cgr.dev/chainguard/crossplane-azure-authorization` |
| `xpkg.upbound.io/upbound/provider-azure-managedidentity` | `cgr.dev/chainguard/crossplane-azure-managedidentity` |
| `xpkg.upbound.io/upbound/provider-azure-sql` | `cgr.dev/chainguard/crossplane-azure-sql` |
| `xpkg.upbound.io/upbound/provider-azure-storage` | `cgr.dev/chainguard/crossplane-azure-storage` |

You can use them by following the [Azure Quickstart](https://marketplace.upbound.io/providers/upbound/provider-family-azure) and using the Chainguard image instead of the upstream image:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-azure-sql
spec:
  package: cgr.dev/chainguard/crossplane-azure-sql:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-sql-fips

# crossplane-sql-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-sql-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-sql-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Crossplane provider for SQL FIPS version

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-sql
spec:
  package: cgr.dev/chainguard/crossplane-sql-fips:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ingress-nginx-controller-fips

# ingress-nginx-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ingress-nginx-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ingress-nginx-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

`ingress-nginx-controller-fips` can be deployed using the upstream [ingress-nginx helm chart](https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx).

The Chainguard image must be specified when invoking the chart, example:

```bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx --set image.repository=cgr.dev/ORGANIZATION/ingress-nginx-controller-fips
```

For more information on ingress-nginx, refer to the [upstream documentation](https://kubernetes.github.io/ingress-nginx).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-fluent-bit-output

# newrelic-fluent-bit-output
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-fluent-bit-output` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-fluent-bit-output/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-fluent-bit-output](https://github.com/newrelic/newrelic-fluent-bit-output) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle). chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes

# kubernetes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Production-Grade Container Scheduling and Management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
Kubernetes, often referred to as K8s, is an open-source platform that automates the deployment, scaling, and operation of containerized applications. It provides key features such as service discovery, load balancing, storage orchestration, and self-healing.

Kubernetes builds upon years of experience running production workloads at scale within Google, leveraging concepts from the Borg system. It has since grown into a robust, production-grade system hosted by the Cloud Native Computing Foundation (CNCF).

For more information on how Kubernetes works and the community behind it, refer to:

- [Kubernetes Documentation](https://github.com/kubernetes)
- [CNCF Kubernetes Project](https://www.cncf.io/)

## Kubernetes Components
This image includes the following core Kubernetes components:

### kube-scheduler: 
Schedules pods to run on specific nodes based on resource availability and constraints. [For more info](https://github.com/kubernetes/kube-scheduler)

### kube-proxy: 
Manages network connectivity and load balancing between services. [For more info](https://github.com/kubernetes/kube-proxy)

### kube-controller-manager: 
Runs various controllers that handle node management, pod replication, and more. [For more info](https://github.com/kubernetes/kube-controller-manager)

### kube-apiserver: 
The central management entity that exposes the Kubernetes API, handles requests, and processes updates. [For more info](https://github.com/kubernetes/apiserver)

Each component plays a critical role in managing the lifecycle and operation of a Kubernetes cluster. These components work together to ensure scalability, availability, and reliability of containerized applications.

### kubernetes-pause:
Using the Chainguard `kubernetes-pause` image requires changing the containerd configuration on the nodes. If you've set up SSH access to the underlying nodes of the cluster, then you can edit the containerd configuration file directly.

If you don't have access to the nodes then you can use a plugin called [kubectl-node-shell](https://github.com/kvaps/kubectl-node-shell)

In the containerd configuration on the node, the default `sandbox_image` needs to be replaced with the Chainguard pause image. Use the editor of your choice to replace the default pause image with the Chainguard pause image:

```toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "cgr.dev/$ORGANIZATION/kubernetes-pause:latest"
```

After this, restart the containerd service:

```shell
sudo systemctl restart containerd
```

Checking the list of containers using the `ctr` command will show the pause container with the Chainguard pause image:

```shell
ctr -n k8s.io containers list
```

#### Compatibility Notes

The pause image user now aligns to upstream `registry.k8s.io/pause` image and runs as non-root user.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### linkerd

# linkerd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/linkerd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/linkerd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## usage

Linkerd can be installed either using linkerd CLI or using helm charts. The following steps will guide you through the installation process using the linkerd CLI.

In cases where you need network-level visibility into packets entering and leaving your application, Linkerd provides a debug sidecar with some helpful tooling. Similar to how proxy sidecar injection works, you add a debug sidecar to a pod by setting the config.linkerd.io/enable-debug-sidecar: "true" annotation at pod creation time. 

For installing the core components of linkerd,

## Prepare the Core Component Values
```
cat <<EOF > linkerd-core-values.yaml
controllerImage: cgr.dev/chainguard/linkerd-controller
linkerdVersion: latest
proxy:
  image:
    name: cgr.dev/chainguard/linkerd-proxy
    version: latest
proxyInit:
  image:
    name: cgr.dev/chainguard/linkerd-proxy-init
    version: latest
debugContainer:
  image:
    name: cgr.dev/chainguard/linkerd-debug
    version: latest
proxyLogLevel: "linkerd=debug,info"
EOF
```

## Install the Core Components
```
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/latest/download/standard-install.yaml
linkerd install --crds | kubectl apply -f -
linkerd install -f linkerd-core-values.yaml | kubectl apply -f -
```

## Prepare the Viz Component Values
```
cat <<EOF > linkerd-viz-values.yaml
tap:
  image:
    registry: cgr.dev/chainguard
    name: linkerd-tap
    tag: latest
dashboard:
  image:
    registry: cgr.dev/chainguard
    name: linkerd-web
    tag: latest
metricsAPI:
  image:
    registry: cgr.dev/chainguard
    name: linkerd-metrics-api
    tag: latest
tapInjector:
  image:
    registry: cgr.dev/chainguard
    name: linkerd-tap
    tag: latest
EOF
```

## Install the Viz Components
```
linkerd viz install -f linkerd-viz-values.yaml | kubectl apply -f -
```

After installation `linkerd check` can be run to validate the installation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kaniko

# kaniko
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kaniko` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kaniko/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Build Container Images In Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are several ways of running Kaniko and one of them is Kubernetes, where you can use the official documentation of Kaniko to deploy it in a Kubernetes cluster, [here](https://github.com/GoogleContainerTools/kaniko/blob/main/README.md#running-kaniko-in-a-kubernetes-cluster) but in a nutshell, you can use the following command:

```bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: cgr.dev/chainguard-private/kaniko:latest
    args:
    - "--context=<your_git_reference_with_Dockerfile_included>" # many others contextes are available
    - "--destination=<your_docker_image_reference>"
    volumeMounts:
    - name: kaniko-secret
      mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
  - name: kaniko-secret
    secret:
      secretName: dockercred
      items:
        - key: .dockerconfigjson
          path: config.json
EOF
```

**NOTE:** If you are using a private registry, you will need to have a secret named `dockercred` with the `.dockerconfigjson` key containing your Docker credentials in this example.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudprober-fips

# cloudprober-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudprober-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudprober-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-iamguarded

# memcached-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Memcached](https://memcached.org/) is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Memcached IAMGuarded is a security-enhanced variant of Memcached designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Memcached deployments.

## Helm Chart Installation

The Memcached IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Memcached image
image:
  registry: myregistry.example.com
  repository: mirrored/memcached-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/memcached-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/memcached:1.6.38
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Memcached IAMGuarded installation using standard Memcached verification methods. The deployment functions as a standard Memcached instance, so all typical Memcached validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Memcached IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Memcached and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-iamguarded

# clickhouse-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based ClickHouse analytics database image. [Clickhouse](https://clickhouse.com) is the fastest and most resource efficient open-source database for real-time apps and analytics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

ClickHouse IAMGuarded is a security-enhanced variant of ClickHouse designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes configuration management capabilities and provides additional security benefits over standard ClickHouse deployments.

## Helm Chart Installation

The ClickHouse IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install clickhouse oci://cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main ClickHouse image
image:
  registry: myregistry.example.com
  repository: mirrored/clickhouse-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install clickhouse oci://cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g.:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/clickhouse:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your ClickHouse IAMGuarded installation using standard ClickHouse verification methods. The deployment functions as a standard ClickHouse instance, so all typical ClickHouse validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The ClickHouse IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both ClickHouse and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### traefik-fips

# traefik-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/traefik-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/traefik-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crane-fips

# crane-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crane-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crane-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based crane-fips image to interact with container registries. Crane is used for inspecting and manipulating container images, allowing you to view manifests, verify image layers, and check cryptographic signatures.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `crane-fips` image is comparable to the [official Crane image](https://gcr.io/go-containerregistry/crane). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `/usr/bin/crane`, compared to upstream's entrypoint of `/ko-app/crane`.

This image is built and tested for FIPS compliance to meet strict security standards in regulated environments.

## Getting started

You can inspect the `crane-fips` image manifest using the `crane-fips` image with the following command. The manifest provides a summary of key metadata about the image, including the image layers, digest information, annotations, and more.

```shell
docker run --rm cgr.dev/ORGANIZATION/crane-fips:latest manifest cgr.dev/ORGANIZATION/crane-fips:latest --platform=linux/amd64
```

When you run this command, you will receive output similar to the following:

```
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 968,
    "digest": "sha256:xxxxx"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 4990473,
      "digest": "sha256:xxxxx"
    }
  ],
  "annotations": {
    ......
  }
}
```

## Documentation and Resources

For more information, you can refer to the [official Crane documentation](https://gocrane.io/docs/). You might also find this [Crane CLI cheatsheet](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) to be useful.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-openshift-routes

# cert-manager-openshift-routes
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-openshift-routes` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-openshift-routes/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenShift Route support for cert-manager

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream `ghcr.io/cert-manager/cert-manager-openshift-routes:latest` Image. Like most other Chainguard Images, this image has few-to-zero CVEs.
If you want to use the image with a shell and package manager, you can use the `-dev` variant of this image.

## Getting Started
**Note:** For getting started with Openshift routes, we need to deploy it in an **OpenShift Cluster**.

### Prerequisites:
1. Ensure you have cert-manager installed through the method of your choice. Make sure you install `cert-manager` and `openshift-routes-deployment` in the same namespace. By default this is in the namespace `cert-manager`. For example, with Helm:
```shell
helm install \
  cert-manager oci://quay.io/jetstack/charts/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true
```
2. Both **ClusterIssuer** and namespace based **Issuer** are possible. Here, a **ClusterIssuer** is used:
For example, create the ClusterIssuer (no additional ingress class is needed for the `openshift-ingress` router. The `example.com` email must be replaced by another one):
```yaml
apiVersion: v1
items:
  - apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      annotations:
      name: letsencrypt-prod
    spec:
      acme:
        email: mymail@example.com
        preferredChain: ""
        privateKeySecretRef:
          name: letsencrypt-prod
        server: https://acme-v02.api.letsencrypt.org/directory
        solvers:
          - http01:
              ingress: {}
```
```shell
oc apply -f clusterissuer.yaml
```
3. Make sure that there is an A record on the load balancer IP or a CNAME record on the load balancer hostname in your DNS system for the HTTP-01 subdomain.
```
CNAME:
  Name: *.service.clustername.domain.com
  Alias: your-lb-domain.cloud
```

### Installation
The openshift-routes component can be installed using the Helm chart:
```shell
# Override default openshift-routes image with Chainguard variant
helm install openshift-routes oci://ghcr.io/cert-manager/charts/openshift-routes \
  -n cert-manager \
  --set image.repository=cgr.dev/ORGANIZATION/cert-manager-openshift-routes \
  --set image.tag=latest
```

## Documentation and Resources
- [Project Repository](https://github.com/cert-manager/openshift-routes)
- [Usage Instructions](https://github.com/cert-manager/openshift-routes?tab=readme-ov-file#usage)
- [Documentation on Route configuration](https://docs.redhat.com/en/documentation/openshift_container_platform/4.11/html/networking/configuring-routes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-redis-exporter-iamguarded

# prometheus-redis-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-redis-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-redis-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus Redis Exporter image for exporting metrics to Redis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Redis Exporter IAMGuarded image is a security-enhanced variant of Redis designed to be deployed using multiple IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Redis deployments.

## Helm Chart Installation

The Redis IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Redis server image
image:
  registry: myregistry.example.com
  repository: mirrored/redis-server-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Redis Sentinel image for high availability
sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-sentinel-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for sysctl
sysctl:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Redis exporter for metrics
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# kubectl image for management operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication
For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install redis oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/redis:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Redis IAMGuarded installation using standard Redis verification methods. The deployment functions as a standard Redis instance, so all typical Redis validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Redis IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Redis and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

### Redis Cluster

For sharded, distributed Redis deployments, use the Redis Cluster chart:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster
```

#### Basic Installation

```bash
helm install redis-cluster oci://cgr.dev/$ORGANIZATION/iamguarded-charts/redis-cluster \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

#### Configuration

The Redis Cluster chart uses the following images from this module:

- **redis-cluster-iamguarded**: Main Redis Cluster nodes
- **os-shell-iamguarded**: Volume permissions initialization
- **prometheus-redis-exporter-iamguarded**: Metrics collection (when enabled)

Example configuration with custom registry:

```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/redis-cluster-iamguarded
  digest: sha256:... # Use specific digest instead of tag
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:...
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-volume-modifier-for-k8s

# aws-volume-modifier-for-k8s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-volume-modifier-for-k8s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-volume-modifier-for-k8s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation

> For the documentation about the EBS CSI driver, please refer to the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html).

### Install via helm

> For full instruction, refer to the [helm chart documentation](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md).

Install the EBS CSI driver via the official Helm chart, enabling the `volume-modify` feature that enable the sidecar controller into the CSI driver controller `Deployment`, via the Helm value `controller.volumeModificationFeature.enable`.

Set the `volumemodifier` sidecar controller image to the Chainguard one, via the Helm values `sidecars.volumemodifier.image.repository` and `sidecars.volumemodifier.image.tag`.

Please find an example of `values` below:

```yml
sidecars:
  volumemodifier:
    image:
      repository: cgr.dev/chainguard/aws-volume-modifier-for-k8s
      tag: latest
controller:
  volumeModificationFeature:
    enabled: true
```

Below is an example, of how to use the helm chart, using both the EBS CSI driver and
Volume Modifier Chainguard images.

Add the helm repo:

```bash
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver/
helm repo update
```

Install the chart:

```bash
helm upgrade --install aws-ebs-csi-driver --namespace kube-system aws-ebs-csi-driver/aws-ebs-csi-driver \
  --set controller.volumeModificationFeature.enabled=true \
  --set sidecars.volumemodifier.image.repository=cgr.dev/chainguard/aws-volume-modifier-for-k8s \
  --set sidecars.volumemodifier.image.tag=latest \
  --set image.repository=cgr.dev/chainguard-private/aws-ebs-csi-driver \
  --set image.tag=latest
```

### Installation via EKS add-on

EKS supports installation of the ebs-csi-driver as an EKS add-on. There are
instructions in the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html).

If you've chosen this installation method, keep in mind that you cannot specify a custom image whilst
installing via EKS add-on.

You'll need to patch the `ebs-csi-controller` deployment to use the Chainguard
image, however this is a step you'll need to repeat each time that you re-deploy
or upgrade the version via EKS add-ons.

## Volume modification

To modify volumes with annotations as expected by the `volumemodifier` EBS CSI driver's sidecar controller, please refer to the [official documentation](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/modify-volume.md#volume-modifier-for-k8s-1). 

Supported annotations on `PersistentVolumeClaim`s are:
* `ebs.csi.aws.com/volumeType`
* `ebs.csi.aws.com/iops`

For instance, you can set and update dynamically those attributes on a `PersistentVolumeClaim` like below:

```yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
  annotations:
    ebs.csi.aws.com/volumeType: "io2"
    ebs.csi.aws.com/iops: "4000"
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 100Gi
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### bats

# bats
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/bats` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/bats/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Bats provides a simple way to verify that the UNIX programs you write behave as expected.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Bats Image is comparable to the [official Bats Image from Docker Hub](https://hub.docker.com/r/bats/bats). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

## Getting started

As an example of how you can use this image, first create a test file named `test.bats`:

```
cat > test.bats <<EOF
#!/usr/bin/env bats

@test "addition using bc" {
  result="$(echo 2+2 | bc)"
  [ "$result" -eq 4 ]
}

@test "addition using dc" {
  result="$(echo 2 2+p | dc)"
  [ "$result" -eq 4 ]
}
EOF
```

Then run the following `docker` command:

```shell
docker run --rm -it \
  -v "$(pwd)":/code \
  cgr.dev/ORGANIZATION/bats:latest \
  test.bats
```

Note these two arguments included in this command:

- `-v "$(pwd)":/code`: Mount the current directory (where test.bats is located) into the container at /code
- `test.bats`: This is passed as an argument to the default entrypoint (`bash bats`) to execute the test file.

## Documentation and Resources
- [Official bats-core documentation](https://bats-core.readthedocs.io/en/stable/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zookeeper-iamguarded

# zookeeper-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zookeeper-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zookeeper-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Apache ZooKeeper](https://zookeeper.apache.org/) is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

ZooKeeper IAMGuarded is a security-enhanced variant of ZooKeeper designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard ZooKeeper deployments.

## Helm Chart Installation

The ZooKeeper IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install zookeeper oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main ZooKeeper image
image:
  registry: myregistry.example.com
  repository: mirrored/zookeeper-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install zookeeper oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/zookeeper
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/zookeeper:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your ZooKeeper IAMGuarded installation using standard ZooKeeper verification methods. The deployment functions as a standard ZooKeeper instance, so all typical ZooKeeper validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The ZooKeeper IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both ZooKeeper and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spark-operator

# spark-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spark-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spark-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, Wolfi-based image for Spark Operator. Facilitates the deployment and management of Apache Spark applications in Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Spark Operator image is comparable to the [Kubeflow Spark Operator image on Docker Hub](https://hub.docker.com/r/kubeflow/spark-operator). Chainguard's image includes only the minimum set of dependencies needed to run Spark Operator.

## Getting Started

### Preparation

Before you deploy the operator, you'll need to create a values manifest, `values.yaml`:

```yaml
image:
  registry: "cgr.dev"
  repository: "ORGANIZATION/spark-operator"
  tag: "latest"
```

### Deployment

To deploy Spark Operator, start by adding the Helm chart repository:

```bash
helm repo add spark-operator https://kubeflow.github.io/spark-operator
helm repo update
```

Then deploy the operator with Helm:

```bash
helm install spark-operator spark-operator/spark-operator --values ./values.yaml
```

You should now be up and running with Spark Operator!

## Documentation and Resources

- [Overview](https://www.kubeflow.org/docs/components/spark-operator/overview/)
- [Getting Started](https://www.kubeflow.org/docs/components/spark-operator/getting-started/)
- [User Guide](https://www.kubeflow.org/docs/components/spark-operator/user-guide/)
- [GitHub Repository](https://github.com/kubeflow/spark-operator)
- [Helm Chart](https://github.com/kubeflow/spark-operator/tree/master/charts/spark-operator-chart)
- [Configuring Spark](https://spark.apache.org/docs/latest/configuration.html)
- [Spark Documentation](https://spark.apache.org/documentation.html)
- [Spark Quick Start Tutorial](https://spark.apache.org/docs/latest/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-operator

# clickhouse-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for ClickHouse. Creates, configures and manages ClickHouse clusters running on Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Clickhouse Operator container image is comparable to [the clickhouse operator image](https://hub.docker.com/r/altinity/clickhouse-operator). Like most other Chainguard container images, the Clickhouse Operator container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's Clickhouse Operator container image can be installed via the [clickhouse-operator helm chart](https://github.com/Altinity/clickhouse-operator/tree/master/deploy/helm/clickhouse-operator).

Create a `values.yaml` file with the following values

```
operator:
  image:
    repository: cgr.dev/ORGANIZATION/clickhouse-operator
    tag: latest
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add clickhouse-operator https://github.com/Altinity/clickhouse-operator
helm install https://github.com/Altinity/clickhouse-operator deploy/helm -f values.yaml
```

We can then try creating a basic ClickHouse Cluster with the following manifest:

```
apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
  name: "simple-01"
spec:
  configuration:
    users:
      # printf 'test_password' | sha256sum
      test_user/password_sha256_hex: 10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01
      test_user/password: test_password
      # to allow access outside from kubernetes
      test_user/networks/ip:
        - 0.0.0.0/0
    clusters:
      - name: "simple"
```

Once cluster is created, we can verify it by running the following command:

```
kubectl get pods -n test-clickhouse-operator
NAME                    READY   STATUS    RESTARTS   AGE
chi-b3d29f-a242-0-0-0   1/1     Running   0          10m
```

## Documentation and Resources

- [Official Documentation](https://github.com/Altinity/clickhouse-operator/tree/master/docs)
- [Official Quick Start Guide](https://github.com/Altinity/clickhouse-operator/blob/master/docs/quick_start.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### yunikorn-scheduler-fips

# yunikorn-scheduler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/yunikorn-scheduler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/yunikorn-scheduler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache YuniKorn K8shim

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is a Getting Started guide for the YuniKorn Scheduler available in the official repository [here](https://yunikorn.apache.org/docs/) where you can learn more about deploying and using Yunikorn Scheduler but the most common way to deploy it is by using the following Helm command:

```shell
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
kubectl create namespace yunikorn
helm install yunikorn yunikorn/yunikorn \
   --namespace yunikorn \
   --set image.repository=cgr.dev/chainguard/yunikorn-scheduler-fips \
   --set image.tag=latest
```

Then you will be able to deploy your applications using the YuniKorn Scheduler like this:

```shell
cat <<EOF | kubectl apply -f-
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-different-scheduler
  labels:
    name: multischeduler-example
spec:
  schedulerName: yunikorn
  containers:
  - name: pod-with-different-scheduler
    image: alpine
    command: ["sh"]
    args: ["-c", "sleep 3600"]
EOF
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### seaweedfs-operator

# seaweedfs-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/seaweedfs-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/seaweedfs-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

seaweedfs kubernetes operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a drop-in replacement for the upstream [seaweedfs/seaweedfs-operator](https://hub.docker.com/r/chrislusf/seaweedfs-operator/tags) image. No changes to your configuration are required when switching to the Chainguard image.

## Getting Started

To deploy the SeaweedFS Operator using the Chainguard image, you can use Kubernetes manifests or Helm. The operator manages SeaweedFS clusters within your Kubernetes environment.

### Using Helm

If using Helm, override the image in your values file:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/seaweedfs-operator
  tag: latest
```

To know more about deploying it via Helm chart, please refer to the [SeaweedFS Operator Helm Chart documentation](https://github.com/seaweedfs/seaweedfs-operator/tree/master?tab=readme-ov-file#helm).

## Documentation and Resources

For more information about SeaweedFS Operator, please refer to:

* [SeaweedFS Operator GitHub Repository](https://github.com/seaweedfs/seaweedfs-operator)
* [SeaweedFS Documentation](https://github.com/seaweedfs/seaweedfs/wiki)
* [SeaweedFS Operator Usage Guide](https://github.com/seaweedfs/seaweedfs-operator/blob/master/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ip-masq-agent

# ip-masq-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ip-masq-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ip-masq-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image to manage IP masquerading on Kubernetes nodes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-bridge-fips

# kafka-bridge-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-bridge-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-bridge-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant HTTP bridge for Apache Kafka using Vert.x framework

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `kafka-bridge-fips` image is a FIPS-compliant drop-in replacement for the upstream [Strimzi Kafka Bridge](https://github.com/strimzi/strimzi-kafka-bridge). It maintains full compatibility with the Strimzi operator while providing FIPS validated cryptographic modules.

### FIPS Support

The `kafka-bridge-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module and FIPS-compliant Java cryptographic libraries. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Install the Strimzi Kafka Operator using Helm:

```sh
kubectl create namespace kafka

helm install strimzi-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator \
  --namespace kafka \
  --set watchAnyNamespace=true
```

Deploy the FIPS-compliant Kafka Bridge using the Strimzi `KafkaBridge` custom resource:

```yaml
apiVersion: kafka.strimzi.io/v1
kind: KafkaBridge
metadata:
  name: my-bridge
  namespace: kafka
spec:
  replicas: 1
  bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9092
  http:
    port: 8080
  image: cgr.dev/ORGANIZATION/kafka-bridge-fips:latest
```

Apply the configuration:

```sh
kubectl apply -f kafka-bridge.yaml -n kafka
```

The Strimzi operator will create a Deployment, ConfigMap, and Service for the bridge automatically.

NOTE: Running multiple replicas is not recommended. The Kafka Bridge maintains in-memory consumer state, requiring HTTP clients to maintain affinity to the same instance.

## Documentation and Resources

* [Strimzi Kafka Bridge Documentation](https://strimzi.io/docs/bridge/latest/)
* [Strimzi Deploying and Managing Guide](https://strimzi.io/docs/operators/latest/deploying)
* [Kafka Bridge GitHub Repository](https://github.com/strimzi/strimzi-kafka-bridge)
* [FIPS-enabled Chainguard Images Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### eck-operator

# eck-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/eck-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/eck-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Elastic Cloud on Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are several ways to deploy the ECK operator. You can follow up the [Quickstart guide](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html) or you can use the [Helm Chart](https://artifacthub.io/packages/helm/elastic/eck-operator) available in Artifact Hub to deploy the operator.

The following example is going to show how to deploy the ECK operator using a its Helm Chart.

### Deploy the ECK operator using Helm

1. Add the Elastic Helm repository:

```bash
helm repo add elastic https://helm.elastic.co
```

2. Install the ECK operator:

```bash

helm install elastic-operator elastic/eck-operator --namespace elastic-system --set image.repository=cgr.dev/chainguard/eck-operator --set image.tag=latest
```

### Deploy an Elasticsearch cluster

1. Create a file called `elasticsearch.yaml` with the following content:

```yaml
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.13.3
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
```

2. Deploy the Elasticsearch cluster:

```
kubectl apply -f elasticsearch.yaml
```

3. Check the Elasticsearch cluster status:

```
kubectl get elasticsearch quickstart -o=jsonpath='{.status.phase}'
```

4. Access the Elasticsearch cluster:

```
kubectl port-forward service/quickstart-es-http 9200
```

5. Get the password for the `elastic` user:

```
PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
```

6. Access the Elasticsearch cluster using curl:

```
curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
```

That's it! You have deployed an Elasticsearch cluster using the ECK operator.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### haproxy-iamguarded

# haproxy-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/haproxy-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/haproxy-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal [haproxy](https://www.haproxy.org/) base image rebuilt every night from source.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

HAProxy IAMGuarded is a security-enhanced variant of haproxy designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard haproxy deployments.

## Helm Chart Installation

The HAProxy IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install haproxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main haproxy image
image:
  registry: myregistry.example.com
  repository: mirrored/haproxy-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install haproxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/haproxy
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/haproxy:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your HAProxy IAMGuarded installation by checking that metrics are being exposed correctly. The deployment functions as a standard haproxy instance, so all typical haproxy validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The HAProxy IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both haproxy and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### istio-base

# istio-base
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/istio-base` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/istio-base/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Istio base image with network debugging utilities

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `REPO_NAME` image is a drop-in replacement for the upstream [istio/base](https://hub.docker.com/r/istio/base) image. It provides the same network debugging utilities required by Istio's sidecar proxies and network configuration.

### User

The Chainguard image runs as a non-root user (`istio-proxy`, UID 1337) by default, matching Istio's expected user configuration. The upstream image does not set a default user. This aligns with Istio's security model where the sidecar proxy runs as UID 1337.

### Environment variables

The Chainguard image does not include the `DEBIAN_FRONTEND` environment variable present in the upstream image, as this is specific to Debian package management and not required at runtime.

## Prerequisites

To use the `REPO_NAME` image, you need:

- Docker installed and running, or a Kubernetes cluster with Istio
- Access to the Chainguard Registry

## Getting Started

The `REPO_NAME` image is primarily used as a base image for Istio's sidecar proxy containers. It includes essential network debugging utilities for troubleshooting service mesh connectivity.

### Verifying network tools

You can verify the included network debugging utilities:

```shell
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "curl --version"
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "ip -Version"
docker run --rm cgr.dev/ORGANIZATION/REPO_NAME:latest -c "dig -v"
```

### Available utilities

The image includes the following network debugging tools:

- `curl` - HTTP client for testing connectivity
- `iptables` and `nft` - Firewall rule management
- `ip` - Network interface configuration
- `ping` - ICMP connectivity testing
- `tcpdump` - Packet capture and analysis
- `conntrack` - Connection tracking
- `netstat` - Network statistics
- `lsof` - List open files and sockets
- `nc` (netcat) - Network utility for reading/writing connections
- `dig` - DNS lookup utility
- `sudo` - Privilege escalation for debugging

## Configuration

### User and group

The image uses the `istio-proxy` user and group (UID/GID 1337), which is the standard user for Istio sidecar containers.

### Shell

The default command is `/bin/bash`, providing a shell environment for debugging and executing commands.

## Documentation and Resources

- [Istio Official Documentation](https://istio.io/latest/docs/)
- [Istio GitHub Repository](https://github.com/istio/istio)
- [Istio Architecture Overview](https://istio.io/latest/docs/ops/deployment/architecture/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falco-fips

# falco-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falco-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falco-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `falco-fips` image is based on the upstream [Falco project](https://falco.org/) with FIPS 140-3 compliance features:

* FIPS 140-3 validated cryptographic modules for federal compliance requirements
* Uses eBPF (modern-bpf driver) instead of traditional kernel modules for system call monitoring
* Does not require loading separate kernel modules, making it more portable across different environments
* Built on Chainguard OS with FIPS-validated cryptographic libraries
* Includes the modern-bpf driver bundled within the image
* No shell or package manager included (distroless design)

This variant is specifically designed for environments requiring FIPS compliance, such as government and regulated industries.

> [!WARNING]
> Falco does not run on macOS. For local testing, use a Linux VM or pass the `--nodriver` argument (though this will not collect any security events).

> [!IMPORTANT]
> FIPS mode enforces stricter cryptographic standards, which may impact performance compared to the standard `falco` image.

## Prerequisites

* Linux environment with kernel version 4.14 or later
* Privileged container access for eBPF functionality
* FIPS-compliant environment for full validation

## Getting Started

The `falco-fips` image provides real-time security monitoring with FIPS 140-3 cryptographic compliance. Usage is identical to the standard Falco image:

### Docker

Run Falco with eBPF for container and host monitoring:

```sh
docker run --rm -i -t \
    --privileged \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    -v /proc:/host/proc:ro \
    cgr.dev/ORGANIZATION/falco-fips:latest falco --modern-bpf
```

For testing without drivers (limited functionality):

```sh
docker run --rm -i -t \
    cgr.dev/ORGANIZATION/falco-fips:latest falco --nodriver
```

### Kubernetes with Helm

Deploy Falco in Kubernetes using the official Helm chart. First, create a values file:

```sh
cat > falco-fips-values.yaml <<EOF
image:
  registry: cgr.dev
  repository: ORGANIZATION/falco-fips
  tag: latest

driver:
  kind: modern-bpf

falcoctl:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/falcoctl-fips
    tag: latest

# FIPS-specific configuration
env:
  - name: FIPS_MODE
    value: "1"

# Optional: customize rules for compliance monitoring
rulesFiles:
  - /etc/falco/falco_rules.yaml
  - /etc/falco/k8s_audit_rules.yaml
EOF
```

Install the chart:

```sh
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

helm install falco-fips falcosecurity/falco \
  --namespace falco \
  --create-namespace \
  --values falco-fips-values.yaml
```

## Configuration

FIPS-compliant Falco configuration follows the same patterns as the standard image:

### FIPS Verification

Verify FIPS mode is enabled:

```sh
docker run --rm cgr.dev/ORGANIZATION/falco-fips:latest \
  sh -c "cat /proc/sys/crypto/fips_enabled"
```

### Custom Rules for Compliance

Create security rules focused on compliance monitoring:

```sh
cat > compliance-rules.yaml <<EOF
- rule: Unauthorized Cryptographic Operations
  desc: Detect non-FIPS cryptographic operations
  condition: >
    spawned_process and
    (proc.name in (openssl, gpg) and
     not proc.args contains "fips")
  output: >
    Non-FIPS cryptographic operation detected
    (command=%proc.cmdline user=%user.name)
  priority: HIGH

- rule: FIPS Module Tampering
  desc: Detect attempts to modify FIPS modules
  condition: >
    open_write and
    fd.directory in (/usr/lib/ssl, /etc/ssl)
  output: >
    Potential FIPS module tampering detected
    (file=%fd.name command=%proc.cmdline)
  priority: CRITICAL
EOF

docker run --rm -i -t \
    --privileged \
    -v $(pwd)/compliance-rules.yaml:/etc/falco/compliance-rules.yaml \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    -v /proc:/host/proc:ro \
    cgr.dev/ORGANIZATION/falco-fips:latest falco --modern-bpf
```

## Documentation and Resources

* [Falco Official Documentation](https://falco.org/docs/)
* [FIPS 140-3 Compliance Guide](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)
* [Falco Rules Documentation](https://falco.org/docs/rules/)
* [Falco Helm Chart](https://github.com/falcosecurity/charts/tree/master/charts/falco)
* [eBPF Driver Documentation](https://falco.org/docs/event-sources/drivers/#modern-ebpf-probe)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### node-problem-detector

# node-problem-detector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/node-problem-detector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/node-problem-detector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Node-problem-detector](https://github.com/kubernetes/node-problem-detector) aims to make various node problems visible to the upstream layers in the cluster management stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Install via `helm` using the upstream source shown below:

```bash
helm repo add deliveryhero https://charts.deliveryhero.io/
helm upgrade --install npd deliveryhero/node-problem-detector \
  --namespace node-problem-detector \
  --create-namespace \
  --set image.repository=cgr.dev/chainguard/node-problem-detector \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sigstore-scaffolding

# sigstore-scaffolding
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sigstore-scaffolding` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sigstore-scaffolding/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based [Sigstore](https://sigstore.dev) images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The images in this directory are just the "glue" for bootstrapping the stack,
but Chainguard offers minimal images for each of the elements needed by the
[Sigstore "scaffold" Helm chart](https://github.com/sigstore/helm-charts/tree/main/charts/scaffold)
for bootstrapping a full sigstore stack.

In addition to these images, the stack also pulls in images from:
- [`cosign`](../cosign)
- [`fulcio`](../fulcio/)
- [`rekor`](../rekor)
- [`trillian`](../trillian)
- [`ctlog`](../ctlog)
- (NYI) `timestamp-authority` (an optional component only used in some setups)

The stack also pulls in several support images:
- [`curl`](../curl)
- [`netcat`](../netcat)
- [`redis`](../redis)
- (NYI) `mysql` - Currently sigstore relies on the nearly EOL `mysql` 5.7

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### auditbeat-fips

# auditbeat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/auditbeat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/auditbeat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Auditbeat is a lightweight shipper that you can install on your servers to audit the activities of users and processes on your systems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [elastic/auditbeat](https://hub.docker.com/r/elastic/auditbeat) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker

> [!NOTE]
> These Docker instructions assume you have a running instance of Elasticsearch and Kibana with which `auditbeat` can interact.

You can run the following command to test Chainguard's auditbeat-fips image:

```shell
docker run \
    --cap-add="AUDIT_CONTROL" \
    --cap-add="AUDIT_READ" \
    --rm \
    cgr.dev/ORGANIZATION/auditbeat-fips:latest setup -E "setup.kibana.host=<your_kibana_host>:5601" -E output.elasticsearch.hosts=["<your_elastic_host>:9200"]
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

### Kubernetes

> [!NOTE]
> Applying the manifests from the following documentation assumes an existing Elasticsearch deployment on your cluster.

You can follow the [official documentation for running Auditbeat on Kubernetes](https://www.elastic.co/guide/en/beats/auditbeat/current/running-on-kubernetes.html) to run Auditbeat.  Once you've downloaded the manifest from Elastic, you can modify it as needed.

Start by modifying the Daemonset resource in the downloaded manifest named `auditbeat-kubernetes.yaml`:

```shell
apiVersion: apps/v1
kind: DaemonSet
spec:
  template:
    spec:
      containers:
        - name: auditbeat
          image: cgr.dev/ORGANIZATION/auditbeat-fips:latest
```

Then use the following command to deploy Auditbeat to Kubernetes:

```shell
kubectl create -f auditbeat-kubernetes.yaml
```
```
serviceaccount/auditbeat created
clusterrole.rbac.authorization.k8s.io/auditbeat created
role.rbac.authorization.k8s.io/auditbeat created
role.rbac.authorization.k8s.io/auditbeat-kubeadm-config created
clusterrolebinding.rbac.authorization.k8s.io/auditbeat created
rolebinding.rbac.authorization.k8s.io/auditbeat created
rolebinding.rbac.authorization.k8s.io/auditbeat-kubeadm-config created
configmap/auditbeat-config created
configmap/auditbeat-daemonset-modules created
daemonset.apps/auditbeat created
```

### Helm

You can use the [official Elastic Stack Helm chart](https://artifacthub.io/packages/helm/elastic/eck-stack) in conjunction with an Elastic Operator and replace the image in `values.yaml` with the Chainguard image to install Auditbeat.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
eck-beats:
  config:
    # The below is a common example, full auditbeat config options can be found here:
    # https://www.elastic.co/guide/en/beats/auditbeat/current/configuring-howto-auditbeat.html
    auditbeat.modules:
    - module: file_integrity
      paths:
      - /hostfs/bin
      - /hostfs/usr/bin
      - /hostfs/sbin
      - /hostfs/usr/sbin
      - /hostfs/etc
      exclude_files:
      - '(?i)\.sw[nop]$'
      - '~$'
      - '/\.git($|/)'
      scan_at_start: true
      scan_rate_per_sec: 50 MiB
      max_file_size: 100 MiB
      hash_types: [sha1]
      recursive: true
    - module: auditd
      audit_rules: |
        # Executions
        -a always,exit -F arch=b64 -S execve,execveat -k exec

        # Unauthorized access attempts (amd64 only)
        -a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -k access
        -a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -k access

    processors:
    - add_cloud_metadata: {}
    - add_host_metadata: {}
    - add_process_metadata:
        match_pids: ['process.pid']
  daemonSet:
    podTemplate:
      spec:
        containers:
          - name: auditbeat
            image: cgr.dev/ORGANIZATION/auditbeat-fips:latest
  enabled: true
  type: auditbeat
```

Install the Elastic Operator if it's not already running:

```bash
helm repo add elastic https://helm.elastic.co
```
```
"elastic" has been added to your repositories
```

Update the chart repositories:

```shell
helm repo update
```
```
...Successfully got an update from the "elastic" chart repository
Update Complete. ⎈Happy Helming!⎈
```

Install the `elastic-operator` Helm chart:

```bash
helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace
```
```
NAME: elastic-operator
LAST DEPLOYED: <DATE>
NAMESPACE: elastic-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

Install the `eck-stack` chart with your custom `values.yaml` file:

```bash
helm install eck-stack elastic/eck-stack -n elastic-stack --create-namespace --values values.yaml
```
```
NAME: eck-stack
LAST DEPLOYED: <DATE>
NAMESPACE: elastic-stack
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Elasticsearch ECK-Stack <VERSION> has been deployed successfully!
```

## Documentation and Resources

* [Official auditbeat (Elastic beats subpackage) repository](https://github.com/elastic/beats).
* [Auditbeat installation and configuration quick start](https://www.elastic.co/guide/en/beats/auditbeat/current/auditbeat-installation-configuration.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openbao

# openbao
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openbao` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openbao/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with OpenBao.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using openbao

The Chainguard openbao image contains the [openbao](https://www.openbao.org/) server binary and supporting config. The image is intended to be a drop-in
replacement for the upstream [openbao/openbao](https://hub.docker.com/r/openbao/openbao) or
[openbao](https://hub.docker.com/r/openbao/openbao) images and compatible with the [OpenBao Helm
chart](https://github.com/openbao/openbao-helm).

The default entrypoint starts a single-node instance of the server in development mode for testing
and development. Note that the container should be given the `IPC_LOCK` capability.

You can start the container with:

```shell
$ docker run --cap-add IPC_LOCK cgr.dev/ORGANIZATION/openbao
==> OpenBao server configuration:

Administrative Namespace:
             Api Address: http://0.0.0.0:8200
                     Cgo: enabled
         Cluster Address: https://0.0.0.0:8201
   Environment Variables: HOME, HOSTNAME, PATH, PWD, SHLVL, SSL_CERT_FILE
              Go Version: go1.23.2
              Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level:
           Recovery Mode: false
                 Storage: inmem
                 Version: OpenBao v2.0.2, built '2024-10-10T15:09:44Z'
             Version Sha: 96853bb4de27ab8ffd1b0c2898c691460d43edeb

==> OpenBao server started! Log data will stream in below:
...
```

To configure openbao for production or other environments, supply a configuration file in the `/openbao/config` directory e.g:

```shell
docker run -v $PWD/openbao.hcl:/openbao/config/openbao.hcl cgr.dev/ORGANIZATION/openbao server
```

You can also supply config via the `BAO_LOCAL_CONFIG` variable e.g:

```shell
docker run --cap-add=IPC_LOCK -e 'BAO_LOCAL_CONFIG={"storage": {"file": {"path": "/openbao/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 cgr.dev/chainguard/openbao server
```

### Helm Chart Usage

This image and the `openbao-k8s` image can be used with the [Helm chart](https://github.com/openbao/openbao-helm). To replace the official
images with the Chainguard images, provide the chart with the following values:

```yaml
injector:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao-k8s"
    tag: "latest"

  agentImage:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao"
    tag: "latest"

server:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao"
    tag: "latest"
```

Assuming these values are saved in `cgr_values.yaml`, you should be able to run:

```shell
helm repo add openbao https://openbao.github.io/openbao-helm
helm install openbao openbao/openbao --values cgr_values.yaml
```

### User

The image starts as root and switches to the lower privileged `openbao` user in the entrypoint
script.

### Differences to openbao/openbao image

This image is not identical to the openbao/openbao image. In particular:

 - The openbao binary and entrypoint script are stored in `/usr/bin`
 - The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the Openbao image uses Alpine (which is musl based)

This image supports the same environment variables as the
[openbao/openbao](https://hub.docker.com/r/openbao/openbao) image.

### Persisting Storage Data

If using the file data storage plugin, please configure it to write to `/openbao/file`.

### Persisting Logs

By default logs will be streamed to stdout and stderr, but can be configured to write to
`/openbao/logs`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keda-fips

# keda-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keda-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keda-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cockroach-openssl

# cockroach-openssl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cockroach-openssl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cockroach-openssl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CockroachDB is a cloud-native distributed SQL database designed to build, scale, and manage modern, data-intensive applications. The Cockroach-openssl image is the FIPS enabled equivalent of the standard Cockroach image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Cockroach-openssl Image is comparable to the [official Cockroach Image from Docker Hub](https://hub.docker.com/r/cockroachdb/cockroach) with FIPs enabled. However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

The upstream image explicitly exposes ports 26257 (SQL) and 8080 (HTTP), while the custom image does not. Port mapping needs to be specified during runtime.

## Getting Started

In this section we will explore how you can use Chainguard's cockroach-openssl Image.

### Helm Chart

You can use the [official Helm chart](https://github.com/cockroachdb/helm-charts/tree/master/cockroachdb) and replace the image in `values.yaml` with Chainguard image.

You can try running the command below to see an immediate installation of cockroach using Chainguard's image:
```
helm install cockroach cockroachdb \
  --repo https://charts.cockroachdb.com/ \
  -f values.yaml
```
With this `values.yaml`:
```
tls:
  enabled: false

image:
  repository: cgr.dev/ORGANIZATION/cockroach-openssl
  tag: latest

conf:
  single-node: true
```

### Docker

You can run the command below to see an immediate installation of cockroach using Chainguard's image:
```
docker run -d \
  --name cockroach \
  -p 26257:26257 -p 8080:8080 \
  cgr.dev/ORGANIZATION/cockroach-openssl:latest \
  start-single-node --insecure
```

## Documentation and Resources
- [Official CockroachDB Documentation](https://www.cockroachlabs.com/docs/stable/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter-fips

# kyverno-policy-reporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Monitoring and Observability Tool for the [PolicyReport CRD](https://kyverno.github.io/policy-reporter/) with an optional UI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kyverno-policy-reporter-fips` Container Image is comparable to the [official kyverno policy-reporter image](https://ghcr.io/kyverno/policy-reporter:latest). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `/usr/bin/policyreporter run`, compared to upstream's entrypoint of `/app/policyreporter run`.

### FIPS support

Chainguard's `kyverno-policy-reporter-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To install Chainguard's `kyverno-policy-reporter-fips` container image on your Kubernetes cluster, you can use the official image's Helm chart.

You can override the image by setting the `image.tag`,`image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/kyverno-policy-reporter-fips
  tag: latest
```
You can then invoke the following command to install kyverno-policy-reporter in your cluster.
```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm install policy-reporter policy-reporter/policy-reporter -f values.yaml --create-namespace -n policy-reporter
```

Once you have the reporter up and running in your cluster, you can go through the following steps to test out the functionality:

Apply a ClusterPolicy requiring pods to have an app label

```
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-label
spec:
  rules:
    - name: check-label
      match:
        resources:
          kinds:
            - Pod
      validate:
        failureAction: Audit
        message: "Labels 'app' is required on every Pod."
        pattern:
          metadata:
            labels:
              app: "?*"
EOF
```

Create a pod that violates the policy

```
cat <<EOF | kubectl apply -n test-policyreporter -f -
apiVersion: v1
kind: Pod
metadata:
  name: violate-pod
spec:
  containers:
    - name: nginx
      image: nginx:1.14.2
EOF
```

You should now be able to see a policy report resource created in the `test-policyreporter` namespace:
```
kubectl get policyreports -n test-policyreporter
```

## Documentation and Resources
* [Official Kyverno Policy Reporter Documentation](https://kyverno.io/docs/policy-reports/)
* [Official Kyverno Documentation](https://kyverno.io/docs/introduction/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### terragrunt

# terragrunt
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/terragrunt` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/terragrunt/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A cloud infrastructure orchestration tool that supports OpenTofu/Terraform.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

**Note on Terraform/OpenTofu Support**: The Terragrunt maintainers [do not maintain the Docker images](https://github.com/gruntwork-io/terragrunt/issues/5271) and actively recommend OpenTofu over Terraform. We provide both options as separate image tags, to meet different organizational requirements: OpenTofu variants for open-source licensing needs (MPL-2.0) and Terraform variants for teams accepting BUSL-1.1 terms.

## Image Variants and Tags

Terragrunt requires either Terraform (BUSL-1.1 licensed) or OpenTofu (MPL-2.0 licensed) as a runtime dependency to operate. The Chainguard image provides these as separate image tags, documented below:

### Available Variants

1. **Base Terragrunt**
   - Tag: `latest`
   - Contains only Terragrunt without Terraform or OpenTofu
   - For building custom images or adding your own IaC tool version
   - Example: `cgr.dev/ORGANIZATION/terragrunt:latest`

2. **Terragrunt with Terraform**
   - Tags: `X.Y.Z` (version number) or `tfX.Y.Z` (explicit prefix)
   - Includes Terragrunt + Terraform X.Y.Z pre-installed
   - **Important**: Terraform is BUSL-1.1 licensed with commercial use restrictions
   - Example: `cgr.dev/ORGANIZATION/terragrunt:X.Y.Z` or `cgr.dev/ORGANIZATION/terragrunt:tfX.Y.Z`

3. **Terragrunt with OpenTofu**
   - Tags: `otfX.Y.Z`
   - Includes Terragrunt + OpenTofu X.Y.Z pre-installed
   - OpenTofu is MPL-2.0 licensed with no commercial restrictions
   - Example: `cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z`

### Tag Format
- `latest` - Base Terragrunt only
- `X.Y.Z` - Terragrunt with Terraform X.Y.Z
- `tfX.Y.Z` - Terragrunt with Terraform X.Y.Z, explicit prefix
- `otfX.Y.Z` - Terragrunt with OpenTofu X.Y.Z

### Choosing the Right Variant

- **Choose `latest`** if you're building a custom image with specific tool versions or using Terragrunt standalone
- **Choose Terraform tags (`X.Y.Z` or `tfX.Y.Z`)** if you need Terraform, accept BUSL-1.1 licensing terms and are okay with the Terraform version rolling forward with image updates
- **Choose OpenTofu tags (`otfX.Y.Z`)** if you need open-source licensing (MPL-2.0) and are okay with the OpenTofu version rolling forward with image updates

## Getting Started

Terragrunt is a thin wrapper for Terraform/OpenTofu that provides extra tools for keeping configurations DRY, working with multiple modules, and managing remote state.

### Basic Usage

Mount the local volume containing your Terragrunt project and terragrunt.hcl:

```sh
# Using base variant (Terragrunt only)
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:latest --version

# Using Terraform variant
# Preview changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:X.Y.Z plan
# Apply changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:X.Y.Z apply

# Or with explicit prefix
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:tfX.Y.Z plan

# Using OpenTofu variant (recommended for open-source)
# Preview changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z plan
# Apply changes
docker run --rm -v $(pwd):/apps -w /apps cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z apply
```

### Using in Kubernetes

Terragrunt does not provide a Helm Chart or Kubernetes Operator. Their documentation suggests running a batch Job for scheduling:

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: infrastructure-deploy
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: terragrunt
        # Examples: :latest (base), :X.Y.Z (Terraform), :otfX.Y.Z (OpenTofu)
        image: cgr.dev/ORGANIZATION/terragrunt:otfX.Y.Z
        command: ["terragrunt"]
        args: ["apply", "-auto-approve"]
        workingDir: /apps
        volumeMounts:
        - name: terraform-code
          mountPath: /apps
      volumes:
      - name: terraform-code
        configMap:
          name: terraform-code
```

## Documentation and Resources

For more information about Terragrunt, refer to:

- [Terragrunt Official Documentation](https://terragrunt.gruntwork.io/docs/)
- [Terragrunt Quick Start Guide](https://terragrunt.gruntwork.io/docs/getting-started/quick-start/)
- [GitHub Repository](https://github.com/gruntwork-io/terragrunt)

For OpenTofu migration and documentation:
- [OpenTofu Documentation](https://opentofu.org/docs/)
- [Migration Guide](https://opentofu.org/docs/intro/migration/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### datadog-agent

# datadog-agent
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/datadog-agent` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/datadog-agent/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Datadog Agent to collect events and metrics from hosts and send them to Datadog.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `datadog-agent` image is comparable to the [Datadog Agent image](https://hub.docker.com/r/datadog/agent) available on Docker Hub.

The Chainguard `datadog-cluster-agent` image is comparable to the [Datadog Cluster Agent image](https://hub.docker.com/r/datadog/cluster-agent) available on Docker Hub. Please note that the Chainguard `datadog-cluster-agent` image runs as `nonroot` with uid `65532`, belonging to gid `65532`, while the Docker Hub image runs as `root`.

## Getting Started

The Datadog Agent collects events and metrics from hosts and sends them to Datadog. In order to run the following command, you must have a Datadog account, as well as have your Datadog API key available:

```shell
docker run \
 --name dd-agent \
 -e DD_API_KEY=${DD_API_KEY} \
 -e DD_SITE="datadoghq.com" \
 -e DD_APM_ENABLED=true \
 -e DD_APM_NON_LOCAL_TRAFFIC=true \
 -v /var/run/docker.sock:/var/run/docker.sock:ro \
 -v /proc/:/host/proc/:ro \
 -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
 -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
 cgr.dev/ORGANIZATION/datadog-agent:latest
```

## Documentation and Resources

- [Datadog Agent Getting Started Guide](https://docs.datadoghq.com/getting_started/agent/)
- [Datadog Agent GitHub Repository](https://github.com/DataDog/datadog-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jaeger

# jaeger
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jaeger` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jaeger/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CNCF Jaeger, a Distributed Tracing Platform

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Components
Jaeger provides multiple components;
```
jaeger-all-in-one
jaeger-anonymizer
jaeger-collector
jaeger-es-index-cleaner
jaeger-ingester
jaeger-query
jaeger-remote-storage
jaeger-tracegen
```

## Using Jaeger

Jaeger provides docker images and a helm chart for installation. It can be installed separately with all its components or
using a single image with all components bundled in. The bundled component is referred to as All-In-One

### Jaeger All In One
This image, designed as a bundle, launches the Jaeger UI, collector, and query with an in memory storage component. [jaeger-all-in-one](https://www.jaegertracing.io/docs/1.6/getting-started/#all-in-one-docker-image)

Either component can be run directly as docker containers or deployed to Kubernetes with helm. Helm chart is located here https://jaegertracing.github.io/helm-charts. To use them, simply replace the appropriate `image:` path with the Chainguard specific Jaeger image. Below is an example values file for doing this with helm:

```yaml
allInOne:
    enabled: true
    image:
    repository: cgr.dev/chainguard/jaeger-all-in-one
    tag: latest
agent:
    enabled: false
collector:
    enabled: false
query:
    enabled: false
storage:
    type: "memory"
# Hotrod is a test application
hotrod:
    enabled: true
```

Using the above values, the helm commands become, to install Jaeger All In One:

```bash
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade --install jaeger jaegertracing/jaeger \
  --history-max 3 \
  --set provisionDataStore.cassandra=false \
  --set allInOne.enabled=true \
  --set storage.type=memory \
  --set agent.enabled=false \
  --set collector.enabled=false \
  --set query.enabled=false \
  --values jaeger-values.yaml
```

### Jaeger Standalone Components:

```yaml
collector:
    image:
    repository: cgr.dev/chainguard/jaeger-collector
    tag: latest
query:
    image:
    repository: cgr.dev/chainguard/jaeger-query
    tag: latest
storage:
    type: "memory"
hotrod:
    enabled: true
cassandra:
    config:
    cluster_size: 1
```

Using the above values, the helm commands become, to install Jaeger with standalone components:

```bash
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade --install jaeger jaegertracing/jaeger \
  --create-namespace \
  --namespace jaeger \
  --history-max 3 \
  --set hotrod.enabled=true \
  --set storage.type=memory  --set cassandra.config.cluster_size=1 \
  --values jaeger-values.yaml
```
For more configuration options in installing the jaeger helm chart, please refer to the [helm upstream doc](https://github.com/jaegertracing/helm-charts/tree/main/charts/jaeger)
> NOTE: Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton-fips

# tekton-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-logging-operator-node-exporter

# kube-logging-operator-node-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-logging-operator-node-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-logging-operator-node-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Custom runner based Prometheus node exporter for kube-logging logging-operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Compatibility

This image is compatible with the `ghcr.io/kube-logging/logging-operator/node-exporter` image and can be used as a drop-in replacement in existing logging-operator deployments.

## Usage

This image contains a custom runner-based Prometheus node exporter that is specifically designed for use with the [kube-logging logging-operator](https://github.com/kube-logging/logging-operator). The logging-operator is a Kubernetes operator that simplifies log collection, processing, and forwarding in Kubernetes clusters using Fluent Bit, Fluentd, and other logging components.

### Integration with Logging Operator

The kube-logging-operator-node-exporter is typically deployed as part of the logging-operator's monitoring stack to provide node-level metrics for logging infrastructure monitoring. It extends the standard Prometheus node exporter functionality with custom metrics and configurations tailored for logging workloads.

### Deployment

This image is designed to be deployed as a DaemonSet in Kubernetes clusters where the logging-operator is running. It should be used in conjunction with:

- The kube-logging logging-operator
- Prometheus for metrics collection
- Grafana or similar tools for metrics visualization

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kayenta-fips

# kayenta-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kayenta-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kayenta-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Automated Canary Service

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Kayenta Image is comparable to the official Kayenta Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
Kayenta is a component that spins up when spinnaker is deployed. The official instructions to deploy spinnaker are present here: https://spinnaker.io/docs/setup/install/. 
To replace kayenta image with Chainguard containers, run:
```
mkdir -p ~/.hal/default/service-settings && cat > ~/.hal/default/service-settings/kayenta.yml' <<EOF
artifactId:  cgr.dev/ORGANIZATION/kayenta-fips:latest
kubernetes:
  imagePullPolicy: IfNotPresent
EOF
```
Make sure you enable canary in your environment, by running something like this:
```
kubectl exec -i halyard -- hal config canary enable
```
Run ` hal --ready deploy apply` to deploy all spinnaker components and monitor 
Remember to replace ORGANIZATION with the your organization name. 
## Documentation and Resources
- [Spinnaker documentation](https://spinnaker.io/docs/)
- [Canary overview](https://spinnaker.io/docs/guides/user/canary/canary-overview/)
- [Kayenta github repository](https://github.com/spinnaker/kayenta)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-server

# metrics-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Metrics Server is a Kubernetes component that collects and provides resource usage metrics (CPU, memory) for nodes and pods.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image for metrics server is comparable to the original, used by
the [supported helm chart](https://github.com/kubernetes-sigs/metrics-server?tab=readme-ov-file#installation).

Our user defaults to running as user 65532, whereas the original runs as 65534.
In both cases these are non-root users. Similar to the upstream image, our image
does not contain a shell or a package manager, and only the minimum set of tools
and dependencies needed to function.

## Getting Started

The Chainguard metrics server image, can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/metrics-server/metrics-server).

Add the helm repository:

```bash
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:

```bash
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/metrics-server
  tag: latest
```

Deploy using helm:

```bash
helm install metrics-server metrics-server/metrics-server -f values.yaml
```

A few minutes after successful deployment, you should see metrics begin to
be published, example:

```bash
kubectl top node
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
control-plane   144m         1%     623Mi           2%
```

> If validating this image in a local 'kind' or 'k3d' cluster, you may need to
> disable tls, by setting 'args: ["--kubelet-insecure-tls"]' in values.yaml.
> Do not set this flag on a production environment.

## Documentation and Resources
For more information on how to deploy and configure metrics server, please
refer to the [GitHub project documentation](https://github.com/kubernetes-sigs/metrics-server).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### copybara

# copybara
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/copybara` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/copybara/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Copybara is a tool used for transforming and moving code between repositories, enabling code synchronization workflows between different version control systems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

Copybara is a tool for transforming and moving code between repositories. It's commonly used for:

- Synchronizing code between internal and external repositories
- Moving code between different version control systems
- Maintaining forks with custom modifications

### Running Copybara

The image uses the following defaults:
- **Entrypoint**: `/usr/local/bin/copybara`
- **Command**: `migrate copy.bara.sky`
- **Working Directory**: `/usr/src/app`

To run Copybara with a custom configuration:

```bash
docker run --rm -v $(pwd):/usr/src/app \
  cgr.dev/ORGANIZATION/copybara:latest \
  migrate copy.bara.sky
```

### Basic Configuration Example

Create a `copy.bara.sky` file defining your workflow:

```python
core.workflow(
    name = "default",
    origin = git.origin(
        url = "https://github.com/example/source-repo.git",
        ref = "main",
    ),
    destination = git.destination(
        url = "https://github.com/example/destination-repo.git",
        fetch = "main",
        push = "main",
    ),
    authoring = authoring.pass_thru("Copybara <copybara@example.com>"),
    origin_files = glob(["**"]),
)
```

### Validating Configuration

Before running a migration, validate your configuration:

```bash
docker run --rm -v $(pwd):/usr/src/app \
  --entrypoint /usr/local/bin/copybara \
  cgr.dev/ORGANIZATION/copybara:latest \
  validate copy.bara.sky
```

### Using Transformations

Copybara supports transformations to modify files during migration:

```python
core.workflow(
    name = "default",
    origin = git.origin(
        url = "https://github.com/example/source-repo.git",
        ref = "main",
    ),
    destination = folder.destination(),
    authoring = authoring.pass_thru("Copybara <copybara@example.com>"),
    origin_files = glob(["**"]),
    transformations = [
        core.move("", "external"),
    ],
)
```

## Compatibility Notes

The Chainguard Copybara image is designed to be compatible with the [upstream Google Copybara](https://github.com/google/copybara) project. Key compatibility details:

- **Java Runtime**: Uses OpenJDK 21 JRE
- **Git**: Includes Git for repository operations
- **Mercurial**: Includes Python-based Mercurial for Hg repository support
- **Build Tools**: Includes Buildifier and Buildozer for Bazel/Starlark file formatting

## Documentation and Resources

- [Google Copybara GitHub Repository](https://github.com/google/copybara)
- [Copybara Reference Documentation](https://github.com/google/copybara/blob/master/docs/reference.md)
- [Moving Code Between Git Repositories with Copybara (Kubesimplify)](https://blog.kubesimplify.com/moving-code-between-git-repositories-with-copybara)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trivy-operator

# trivy-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trivy-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trivy-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Trivy Operator automatically scans your Kubernetes workloads for security issues and generates security reports as Kubernetes Custom Resources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [upstream Trivy Operator image](https://github.com/aquasecurity/trivy-operator) maintained by Aqua Security. Switching to the Chainguard image should not require any significant changes to your existing setup.

## Getting Started

To deploy the Chainguard Trivy Operator image with Helm, first add the Aqua Security Helm repository:

```shell
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update
```

Next create a values file. The following is a minimal example:

```yaml
# values.yaml

image:
  registry: "cgr.dev"
  repository: "ORGANIZATION/trivy-operator"
  tag: "latest"

trivy:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/trivy"
    tag: "latest-dev"
```

Note that we're using the `-dev` variant of the `trivy` image. That's because
the `trivy` image does not include a shell. You could also consider adding
`bash` to the image with [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly-console/).

Finally, install Trivy Operator. This example assumes the values file is named `values.yaml`:

```shell
helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace \
  -f values.yaml
```

## Documentation and Resources

For more information about Trivy Operator, refer to the following resources:

- [Trivy Operator GitHub Repository](https://github.com/aquasecurity/trivy-operator)
- [Trivy Operator Documentation](https://aquasecurity.github.io/trivy-operator/latest/)
- [Trivy Project](https://github.com/aquasecurity/trivy)
- [Kubernetes Security with Trivy](https://aquasecurity.github.io/trivy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-rollout-operator-fips

# grafana-rollout-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-rollout-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-rollout-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Rollout Operator coordinates the rollout of pods between different StatefulSets within a specific namespace, and can be used to manage multi-AZ deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Compatibility Notes

This image is the FIPS version of Chainguard's Grafan Rollout Operator image, which is itself a drop-in replacement for the [grafana/rollout-operator](https://hub.docker.com/r/grafana/rollout-operator/tags) image.

## Getting Started

There is a Helm chart available for the Grafana Rollout Operator. You can install it using the following commands:

First, install the Helm chart repository:

```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```

Prepare the values file `values.yaml` with the following content:

```yaml
 image:
   repository: cgr.dev/ORGANIZATION/grafana-rollout-operator-fips
   tag: latest
```

Then, install the Grafana Rollout Operator:

```shell
helm install grafana-rollout-operator grafana/grafana-rollout-operator -f values.yaml
```

Check the daemonset is running:

```bash
kubectl get deploy grafana-rollout-operator -n grafana-rollout-operator
```

This works in conjencture with [mimir-distributed](https://grafana.com/docs/helm-charts/mimir-distributed/latest/get-started-helm-charts/).

Add Labels and Annotations to ingester zones:

```shell
kubectl label sts mimir-ingester-zone-a grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-a grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-a grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-a grafana.com/prepare-downscale-http-port=80 -n mimir

kubectl label sts mimir-ingester-zone-b grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-b grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/rollout-downscale-leader=mimir-ingester-zone-a -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-b grafana.com/prepare-downscale-http-port=80 -n mimir

kubectl label sts mimir-ingester-zone-c grafana.com/min-time-between-zones-downscale=2m -n mimir
kubectl label sts mimir-ingester-zone-c grafana.com/prepare-downscale=true -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/rollout-downscale-leader=mimir-ingester-zone-b -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/prepare-downscale-http-path=ingester/prepare-shutdown -n mimir
kubectl annotate sts mimir-ingester-zone-c grafana.com/prepare-downscale-http-port=80 -n mimir
```

Check for logs:

```shell
kubectl logs deployment/mimir-rollout-operator -n mimir
```

This command will return output like the following:

```shell
level=debug ts=2024-05-14T17:02:34.97299692Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-a
level=debug ts=2024-05-14T17:02:34.973309878Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-b
level=debug ts=2024-05-14T17:02:34.97338692Z msg="reconciling StatefulSet" statefulset=mimir-store-gateway-zone-c
level=debug ts=2024-05-14T17:02:34.97363967Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-a
level=debug ts=2024-05-14T17:02:34.973721503Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-b
level=debug ts=2024-05-14T17:02:34.973819586Z msg="reconciling StatefulSet" statefulset=mimir-ingester-zone-c
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### airflow-iamguarded

# airflow-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/airflow-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/airflow-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Airflow is a platform to programmatically author, schedule, and monitor workflows as directed acyclic graphs (DAGs).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Airflow IAMGuarded is a security-enhanced variant of Airflow designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Airflow deployments.

## Helm Chart Installation

The Airflow IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/airflow
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install airflow oci://cgr.dev/$ORGANIZATION/iamguarded-charts/airflow \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Airflow image
image:
  registry: myregistry.example.com
  repository: mirrored/airflow-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus statsd exporter image
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-statsd-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Redis dependent chart images
redis:
  # Redis server image
  image:
    registry: myregistry.example.com
    repository: mirrored/redis-server-iamguarded
    digest: sha256:... # Use specific digest instead of tag

  # Redis Sentinel image for high availability
  sentinel:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/redis-sentinel-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for volume permissions
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for sysctl
  sysctl:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # Prometheus Redis exporter for metrics
  metrics:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/prometheus-redis-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # kubectl image for management operations
  kubectl:
    image:
      registry: myregistry.example.com
      repository: mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# PostgreSQL dependent chart images
postgresql:
  # PostgreSQL image
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-iamguarded
    digest: sha256:... # Use specific digest instead of tag

  # Prometheus Exporter
  metrics:
    image:
      registry: myregistry.example.com
      repository: mirrored/prometheus-postgres-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag

  # OS Shell image for volume permissions
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install airflow oci://cgr.dev/$ORGANIZATION/iamguarded-charts/airflow@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/airflow
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/airflow:22.7.3
   Digest: sha256:c2ac4bca21cbd890b5eb5897d243ec083c999b293bd86aa63204e7a41325efa2
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Airflow IAMGuarded installation using standard Airflow verification methods. The deployment functions as a standard Airflow instance, so all typical Airflow validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Airflow IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Airflow and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nrdot-collector-k8s

# nrdot-collector-k8s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nrdot-collector-k8s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nrdot-collector-k8s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

New Relic .NET collector for Kubernetes monitoring

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard nrdot-collector-k8s image is comparable to the official [nrdot-collector-k8s Image from Docker Hub](https://hub.docker.com/r/newrelic/nrdot-collector-k8s). Like most other Chainguard Images, this image has few-to-zero CVEs and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

Note - The Chainguard image is built with the latest versions of all dependencies, including `opentelemetry-collector-contrib/receiver/kubeletstatsreceiver`, so we no longer need the featuregate `receiver.kubeletstats.enableCPUUsageMetrics` in the daemonset. This is present by default in the daemonset as of version 1.5.0. To edit this, you could apply a patch after deploying the helm chart like:
```
kubectl -n newrelic patch ds nr-k8s-otel-collector-daemonset \
  --type='json' -p='[
    {
      "op": "replace",
      "path": "/spec/template/spec/containers/0/args",
      "value": [
        "--config",
        "/config/daemonset-config.yaml",
        "--feature-gates",
        "metricsgeneration.MatchAttributes"
      ]
    }
  ]'
```

## Getting started
You can install the nrdot-collector-k8s using the official helm chart provided [here](https://github.com/newrelic/helm-charts/tree/master/charts/nr-k8s-otel-collector).
Be sure to use a values.yaml like the one showed below to use Chainguard's nrdot-collector-k8s image:
```
image:
    repository:cgr.dev/ORGANIZATION/REPO_NAME
    tag: latest
```

### Documentation and Resources

* [nrdot-collector-releases GitHub Repository](https://github.com/newrelic/nrdot-collector-releases)
* [kubeletstats-receiver-metrics-deprecation](https://opentelemetry.io/blog/2025/kubeletstats-receiver-metrics-deprecation/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8ssandra-client-fips

# k8ssandra-client-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8ssandra-client-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8ssandra-client-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-livenessprobe-fips

# kubernetes-csi-livenessprobe-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-livenessprobe-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-livenessprobe-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### onepassword-operator

# onepassword-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/onepassword-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/onepassword-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The 1Password Connect Kubernetes Operator provides the ability to integrate Kubernetes Secrets with 1Password

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `onepassword-operator` container is a lean, Wolfi-based container image. It is functionally equivalent to the [1password/onepassword-operator](https://hub.docker.com/r/1password/onepassword-operator/tags) while maintaining minimal dependencies and enhanced security.

## Getting Started

### Prerequisites

Before installing the operator, you'll need:
1. A 1Password account with Secrets Automation permissions
2. The `1password-credentials.json` file from your Connect server setup
3. A Connect token

> **NOTE**: See the [Connect Server guide](https://developer.1password.com/docs/connect/get-started) to set up a server and get your credentials file and token.

### Installation with Helm

**Install the operator with Chainguard images:**

```bash
helm repo add 1password https://1password.github.io/onepassword-operator/
helm repo update

helm install onepassword \
  1password/connect \
  --namespace onepassword \
  --set-file connect.credentials=1password-credentials.json \
  --set operator.create=true \
  --set operator.imageRepository=cgr.dev/ORGANIZATION/onepassword-operator \
  --set operator.version=latest \
  --set operator.token.name=$(op connect token create <token_name> --server <server_id_or_name> --vaults <vault_id_or_name>)
```

### Create a OnePasswordItem

Once the operator is running, you can create OnePasswordItem resources to sync 1Password items to Kubernetes Secrets:

```yaml
apiVersion: onepassword.com/v1
kind: OnePasswordItem
metadata:
  name: my-secret
spec:
  itemPath: "vaults/<vault_id_or_title>/items/<item_id_or_title>"
```

> **NOTE:** you must replace `<vault_id_or_title>` and `<item_id_or_title>` with your actual vault and item identifiers.

The operator will automatically create a Kubernetes Secret with the same name containing all fields from the 1Password item.

You can check the secrets created to make sure that everything is working correctly:

```bash
kubectl get secrets
```

and check the contents of the secret:

```bash
kubectl get secret <name_of_your_item> -o yaml
```

## Documentation and Resources

For comprehensive documentation and additional configuration options, please refer to:

- [1Password Operator Documentation](https://developer.1password.com/docs/k8s/operator) - Official documentation for the 1Password Kubernetes Operator
- [1Password Connect Server Documentation](https://developer.1password.com/docs/connect) - Setup and configuration guide for Connect Server
- [1Password Operator GitHub Repository](https://github.com/1Password/onepassword-operator) - Source code and issue tracking

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dart

# dart
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dart` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dart/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for dart programming language

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Overview
`cgr.dev/chainguard/dart:latest` is a base image that can be used with your dart applications.

### Usage

Create a webserver application 
```bash
dart create -t server-shelf webserver
```
We'll make some changes in the Dockerfile now.

The base image will be changed to `cgr.dev/chainguard/dart:latest` This image contains latest stable version of dart sdk.
Given Chainguard image by default ships with `nonroot` user, we'll need to update our `COPY` instructions in Dockerfile.
After updating the instructions will look following:
```dockerfile
COPY --chown=nonroot:nonroot pubspec.* ./
COPY --chown=nonroot:nonroot  . .
```

The final Dockerfile is following:
```dockerfile
FROM cgr.dev/chainguard/dart:latest AS build

WORKDIR /app
COPY --chown=nonroot:nonroot pubspec.* ./
RUN ["dart", "pub", "get"]

COPY --chown=nonroot:nonroot . .
RUN ["dart", "compile", "exe", "bin/server.dart", "-o", "bin/server"]

FROM cgr.dev/chainguard/dart-runtime:latest
COPY --from=build /app/bin/server /app/bin/

EXPOSE 8080
CMD ["/app/bin/server"]
```

Build the application by invoking the following command:
```bash
docker build -t k3d-k3d.localhost:5005/webserver  . --no-cache --push
```

Run the application in detached mode:
```bash
docker run --rm -d -p 8080:8080 k3d-k3d.localhost:5005/webserver
curl localhost:8080
Hello, World!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-fips

# minio-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spicedb-fips

# spicedb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spicedb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spicedb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This is the FIPS-compliant variant of Spice db an open-source authorization database inspired by Google's Zanzibar, providing scalable and fine-grained access control for applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

### FIPS Support
The `spicedb-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
## Getting Started

### Running with Docker

To quickly test SpiceDB locally, run the following command:

```sh
docker run -d \
  cgr.dev/ORGANIZATION/spicedb-fips:latest \
  serve \
  --grpc-preshared-key "somerandomkeyatleastthirtytwocharacters"
```

### Deploying to Kubernetes with the SpiceDB Operator

The recommended way to deploy SpiceDB on Kubernetes is using the [SpiceDB Operator](https://github.com/authzed/spicedb-operator). First, install the operator:

```sh
kubectl apply --server-side -f https://github.com/authzed/spicedb-operator/releases/latest/download/bundle.yaml
```

Then create a SpiceDB cluster:

```yaml
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: spicedb-config
stringData:
  preshared_key: "somerandomkeyatleastthirtytwocharacters"
---
apiVersion: authzed.com/v1alpha1
kind: SpiceDBCluster
metadata:
  name: spicedb
spec:
  config:
    image: "cgr.dev/ORGANIZATION/spicedb-fips:latest"
  secretName: spicedb-config
EOF
```

**Note**: The SpiceDB operator v1.20.1 has a bug that incorrectly parses image references containing ports (e.g., `registry:5000/image`). If you encounter image pull errors with such references, use the workaround of patching the deployment after creation instead of specifying the image in the CR.
## Documentation and Resources

* [Official SpiceDB Documentation](https://authzed.com/docs/spicedb/getting-started/discovering-spicedb)
* [SpiceDB on GitHub](https://github.com/authzed/spicedb)
* [SpiceDB Playground](https://play.authzed.com/) - Interactive environment for testing schemas

Additional FIPS-related resources:
* [Chainguard FIPS Images Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### longhorn

# longhorn
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/longhorn` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/longhorn/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A lightweight, reliable distributed block storage system for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Longhorn images are compatible with the upstream [Longhorn](https://longhorn.io). Longhorn is a distributed block storage system for Kubernetes. These images leverage the security features of Chainguard Containers, including minimal attack surface, low-to-zero CVEs, automated nightly builds, high-quality SBOMs, verifiable signatures, and reproducible builds.

## Versioning Strategy
These images follow semantic versioning aligned with [longhorn/longhorn](https://github.com/longhorn/longhorn) releases for consistency, even though individual components (longhorn-share-manager, longhorn-ui, backing-image-manager, longhorn-manager) may have independent upstream versions.                      

#### Backing Image Manager Compatibility
Chainguard's variant of Longhorn Backing Image Manager does not include `telnet`, as it is not functionally required by Longhorn and the container is designed to remain minimal.

## Available Images

Longhorn is composed of multiple container images. Currently, the following Chainguard Longhorn images are available:
* longhorn-share-manager
* longhorn-ui
* backing-image-manager
* longhorn-manager
* longhorn-instance-manager
* longhorn-engine

```shell
cgr.dev/ORGANIZATION/longhorn-share-manager:latest
cgr.dev/ORGANIZATION/longhorn-ui:latest
cgr.dev/ORGANIZATION/backing-image-manager:latest
cgr.dev/ORGANIZATION/longhorn-manager:latest
cgr.dev/ORGANIZATION/longhorn-instance-manager:latest
cgr.dev/ORGANIZATION/longhorn-engine:latest
```

The `longhorn-share-manager` component provides NFS server functionality to enable ReadWriteMany (RWX) volume access in Longhorn.
The `longhorn-ui` component provides access to the dashboard for ease of administering the longhorn storage system.
The `backing-image-manager` handles creating, synchronizing and deleting backing images stored on a single Longhorn disk.
The `longhorn-manager` component is a Kubernetes controller that orchestrates volume lifecycle operations including attachment, replica management, and backup coordination across cluster nodes.
The `longhorn-instance-manager` component manages the lifecycle of Longhorn engine and replica instances.
The `longhorn-engine` is the data plane component that exposes Longhorn volumes as block devices and handles all read/write I/O operations between workload pods and the replicated storage backends.

## Getting Started

To deploy Longhorn with Chainguard images, use the official Longhorn Helm chart with custom values to override the default images.

First, add the Longhorn Helm repository:

```bash
helm repo add longhorn https://charts.longhorn.io
helm repo update
```

Create a custom values file (`values-chainguard.yaml`) to use Chainguard images:

```yaml
image:
  longhorn:
    shareManager:
      repository: cgr.dev/ORGANIZATION/longhorn-share-manager
      tag: latest
    ui:
      repository: cgr.dev/ORGANIZATION/longhorn-ui
      tag: latest
    backingImageManager:
      repository: cgr.dev/ORGANIZATION/backing-image-manager
      tag: latest
    manager:
      repository: cgr.dev/ORGANIZATION/longhorn-manager
    instanceManager:
      repository: cgr.dev/ORGANIZATION/longhorn-instance-manager
      tag: latest
    engine:
      repository: cgr.dev/ORGANIZATION/longhorn-engine
      tag: latest
```

Deploy Longhorn with the custom values:

```bash
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --create-namespace \
  -f values-chainguard.yaml
```

## Documentation and Resources
* Longhorn Docs - https://longhorn.io/docs/
* Longhorn Github - https://github.com/longhorn/longhorn
* Longhorn Share Manager Github - https://github.com/longhorn/longhorn-share-manager
* Longhorn Backing Image Manager Github - https://github.com/longhorn/backing-image-manager
* Longhorn Support Bundle Kit Github - https://github.com/rancher/support-bundle-kit
* Longhorn Instance Manager Github - https://github.com/longhorn/longhorn-instance-manager

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### infinispan-operator

# infinispan-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/infinispan-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/infinispan-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for Infinispan. Automates deployment, scaling, and lifecycle management of Infinispan distributed in-memory data grid clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Infinispan Operator image is designed to be a drop-in replacement for the [upstream Infinispan Operator](https://github.com/infinispan/infinispan-operator). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility with Infinispan cluster management functionality.

## Getting Started

The Infinispan Operator enables you to create, configure, and manage Infinispan clusters on Kubernetes. It automates the deployment, scaling, and lifecycle management of Infinispan distributed in-memory data grid instances.

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Installation with OLM (Operator Lifecycle Manager)

The easiest way to install the Infinispan Operator is through OLM and then patch the CSV to use the Chainguard image:

```bash
# Install OLM if not already installed
curl -fsSL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.32.0/install.sh | bash -s v0.32.0

# Wait for OLM to be ready
kubectl wait --for=condition=Available deployment/olm-operator -n olm --timeout=300s
kubectl wait --for=condition=Available deployment/catalog-operator -n olm --timeout=300s
kubectl wait --for=condition=Available deployment/packageserver -n olm --timeout=300s

# Install Infinispan operator via OperatorHub
kubectl create -f https://operatorhub.io/install/infinispan.yaml

# Wait for operator deployment to be ready
kubectl wait --for=condition=Available deployment -l app.kubernetes.io/name=infinispan-operator -n operators --timeout=300s

# Get the CSV name and patch it to use Chainguard image
CSV_NAME=$(kubectl get csv -n operators -l operators.coreos.com/infinispan.operators -o jsonpath='{.items[0].metadata.name}')
kubectl -n operators patch csv $CSV_NAME --type='json' -p='[{"op": "replace", "path": "/spec/install/spec/deployments/0/spec/template/spec/containers/0/image", "value": "cgr.dev/ORGANIZATION/infinispan-operator:latest"}]'

# Restart the deployment to use the new image
OPERATOR_DEPLOYMENT=$(kubectl get deployment -n operators -l app.kubernetes.io/name=infinispan-operator -o jsonpath='{.items[0].metadata.name}')
kubectl -n operators rollout restart deployment/$OPERATOR_DEPLOYMENT
kubectl -n operators rollout status deployment/$OPERATOR_DEPLOYMENT --timeout=300s
```
## Resources
- [Infinispan Operator Installation Guide](https://infinispan.org/docs/infinispan-operator/2.3.x/operator.html#installation)
- [Infinispan Operator Documentation](https://infinispan.org/docs/infinispan-operator/main/operator.html)
- [Infinispan Operator GitHub Repository](https://github.com/infinispan/infinispan-operator)
- [Getting Started with Infinispan](https://infinispan.org/get-started/)
- [Infinispan Configuration Guide](https://infinispan.org/docs/stable/titles/configuring/configuring.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argo-fips

# argo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Argo is a collection of tools for Kubernetes that help users to run workflows and manage clusters.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Argo image group is composed of multiple container images:

```
docker pull cgr.dev/ORGANIZATION/argo-exec-fips
docker pull cgr.dev/ORGANIZATION/argo-cli-fips
docker pull cgr.dev/ORGANIZATION/argo-workflowcontroller-fips
docker pull cgr.dev/ORGANIZATION/argo-events-fips
```

These images are comparable to the images used for various Argo components, including [Argo CD](https://argoproj.github.io/cd/), [Argo Workflows](https://argoproj.github.io/workflows/), and [Argo Events](https://argoproj.github.io/argo-events/).

### FIPS support

Chainguard's `argo-fips` images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Argo provides two upstream methods for installing: Helm and raw manifests. The Chainguard container images for Argo are designed to be a drop-in replacement for either method. To use them, replace the appropriate `image:` path with the Chainguard Argo image. 

Chainguard's Argo images can be deployed separately, but are typically deployed together leveraging the [Argo Helm charts](https://github.com/argoproj/argo-helm).

The following is an example [values file](https://helm.sh/docs/chart_template_guide/values_files/) for deploying these images with Helm:

```yaml
images:
  tag: "latest"
controller:
  image:
    # -- Registry to use for the controller
    registry: cgr.dev
    # -- Registry to use for the controller
    repository: ORGANIZATION/argo-workflowcontroller-fips
executor:
  image:
    # -- Registry to use for the Workflow Executors
    registry: cgr.dev
    # -- Repository to use for the Workflow Executors
    repository: ORGANIZATION/argo-exec-fips
server:
  # -- Deploy the Argo Server
  image:
    # -- Registry to use for the server
    registry: cgr.dev
    # -- Repository to use for the server
    repository: ORGANIZATION/argo-cli-fips
```

Assuming this values file is named `argo.yaml`, you could execute the following `helm` commands to install Argo Workflows:

```shell
helm repo add argo https://argoproj.github.io/argo-helm

helm install argo-workflows argo/argo-workflows \
  --namespace argo-workflows \
  --create-namespace \
  -f argo.yaml
```

The following values file will only deploy the Argo Events image:

```yaml
images:
  tag: "latest"
global:
  image:
    # -- Registry to use for the events
    repository: cgr.dev/ORGANIZATION/argo-events-fips
    tag: "latest"
```

Assuming this values file is named `events.yaml`, you could run the following Helm commands to deploy the Argo Events image:

```shell
helm repo add argo https://argoproj.github.io/argo-helm

helm install argo-workflows argo/argo-events \
  --namespace argo-events \
  --create-namespace \
  -f events.yaml
```

> [!NOTE]
> Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pulumi-kubernetes-operator

# pulumi-kubernetes-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pulumi-kubernetes-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pulumi-kubernetes-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

See https://github.com/pulumi/pulumi-kubernetes-operator#using-kubectl

Install the CRDs:
```
VERSION="1.11.5"
curl -LO "https://github.com/pulumi/pulumi-kubernetes-operator/archive/refs/tags/v${VERSION}.tar.gz"
tar -xvf "v${VERSION}.tar.gz"
kubectl apply -f pulumi-kubernetes-operator-${VERSION}/deploy/crds/
```

Inject the Chainguard image into the install
```
IMAGE_NAME="cgr.dev/chainguard-private/pulumi-kubernetes-operator:latest"
cat pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml | \
  yq ".spec.template.spec.containers[0].image = \"${IMAGE_NAME}\"" \
  > pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml.tmp && \
  mv pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml.tmp \
  pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml
```

If you've loaded the image in yourself, modify the `imagePullPolicy`
as well to prevent 403 errors:
```
cat pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml | \
  yq ".spec.template.spec.containers[0].imagePullPolicy = \"IfNotPresent\"" \
  > pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml.tmp && \
  mv pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml.tmp \
  pulumi-kubernetes-operator-${VERSION}/deploy/yaml/operator.yaml
```

Deploy the operator:
```
kubectl apply -f pulumi-kubernetes-operator-${VERSION}/deploy/yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8ssandra-system-logger-fips

# k8ssandra-system-logger-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8ssandra-system-logger-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8ssandra-system-logger-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-operator

# gitlab-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for GitLab Server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab-operator` image is designed to be a drop-in replacement for the upstream [GitLab Operator](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/container_registry/2034058), No changes to your configuration are required when switching to the Chainguard image.

## Getting Started

### Installing GitLab with GitLab Operator

#### Prerequisites

Before installing the GitLab Operator, you will need:

- **Kubernetes cluster** with `kubectl` configured
- **Ingress controller** - The GitLab Operator deploys NGINX by default, or you can use an [external NGINX Ingress controller](https://kubernetes.github.io/ingress-nginx/deploy/)
- **[cert-manager](https://cert-manager.io/docs/installation/)** - Must be installed before the operator
- **[Metrics server](https://github.com/kubernetes-sigs/metrics-server#installation)** - Required for HorizontalPodAutoscalers
- **Domain name with DNS configured** - You'll need an internet-accessible domain that points to your Ingress controller. See [GitLab DNS settings documentation](https://docs.gitlab.com/omnibus/settings/dns/) for more details

> **Note**: The default configuration is **not suitable for production use**. For production deployments, follow the [Cloud Native Hybrid reference architectures](https://docs.gitlab.com/administration/reference_architectures/#cloud-native-hybrid).

#### Install the GitLab Operator

The GitLab Operator can be deployed using its Helm chart:

```sh
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm install gitlab-operator gitlab/gitlab-operator \
  --namespace gitlab-system \
  --create-namespace \
  --set image.registry=cgr.dev \
  --set image.repository=ORGANIZATION \
  --set image.name=gitlab-operator
```
See [values.yaml](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/master/deploy/chart/values.yaml) for other possible configuration options.

Verify the operator deployment:
```sh
kubectl -n gitlab-system get deployment gitlab-controller-manager
```
#### Deploy GitLab
After the operator is installed, you can deploy GitLab by creating a GitLab custom resource:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: apps.gitlab.com/v1beta1
kind: GitLab
metadata:
  name: gitlab
spec:
  chart:
    version: "X.Y.Z" # supported GitLab chart version (see note below)
    values:
      global:
        hosts:
          domain: example.com # use a real domain here
        ingress:
          configureCertmanager: true
      certmanager-issuer:
        email: youremail@example.com # use your real email address here
EOF
```
> Note: Each GitLab Operator image supports only a few GitLab helm charts. To determine the supported versions for an operator version, check: https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/[OPERATOR_VERSION]/CHART_VERSIONS

Wait for the GitLab instance to deploy:

```sh
kubectl wait --for=condition=Ready gitlab gitlab --namespace=gitlab-system --timeout=10m
```

Once the GitLab instance is running, you can access it at your configured domain (`https://gitlab.example.com`).
#### GitLab Configuration

The GitLab Operator supports extensive configuration through the GitLab custom resource. All configuration options available in the [GitLab Helm Chart](https://docs.gitlab.com/charts/) can be specified under `spec.chart.values`.

For instance, you can configure the GitLab CR to use Chainguard images for various GitLab components:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: apps.gitlab.com/v1beta1
kind: GitLab
metadata:
  name: gitlab
  namespace: gitlab-system
spec:
  chart:
    version: "X.Y.Z"
    values:
      global:
        hosts:
          domain: example.com
        ingress:
          configureCertmanager: true
      certmanager-issuer:
        email: youremail@example.com
      
      gitlab:
        toolbox:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-toolbox-ce
            tag: latest

        gitaly:
          image:
            repository: cgr.dev/ORGANIZATION/gitaly
            tag: latest

        kas:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-kas
            tag: latest

        webservice:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-webservice-ce
            tag: latest

        sidekiq:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-sidekiq-ce
            tag: latest
EOF
```
Visit the [Chainguard Containers Directory](https://images.chainguard.dev/directory/) for a full list of available Chainguard GitLab images.

## Documentation and Resources

For more information on the GitLab Operator, refer to:

- [GitLab Operator repository](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator)
- [GitLab Operator documentation](https://docs.gitlab.com/operator/)
- [GitLab Helm chart documentation](https://docs.gitlab.com/charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-efs-csi-driver

# aws-efs-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-efs-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-efs-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal images for [aws-efs-csi-driver](https://aws.amazon.com/efs/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's AWS Elastic File System (EFS) Container Storage Interface (CSI) driver image is comparable to the [amazon/aws-efs-csi-driver image](https://hub.docker.com/r/amazon/aws-efs-csi-driver) on Docker Hub. As with many of Chainguard's other container images, the AWS EFS CSI driver image contains only the minimum number of dependencies it needs to function. This means it doesn't include things like a shell or package manager.

## Getting Started

The EFS CSI driver requires IAM permissions to interact with your filesystem. This includes an IAM role and policies, as well as a service account and annotation to assume the role.

Refer to the AWS documentations resources on [creating an IAM role](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html#efs-create-iam-resources) for more information.

### Install with Helm

For complete instructions on installing this image with Helm, please refer to the [Helm chart documentation](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#installation).

The following is an example of how to use the Helm chart, using the Chainguard image.

Start by adding a `values.yaml` file to configure the Helm chart:

```
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/aws-efs-csi-driver
  tag: latest
  digest: null
controller:
  serviceAccount:
  create: false
  name: efs-csi-controller-sa
EOF
```

Be sure to update the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Add the Helm repository:

```shell
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
```

Then Install the chart:

```shell
helm upgrade --install aws-efs-csi-driver --namespace kube-system aws-efs-csi-driver/aws-efs-csi-driver -f values.yaml
```

### Install as an EKS add-on

Amazon's Elastic Kubernetes Service (EKS) allows you to install the efs-csi-driver as an EKS add-on. For complete instructions on how you can do this, refer to the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html). If you've chosen this installation method, be aware that you cannot specify a custom image while installing as an EKS add-on.

You'll need to patch the `efs-csi-controller` deployment to use the Chainguard image, and this is a step you'll need to repeat each time that you re-deploy or upgrade the version using EKS add-ons.

## Documentation and Resources

For more information, please refer to the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### blob-csi-fips

# blob-csi-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/blob-csi-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/blob-csi-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access Azure Storage via azure-storage-fuse & NFSv3.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is fully comparable to the official [blob-csi](https://oci.dag.dev/?image=mcr.microsoft.com%2Foss%2Fkubernetes-csi%2Fblob-csi%3Av1.26.2) image available from the Microsoft Artifact Registry.

## FIPS support
Chainguard's blob-csi-fips images ship with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the guide on FIPS-enabled Chainguard Images on Chainguard Academy.

## Getting Started
### Install via Helm
You can deploy the blob-csi-driver using the [official blob-csi-driver Helm chart](https://github.com/kubernetes-sigs/blob-csi-driver/tree/master/charts#readme).

First, create a `values.yaml` file to configure the image repository:

```yaml
image:
  blob:
    repository: cgr.dev/ORGANIZATION/blob-csi-fips
    tag: latest
```

Add the `blob-csi-driver` chart and install:

```bash
helm repo add blob-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/blob-csi-driver/master/charts
helm install blob-csi-driver blob-csi-driver/blob-csi-driver  --values values.yaml
NAME: blob-csi-driver
LAST DEPLOYED: <DATE>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Azure Blob Storage CSI driver is getting deployed to your cluster.

To check Azure Blob Storage CSI driver pods status, please run:

  kubectl --namespace=default get pods --selector="app.kubernetes.io/name=blob-csi-driver" --watch
```

## Documentation and Resources
* [blob-csi GitHub repository](https://github.com/kubernetes-sigs/blob-csi-driver).
* [Azure Documentation: Use Azure Blob Storage CSI Driver](https://learn.microsoft.com/en-us/azure/aks/azure-blob-csi?tabs=NFS)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8ssandra-operator-fips

# k8ssandra-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8ssandra-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8ssandra-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### google-cloud-sdk-iamguarded

# google-cloud-sdk-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/google-cloud-sdk-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/google-cloud-sdk-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal IAMGuarded image with the [Google Cloud SDK](https://cloud.google.com/sdk/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

IAMGuarded-compatible version of the Google Cloud SDK image.

## Overview

This image provides the Google Cloud SDK in an IAMGuarded-compatible format. It includes the `gcloud` command-line tool and other utilities for interacting with Google Cloud Platform services.

## Usage

```bash
docker run --rm cgr.dev/chainguard-private/google-cloud-sdk-iamguarded:latest gcloud --version
```

## Configuration

The image runs with a non-root user (UID/GID 1001) and installs the Google Cloud SDK at `/opt/iamguarded/google-cloud-sdk/`.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### laravel

# laravel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/laravel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/laravel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Laravel images for developing, building, and running Laravel applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Obtaining Environment Information

Based on the `cgr.dev/chainguard/php:latest-fpm` image, our Laravel images include extensions required by Laravel and a dedicated `laravel` user with uid `1000`, reserved for development and build. To check the PHP version running on the `latest` variant, you can run:

```shell
docker run --rm --entrypoint php cgr.dev/chainguard/laravel:latest --version
```

You should get output similar to this:

```
PHP 8.2.17 (cli) (built: Mar 12 2024 17:12:35) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.17, Copyright (c) Zend Technologies
```

To obtain information about available modules, you can run:

```shell
docker run --rm --entrypoint php cgr.dev/chainguard/laravel:latest -m
```

And this will give you the list of PHP modules currently enabled in the `cgr.dev/chainguard/laravel` image:

```
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
random
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
zlib
```
To obtain detailed information about the environment, you can run a `php --info` command on any of the image tags and use `grep` to look for a specific module or extension.

For instance, to check for `curl` settings, you can run:

```shell
docker run --rm --entrypoint php cgr.dev/chainguard/laravel:latest --info | grep curl
```

## Using the `latest-dev` image as Development Environment for Laravel Applications

You can use the `latest-dev` variant of the Laravel image to create and develop Laravel applications without having to install PHP on your host machine.

To create a new Laravel application from your host environment and get access to source files for development, you can run the `laravel-dev` image using a shared volume:

```shell
docker run --rm -v ${PWD}:/work --entrypoint composer --user laravel \
    cgr.dev/chainguard/laravel:latest-dev \
    create-project laravel/laravel demo-laravel --working-dir=/work
```

The **laravel** user has uid **1000**, which will typically match a non-root system user on Linux systems. This allows for a frictionless development environment using shared volumes. If you run into permission issues, it might be the case that your user has a different UID, and that won't match the ownership of files generated inside the container and shared through volumes. If that happens, you should use the `root` container user instead, and fix file permissions accordingly.

In a similar way, you can use the built-in Laravel server to preview the application on your host browser. You'll need a port redirect for that:

```shell
docker run -p 8000:8000 --rm -it -v ${PWD}:/work --entrypoint /work/demo-laravel/artisan --user laravel cgr.dev/chainguard/laravel:latest-dev serve --host=0.0.0.0
```
You can access the application at `http://localhost:8000` while the command runs.

## Example Docker Compose Setup
A good way to test your setup locally is by using [Docker Compose](https://docs.docker.com/compose/compose-file/). The following `docker-compose.yaml` file demonstrates how to create a web server environment using the [Nginx Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/reference/nginx) :

```yaml
version: "3.7"
services:
  app:
    image: cgr.dev/chainguard/laravel:latest-dev
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./app:/app
    networks:
      - wolfi

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:8080
    volumes:
      - ./app:/app
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - wolfi

  mariadb:
    image: cgr.dev/chainguard/mariadb
    restart: unless-stopped
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: 1
      MARIADB_USER: laravel
      MARIADB_PASSWORD: password
      MARIADB_DATABASE: php-test
    ports:
      - 3306:3306
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge

```

You'll notice the Nginx service has a volume share to set up a custom config file. The following `nginx.conf` file sets up Nginx to serve pages from a `/app/public` folder and redirects requests to `.php` files to the `app` service on port `9000`.

```
events {
  worker_connections  1024;
}

http {
    server {
        listen 80;
        index index.php index.html;
        root /app/public;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
}
```

You can get the environment up with:

```shell
docker composer up
```
This will give you a full LEMP experience in a persistent environment including a MariaDB database (drop-in replacement for MySQL).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-security-scan-fips

# rancher-security-scan-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-security-scan-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-security-scan-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Evaluates Kubernetes cluster security posture against established best practices using kube-bench framework.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `rancher-security-scan` container image is designed to be a drop-in replacement for the upstream [rancher/security-scan image](https://github.com/rancher/security-scan). This image maintains full compatibility with rancher/security-scan:latest while providing enhanced security through Chainguard's distroless base and regular vulnerability patching.

## Getting Started

### Kubernetes Deployment

The rancher-security-scan image is typically deployed as part of Rancher's compliance scanning framework. For deployment examples and configurations, please refer to the upstream test deployment.
- [deploy.yaml](https://github.com/rancher/security-scan/blob/main/tests/deploy.yaml) for the basic deployment manifest
- [hack/e2e](https://github.com/rancher/security-scan/blob/main/hack/e2e) for the full recipe/setup process

## Documentation and Resources

- [Rancher Security Scan](https://github.com/rancher/security-scan)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-fips

# kyverno-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `kyverno-fips` container image is based on the [Kyverno image](https://github.com/kyverno/kyverno) with these differences:

- Uses `/usr/bin/kyverno` as the entrypoint instead of `/ko-app/kyverno`
- Built with FIPS-compliant OpenSSL for cryptographic operations
- Consists of five separate container images for different components (admission controller, background controller, cleanup controller, reports controller, and init container)

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Kyverno can be deployed using the official Kyverno Helm chart with Chainguard FIPS container images.

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
admissionController:
  container:
    image:
      registry: cgr.dev
      repository: ORGANIZATION/kyverno-fips
      tag: latest
  initContainer:
    image:
      registry: cgr.dev
      repository: ORGANIZATION/kyverno-pre-fips
      tag: latest

backgroundController:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-background-controller-fips
    tag: latest

cleanupController:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-cleanup-controller-fips
    tag: latest

reportsController:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-reports-controller-fips
    tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno -n kyverno --create-namespace -f values.yaml
```

## Documentation and Resources

- [Kyverno Official Documentation](https://kyverno.io/docs/)
- [Kyverno Installation Guide](https://kyverno.io/docs/installation/)
- [Kyverno Policy Examples](https://kyverno.io/policies/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mongodb-exporter-fips

# prometheus-mongodb-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mongodb-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mongodb-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-operator-fips

# gitlab-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for GitLab Server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab-operator-fips` image is designed to be a drop-in replacement for the upstream [GitLab Operator](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/container_registry/2034058), No changes to your configuration are required when switching to the Chainguard image.

### FIPS Support
The `gitlab-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Installing GitLab with GitLab Operator

#### Prerequisites

Before installing the GitLab Operator, you will need:

- **Kubernetes cluster** with `kubectl` configured
- **Ingress controller** - The GitLab Operator deploys NGINX by default, or you can use an [external NGINX Ingress controller](https://kubernetes.github.io/ingress-nginx/deploy/)
- **[cert-manager](https://cert-manager.io/docs/installation/)** - Must be installed before the operator
- **[Metrics server](https://github.com/kubernetes-sigs/metrics-server#installation)** - Required for HorizontalPodAutoscalers
- **Domain name with DNS configured** - You'll need an internet-accessible domain that points to your Ingress controller. See [GitLab DNS settings documentation](https://docs.gitlab.com/omnibus/settings/dns/) for more details

> **Note**: The default configuration is **not suitable for production use**. For production deployments, follow the [Cloud Native Hybrid reference architectures](https://docs.gitlab.com/administration/reference_architectures/#cloud-native-hybrid).

#### Install the GitLab Operator

The GitLab Operator can be deployed using its Helm chart:

```sh
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm install gitlab-operator gitlab/gitlab-operator \
  --namespace gitlab-system \
  --create-namespace \
  --set image.registry=cgr.dev \
  --set image.repository=ORGANIZATION \
  --set image.name=gitlab-operator-fips
```
See [values.yaml](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/master/deploy/chart/values.yaml) for other possible configuration options.

Verify the operator deployment:
```sh
kubectl -n gitlab-system get deployment gitlab-controller-manager
```
#### Deploy GitLab
After the operator is installed, you can deploy GitLab by creating a GitLab custom resource:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: apps.gitlab.com/v1beta1
kind: GitLab
metadata:
  name: gitlab
spec:
  chart:
    version: "X.Y.Z" # supported GitLab chart version (see note below)
    values:
      global:
        hosts:
          domain: example.com # use a real domain here
        ingress:
          configureCertmanager: true
      certmanager-issuer:
        email: youremail@example.com # use your real email address here
EOF
```
> Note: Each GitLab Operator image supports only a few GitLab helm charts. To determine the supported versions for an operator version, check: https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/[OPERATOR_VERSION]/CHART_VERSIONS

Wait for the GitLab instance to deploy:

```sh
kubectl wait --for=condition=Ready gitlab gitlab --namespace=gitlab-system --timeout=10m
```

Once the GitLab instance is running, you can access it at your configured domain (`https://gitlab.example.com`).
#### GitLab Configuration

The GitLab Operator supports extensive configuration through the GitLab custom resource. All configuration options available in the [GitLab Helm Chart](https://docs.gitlab.com/charts/) can be specified under `spec.chart.values`.

For instance, you can configure the GitLab CR to use Chainguard FIPS images for various GitLab components:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: apps.gitlab.com/v1beta1
kind: GitLab
metadata:
  name: gitlab
  namespace: gitlab-system
spec:
  chart:
    version: "X.Y.Z"
    values:
      global:
        hosts:
          domain: example.com
        ingress:
          configureCertmanager: true
      certmanager-issuer:
        email: youremail@example.com
      
      gitlab:
        toolbox:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-toolbox-ce
            tag: latest

        gitaly:
          image:
            repository: cgr.dev/ORGANIZATION/gitaly
            tag: latest

        kas:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-kas
            tag: latest

        webservice:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-webservice-ce
            tag: latest

        sidekiq:
          image:
            repository: cgr.dev/ORGANIZATION/gitlab-sidekiq-ce
            tag: latest
EOF
```

Visit the [Chainguard Containers Directory](https://images.chainguard.dev/directory/) for a full list of available Chainguard GitLab images.

## Documentation and Resources

For more information on the GitLab Operator, refer to:

- [GitLab Operator repository](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator)
- [GitLab Operator documentation](https://docs.gitlab.com/operator/)
- [GitLab Helm chart documentation](https://docs.gitlab.com/charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### unbound-mailcow-fips

# unbound-mailcow-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/unbound-mailcow-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/unbound-mailcow-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Unbound is a validating, recursive, and caching DNS resolver.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Unbound Mailcow image is comparable to the [mailcow/unbound image](https://hub.docker.com/r/mailcow/unbound) on Docker Hub. As with many of Chainguard's other container images, the Unbound Mailcow image contains only the minimum number of dependencies it needs to function.

The `unbound-mailcow-fips` Chainguard Image runs as the `root` user to support use of `supervisord` as the default command for the image.  The `unbound` daemon started by `supervisord` drops privileges to `unbound` on startup.

### FIPS Support

The `mailcow-unbound-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

This version of the image does not support use of unbound with DNSCrypt as this feature uses a cryptographic library that is not FIPS certified.

## Getting Started

You can start an `unbound` DNS resolver with a command like the following:

```shell
docker run --rm -d --name=unbound-resolver -p 5454:53/udp -p 5454:53/tcp cgr.dev/ORGANIZATION/unbound-mailcow-fips:latest unbound
```

Following that, you can check that `unbound` is working:

```shell
dig @127.0.0.1 -p 5454 chainguard.dev
```

## Documentation and Resources

You can find more information in the [official Unbound documentation](https://unbound.docs.nlnetlabs.nl/en/latest/index.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tflint

# tflint
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tflint` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tflint/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Pluggable Terraform Linter

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `tflint` image is comparable to the [official TFLint image on GHCR](ghcr.io/terraform-linters/tflint).

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it \
  -v "${PWD}:/data" \
  -t cgr.dev/ORGANIZATION/tflint:latest
```

```shell
# (Example output:)
1 issue(s) found:

Warning: terraform "required_version" attribute is required (terraform_required_version)

  on main.tf line 1:

Reference: https://github.com/terraform-linters/tflint-ruleset-terraform/blob/v0.13.0/docs/rules/terraform_required_version.md
```

To download plugins and initialize your environment, you can run the image with `--init` as an argument:

```shell
docker run --rm -it \
  -v "${PWD}:/data" \
  cgr.dev/ORGANIZATION/tflint:latest \
  --init
```
```
All plugins are already installed
```

## Documentation and Resources
- [TFLint documentation](https://github.com/terraform-linters/tflint#getting-started)
- [Terraform documentation](https://developer.hashicorp.com/terraform/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-sentinel-iamguarded-fips

# valkey-sentinel-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-sentinel-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-sentinel-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey is an open source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `valkey-sentinel-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Valkey Sentinel IAMGuarded is a security-enhanced variant of Valkey designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Valkey Sentinel deployments.

## Helm Chart Installation

The Valkey IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/valkey-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/valkey-sentinel-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/valkey:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Valkey IAMGuarded installation using standard Valkey verification methods. The deployment functions as a standard Valkey instance, so all typical Valkey validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Valkey IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Valkey and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-iamguarded-fips

# clickhouse-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-enabled minimal Wolfi-based ClickHouse analytics database image with IAMGuarded integration. [Clickhouse](https://clickhouse.com) is the fastest and most resource efficient open-source database for real-time apps and analytics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `clickhouse-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

ClickHouse IAMGuarded FIPS is a security-enhanced, FIPS-compliant variant of ClickHouse designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard ClickHouse deployments while meeting federal cryptographic compliance requirements.

[ClickHouse](https://clickhouse.com) is the fastest and most resource efficient open-source database for real-time apps and analytics.

## Helm Chart Installation

The ClickHouse IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse
```

### Basic Installation

Once authenticated you can install the chart with standard Helm commands and your organization name:

```bash
helm install clickhouse oci://cgr.dev/$ORGANIZATION/iamguarded-charts/clickhouse \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

## What are Chainguard Containers?

[Chainguard Containers](https://www.chainguard.dev/containers?utm_source=readmes) are minimal container images that are secure by default.

In many cases, the Chainguard Containers tagged as `:latest` contain only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager. Chainguard Containers are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_ designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with a `-dev` variant.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-health-monitor

# kubernetes-csi-external-health-monitor
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-health-monitor` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-health-monitor/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CSI External Health Monitor Controller

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides the CSI External Health Monitor Controller component for Kubernetes CSI (Container Storage Interface) drivers. It is designed to monitor the health of persistent volumes provisioned by CSI drivers and report volume conditions to Kubernetes. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's external-health-monitor image maintains functional parity with the [upstream external-health-monitor](https://github.com/kubernetes-csi/external-health-monitor).

## Getting Started

The CSI External Health Monitor Controller is typically deployed as a sidecar container alongside CSI driver components. It monitors volume health by periodically calling CSI driver APIs and reporting volume conditions to Kubernetes.

### Basic Deployment

The health monitor controller can be deployed as part of a CSI driver deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: csi-driver-with-health-monitor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: csi-driver
  template:
    metadata:
      labels:
        app: csi-driver
    spec:
      containers:
      - name: csi-driver
        image: your-csi-driver:latest
        # CSI driver configuration...
      - name: health-monitor
        image: cgr.dev/ORGANIZATION/kubernetes-csi-external-health-monitor:latest
        args:
        - --v=2
        - --csi-address=/csi/csi.sock
        - --leader-election=true
        - --http-endpoint=:8080
        - --timeout=30s
        - --monitor-interval=60s
        - --enable-node-watcher=true
        ports:
        - containerPort: 8080
          name: http-endpoint
        volumeMounts:
        - name: socket-dir
          mountPath: /csi
      volumes:
      - name: socket-dir
        emptyDir: {}
```

### Configuration Options

The external health monitor supports several command-line arguments:

- `--csi-address`: Path to the CSI driver socket
- `--leader-election`: Enable leader election for multiple replicas
- `--http-endpoint`: HTTP endpoint for metrics and health checks
- `--timeout`: Timeout for CSI operations
- `--monitor-interval`: Interval between health checks
- `--enable-node-watcher`: Enable node watcher for volume condition monitoring

### Kubernetes Integration

The health monitor requires appropriate RBAC permissions to monitor volumes and report conditions:

```yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: external-health-monitor
rules:
- apiGroups: [""]
  resources: ["persistentvolumes", "persistentvolumeclaims", "nodes", "pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["get", "list", "watch", "create", "patch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["volumeattachments", "storageclasses", "csinodes"]
  verbs: ["get", "list", "watch"]
```

### Monitoring and Observability

The health monitor exposes metrics on the configured HTTP endpoint:

- Volume health status metrics
- CSI operation metrics
- Controller operation metrics

Access metrics via:
```bash
curl http://localhost:8080/metrics
```

## Documentation and Resources

- [CSI External Health Monitor Documentation](https://kubernetes-csi.github.io/docs/external-health-monitor-controller.html)
- [Kubernetes CSI Documentation](https://kubernetes.io/docs/concepts/storage/volumes/#csi)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-webhook-certgen

# kube-webhook-certgen
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-webhook-certgen` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-webhook-certgen/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Generates certificates and updates Kubernetes webhooks, integrating with Helm to simplify Kubernetes job execution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Forked version, maintained by ingress-nginx project!
NOTE: this is the ingress-nginx projects fork of `kube-webhook-certgen`. The
[original project](https://github.com/jet/kube-webhook-certgen) is no longer
maintained.

## Versioning Strategy
NOTE: This image follows semantic versioning aligned with the [ingress-nginx-controller images](https://images.chainguard.dev/directory/image/ingress-nginx-controller/versions). While the [ingress-nginx project](https://github.com/kubernetes/ingress-nginx/tree/main/images/kube-webhook-certgen) uses independent tagging for their build system, both implementations provide the same core functionality. The Chainguard version tags correspond to the ingress-nginx-controller releases to maintain consistency.

If you're migrating from the [original jet/kube-webhook-certgen project](https://github.com/jet/kube-webhook-certgen) (which is no longer maintained) or using Helm charts like [kube-prometheus-stack](https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack?modal=values&path=prometheusOperator.admissionWebhooks.patch.image) that reference older image versions, you can use our semantically tagged versions as drop-in replacements.

## Prometheus operator
Below is an example of how to deploy the prometheus operator, which utilizes
this image.

First, add the helm operator:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
```

Then, use the following Terraform configuration to deploy the Prometheus
Operator. Note, we're utilizing the[Chainguard prometheus operator image](https://images.chainguard.dev/directory/image/prometheus-operator/overview),
as well as the Chainguard kube-webhook-certgen image:

```bash
helm install prometheus-operator prometheus-community/kube-prometheus-stack \
  --set prometheusOperator.image.registry=cgr.dev \
  --set prometheusOperator.image.repository=chainguard/prometheus-operator \
  --set prometheusOperator.image.tag=latest
  --set prometheusOperator.admissionWebhooks.patch.image.registry=cgr.dev \
  --set prometheusOperator.admissionWebhooks.patch.image.repository=chainguard/kube-webhook-certgen \
  --set prometheusOperator.admissionWebhooks.patch.image.tag=latest
```

For more information, refer to the following resources:
- [prometheus operator docs](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)
- [kube-webhook-certgen docs](https://github.com/kubernetes/ingress-nginx/tree/main/images/kube-webhook-certgen)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-k8s-cni-fips

# amazon-k8s-cni-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-k8s-cni-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-k8s-cni-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

AWS VPC CNI can be deployed to manage networking in an Amazon EKS cluster, providing high-performance networking for Kubernetes workloads. 

For help with installation, please refer to the [TESTING.md](./TESTING.md) and [the official ](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### povray

# povray
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/povray` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/povray/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

POV-Ray is a ray-tracing program that generates images from text-based scene descriptions.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `povray` image provides a complete implementation of POV-Ray, the Persistence of Vision Raytracer. Notable characteristics:

* Contains POV-Ray with all standard include files and libraries
* Runs as a non-root user by default
* Does not include a shell or package manager in the production variant

## Getting Started

POV-Ray renders 3D scenes described in text files with a `.pov` extension. The basic workflow involves creating a scene file and using POV-Ray to render it to an image.

To render a simple scene, first create a scene file:

```sh
cat > simple-scene.pov <<EOF
#version MAJOR.MINOR;

global_settings { assumed_gamma 1.0 }

camera {
  location <0, 1, -5>
  look_at <0, 0, 0>
  angle 35
}

light_source { <5, 10, -5> color rgb <1, 1, 1> }

sphere {
  <0, 0, 0>, 1
  pigment { color rgb <1, 0, 0> }
  finish { phong 0.9 }
}

plane {
  y, -1
  pigment { checker color rgb <0.8, 0.8, 0.8>, color rgb <0.2, 0.2, 0.2> }
}
EOF
```

Render the scene to a PNG image:

```sh
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/simple-scene.pov +O/scenes/output.png +W640 +H480
```

This command mounts the current directory as `/scenes` in the container and renders the scene file to `output.png` with a resolution of 640x480 pixels.

### Common Command Options

POV-Ray accepts many command-line options for controlling the rendering process:

```sh
# Render with anti-aliasing for smoother edges
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.png +W800 +H600 +A

# Render with specific quality level (0-11, higher = better)
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.png +W640 +H480 +Q9

# Render to different formats
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.tga +FT +W640 +H480
```

### Working with Include Files

POV-Ray scenes often use include files for reusable components. The image includes standard POV-Ray libraries:

```sh
cat > textured-scene.pov <<EOF
#version MAJOR.MINOR;
#include "colors.inc"
#include "stones.inc"

global_settings { assumed_gamma 1.0 }

camera {
  location <0, 2, -5>
  look_at <0, 0, 0>
  angle 35
}

light_source { <5, 10, -5> color White }

sphere {
  <0, 0, 0>, 1
  texture { T_Stone25 }
}
EOF
```

Render the scene that uses standard textures:

```sh
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/textured-scene.pov +O/scenes/textured.png +W640 +H480 +A
```

## Configuration

### Volume Mounts

Mount your scene files directory to `/scenes` to make them accessible to POV-Ray:

```sh
docker run --rm -v /path/to/your/scenes:/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/myscene.pov +O/scenes/rendered.png
```

## Documentation and Resources

* [POV-Ray Official Documentation](https://www.povray.org/documentation/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### node-fips

# node-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/node-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/node-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`node-fips` is comparable to the official [`node`](https://hub.docker.com/_/node/) image for running NodeJS apps, but is specially designed to use approved cryptographic implementations at runtime. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

The `node-fips` Chainguard Image runs as a nonroot user (`node`) by default. A `USER root` statement may be required before performing tasks requiring elevated permissions.
Note: This image uses a different entrypoint(`/usr/bin/node`) than the official Node image.

### Container Variants

Chainguard's `node-fips` container image comes in multiple variants, each designed for different user needs and operational requirements.

The standard `node-fips` variant provides a minimal container image that includes tools commonly needed for production use and compatibility, such as Node.js runtime and essential libraries. This is the default choice for most users, aimed at production deployments and smooth migration from external Node container images, but without unnecessary extras. The `-dev` variant (also known as "Development" variant) adds extra utilities like a shell, package manager (e.g., apk), and debugging tools on top of the standard runtime. These are useful when building or troubleshooting applications inside the container, or when needing a familiar interactive environment with broad compatibility.

Importantly, Chainguard's `node-fips` container image also comes with a `-slim` variant that is even more minimal than the standard variant and contains only the critical files necessary to run Node.js applications. As such, it doesn't include a shell, package manager, debuggers, or utility tools, meaning that the image's size and attack surface are kept as small as possible. `-slim` variants are best suited for advanced users who want maximum security and smallest possible footprint. They're ideal for locked-down production environments or cases with strict compliance requirements, but users give up conveniences like shell access or running shell-based entrypoint scripts.

## Getting Started

### Verify FIPS Mode

Node provides the [Crypto API](https://nodejs.org/api/crypto.html) as standard. The cryptographic primitives accessed via these APIs are implemented by OpenSSL. When OpenSSL is configured to use the OpenSSL FIPS provider by default, the NodeJS Crypto API will be using approved implementation at runtime. This is documented in the [FIPS section](https://nodejs.org/api/crypto.html#fips-mode) of the NodeJS Crypto API. The configuration options mentioned there have been completed at the `node-fips` image build time, meaning the `node-fips` image from Chainguard provides the Crypto APIs in approved mode without any special actions required from you, and without any need to modify your code.

This is achieved using the `openssl-config-fipshardened` package that is pre-installed in the images, and completes the configuration described in the NodeJS upstream documentation, which states "FIPS mode can be enabled in Node.js via the OpenSSL configuration file". The applicable Cryptographic Module Validation Program (CMVP) certificate is listed on the [FIPS commitment](https://www.chainguard.dev/legal/fips-commitment) page.

To interactively verify that FIPS mode is correctly enabled, use the [crypto.getFips()](https://nodejs.org/api/crypto.html#cryptogetfips) API. Be sure to replace `ORGANIZATION` with the name of your organization:

```shell
docker run cgr.dev/ORGANIZATION/node-fips --eval "require('crypto'); console.log(crypto.getFips() === 1)"
```
```
true
```

The majority of npm packages that use the [Crypto](https://nodejs.org/api/crypto.html) API to implement all cryptography and higher level abstractions, and thus are FIPS-compliant, or fail at runtime (for example, by attempting to request and use an unapproved algorithm).

There are many npm packages that provide their own cryptographic implementations (typically in pure-JavaScript) or by vendoring native code. All of those are likely to not be FIPS-certified, unless they only use [Crypto](https://nodejs.org/api/crypto.html) for the cryptographic primitives or have been separately certified. This means that the majority and potentially all of the npm packages with the [keyword "crypto"](https://www.npmjs.com/search?q=keywords%3Acrypto&ranking=popularity) are not FIPS-certified implementations, and must not be used to cryptographically secure data. It is permitted to use them for non-security purposes.

### Distroless CLI Application

In this example, we'll write a `.js` script that prints a message, then prints the message reversed. The script will use one dependency, the [`text-reverse`](https://www.npmjs.com/package/text-reverse) package. The script will optionally take one positional argument: if no argument is passed, a default message will be printed and reversed, otherwise the passed argument will be printed and reversed.

First, let's create a project structure for our example:

```sh
mkdir -p ~/node-reverse/bin && cd ~/node-reverse
```

This creates the following folder structure and sets our working directory to the root `node-reverse`folder:

```
node-reverse
└── bin
```

Now let's create a `package.json` file, which provides metadata about the project, including dependencies:

```sh
cat << 'EOF' > package.json
{
    "name": "linky_hello",
    "version": "1.0.0",
    "description": "Say hello to Linky",
    "main": "bin",
    "bin": {
        "linky_hello": "./bin/index.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
        "text-reverse": "^1.0.0"
    }
}
EOF
```

The above defines a package, `linky_hello`, that depends on `text-reverse`, and which will run the code in `bin/index.js` on `npm run start`.

Let's create our application code now:

```sh
cat << 'EOF' > bin/index.js
#!/usr/bin/env node

const reverse=require('text-reverse');

const run_argument=process.argv[2]

if (run_argument) {
    console.log(run_argument)
    console.log(reverse(run_argument))    
} else {
    const message="Hello, Linky!"
    const reversed=reverse(message)
    console.log(message  + "🐙")
    console.log("🐙" + reversed)
}
EOF
```

This application code first looks at any arguments passed to the script. If a positional argument is passed when the script is run, it will print that argument, then print its reverse. If no argument is passed, a default message will be printed and reversed.

Finally, let's create a `Dockerfile` for our image build. Run the following to create the Dockerfile:

```sh
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/node-fips:latest
ENV NODE_ENV=production

WORKDIR /app

COPY --chown=node:node package.json .
ADD ./bin ./bin
RUN npm install

ENTRYPOINT ["node", "bin/index.js"]
EOF
```

Again, be sure to replace `ORGANIZATION` with the name of your Chainguard organization.

This `Dockerfile` sets the `file NODE_ENV` environment variable to `production`, copies our `package.json` and `bin` directory, installs our dependency with `npm install`, and runs our `.js` script.

Build the image, tagging it `node-reverse`:

```sh
docker build . -t node-reverse
```

Finally, run the container:

```sh
docker run node-reverse
```

You should see the following output:

```
Hello, Linky!🐙
🐙!ykniL ,olleH
```

You can also pass an argument to the `docker run node-reverse` command to change the output:

```sh
docker run node-reverse "Hello, Chainguard User\!"
```

This should produce the following output:

```
Hello, Chainguard User!
!resU draugniahC ,olleH
```

## Express.js Server

In this example, we'll create an [Express.js](https://expressjs.com/) server that allows retrieval of a JSON-formatted list of animals and the addition of new animals via POST request.

First, create a folder for our example:

```sh
mkdir -p ~/node-express && cd $_
```

Create a `package.json` file, which provides metadata about the project, including dependencies:

```sh
cat << 'EOF' > package.json
{
  "name": "Express Server",
  "version": "1.0.0",
  "description": "A server that allows getting and posting dummy data in JSON format",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.14.1",
    "express": "^4.13.3"
  }
}
EOF
```

Next, add our server application code:

```sh
cat << 'EOF' > server.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

//Allow all requests from all domains
app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "POST, GET");
  next();
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

var animals = [
    {
        "id": "234kjw",
        "text": "octopus"
    },
    {
        "id": "as82w",
        "text": "penguin"
    },
    {
        "id": "234sk1",
        "text": "whale"
    }
];

app.get('/animals', function(req, res) {
    console.log("GET From SERVER");
    res.send(animals);
});

app.post('/animals', function(req, res) {
    var animal = req.body;
    console.log(req.body);
    animals.push(animal);
    res.status(200).send("Successfully posted animal\n");
});

console.log("🐙🐧🐋 Server running. Retrieve animals from http://localhost:6069/animals")
app.listen(6069);
EOF
```

This application runs a server with GET and POST endpoints. At the GET endpoint, some dummy data is served in JSON format. The POST endpoint accepts and adds new entries passed as JSON.

Finally, create a `Dockerfile` for our image build:

```sh
cat << EOF > Dockerfile
FROM cgr.dev/ORGANIZATION/node-fips:latest
ENV NODE_ENV=production

WORKDIR /app

COPY --chown=node:node ["package.json", "server.js", "./"]

RUN npm install --omit-dev

CMD [ "server.js" ]
EOF
```

Again, be sure to replace `ORGANIZATION` with the name of your Chainguard organization.

Build the image:

```sh
docker build . -t node-express
```

Finally, run the server container:

```sh
docker run --rm -p 6069:6069 node-express
```

You should see the following message:

```
🐙🐧🐋 Server running. Retrieve animals from http://localhost:6069/animals
```

Visit [http://localhost:6069/animals](http://localhost:6069/animals) to view the served JSON data.

You can post new data to the running application:

```sh
 curl -H 'Content-Type: application/json' \
 -d '{ "id":9001,"text":"gnu"}' \
 -X POST \
 http://localhost:6069/animals
```

After posting, refresh the page on [http://localhost:6069/animals](http://localhost:6069/animals) to view the additional data.

## Configuration

### Webpack Recommendation

WebPack 4 may default to using the Crypto API MD4 hash for non-security purposes, which is not available with `node-fips`. Upgrade to WebPack 5 which defaults to highly performant non-security [xxhash](https://xxhash.com/) for better performance.

If upgrading to WebPack 5 is not an option, one can update local webpack configuration to use SHA-256 (even though it is for a non-security purpose) which will work regardless of the node's fips mode. See [this PR](https://github.com/argoproj/argo-rollouts/pull/3475/files) as an example.

## Documentation and Resources

- [Chainguard Academy: FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)
- [Chainguard Node Image guidance](https://images.chainguard.dev/directory/image/node/overview)
- [Chainguard Academy: Getting Started with the Node Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/node/)
- [Chainguard Academy: How to Port a Sample Application to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/?utm_source=blog&utm_medium=website&utm_campaign=FY25-EC-Blog_sourced)
- [Learning Lab: Chainguard's Node Image](https://www.chainguard.dev/events/chainguards-node-image)
- [Blog: Migrating a Node.js application to Chainguard Images](https://www.chainguard.dev/unchained/migrating-a-node-js-application-to-chainguard-images)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### contour-iamguarded-fips

# contour-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/contour-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/contour-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Contour is an ingress controller for Kubernetes that works by deploying the Envoy proxy as a reverse proxy and load balancer. Contour supports dynamic configuration updates out of the box while maintaining a lightweight profile.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Contour IAMGuarded is a security-enhanced variant of Contour designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Contour deployments.

## Helm Chart Installation

The Contour IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/contour
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
# Main Contour image
contour:
  image:
    repository: $ORGANIZATION/contour-iamguarded-fips

# Envoy proxy image
envoy:
  image:
    repository: $ORGANIZATION/envoy-iamguarded-fips

# Nginx image
defaultBackend:
  image:
    repository: $ORGANIZATION/nginx-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Contour image
contour:
  image:
    registry: myregistry.example.com
    repository: mirrored/contour-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Envoy proxy image
envoy:
  image:
    registry: myregistry.example.com
    repository: mirrored/envoy-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Nginx image
defaultBackend:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/contour:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Contour IAMGuarded installation:

```bash
kubectl get po -l app.kubernetes.io/name=contour
```

You should see Contour and Envoy pods running:

```bash
NAME                              READY   STATUS    RESTARTS   AGE
contour-contour-c66d5cb67-z7ql6   1/1     Running   0          98s
contour-envoy-cw6vs               2/2     Running   0          98s
```

For more information on Contour, including follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### filebeat

# filebeat
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/filebeat` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/filebeat/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[filebeat](https://github.com/elastic/beats/tree/main/filebeat) Tails and ships log files

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Filebeat Image is comparable to [the official Filebeat image from Docker Hub](https://hub.docker.com/r/elastic/filebeat). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
There are no actively supported Helm charts for deploying Filebeat upstream. The most recent are present [here](https://github.com/elastic/helm-charts/tree/main/filebeat) and were archived in 2023. There are, however, [manifest-based deployments](https://github.com/elastic/beats/tree/main/deploy/kubernetes/filebeat) offered as an alternative by the upstream maintainers.

You will need to override the image properties to use the Chainguard-provided image for Filebeat. Additionally, make sure to change the image in the daemonset to the Chainguard filebeat Image.

Be aware that you can configure Filebeat to write to a specific output by [setting options in the `Outputs` section of the `filebeat.yml` config file](https://www.elastic.co/guide/en/beats/filebeat/current/configuring-output.html). In the manifests provided above, it can be done [here](https://github.com/elastic/beats/blob/main/deploy/kubernetes/filebeat/filebeat-configmap.yaml#L55).

2. The above manifests will bring Filebeat up in `kube-system` namespace. And you will be able to see Filebeat output in `*.ndjson` file in `/usr/share/filebeat/output` directory in the Filebeat pod.

## Documentation and Resources

- [Filebeat official docs](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html)

> [!NOTE]
> The upstream documentation doesn't currently maintain a Filebeat Helm chart, and testing with [the deprecated chart](https://github.com/elastic/helm-charts/tree/2fd64d0af65f14df7aa01da591919460dabac4b3/filebeat) requires installing additional packages (such as curl and bash) in the container.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-blackbox-exporter-fips

# prometheus-blackbox-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-blackbox-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-blackbox-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gpu-operator-validator

# gpu-operator-validator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gpu-operator-validator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gpu-operator-validator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [gpu-operator-validator](https://github.com/NVIDIA/gpu-operator) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

NVIDIA GPU Operator creates/configures/manages GPUs atop Kubernetes and automates tasks related to bootstrapping GPU nodes.

The `gpu-operator-validator` image provides the validator for NVIDIA GPU Operator, which runs as a Daemonset and ensures that all components are working as expected on all GPU nodes. This needs to be run on a VM which has GPU support, or a kind cluster which supports GPUs.

## Helm Installation for GPU-Operator
You can configure the GPU Operator Validator using the Helm chart
```shell
$ helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
    && helm repo update
$ helm upgrade --install gpu-operator nvidia/gpu-operator \
    --set validator.repository=<cgr-registry> \
    --set validator.image=gpu-operator-validator \
    --set validator.version=latest \
    --set operator.repository=<cgr-registry> \
    --set operator.image=gpu-operator \
    --set operator.version=latest-dev
 ```

It might take a couple of minutes for all the pods and deamonsets to be created.

For more information, refer to the documentation:
- https://github.com/NVIDIA/gpu-operator/tree/main/deployments/gpu-operator
- https://catalog.ngc.nvidia.com/orgs/nvidia/teams/cloud-native/containers/gpu-operator-validator

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8sgpt-operator

# k8sgpt-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8sgpt-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8sgpt-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal k8sgpt-operator container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [k8sgpt-operator](https://github.com/k8sgpt-ai/k8sgpt-operator/pkgs/container/k8sgpt-operator) image from the K8sGPT Project. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

To install Chainguard's k8sgpt-operator image on your Kubernetes cluster, you can use the k8sgpt-operator [Helm chart](https://artifacthub.io/packages/helm/k8sgpt/k8sgpt-operator).

You can override the image by setting the `controllerManager.manager.image.repository` and `controllerManager.manager.image.tag` values in a `values.yaml` file, like so:

```yaml
controllerManager:
  manager:
    image:
      repository: cgr.dev/ORGANIZATION/k8sgpt-operator
      tag: latest
```

Then invoke the following command to install k8sgpt-operator in your cluster:

```shell
helm repo add k8sgpt https://charts.k8sgpt.ai/
helm install release k8sgpt/k8sgpt-operator -n k8sgpt-operator-system --create-namespace --values values.yaml
```

## Documentation and Resources
For more information, please refer to [the documentation for k8sgpt-operator](https://docs.k8sgpt.ai/getting-started/in-cluster-operator/). 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### terraform-fips

# terraform-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/terraform-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/terraform-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with upstream terraform image with few exceptions:
- Chainguard's terraform fips root image is totally compatible with upstream image.
- Chainguard's terraform nonroot fips image includes a `/work` directory specifically for the nonroot user, which allows you to mount your Terraform project in that location.

We'll create a simple main.tf file for using chainguard terraform image. 
```tf
terraform {
  required_providers {
    random = {
      source = "hashicorp/random"
    }
  }
}

provider "random" {}
resource "random_string" "random" {
  length = 16
}

output "random" {
  value = random_string.random.result
}
```
Save this file as main.tf in your current working directory.

We'll now use chainguard terraform image to initialize the plugins and create the resource.
```bash
$ docker run --rm -v $(pwd):/test -w /test cgr.dev/chainguard/terraform-fips:latest init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/random...
- Installing hashicorp/random v3.6.3...
- Installed hashicorp/random v3.6.3 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```
Once our plugins are initialized, we'll go ahead and create the resource.

```bash
$ docker run --rm -v $(pwd):/test -w /test cgr.dev/chainguard/terraform-fips:latest apply -auto-approve

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # random_string.random will be created
  + resource "random_string" "random" {
      + id          = (known after apply)
      + length      = 16
      + lower       = true
      + min_lower   = 0
      + min_numeric = 0
      + min_special = 0
      + min_upper   = 0
      + number      = true
      + numeric     = true
      + result      = (known after apply)
      + special     = true
      + upper       = true
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + random = (known after apply)
random_string.random: Creating...
random_string.random: Creation complete after 0s [id=PbPn(n:POB5tuPLn]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

random = "PbPn(n:POB5tuPLn"

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-volume-provisioner-fips

# local-volume-provisioner-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-volume-provisioner-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-volume-provisioner-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Static provisioner of local volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `local-volume-provisioner-fips` Chainguard Image is a FIPS-enabled variant of the `local-volume-provisioner` image. It is comparable to the [upstream `local-volume-provisioner` image](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) maintained by the Kubernetes SIG Storage community, with the following key differences:

### FIPS Compliance

**Difference:** This variant is built with FIPS 140-2/140-3 validated cryptographic modules.

**Why this change exists:** Many government agencies and regulated industries require FIPS-validated cryptography for compliance with federal security standards. This variant ensures all cryptographic operations use FIPS-approved algorithms and implementations.

**Benefits:**
- Compliance with federal security requirements (NIST FIPS 140-2/140-3)
- Suitable for government and regulated industry deployments
- Meets DOD, FedRAMP, and other federal security frameworks

> [!NOTE]
> If you do not have specific FIPS compliance requirements, the standard `local-volume-provisioner` image is recommended as it has a smaller footprint.

### Non-root Execution

**Difference:** This Chainguard Image runs as a non-root user (UID 65532) instead of root (UID 0).

**Why this change exists:** Running containers as non-root is a security best practice that reduces the attack surface by limiting the privileges available to a compromised container. This aligns with the principle of least privilege and helps meet compliance requirements for secure container deployments.

**Benefits:**
- Reduced security risk if the container is compromised
- Better alignment with Pod Security Standards and security policies
- Compliance with organizational security requirements that prohibit root containers

> [!IMPORTANT]
> **Breaking change:** If you are migrating from an upstream image that runs as root, you may need to adjust your deployment. The non-root user requires explicit permissions to access host paths and perform volume management operations.

**Required adjustments:**
- Host paths mounted into the container must have appropriate permissions (readable/writable by UID 65532)
- Some file system operations may require init containers with elevated privileges to prepare directories
- Security contexts and volume mount options may need configuration to grant necessary permissions

If you encounter permission errors, review your volume mounts, security contexts, and host path permissions to ensure compatibility with non-root execution.

## Prerequisites

Before using this image, you will need:

- A Kubernetes cluster (version 1.23 or later recommended)
- `kubectl` configured to access your cluster
- Host paths on nodes designated for local volume storage
- Appropriate permissions to create StorageClasses and DaemonSets

For detailed information about the local volume provisioner, refer to the [upstream documentation](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner).

## Getting Started

To be able to test the local volume provisioner, you need to have a Kubernetes cluster running. You can use [k3d](https://k3d.io//) to create a local cluster.

### Create a local cluster

```bash

k3d create cluster
```

### Deploy the local volume provisioner

```bash
# Create the necessary StorageClass
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/default_example_storageclass.yaml

# Create the local volume provisioner
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/default_example_provisioner_generated.yaml

# Change the provisioner image to the Chainguard image
kubectl set image daemonset/local-volume-provisioner provisioner="cgr.dev/ORGANIZATION/local-volume-provisioner-fips:latest"
```

Please ensure that the local volume provisioner is running before moving to the next step:

```bash
kubectl rollout status daemonset/local-volume-provisioner --timeout=120s
```

So, if everything is running, you should shell/exec into the nodes and do the following:

```bash
# Get server and worker node names from k3d, filtering by role
node_names=$(k3d node list -o json | jq -r '.[] | select(.role == "server" or .role == "agent") | .name')

# Loop over each node name and execute the commands
for node in $node_names; do
    echo "Configuring node: $node"

    # Create directory
    docker exec $node mkdir -p /mnt/fast-disks/vol1

    # Mount tmpfs
    docker exec $node mount -t tmpfs vol1 /mnt/fast-disks/vol1

    echo "Configuration complete for node: $node"
done
```

Once you have the local disks mounted, you should see the PVs created:

```bash
kubectl get pv
```

That's it! You have the `local-volume-provisioner` running and managing the local disks on your cluster.

## Configuration

The `local-volume-provisioner` is configured through a ConfigMap that defines discovery directories and storage classes. Here's an example of configuring the provisioner to use a specific directory pattern with proper permissions for non-root execution:

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-provisioner-config
  namespace: default
data:
  storageClassMap: |
    fast-disks:
      hostDir: /mnt/fast-disks
      mountDir: /mnt/fast-disks
      blockCleanerCommand:
        - "/scripts/shred.sh"
        - "2"
      volumeMode: Filesystem
      fsType: ext4
```

**Key configuration considerations for non-root execution:**

When using this Chainguard Image, ensure that the `hostDir` paths have appropriate permissions. You may need to use an init container to prepare directories with the correct ownership:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: local-volume-provisioner
spec:
  template:
    spec:
      initContainers:
      - name: prepare-dirs
        image: cgr.dev/ORGANIZATION/busybox-fips:latest
        command:
        - sh
        - -c
        - |
          chown -R 65532:65532 /mnt/fast-disks
          chmod -R 755 /mnt/fast-disks
        volumeMounts:
        - name: local-disks
          mountPath: /mnt/fast-disks
        securityContext:
          runAsUser: 0
          privileged: true
      containers:
      - name: provisioner
        image: cgr.dev/ORGANIZATION/local-volume-provisioner-fips:latest
        securityContext:
          runAsUser: 65532
          runAsNonRoot: true
        # ... rest of configuration
```

This approach uses a privileged init container to set up directory permissions once, allowing the main provisioner container to run securely as non-root. This pattern provides the security benefits of non-root execution while handling the necessary privileged operations during initialization.

For complete configuration options, refer to the [upstream configuration documentation](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/provisioner.md).

## Documentation and Resources

- [Kubernetes Local Persistent Volumes](https://kubernetes.io/docs/concepts/storage/volumes/#local) - Official Kubernetes documentation on local volumes
- [Local Volume Provisioner GitHub Repository](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) - Upstream project documentation
- [Chainguard Academy](https://edu.chainguard.dev/) - Learn more about Chainguard Images and secure container practices
- [Working with Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/) - General guidance on using Chainguard Images

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### emqx-exporter

# emqx-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/emqx-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/emqx-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The emqx-exporter is designed to expose partial metrics that are not included in the EMQX Prometheus API.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is based on the upstream [emqx-exporter](https://hub.docker.com/r/emqx/emqx-exporter) image, with the following differences:

* Like all other Chainguard Containers, `emqx-exporter` features a stripped down, minimal design container image
* It has few-to-zero CVEs

## Getting Started
EMQX Exporter can be deployed either as a standalone container or inside a Kubernetes cluster. This section provides minimal examples to help you start the service using the supported deployment methods.

### Running with Docker
```bash
git clone https://github.com/emqx/emqx-exporter
cd emqx-exporter/examples/docker-compose

# Replace the emqx-exporter image with the Wolfi variant:
IMAGE="cgr.dev/ORGANIZATION/emqx-exporter:latest" yq -i '.services."emqx-exporter".image = env(IMAGE)' docker-compose.yml

# Start the deployment
docker-compose up -d
```

You should now see the exported metrics in prometheus&grafana. You can also query them via promtool:

```bash
# Check the exposed metrics
curl http://localhost:8085/metrics
# Query the metrics
promtool query instant http://localhost:9090 emqx_cluster_status
```

### Running with Kubernetes
```bash
git clone https://github.com/emqx/emqx-exporter
cd emqx-exporter

# Replace the emqx-exporter image with the Wolfi variant:
IMAGE="cgr.dev/ORGANIZATION/emqx-exporter:latest"  yq -i '
(. | select(.kind == "Deployment" and .metadata.name == "emqx-exporter")
    | .spec.template.spec.containers[]
    | select(.name == "exporter")
    | .image) = env(IMAGE)
' examples/kubernetes/resources/emqx-exporter.yaml

# Install EMQX-Operator
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true
helm repo add emqx https://repos.emqx.io/charts
helm repo update
helm upgrade --install emqx-operator emqx/emqx-operator \
  --namespace emqx-operator-system \
  --create-namespace
kubectl wait --for=condition=Ready pods -l "control-plane=controller-manager" -n emqx-operator-system

# Install CRDs for prometheus stack
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
kubectl apply --server-side -f manifests/setup
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring

# Install EMQX & EMQX Exporter
cd ..
kubectl apply -k examples/kubernetes --server-side
```

You should now see the exported metrics in prometheus&grafana. You can also query them via promtool:

```bash
# Expose the emqx-exporter service 
kubectl port-forward svc/emqx-exporter-service 8085:8085

# Check the exposed metrics
curl http://localhost:8085/metrics

# Expose the prometheus service
kubectl -n monitoring port-forward svc/prometheus-k8s 9090:9090

# Query the metrics
promtool query instant http://localhost:9090 emqx_cluster_status
```

## Documentation and Resources

For more information about Emqx-Exporter in container images, please refer to the [emqx website](https://docs.emqx.com/en/emqx-operator/latest/tasks/configure-emqx-prometheus.html#monitor-emqx-cluster-by-prometheus-and-grafana) or to the [official repository](https://github.com/emqx/emqx-exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-process-exporter-fips

# prometheus-process-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-process-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-process-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

process-exporter is an agent that collects process-specific metrics from a system and exposes them in a format that can be ingested by Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `prometheus-process-exporter-fips` container image is comparable to the [ncabatoff/process-exporter](https://github.com/ncabatoff/process-exporter) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `prometheus-process-exporter` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting started

To get started, pull down the image with Docker:

```bash
docker pull cgr.dev/ORGANIZATION/prometheus-process-exporter-fips
```

Now, you can run the image:

```bash
docker run --rm -p 9256:9256 cgr.dev/ORGANIZATION/prometheus-process-exporter-fips:latest
```

This exposes metrics at `http://localhost:9256/metrics`.

### Kubernetes

Create a Deployment:

`deployment.yaml`:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-process-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus-process-exporter
  template:
    metadata:
      labels:
        app: prometheus-process-exporter
    spec:
      containers:
      - name: prometheus-process-exporter
        image: cgr.dev/ORGANIZATION/prometheus-process-exporter-fips:latest
        ports:
        - containerPort: 9256
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-process-exporter
spec:
  selector:
    app: prometheus-process-exporter
  ports:
    - protocol: TCP
      port: 9256
      targetPort: 9256
  type: ClusterIP
```

Apply the YAML:

```bash
kubectl apply -f deployment.yaml
```

Access metrics:

```bash
kubectl port-forward svc/prometheus-process-exporter 9256:9256
```

Now, you can access metrics at `http://localhost:9256/metrics`

## Documentation and Resources

* **[Official Documentation](https://github.com/ncabatoff/process-exporter#readme)**
* **[GitHub Repository](https://github.com/ncabatoff/process-exporter)**
* **[Grafana Alloy Process Exporter Integration](https://grafana.com/docs/alloy/latest/reference/components/prometheus/prometheus.exporter.process/)**
* **[Grafana Agent process_exporter_config](https://grafana.com/docs/agent/latest/static/configuration/integrations/process-exporter-config/)**
* **[Prometheus Exporters Overview](https://prometheus.io/docs/instrumenting/exporters/)**
* **[Process Exporter Dashboard for Grafana](https://grafana.com/grafana/dashboards/22161-process-exporter-dashboard/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### os-shell-cassandra-iamguarded

# os-shell-cassandra-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/os-shell-cassandra-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/os-shell-cassandra-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

os-shell-cassandra-iamguarded image is an utilities image specifically for the Cassandra Helm chart's dynamic seed discovery feature. This image includes additional dependencies required for dynamic seed discovery and should only be used with the Cassandra Helm chart

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

OS-Shell Cassandra IAMGuarded is a specialized image providing shell and Cassandra-specific utilities, used exclusively by the Cassandra Helm chart for dynamic seed discovery operations. This image includes additional dependencies beyond the standard os-shell-iamguarded image that are required for Cassandra's dynamic seed discovery feature.

**Important**: This image should only be used with the Cassandra Helm chart and is not intended as a general-purpose shell image.

## Helm Chart Installation

This image is specifically designed for the Cassandra Helm chart and is used for dynamic seed discovery operations. It does not come with its own Helm Chart.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for the Cassandra Helm chart that enables dynamic seed discovery and pins the image to specific digest:

```yaml
# OS Shell Cassandra image for dynamic seed discovery
dynamicSeedDiscovery:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-cassandra-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-iamguarded

# envoy-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Envoy](https://www.envoyproxy.io/) Cloud-native high-performance edge/middle/service proxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Envoy IAMGuarded is a security-enhanced variant of Envoy designed to be deployed as part of Contour IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Envoy and Contour deployments.

## Helm Chart Installation

The Contour IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/contour
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Contour image
contour:
  image:
    registry: myregistry.example.com
    repository: mirrored/contour-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Envoy proxy image
envoy:
  image:
    registry: myregistry.example.com
    repository: mirrored/envoy-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Nginx image
defaultBackend:
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install contour oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/contour
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/contour:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Contour IAMGuarded installation:

```bash
kubectl get po -l app.kubernetes.io/name=contour
```

You should see Contour and Envoy pods running:

```bash
NAME                              READY   STATUS    RESTARTS   AGE
contour-contour-c66d5cb67-z7ql6   1/1     Running   0          98s
contour-envoy-cw6vs               2/2     Running   0          98s
```

For more information on Contour, including follow-on steps on how to validate the installation, please refer to [Getting started with Contour](https://projectcontour.io/getting-started).

For more information on Envoy, please refer to [Getting started with Envoy](https://www.envoyproxy.io/docs/envoy/latest/start/start).

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wildfly

# wildfly
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wildfly` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wildfly/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

WildFly is a lightweight and open-source application server designed for deploying and running Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's WildFly image is comparable to the [official WildFly image](https://quay.io/repository/wildfly/wildfly). Note that, as of this writing, the entrypoint of Chainguard's WildFly image has diverged from the upstream image (`quay.io/wildfly/wildfly`) to bind to management interfaces over `0.0.0.0` instead of the default (`-bmanagement=0.0.0.0`). This change was necessary to ensure compatibility with Helm Chart version **2.4.0** ([release link](https://github.com/wildfly/wildfly-charts/releases/tag/wildfly-2.4.0)), as both Chainguard's image and the upstream image were failing without this modification.  

This issue will be resolved once [PR #143](https://github.com/wildfly/wildfly-charts/pull/143) is merged into the WildFly Charts repository. 

## Getting Started

To start a WildFly container using the Chainguard image, run the following command:

```shell
docker run --rm --name wildfly-container -p 9990:9990 -p 8080:8080 -it cgr.dev/ORGANIZATION/wildfly:latest
```

You can verify the container is running with a `docker ps` command:

```shell
docker ps | grep wildfly-container
```

To check if Wildfly has started successfully, check the logs with `docker logs`:

```shell
docker logs wildfly-container | grep "Started server"
```

You can deploy a sample WAR application to WildFly. First use `curl` to download a sample application from the Apache Tomcat website:

```shell
curl -sSL -o sample.war https://tomcat.apache.org/tomcat-10.1-doc/appdev/sample/sample.war
```

Then deploy the application:

```shell
docker cp sample.war wildfly-container:/opt/jboss/wildfly/standalone/deployments
```

Verify the deployment:

```
docker exec wildfly-container ls -l /opt/jboss/wildfly/standalone/deployments | grep sample.war
```

Once deployed, confirm that the sample application is accessible:

```shell
curl -s http://localhost:8080/sample/ | grep "Hello, World"
```

To remove the WildFly container:

```shell
docker rm -f wildfly-container
```

## Documentation and Resources

- [WildFly Quickstarts](https://github.com/wildfly/quickstart)
- [WildFly Guides](https://www.wildfly.org/guides/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openscap

# openscap
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openscap` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openscap/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

NIST Certified SCAP 1.2 toolkit

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `openscap` image is designed to be a drop-in replacement for the upstream [OpenSCAP toolkit](https://github.com/OpenSCAP/openscap).

## Getting Started

To retrieve information about a SCAP data stream, run a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/openscap:latest info /usr/share/xml/scap/ssg/content/ssg-chainguard-gpos-ds.xml
```
```
Document type: Source Data Stream
Imported: 2025-06-12T21:40:52
Stream: scap_org.open-scap_datastream_from_xccdf_all-resolved-xccdf-v3r2.xml
[... additional document information ...]
```

If you have SCAP content files that you want to evaluate, you can first create a directory to store the files:

```shell
mkdir -p scap-content
```

Then evaluate SCAP content by mounting the content directory. In the following example, we run an evaluation on the file /scap-content/your-oval-file.xml..."

```shell
docker run --rm \
  -v $(pwd)/scap-content:/scap-content \
  cgr.dev/ORGANIZATION/openscap:latest \
  oval eval --results /scap-content/results.xml /scap-content/your-oval-file.xml
```

> [!NOTE]
> Many security scanning operations require elevated privileges or access to host system information. Consider using `--privileged` or specific capability flags when performing system scans.

## Documentation and Resources

- [OpenSCAP User Manual](https://static.open-scap.org/openscap-1.3/oscap_user_manual.html)
- [NIST SCAP Documentation](https://csrc.nist.gov/projects/security-content-automation-protocol)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-kubeseal-iamguarded

# sealed-secrets-kubeseal-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-kubeseal-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-kubeseal-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Kubeseal is used to for one-way encryption of secrets. While not intended to be deployed via a Helm chart, it is typically used in conjunction with Sealed Secrets to enable a GitOps-friendly workflow. Additionally, the IAMGuarded variant is designed to be compatible with the IAMGuarded variant of Sealed Secrets. The IAMGuarded combination provides additional security benefits over standard Kubeseal variants.

## FIPS Compliance
This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

## Encrypting Secrets with Docker

The `sealed-secrets-kubeseal-iamguarded` image can be used to encrypt and/or validate the sealed secrets.

To seal a secret, run the image and mount the Kubernetes config file - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-iamguarded \
  -o yaml \
  <secret.yaml >sealed-secret.yaml
```

This will encrypt contents of `secret.yaml` as `sealed-secret.yaml`.

It's also possible to validate a sealed secret using the `--validate` flag to make sure the sealed secret is correct - such as:

```shell
docker run \
  -v $KUBECONFIG:/.kube/config:ro \
  -e KUBECONFIG=/.kube/config \
  cgr.dev/ORGANIZATION/sealed-secrets-kubeseal-iamguarded \
  --validate \
  <sealed-secret.yaml
```

### Applying Sealed Secrets

Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f sealed-secret.yaml
```

Sealed secrets controller needs to be running in the cluster for this to work. The `sealed-secrets-controller-iamguarded` Chainguard image can be used for this purpose.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metacontroller

# metacontroller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metacontroller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metacontroller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Metacontroller Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ export HELM_EXPERIMENTAL_OCI=1
$ helm install my-metacontroller-helm oci://ghcr.io/metacontroller/metacontroller-helm --version v4.10.3  \
    --set image.repository=cgr.dev/chainguard/metacontroller \
    --set image.tag=latest \
    <other configuration parameters here>
```

See the [configuration](https://metacontroller.github.io/metacontroller/guide/helm-install.html#configuration) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6274

# request-6274
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6274` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6274/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image with Go programming language using the go-slim package

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Go-Slim Container Image

This container provides a minimal Go runtime environment based on the go-slim package. The go-slim package is designed to provide the essential Go toolchain components with a reduced footprint compared to the standard Go image.

### Features

- Minimal container size compared to the standard Go image
- Includes the full Go toolchain for building applications
- Compatible with standard Go applications and build processes
- CGO is disabled by default for smaller binary sizes and improved portability
- Pre-configured with secure default settings

### Usage Examples

#### Building a Go Application

```bash
docker run --rm -v $(pwd):/src -w /src cgr.dev/chainguard/request-6274 build -o myapp .
```

#### Running as a Base Image

```dockerfile
FROM cgr.dev/chainguard/request-6274:latest

WORKDIR /app
COPY . .
RUN go build -o myapp .

ENTRYPOINT ["/app/myapp"]
```

#### Available Tags

The image is available with the following tags:
- `:latest` - Latest stable Go version
- `:1.23` - Go 1.23.x version
- `:1.24` - Go 1.24.x version

### Environment Variables

The image comes with the following environment variables pre-configured:
- `CGO_ENABLED=0` - Disables CGO for static builds and better portability
- `GODEBUG=tarinsecurepath=0,zipinsecurepath=0` - Secure path handling
- `GOTOOLCHAIN=local+auto` - Uses the local toolchain with auto-update capabilities

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero-fips

# velero-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Velero] (https://velero.io/docs/v1.13/) (formerly Heptio Ark) gives you tools to back up and restore your Kubernetes cluster resources and persistent volumes. You can run Velero with a cloud provider or on-premises.

Velero lets you:
* Take backups of your cluster and restore in case of loss.
* Migrate cluster resources to other clusters.
* Replicate your production cluster to development and testing clusters.

## Installation and Usage

```bash
docker run cgr.dev/chainguard/velero:latest help
```

For more information, refer to the velero documentation:
- [Velero GitHub](https://github.com/vmware-tanzu/velero)

When deploying velero helm charts with a kubectl image ensure to use
`-dev` tags as the velero upstream helm chart expects presence of `sh`
and `which` commands in the kubectl image. See this
[vmware-tanzu/helm-charts#591](https://github.com/vmware-tanzu/helm-charts/issues/591)
upstream issue. And at the same time kubectl images typically do not
ship with a `sh`.

At low level, Velero delegates the backup/restore calls to restic, kopia, etc.
Restic is currently in deprecation phase, and may result in error `panic: EVP_DigestInit_ex`.
To handle this, its recommendated to use kopia. Check Velero docs for right kopia configuration.
One method to use kopia, while using velero helm chart, is by adding below extraArgs:
```
server:
  extraArgs:
    - --uploader-type=kopia
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-aws-provider-fips

# crossplane-aws-provider-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-aws-provider-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-aws-provider-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane provider-aws is the infrastructure provider for Amazon Web Services (AWS).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `crossplane-aws-provider-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/provider-aws](https://github.com/crossplane-contrib/provider-aws/pkgs/container/provider-aws) image.

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Provider

Deploy the Provider to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws
spec:
  package: cgr.dev/ORGANIZATION/crossplane-aws-provider-fips:latest
```

Apply this configuration:
```bash
kubectl apply -f provider.yaml
```

Verify the function is healthy:
```bash
kubectl get providers
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/provider-aws).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-secrets

# external-secrets
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-secrets` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-secrets/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Fetches secrets from external systems and exposes them as Kubernetes Secrets.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to 'ghcr.io/external-secrets/external-secrets'.
Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

This image can be deployed by leveraging the [external secrets helm chart](https://external-secrets.io/latest).

Create a `values.yaml` file, specifying the Chainguard image:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/external-secrets
  tag: latest

installCRDs: true

webhook:
  image:
    repository: cgr.dev/ORGANIZATION/external-secrets
    tag: latest

certController:
  image:
    repository: cgr.dev/ORGANIZATION/external-secrets
    tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add external-secrets https://charts.external-secrets.io
helm repo update
helm install external-secrets external-secrets/external-secrets -n external-secrets-system -f values.yaml --create-namespace
```

## Documentation and Resources

- [External Secrets Operator Documentation](https://external-secrets.io/)
- [External Secrets GitHub Repository](https://github.com/external-secrets/external-secrets)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dnsdist

# dnsdist
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dnsdist` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dnsdist/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

dnsdist is a highly DNS-, DoS- and abuse-aware loadbalancer

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard dnsdist image is comparable to the [upstream dnsdist](https://hub.docker.com/u/powerdns?page=1&search=dnsdist). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager, while maintaining full compatibility.

## Getting Started

### Running with Docker

To run dnsdist using Docker, you can use the following command:

```shell
docker run \
    -p 53:53/tcp \
    -p 53:53/udp \
    cgr.dev/ORGANIZATION/dnsdist:latest --supervised
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the following below resources for further usage details.

## Resources
- [Quickstart Guide](https://www.dnsdist.org/quickstart.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-fluentd-operator

# kube-fluentd-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-fluentd-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-fluentd-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image is used for the [Kubernetes Fluentd Operator](https://github.com/vmware/kube-fluentd-operator)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kube-fluentd-operator` container image is comparable to the [official kube-fluentd-operator image](https://hub.docker.com/r/vmware/kube-fluentd-operator).

Notably, Chainguard's `kube-fluentd-operator` image does not expose any ports whereas the ports exported by the upstream are: `24444/tcp` and `5140/tcp`. Additionally, like other Chainguard Containers, `kube-fluentd-operator` does not include things like a shell or package manager.

## Getting Started

Install using helm:

Create a `values.yaml` file with the following values:
```
rbac:
  create: true

image:
  tag: latest
  repository: cgr.dev/ORGANIZATION/kube-fluentd-operator
```

Make sure to replace the `ORGANIZATION` with your desired values.

Install using the new values:

```
git clone git@github.com:vmware/kube-fluentd-operator.git
helm install kfo ./kube-fluentd-operator/charts/log-router \
  -f values.yaml \
  --wait
```

Then create a namespace demo and a configmap describing where all logs from demo should go to. The configmap must contain an entry called `fluent.conf`. Finally, point the `kube-fluentd-operator` to this configmap using annotations.

```
kubectl create ns demo

cat > fluent.conf << EOF
<match **>
  @type null
</match>
EOF
```

Create the configmap with a single entry "fluent.conf":

```shell
kubectl create configmap fluentd-config --namespace demo --from-file=fluent.conf=fluent.conf
```

In a minute, this configuration would be translated to something like this:

```
<match demo.**>
  @type null
</match>
```

## Documentation and Resources

* [Official Getting Started Guide](https://github.com/vmware/kube-fluentd-operator?tab=readme-ov-file#try-it-out)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgbouncer-iamguarded

# pgbouncer-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgbouncer-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgbouncer-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [pgbouncer](https://www.pgbouncer.org/) connection pooler for PostgreSQL with IAMGuarded support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PgBouncer IAMGuarded is a security-enhanced variant of PgBouncer, an open-source middleware that operates between PostgreSQL servers and clients, providing features such as load balancing.

## Installation and usage

PgBouncer does not come with its own Helm Chart and is meant to be used standalone.

Such as:

```
$ docker container run -d \
  -e POSTGRESQL_HOST=postgresql-hostname \
  -e POSTGRESQL_USERNAME=... \
  -e POSTGRESQL_PASSWORD=... \
  cgr.dev/ORGANIZATION/pgbouncer-iamguarded:latest
```

Where `POSTGRESQL_HOST`, `POSTGRESQL_USERNAME` and `POSTGRESQL_PASSWORD` should be provided and be a valid host, user and password to connect to PostgreSQL that PgBouncer should be a proxy for.

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-iamguarded-fips

# nginx-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based nginx HTTP, reverse proxy, mail proxy, and a generic TCP/UDP proxy server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

NGINX IAMGuarded is a security-enhanced variant of NGINX designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard NGINX deployments.

## Helm Chart Installation

The NGINX IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-iamguarded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main NGINX image
image:
  registry: myregistry.example.com
  repository: mirrored/nginx-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/nginx-prometheus-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
cloneStaticSiteFromGit:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/git-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
  repository: github.com/org/repo-to-serve
  branch: main
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-iamguarded oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your NGINX IAMGuarded installation using standard NGINX verification methods. The deployment functions as a standard NGINX instance, so all typical NGINX validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### orthanc

# orthanc
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/orthanc` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/orthanc/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Lightweight DICOM server for medical imaging with RESTful API and web interface

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [docker.io/orthancteam/orthanc](https://hub.docker.com/r/orthancteam/orthanc) image. The following plugins are included in the base image:

* **gdcm**: Enhanced DICOM parsing with GDCM library
* **dicomweb**: DICOMweb (QIDO-RS, WADO-RS, STOW-RS) support (runtime dependency of GDCM)
* **housekeeper**: Automatic database maintenance and optimization (default plugin)

This plugin set provides core functionality while maintaining a smaller attack surface compared to full-featured distributions.

> [!NOTE]
> The upstream image version (25.4.2) corresponds to the [Orthanc Builder repository](https://github.com/orthanc-server/orthanc-builder) version, while our image is tagged with the latest version of Orthanc core itself.

## Overview

Orthanc is a lightweight, open-source DICOM server for medical imaging. It provides a complete solution for managing, storing, and distributing medical images with the following key features:

* **DICOM Server**: Full DICOM Store SCP, Query/Retrieve SCP, Web-based DICOM viewer
* **RESTful API**: Complete REST API for integration with other systems
* **Web Interface**: Built-in web interface for image viewing and management
* **Plugin System**: Extensible architecture with numerous plugins available
* **Standards Compliance**: Full DICOM 3.0 and DICOMweb compliance

## Getting Started

### Basic Usage

Run Orthanc with default configuration:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  cgr.dev/ORGANIZATION/orthanc:latest
```

Access the web interface at `http://localhost:8042` (default username: `orthanc`, password: `orthanc`).

### With Persistent Storage

For production use, mount a volume for persistent data storage:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  -v orthanc-data:/var/lib/orthanc/db \
  cgr.dev/ORGANIZATION/orthanc:latest
```

### Custom Configuration

Mount a custom configuration file:

```bash
docker run -d \
  --name orthanc \
  -p 8042:8042 \
  -p 4242:4242 \
  -v /path/to/orthanc.json:/etc/orthanc/orthanc.json:ro \
  -v orthanc-data:/var/lib/orthanc/db \
  cgr.dev/ORGANIZATION/orthanc:latest
```

## Documentation and Resources

For more information about Orthanc:

* [Official Documentation](https://orthanc.uclouvain.be/book/)
* [Plugin Documentation](https://orthanc.uclouvain.be/book/plugins.html)
* [Source Code Downloads](https://orthanc.uclouvain.be/downloads/sources/index.html)
* [REST API Documentation](https://orthanc.uclouvain.be/book/users/rest.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyterhub-k8s-hub

# jupyterhub-k8s-hub
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyterhub-k8s-hub` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyterhub-k8s-hub/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The image is not intended to be used directly. It requires some configuration files to be mounted into the container. See the [JupyterHub documentation](https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html) for more information.

Since the image is non-root, we are using `1000` as the UID and GID for the user. This user has
write access to `/usr/local/etc/jupyterhub`.

You can run the image using the Helm Chart with:

```shell
helm repo add jupyterhub https://hub.jupyter.org/helm-chart/
helm repo update
helm upgrade --install jupyterhub jupyterhub/jupyterhub \
  --set hub.image.name=cgr.dev/chainguard-private/jupyterhub-k8s-hub \
  --set hub.image.tag=$VERSION \
  --set hub.config.JupyterHub.db_url=/usr/local/etc/jupyterhub/jupyterhub.sqlite
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### etcd-iamguarded

# etcd-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/etcd-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/etcd-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[etcd](https://etcd.io/) Distributed reliable key-value store for the most critical data of a distributed system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Etcd IAMGuarded is a security-enhanced variant of Etcd designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Etcd deployments.

## Helm Chart Installation

The Etcd IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/etcd
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install etcd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Etcd image
image:
  registry: myregistry.example.com
  repository: mirrored/etcd-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install etcd oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/etcd
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/etcd:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Etcd IAMGuarded installation using standard Etcd verification methods. The deployment functions as a standard Etcd instance, so all typical Etcd validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Etcd IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Etcd and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-prometheus-exporter-iamguarded-fips

# nginx-prometheus-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-prometheus-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-prometheus-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nginx prometheus exporter

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

NGINX Prometheus Exporter IAMGuarded is a security-enhanced variant of NGINX Prometheus Exporter designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard NGINX Prometheus Exporter deployments.

## Helm Chart Installation

The NGINX Prometheus Exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-prometheus-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install nginx-prometheus-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-prometheus-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main NGINX Prometheus Exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/nginx-prometheus-exporter-iamguarded
  digest: sha256:... # Use specific digest instead of tag

```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install nginx-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/nginx-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/nginx-exporter:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your NGINX Prometheus Exporter IAMGuarded installation using standard NGINX Prometheus Exporter verification methods. The deployment functions as a standard NGINX Prometheus Exporter instance, so all typical NGINX Prometheus Exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ffmpeg-fips

# ffmpeg-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ffmpeg-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ffmpeg-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that contains ffmpeg

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Compatibility Notes

This image does not include zeromq support, since it uses non-FIPS compatible elliptic curves for cryptography.

# Usage

Example: convert a .mov file to .mp4

```
docker run --rm \
    -v "${PWD}":/work \
    -w /work \
    cgr.dev/ORGANIZATION/ffmpeg-fips:latest
    -i tests/sample.mov \
    tests/sample.mp4
```

### FIPS Support

The `ffmpeg-fips` Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5190

# request-5190
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5190` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5190/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for pytorch, a Python package that provides two high-level features: Tensor computation with strong GPU acceleration and Deep neural networks built on a tape-based autograd system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s PyTorch image is similar to the [pytorch/pytorch image](https://hub.docker.com/r/pytorch/pytorch), with several key differences:

* Chainguard images are using Wolfi Linux distribution, the `pytorch/pytorch` images are based on Ubuntu 22.04
* Chainguard images are running as `nonroot` user with home in `/home/nonroot` directory, while the `pytorch/pytorch` images are running as root user
* Chainguard images do not ship a full shell by default and it's entrypoint is Python, while `pytorch/pytorch` uses Bash as entrypoint
  (**NOTE**: Chainguard also provides a `-dev` images that have a full shell and entrypoint can be set to `/bin/sh` or `/bin/bash` for such images)

## Running pytorch

PyTorch has some prerequisites which need to be configured in the environment
prior to running with GPUs. For examples, please refer to `TESTING.md`.

Additionally, please refer to the [upstream documentation](https://github.com/pytorch/pytorch)
for more information on configuring and using PyTorch.

Assuming the environment prerequisites have been met, below demonstrates how
to launch the container:

```bash
docker run --rm -i -t \
    --privileged \
    --gpus all \
    cgr.dev/ORGANIZATION/request-5190:latest
```

## Testing GPU Access

If your environment has connected GPUs, you can check that PyTorch has access with the following:

```bash
docker run --rm -it --gpus all cgr.dev/ORGANIZATION/request-5190:latest
Python 3.11.11 (tags/v3.11.11-0-gd03b868-dirty:d03b868, Dec  4 2024, 19:55:37) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'NVIDIA T4G'
```

## Testing PyTorch

As a quick intro, we will use PyTorch to create a very simple deep learning model with two linear layers and an activation function. We’ll create an instance of it and ask it to report on its parameters. Running the below will fetch a [model_builder.py](https://github.com/chainguard-images/images/blob/main/images/pytorch/model_builder.py) script from the Chainguard Images repository, place it in a folder on your host machine, and run the script in a pytorch container from a volume.

```bash
mkdir pytorch-test &&\
 curl https://raw.githubusercontent.com/chainguard-images/images/main/images/pytorch/model_builder.py > pytorch-test/model_builder.py &&\
 docker run --rm -it -v "$PWD/pytorch-test:/tmp/pytorch-test" --gpus all cgr.dev/ORGANIZATION/request-5190:latest -c "python /tmp/pytorch-test/model_builder.py"
```

You may also consider running this [quickstart script](https://github.com/chainguard-images/images/blob/main/images/pytorch/tests/quickstart.py) based on the [official PyTorch quickstart tutorial](https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html) using the same approach as above.

### Using Helm charts

As a place to get started, you may also use this Helm chart to get PyTorch running
```bash
  helm install pytorch \
  --namespace pytorch-space --create-namespace  \
  --set image.registry="cgr.dev" \
  --set image.repository="chainguard/request-5190" \
  --set image.tag=latest \
  --set containerSecurityContext.runAsUser=0 \
  --set containerSecurityContext.runAsNonRoot=false \
  --set containerSecurityContext.allowPrivilegeEscalation=true \
  --wait oci://registry-1.docker.io/bitnamicharts/pytorch
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-attacher-fips

# kubernetes-csi-external-attacher-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-attacher-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-attacher-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for [kubernetes-csi/external-attacher](https://github.com/kubernetes-csi/external-attacher). Watches Kubernetes VolumeAttachment objects and triggers ControllerPublish/Unpublish against a CSI endpoint.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-attacher-fips` container image is comparable to the official csi-attacher image. Chainguard Containers are designed with minimalism and security in mind, and thus `kubernetes-csi-external-attacher-fips` the image has a few differences from the upstream image. Notably, Chainguard's `kubernetes-csi-external-attacher-fips` image sets the entrypoint to `/usr/bin/csi-attacher` whereas the upstream sets it to: `/csi-attacher`. Additionally, like other Chainguard Containers, `kubernetes-csi-external-attacher` does not include things like a shell or package manager.

### FIPS Support

The `kubernetes-csi-external-attacher-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To use Chainguard's `kubernetes-csi-external-attacher-fips` image, first deploy the standard attacher:
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-attacher/master/deploy/kubernetes/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-attacher/master/deploy/kubernetes/rbac.yaml
```

Then substitute the attacher's image with ours:

```
kubectl set image deployment/csi-attacher csi-attacher="cgr.dev/chainguard/kubernetes-csi-external-attacher-fips"
```

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-attacher/blob/master/README.md#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1279

# request-1279
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1279` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1279/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cassandra-fips

# cassandra-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cassandra-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Cassandra](https://cassandra.apache.org) is a free and open-source, distributed, wide-column store, NoSQL database.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Disclaimer

This image is equipped with the essential components for Cassandra to operate in
FIPS mode. However, it's important for users to ensure they use it in line with
FIPS compliance standards.

This includes tasks such as keystore generation, configuration, and launching
Cassandra with the correct configuration parameters. More guidance is provided in
the sections below.

## Compatibility Notes

This image is compatible with [external Cassandra image](https://hub.docker.com/_/cassandra). Additionally, it supports running Cassandra in a FIPS 140-3 complaint mode.

## FIPS Support

This Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Keystore

Cassandra running in FIPS mode requires a BCFKS compatible keystore to manage its TLS certificates.

Although Cassandra supports various keystore types, only BCKFS offers the
capability to operate in approved _(strict)_ mode under FIPS standards, ensuring
only approved ciphers are used.

### BCKFS Keystore creation

To create keystore in BCKFS format you can use keytool from this image like so:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/cassandra-fips \
  -v -keystore /tmp/keystore/server.keystore \
  -storetype bcfks \
  -providername BCFIPS \
  -alias "localhost" \
  -genkeypair -sigalg SHA512withRSA -keyalg RSA \
  -dname CN="localhost" \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
  -keypass "<YOUR TLS KEY PASSWORD, can be the same>"
```

To view the keystore:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/cassandra-fips \
  -v -keystore /tmp/keystore/server.keystore \
  -list \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>"
```

### Export CA certificate

To export a CA certificate from an existing keystore you can use keytool:

```bash
docker run -v "$(pwd):/tmp/keystore" --entrypoint keytool cgr.dev/ORGANIZATION/cassandra-fips \
  -v \
  -keystore /tmp/keystore/server.keystore \
  -storetype bcfks \
  -providername BCFIPS \
  -alias "localhost" \
  -exportcert -rfc \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>" | dos2unix > cassandra.crt
```

### Create `cqlshrc` file

To connect to Cassandra with cqlsh you need to create a `cqlshrc` file with the following content:

```bash
cat <<EOF > cqlshrc.yaml
[ssl]
certfile = /etc/cassandra/ssl/cassandra.crt
validate = false
version = TLSv1.3
EOF
```

### Create `cassandra.yaml` file

To use Cassandra in FIPS mode, `cassandra.yaml` needs to be configured to use FIPS enabled keystores and truststores.

Edit  `cassandra.yaml` file and set the various keystore and truststore options to use `store_type: BCFKS` for the type. The following includes example server and client encryption options using the correct BCFKS keystore :

<details>
  <summary>cassandra.yaml</summary>
  
  ```yaml
# extracted with egrep -v '((\W)+\#|^$|^#)' cassandra.yaml
server_encryption_options:
  internode_encryption: all
  enable_legacy_ssl_storage_port: false
  keystore: /tmp/keystore/server.keystore
  keystore_password: <YOUR KEYSTORE PASSWORD>
  require_client_auth: false
  truststore: /tmp/keystore/server.truststore
  truststore_password: <YOUR TRUSTSTORE PASSWORD>
  require_endpoint_verification: false
client_encryption_options:
  enabled: true
  keystore: /tmp/keystore/server.keystore
  keystore_password: <YOUR KEYSTORE PASSWORD>
  require_client_auth: false
  protocol: TLS
  store_type: BCFKS
transparent_data_encryption_options:
  enabled: false
  chunk_length_kb: 64
  cipher: AES/CBC/PKCS5Padding
  key_alias: testing:1
  key_provider:
    - class_name: dev.chainguard.cassandra.util.BcFipsKeyProvider
      parameters:
        - keystore: /tmp/keystore/server.keystore
          keystore_password: <YOUR KEYSTORE PASSWORD>
          store_type: BCFKS
          key_password: <YOUR KEY PASSWORD>
  ```
  
</details>

## Running with TLS enabled

Example of launching Cassandra with TLS enabled:

```bash
docker run --rm --name cassandra-fips \
  -v "$(pwd)/server.keystore:/tmp/keystore/server.keystore" \
  -v "$(pwd)/cassandra.yaml:/etc/cassandra/cassandra.yaml" \
  -v "$(pwd)/cqlshrc.yaml:/home/cassandra/.cassandra/cqlshrc" \
  -v "$(pwd)/cassandra.crt:/etc/cassandra/ssl/cassandra.crt" \
  cgr.dev/ORGANIZATION/cassandra-fips
```

Now, wait until the `Startup complete` message is shown in the logs. This means that Cassandra is ready to accept connections. You can now connect to it with cqlsh:

```bash
docker exec <CONTAINER_ID_OR_NAME> SSL_CERTFILE=etc/cassandra/ssl/cassandra.crt cqlsh --ssl localhost 9042 -e "DESCRIBE KEYSPACES"

system       system_distributed  system_traces  system_virtual_schema
system_auth  system_schema       system_views
```

### FIPS validation

You'll see debug logs such as the below if Cassandra is running in FIPS mode:

```bash
BCFIPS health check OK
```

Additionally, you can check bcfips is enforcing minimum password lengths, by
running the container with a non-compliant admin password, such as `1234`:

```bash
Caused by: org.bouncycastle.crypto.fips.FipsUnapprovedOperationError:
password must be at least 112 bits
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatus

# gatus
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatus` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatus/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Gatus is a dev-oriented health dashboard that gives you the ability to monitor your services using HTTP, ICMP, TCP and DNS queries

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s Gatus image is a lean, Wolfi-based container image. It mirrors the [Docker image from the Gatus project](https://hub.docker.com/r/twinproduction/gatus) in functionality and has minimal dependencies like the upstream project.

## Getting Started

To run Gatus locally with Docker,
```shell
docker run -p 8080:8080 --name gatus cgr.dev/ORGANIZATION/gatus:latest
```

To run Gatus locally with one of your own config files,
```shell
docker run -p 8080:8080 --name gatus \
--mount type=bind,source="$(pwd)"/config.yaml,target=/config/config.yaml \
cgr.dev/ORGANIZATION/gatus:latest
``` 

### Helm installation
To deploy Gatus with a Helm chart,
```shell
helm repo add twin https://twin.github.io/helm-charts
helm repo update
helm install gatus twin/gatus --set image.repository=cgr.dev/ORGANIZATION --set image.tag=latest
```

Please find the documentation on how to monitor TCP endpoints, UDP endpoints and other options in [project documentation](https://github.com/TwiN/gatus/blob/master/README.md#monitoring-a-tcp-endpoint)

Additional examples of Gatus Deployment, can be referenced in [Gatus Repo](https://github.com/TwiN/gatus/tree/master/.examples)

## Documentation and Resources

Please refer the [Gatus Project documentation](https://github.com/TwiN/gatus/blob/master/README.md) for information on how to configure health checks, monitor different conditions and trigger alerts for differentt scenarios.

You can explore the following resources to learn more about Gatus:
* [Gatus GitHub Project](https://github.com/TwiN/gatus/blob/master/README.md)
* [Gatus Deployment using Helm charts](https://github.com/TwiN/helm-charts/blob/master/README.md)
* [Gatus Docs](https://gatus.io/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8sgpt

# k8sgpt
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8sgpt` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8sgpt/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [k8sgpt](https://k8sgpt.ai/) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `k8sgpt` Container Image is comparable to the [official k8sgpt image](https://ghcr.io/k8sgpt-ai/k8sgpt). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `k8sgpt`, compared to upstream's entrypoint of `/k8sgpt`.

## Getting Started

You can make use of the `k8sgpt` for different AI backends. The default AI backend is OpenAI so you can make use of that.

Run the following command to generate a token for authentication.

```
k8sgpt generate
```
This will provide you with a URL to generate a token, follow the URL from the command line to your browser to then generate the token.

Then, authenticate with the following command:

```
k8sgpt auth add --backend openai --model gpt-4o-mini
```
This will request the token that has just been generated. Paste the token into the command line.

You should then see the following success message:
> Enter openai Key: openai added to the AI backend provider list

You should be then able to analyze your Kubernetes cluster with the following command:

```
k8sgpt analyze
```

## Documentation and Resources

- [Official Website](https://k8sgpt.ai/)
- [Official Documentation](https://docs.k8sgpt.ai/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno

# kyverno
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Kyverno](https://kyverno.io/) is a policy engine that allows you to write policies as Kubernetes resources and manage them with familiar tools

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kyverno` Container Image is comparable to the [official kyverno image](https://github.com/kyverno/kyverno/pkgs/container/kyverno). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `/usr/bin/kyverno`, compared to upstream's entrypoint of `/ko-app/kyverno`.

## Getting Started

Chainguard's `kyverno` Container Image can be deployed using the official Kyverno Helm chart.

### Installation with Helm

The recommended way to install Kyverno with Chainguard images is to use a `values.yaml` file with the official Helm chart:

1. Create a values.yaml file with the following content:

```yaml
admissionController:
  initContainer:
    image:
      registry: cgr.dev
      repository: ORGANIZATION/kyvernopre
      tag: latest
  container:
    image:
      registry: cgr.dev
      repository: ORGANIZATION/kyverno
      tag: latest

backgroundController:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-background-controller
    tag: latest

cleanupController:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-cleanup-controller
    tag: latest

reportsController:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/kyverno-reports-controller
    tag: latest
```

Be sure to replace `ORGANIZATION` with the name used for your organization's private repository within the Chainguard registry.

2. Install Kyverno using the Helm chart with your values file:

```shell
# Add the Kyverno Helm repository
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# Install Kyverno with Chainguard images
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --values values.yaml
```

### Verifying the Installation

After installing Kyverno, you can verify it is functioning correctly by creating a simple policy.
You can test a validation policy that requires specific labels on Pods:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: check-for-labels
      match:
        any:
        - resources:
            kinds:
              - Pod
            namespaces:
              - default
      validate:
        message: "The label 'app.kubernetes.io/name' is required."
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: "?*"
```

After applying this policy, try to create a Pod without the required label and verify it is rejected.

## Documentation and Resources

For complete documentation and more examples, please refer to the following resources:

- [Kyverno Official Documentation](https://kyverno.io/docs/)
- [Kyverno GitHub Repository](https://github.com/kyverno/kyverno)
- [Kyverno Policy Examples](https://kyverno.io/policies/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5754

# request-5754
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5754` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5754/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CLI for Databricks

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Compatibility Notes

Chainguard's `databricks-cli` image is comparable to the [upstream Databricks CLI image](https://github.com/databricks/cli/pkgs/container/cli) on GHCR.

# Getting Started

Using the Databricks CLI is as easy as running Chainguard's image with Docker:

```bash
docker run cgr.dev/ORGANIZATION/databricks-cli:latest
```

This will print a number of subcommands you can pass to the CLI:

```
Databricks CLI

Usage:
  databricks [command]

Databricks Workspace
  fs                                     Filesystem related commands
  git-credentials                        Registers personal access token for Databricks to do operations on behalf of the user.
  repos                                  The Repos API allows users to manage their git repos.
  secrets                                The Secrets API allows you to manage secrets, secret scopes, and access permissions.
  workspace                              The Workspace API allows you to list, import, export, and delete notebooks and folders.
...
```

Please see the CLI's documentation for usage.

# Documentation and Resources

- [Databricks CLI documentation](https://docs.databricks.com/aws/en/dev-tools/cli)
- [Databricks CLI GitHub repository](https://github.com/databricks/cli)
- [Create a Databricks workspace](https://docs.databricks.com/aws/en/admin/workspace)
- [Getting started with Databricks on AWS](https://www.databricks.com/product/aws)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-provisioner

# kubernetes-csi-external-provisioner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-provisioner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-provisioner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Sidecar container that watches Kubernetes PersistentVolumeClaim objects and triggers CreateVolume/DeleteVolume against a CSI endpoint

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-provisioner` container image is comparable to the [official csi-provisioner image](https://gcr.io/k8s-staging-sig-storage/csi-provisioner:canary). Chainguard Containers are designed with minimalism and security in mind, and thus `kubernetes-csi-external-provisioner` the image has the following differences from the upstream image:

* Chainguard's `kubernetes-csi-external-provisioner` image sets the entrypoint to `/usr/bin/csi-provisioner` whereas the upstream sets it to: `/csi-provisioner`.

## Getting Started

To use Chainguard's `kubernetes-csi-external-provisioner` image, first deploy the standard provisioner:
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-provisioner/v3.5.0/deploy/kubernetes/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-provisioner/v3.5.0/deploy/kubernetes/deployment.yaml
```
Then substitute the provisioner's image with ours:
```
kubectl set image deployment/csi-provisioner csi-provisioner="cgr.dev/chainguard/kubernetes-csi-external-provisioner:latest"
```

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-provisioner/blob/master/README.md#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-ipam

# azure-ipam
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-ipam` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-ipam/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure VNET IPAM plugins manage IP address assignments to containers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [azure-ipam](https://oci.dag.dev/?image=mcr.microsoft.com%2Fcontainernetworking%2Fazure-ipam:v0.3.0) image available from the Microsoft Artifact Registry. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Kubernetes

The source repository contains a Kubernetes [test manifest](https://github.com/Azure/azure-container-networking/blob/master/test/integration/manifests/cilium/cns-write-ovly.yaml) that can be used with a your image to confirm operation:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: azure-cns
  namespace: kube-system
  labels:
    app: azure-cns
spec:
...
  template:
...
    spec:
...
      containers:
...
      initContainers:
        - name: cni-installer
          image: cgr.dev/ORGANIZATION/azure-ipam:latest
          imagePullPolicy: Always
          command: ["/dropgz"]
```

Alternatively, you can replace the image used in an existing Daemonset:

```bash
$ kubectl set image -n kube-system daemonset/azure-cns cni-installer=cgr.dev/ORGANIZATION/azure-ipam:latest
daemonset.apps/azure-cns image updated
```

## Documentation and Resources

* [Official azure-ipam repository](https://github.com/Azure/azure-container-networking/tree/master/azure-ipam).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### plugin-barman-cloud

# plugin-barman-cloud
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/plugin-barman-cloud` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/plugin-barman-cloud/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CloudNativePG barman-cloud plugin for PostgreSQL backup and recovery to S3-compatible storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `plugin-barman-cloud` images are compatible with the upstream [CloudNativePG barman-cloud plugin](https://github.com/cloudnative-pg/plugin-barman-cloud). This plugin provides PostgreSQL backup and recovery capabilities to S3-compatible storage using Barman Cloud tools.

The plugin consists of two components:
- **Plugin Manager** (`plugin-barman-cloud`): Runs as a deployment and manages plugin lifecycle
- **Sidecar** (`plugin-barman-cloud-sidecar`): Injected into PostgreSQL pods to handle backup operations

## Getting Started

### Using Chainguard's CloudNative-PG Operator Images

Create a `values.yaml` file to configure the CloudNative-PG operator with Chainguard images:

```yaml
# values.yaml for CloudNative-PG with Chainguard images
image:
  repository: cgr.dev/ORGANIZATION/cloudnative-pg 
  tag: latest
  pullPolicy: IfNotPresent
```

```bash
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm repo update

# Install with Chainguard images
helm install cnpg cnpg/cloudnative-pg \
  --namespace cnpg-system \
  --create-namespace \
  --values values.yaml

# Wait for operator to be ready
kubectl wait --for=condition=Available deployment/cnpg-cloudnative-pg -n cnpg-system --timeout=120s
```

Download the plugin manifest and modify it to use Chainguard images:

```bash
# Set your custom images
PLUGIN_IMAGE="cgr.dev/ORGANIZATION/plugin-barman-cloud:latest"
SIDECAR_IMAGE="cgr.dev/ORGANIZATION/plugin-barman-cloud-sidecar:latest"

# Download and modify the manifest with yq to inject custom sidecar image
curl -fsSL "https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.6.0/manifest.yaml" | \
  yq eval "select(.kind == \"Secret\") |= .data.SIDECAR_IMAGE = \"$(echo -n ${SIDECAR_IMAGE} | base64)\"" | \
  kubectl apply -f -

# Update the plugin operator deployment with custom image
kubectl set image deployment/barman-cloud "*=${PLUGIN_IMAGE}" -n cnpg-system
kubectl rollout status deployment barman-cloud -n cnpg-system --timeout=120s
```

## Documentation and Resources

* [CloudNativePG Plugin Documentation](https://cloudnative-pg.io/docs/)
* [Barman Cloud Plugin Repository](https://github.com/cloudnative-pg/plugin-barman-cloud)
* [CloudNativePG Backup and Recovery Guide](https://cloudnative-pg.io/documentation/current/backup_recovery/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-livenessprobe

# kubernetes-csi-livenessprobe
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-livenessprobe` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-livenessprobe/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

 A sidecar container that can be included in a CSI plugin pod to enable integration with Kubernetes Liveness Probe.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Run it

Generally speaking, the `kubernetes-csi-livenessprobe` is a low level Kubernetes component not meant to be managed directly. However, all the steps outlined in the [upstream repo](https://github.com/kubernetes-csi/livenessprobe) apply just as well to the Chainguard Image version.

## Test it

A simple smoke test is provided below that leverages `docker` to spin up the liveness probe attached to a csi driver and ensure basic functionality is met:

```bash
#!/usr/bin/env bash

set -o errexit -o nounset -o errtrace -o pipefail -x

if [[ "${IMAGE_NAME}" == "" ]]; then
	echo "Must set IMAGE_NAME environment variable. Exiting."
	exit 1
fi

UDS="/csi/csi.sock"
CSI_ENDPOINT="unix:/$UDS"

# Start hostpathplugin in the background
docker run -d --name csi-driver -v $(pwd)/csi:/csi quay.io/k8scsi/hostpathplugin:v1.6.0 --endpoint=$CSI_ENDPOINT -nodeid 1 --v=5
trap "docker rm -f csi-driver" EXIT

docker run -d --name probe -p 9808:9808 -v $(pwd)/csi:/csi "$IMAGE_NAME" --v=5 --csi-address=$UDS
trap "docker rm -f probe" EXIT

# Give time to CSI hostpathplugin and livenessprobe to initialize
sleep 3

# Requesting health
health=$(curl -I http://localhost:9808/healthz | grep HTTP | awk '{print $2}')
if [[ "x$health" != "x200" ]]; then
	echo "Health check failed, but it was not supposed to, exiting..."
	exit 1
fi

# Killing hostpathplugin
docker stop csi-driver
sleep 3

# Requesting health, should fail since hostpathplugin is gone
health=$(curl -I http://localhost:9808/healthz | grep HTTP | awk '{print $2}')
if [[ "x$health" != "x500" ]]; then
	echo "Health check did not detect driver failure, returned code: $health, exiting..."
	exit 1
fi

exit 0
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kustomize-mutating-webhook

# kustomize-mutating-webhook
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kustomize-mutating-webhook` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kustomize-mutating-webhook/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A dynamic solution to patch FluxCD Kustomization resources, seamlessly integrating and federating substitution variables across multiple namespaces.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kustomize-mutating-webhook` container image is comparable to [the kustomize-mutating-webhook image](https://ghcr.io/xunholy/kustomize-mutating-webhook). Like most other Chainguard container images, the `kustomize-mutating-webhook` container image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started

The Chainguard's `kustomize-mutating-webhook` container image can be installed via the [kustomize-mutating-webhook helm chart](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/tree/main/deploy/chart/kustomize-mutating-webhook).

Create a `values.yaml` file with the following values

```
image:
    repository: cgr.dev/ORGANIZATION/kustomize-mutating-webhook
    tag: latest
```

Make sure to replace `ORGANIZATION` with your organization.

Run the following command to install the helm chart:

```
helm repo add kustomize-mutating-webhook https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/
helm install https://github.com/xunholy/fluxcd-kustomize-mutating-webhook/ deploy/chart/fluxcd-mutating-webhook/ -n kusotmize-mutating-webhook -f values.yaml
```

You can then try to create a new Kustomization resource without the `postBuild` spec:

```
kubectl apply -f - <<EOF
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: test-app
  namespace: default
spec:
  interval: 10m
  path: "./deploy"
  prune: true
  sourceRef:
    kind: GitRepository
    name: test-repo
EOF
```

The webhook should then add the `postBuild` spec for you according to your config.

## Documentation and Resources

* [Official GitHub Repository](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook)
* [Official Usage Guide](https://github.com/xunholy/fluxcd-kustomize-mutating-webhook?tab=readme-ov-file#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-rbac-proxy-fips

# kube-rbac-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-rbac-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-rbac-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### teleport

# teleport
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/teleport` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/teleport/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Teleport is an access management platform designed to provide secure and unified access to various infrastructure resources such as SSH, Kubernetes clusters, databases, and web applications

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are several ways of installing and configuring Teleport. To access the whole available installation methods and configurations, visit the [Teleport Installation documentation](https://goteleport.com/docs/installation/).

For example this guide shows how to run Teleport in a Docker container: https://goteleport.com/docs/installation/#example-of-running-a-teleport-container

1. Run teleport configure from the Teleport container to generate a configuration file. This sets the container's name to localhost so your browser can trust the Proxy Service's self-signed TLS certificate:

```bash
docker run --hostname localhost --rm \
  --entrypoint=/usr/local/bin/teleport \
  cgr.dev/ORGANIZATION/teleport:latest configure --roles=proxy,auth > ~/teleport/config/teleport.yaml
```

2. Start the Teleport container:

```bash
docker run --hostname localhost --name teleport \
  -v ~/teleport/config:/etc/teleport \
  -v ~/teleport/data:/var/lib/teleport \
  -p 3025:3025 -p 3080:3080 \
  cgr.dev/chainguard/teleport:latest
```

3. From there, open another terminal and make sure your Teleport container's web API is functioning as intended:

```bash
curl --insecure https://localhost:3080/webapi/ping
```

You should see JSON output similar to the following:

```json
{
  "auth": {
    "type": "local",
    "second_factor": "otp",
    "preferred_local_mfa": "otp",
    "local": {
      "name": ""
    },
    "private_key_policy": "none",
    "device_trust_disabled": true,
    "has_motd": false
  },
  "proxy": {
    "kube": {
      "enabled": true,
      "listen_addr": "0.0.0.0:3080"
    },
    "ssh": {
      "listen_addr": "0.0.0.0:3080",
      "tunnel_listen_addr": "0.0.0.0:3080",
      "web_listen_addr": "0.0.0.0:3080"
    },
    "db": {
      "postgres_listen_addr": "0.0.0.0:3080",
      "mysql_listen_addr": "0.0.0.0:3080"
    },
    "tls_routing_enabled": true
  },
  "server_version": "12.1.5",
  "min_client_version": "11.0.0",
  "cluster_name": "localhost",
  "automatic_upgrades": false
}
```

## Helm Installation for Teleport

You can install Teleport on Kubernetes using Helm. For more information, visit the [Teleport Helm Chart documentation](https://goteleport.com/docs/installation/helm/).

Add the Helm repository and install the Teleport Helm chart:

```bash
helm repo add teleport https://charts.releases.teleport.dev
helm repo update
```

Then install the Teleport Helm chart:

```bash
helm install teleport-cluster teleport/teleport-cluster \
  --create-namespace \
  --namespace=teleport-cluster \
  --set image=cgr.dev/ORGANIZATION/teleport
```

> Note: As Chainguard provides only :latest tag for public images you cannot use the :latest tag for `teleportVersionOverride` variable as its only accepts semver type of version number.
> Due to that limitation you should clone this image with semver tag and use it in the helm install command.
> https://github.com/gravitational/teleport/blob/1e92d5e90223fc69ca75d00da4c350808dc56c2a/examples/chart/teleport-cluster/charts/teleport-operator/templates/_helpers.tpl#L38-L40
> Or you could use helm --version X for Teleport version.

## teleport-kube-agent-updater

Chainguard also provides the `teleport-kube-agent-updater` image, which is a Kubernetes controller that manages automatic updates for Teleport agents running in Kubernetes clusters.

The updater connects to the Teleport proxy to check for new versions and performs rolling updates while validating image provenance. It's typically deployed alongside the `teleport-kube-agent` Helm chart.

**OCI Reference:** `cgr.dev/ORGANIZATION/teleport-kube-agent-updater`

For more information, see the [Teleport Kubernetes Agent Updater documentation](https://github.com/gravitational/teleport/tree/master/integrations/kube-agent-updater).

### Helm Installation for teleport-kube-agent-updater

The `teleport-kube-agent-updater` is typically deployed using the `teleport-kube-agent` Helm chart. For more information, see the [Teleport Kube Agent Helm Chart documentation](https://goteleport.com/docs/reference/helm-reference/teleport-kube-agent/).

> **Note:** The Teleport Helm charts override the image tag with the `appVersion` from Chart.yaml, ignoring any user-provided tag. This means you cannot directly specify a custom image tag via Helm values. See:
> - [Chart.yaml appVersion](https://github.com/gravitational/teleport/blob/master/examples/chart/teleport-kube-agent/Chart.yaml)
> - [Tag override in _helpers.tpl](https://github.com/gravitational/teleport/blob/master/examples/chart/teleport-kube-agent/templates/_helpers.tpl)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wazero

# wazero
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wazero` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wazero/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `wazero` tool which can be used to compile or run wasm binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### timoni

# timoni
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/timoni` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/timoni/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with `timoni` binary. `timoni` is a package manager for Kubernetes, powered by `cue` and inspired by `helm`.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The image contains the `timoni`  binary and a few assorted runtime dependencies.

```
docker run cgr.dev/chainguard/timoni:latest
A package manager for Kubernetes powered by CUE.

Usage:
  timoni [command]

Available Commands:
  apply       Install or upgrade a module instance
  build       Build an instance from a module and print the resulting Kubernetes resources
  bundle      Commands for managing bundles
  completion  Generates completion scripts for various shells
  delete      Uninstall a module instance from the cluster
  help        Help about any command
  inspect     Commands for getting information about installed instances
  list        Prints a table of instances and their module version
  mod         Commands for managing modules
  status      Displays the current status of Kubernetes resources managed by an instance
  version     Print the client and API version information

Flags:
      --as string                      Username to impersonate for the operation. User could be a regular user or a service account in a namespace.
      --as-group stringArray           Group to impersonate for the operation, this flag can be repeated to specify multiple groups.
      --as-uid string                  UID to impersonate for the operation.
      --cache-dir string               Default cache directory (default "/home/nonroot/.kube/cache")
      --certificate-authority string   Path to a cert file for the certificate authority
      --client-certificate string      Path to a client certificate file for TLS
      --client-key string              Path to a client key file for TLS
      --cluster string                 The name of the kubeconfig cluster to use
      --context string                 The name of the kubeconfig context to use
      --disable-compression            If true, opt-out of response compression for all requests to the server
  -h, --help                           help for timoni
      --insecure-skip-tls-verify       If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure
      --kubeconfig string              Path to the kubeconfig file to use for CLI requests.
      --log-color                      Adds colorized output to the logs. (defaults to false when no tty)
      --log-pretty                     Adds timestamps to the logs. (default true)
  -n, --namespace string               The instance namespace. (default "default")
  -s, --server string                  The address and port of the Kubernetes API server
      --timeout duration               The length of time to wait before giving up on the current operation. (default 5m0s)
      --tls-server-name string         Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used
      --token string                   Bearer token for authentication to the API server
      --user string                    The name of the kubeconfig user to use
  -v, --version                        version for timoni

```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### podinfo-fips

# podinfo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/podinfo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/podinfo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Podinfo is a tiny web application that provides Go microsrvice template for kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Podinfo image is built to be compatible with the upstream [stefanprodan/podinfo](https://github.com/stefanprodan/podinfo) project. The image runs as a non-root user named `app` with UID `100` and includes the `podinfo` binary along with the `podcli` CLI tool.

Like most Chainguard container images, the production variant comes with only the minimum dependencies needed to function and does not include a shell or package manager.

### FIPS Compliance

This FIPS-compliant image includes OpenSSL FIPS provider and is built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

## Getting Started

### Running with Docker

To run Podinfo with Docker using the default configuration:

```shell
docker run -d -p 9898:9898 cgr.dev/ORGANIZATION/podinfo:latest
```

This command starts the Podinfo server on the default HTTP port `9898`. You can verify that it's running by accessing the web interface:

```shell
curl http://localhost:9898
```

You should see a response containing "greetings from podinfo".

### Testing HTTP Endpoints

Podinfo provides several built-in endpoints for testing and monitoring:

```shell
# Homepage
curl http://localhost:9898/

# Health check endpoint
curl http://localhost:9898/healthz

# Readiness probe endpoint
curl http://localhost:9898/readyz

# Generate a token (POST request)
curl -X POST http://localhost:9898/token
```

### Enabling gRPC Support

Podinfo also supports gRPC. To enable the gRPC server, you can specify the gRPC port when starting the container:

```shell
docker run -d -p 9898:9898 -p 9999:9999 \
  cgr.dev/ORGANIZATION/podinfo:latest \
  --grpc-port=9999
```

You can then test the gRPC endpoints using `grpcurl`:

```shell
# Check gRPC health
grpcurl -plaintext localhost:9999 grpc.health.v1.Health/Check

# Get service info
grpcurl -plaintext -d '{}' localhost:9999 info.InfoService/Info
```

### Command-Line Options

The `podinfo` binary supports various configuration flags. You can view all available options:

```shell
docker run --rm cgr.dev/ORGANIZATION/podinfo:latest --help
```

To check the version:

```shell
docker run --rm cgr.dev/ORGANIZATION/podinfo:latest --version
```

## Kubernetes Deployment

### Using Helm

Podinfo can be easily deployed to Kubernetes using the official Helm chart:

```shell
helm install podinfo oci://ghcr.io/stefanprodan/charts/podinfo \
  --set image.repository=cgr.dev/ORGANIZATION/podinfo \
  --set image.tag=latest
```

This will deploy Podinfo with all necessary Kubernetes resources including Services, Deployments, and optional Ingress configurations.

## Use Cases

Podinfo is commonly used for:

- **Testing Kubernetes deployments**: Demonstrating pod lifecycle, service discovery, and networking
- **GitOps workflows**: Serving as a demo application for continuous deployment with Flux or Argo CD
- **Service mesh validation**: Testing service mesh features like traffic splitting and observability
- **Cloud-native best practices**: Learning about health checks, metrics, logging, and tracing
- **Load testing**: Generating consistent workloads for infrastructure testing

## Documentation and Resources

* [Official Podinfo GitHub Repository](https://github.com/stefanprodan/podinfo)
* [Podinfo Helm Chart](https://github.com/stefanprodan/podinfo/tree/master/charts/podinfo)
* [Flux GitOps Toolkit Documentation](https://fluxcd.io/) — Podinfo is frequently used in Flux examples

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spire-controller-manager

# spire-controller-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spire-controller-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spire-controller-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The SPIRE Controller Manager provides automated workload identity management for Kubernetes clusters through SPIRE

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream SPIRE Controller Manager, which provides automated workload identity management and registration for Kubernetes clusters. While this image maintains functional parity with the upstream version, it is built on Wolfi providing regular security updates and a minimal attack surface. Additionally, the image fully supports all SPIRE Controller Manager CRDs and configurations.

## Getting Started

To install Chainguard `spire-controller-manager` image on your Kubernetes cluster, you can use the official [Helm chart](https://github.com/spiffe/helm-charts-hardened/tree/main/charts/spire).

Add the SPIRE Helm repository
```shell
helm repo add spire https://spiffe.github.io/helm-charts-hardened/
helm repo update
```

Then override the image by setting the `image.repository` and `image.tag` values in a values.yaml file to Chainguard's image
```yaml
spire-controller-manager:
  image:
    registry: cgr.dev
    repository: chainguard/spire-controller-manager
    tag: latest
```

Next install the CRDs
```shell
helm install spire-crds spire/spire-crds \
  -n spire-system \
  --create-namespace
```

Finally, install SPIRE with Chainguard's image
```shell
helm install spire spire/spire \
  -n spire-system \
  -f values.yaml
```

## Documentation and Resources:

 - [Spire Controller Manager Github Repository](https://github.com/spiffe/spire-controller-manager)
 - [Official SPIFFE Documentation](https://spiffe.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### traefik

# traefik
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/traefik` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/traefik/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Traefik](https://github.com/traefik/traefik) is a cloud native application proxy.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Traefik

The default Traefik ports are 80 and 8080.

There is no default configuration in the image, but you can use a sample one like this:

```yaml
## traefik.yml

# API and dashboard configuration. DO NOT RUN IN PROD
api:
  insecure: true
```

Save the configuration file from above as `traefik.yml`, then run:

```sh
docker run -v $PWD:/etc  -p 80:80 -p 8080:8080 cgr.dev/chainguard/traefik  --configFile=/etc/traefik.yml
time="2023-01-29T12:37:55Z" level=info msg="Configuration loaded from file: /etc/traefik.yml"
```

## Users and Directories

By default this image runs as a non-root user named `traefik` with a uid of 65532.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-activemq-artemis

# apache-activemq-artemis
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-activemq-artemis` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-activemq-artemis/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ActiveMQ Artemis

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the [activemq-artemis image on Docker Hub](https://hub.docker.com/r/apache/activemq-artemis). Switching to Chainguard activemq-artemis image should not require any changes to your existing setup.

## Getting Started
This image is intended to be deployed as described in the official Apache activemq-artemis [documentation](https://activemq.apache.org/components/artemis/documentation/). For example, using this command will start apache in the local container runtime, generating the broker stored inside the container file system:

```
docker run --detach --name mycontainer -p 61616:61616 -p 8161:8161 --rm cgr.dev/ORGANIZATION/apache-activemq-artemis:latest
```

This image also supports mapping a directory to the container so the broker is stored to the file system:

```
docker run -it -p 61616:61616 -p 8161:8161 -v <broker folder on host>:/var/lib/artemis-instance apache/activemq-artemis:latest-alpine
```

It is also possible to override the etc configuration for the activemq-artemis image, as described [here](https://activemq.apache.org/components/artemis/documentation/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cilium-envoy

# cilium-envoy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cilium-envoy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cilium-envoy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cilium-envoy is a specialized Envoy proxy used by Cilium for Layer 7 policy enforcement and service mesh functionality.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [quay.io/cilium/cilium-envoy](https://quay.io/repository/cilium/cilium-envoy) image. Switching to the Chainguard image should not require any changes to your existing Cilium deployment.

### cilium-envoy runs as root by default

Matching the public counterpart image, the Chainguard image runs as root by default.

If you need to use a non-root user, specify `1337` as the runAsUser in the cilium Helm chart:

```yaml
# values.yaml

envoy:
  podSecurityContext:
    runAsUser: 1337
```

## Getting Started

### Docker

The cilium-envoy container requires specific Linux capabilities to function properly:

```bash
docker run --rm \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_ADMIN \
  --cap-add=BPF \
  cgr.dev/ORGANIZATION/cilium-envoy:latest cilium-envoy --version
```

### Kubernetes/Helm

Cilium-envoy is typically deployed as part of a Cilium installation using Helm. To use the Chainguard image with a Cilium deployment, you can configure the Cilium Helm chart to use the custom image:

1. Create a `values.yaml` file with the following content:

```yaml
envoy:
  image:
    override: true
    repository: cgr.dev/ORGANIZATION/cilium-envoy
    tag: latest
    pullPolicy: IfNotPresent
```

2. Install or upgrade Cilium with the custom values:

```bash
helm upgrade --install cilium cilium/cilium \
  --namespace kube-system \
  --values values.yaml
```

### Required Capabilities

The cilium-envoy container requires the following Linux capabilities to function properly:

- `CAP_NET_ADMIN`: Required for network operations
- `CAP_SYS_ADMIN` or `CAP_BPF`: Required for BPF operations

These capabilities are necessary for integration with Cilium's datapath and should be provided when running the container.

## Documentation and Resources

* [Cilium Documentation](https://docs.cilium.io/)
* [Cilium Proxy Repository](https://github.com/cilium/proxy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### code-server

# code-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/code-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/code-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

VS Code in the browser

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `code-server` container image is comparable to Coders's [code-server](https://hub.docker.com/r/codercom/code-server). Chainguard's container contains only the minimum set of dependencies needed to run code-server.

## Getting Started

The [official documentation](https://coder.com/docs/code-server) outlines how to run the code-server image.

As detailed on the official [Docker Hub page](https://hub.docker.com/r/codercom/code-server), to run the image locally, first create a .config directory in your home directory:

```bash 
mkdir -p ~/.config
```

Next, the image can be ran with this `docker run` command:

```bash
docker run -it --name code-server -p 127.0.0.1:8080:8080 \
  -v "$HOME/.config:/home/coder/.config" \
  -v "$PWD:/home/coder/project" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  cgr.dev/ORGANIZATION/code-server
```

Alternatively, the image can be installed in a Kubernetes cluster with the official helm chart. Follow the instructions in the [documentation](https://coder.com/docs/code-server/helm) to clone the official repository, then create a values.yaml file using the instructions in the same documentation page. In the values.yaml file, under the `image` section, define the `repository` and `tag` keys and set their values to the appropriate Chainguard values, as illustrated below. Be sure to replace `ORGANIZATION` with your actual organization name.

```yaml
values:
  image:
    repository: cgr.dev/ORGANIZATION/code-server
    tag: "latest"
```

After creating the values.yaml file, follow the remaining instructions to install with helm:

```bash
helm upgrade --install code-server \
  ci/helm-chart \
  --values init.yaml
```

## Documentation and Resources
- [code-server documentation](https://coder.com/docs/code-server)
- [code-server Github](https://github.com/coder/code-server)
- [code-server Dockerhub](https://hub.docker.com/r/codercom/code-server)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubectl-fips

# kubectl-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubectl-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubectl-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `kubectl` Chainguard Image provides a low-to-zero CVE environment for [`kubectl`](https://kubernetes.io/docs/reference/kubectl/) suitable for integrating into Kubernetes CI or testing workflows.

## Configuration

To load your own global configuration file, you can set the `KUBECONFIG` environment variable and mount a configuration file on your host machine to the specified location on the container using a volume.

The command below sets the `KUBECONFIG` environment variable to `.kube/config` within the `nonroot` home folder, initializes a volume at that location, and runs the container with a command that prints the current configuration.

```sh
docker run \
 -e KUBECONFIG=/home/nonroot/.kube/config \
 -v $PWD/config:/home/nonroot/.kube/config \
 cgr.dev/ORGANIZATION/kubectl-fips:latest-dev config view
```

Be sure to replace `ORGANIZATION` with your organization’s name. You will likely also need to change `$PWD/config` to your kubeconfig path.

If you would prefer to test this command without using your own configuration file, you can create a default `config` file in your current working directory as below:

```sh
cat << 'EOF' > config
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {output=json}
users: null
EOF
```

## Getting Started

### Adding to a Kubernetes Cluster

In this example, we'll add the Kubectl Chainguard Image to a Kubernetes cluster. To follow this example, you'll need to install the following software to your host machine:

- [`kind`](https://kind.sigs.k8s.io/docs/user/quick-start#installation). 
- [`chainctl`](https://edu.chainguard.dev/chainguard/chainctl-usage/how-to-install-chainctl/)
- [`kubectl`]( https://kubernetes.io/docs/tasks/tools/)

Once the `kind` utility for creating local Kubernetes clusters is installed and on your path, create a new cluster with the following command:

```sh
kind create cluster
```

This will create a cluster with the default name `kind`.

Next, we'll need to download a pull token using Chainguard's [`chainctl`](https://edu.chainguard.dev/chainguard/chainctl-usage/how-to-install-chainctl/) utility. This will allow us to access your organization's Chainguard Images in environments that do not support OIDC, such as a Kubernetes cluster.

Run the following to generate a pull token:

```
chainctl auth configure-docker --pull-token --save
```

You will need to select your organization name from the menu and confirm the creation of the pull token. This will save your pull token to your Docker configuration, typically at `~/.docker/config.json`.

Now use [kubectl](https://kubernetes.io/docs/tasks/tools/) on your host machine to load the pull token as a secret. The following assumes your current working directory is your home directory, and depending on your system and configuration you may need to update the path to the `config.json`.

```
kubectl create secret generic cgsecret \
 --from-file=.dockerconfigjson=./.docker/config.json \
 --type=kubernetes.io/dockerconfigjson
```

Next, we'll run a shell command to create a configuration for the pod for our `kubectl ` Chainguard Image container. 

Run the following command to create the pod configuration file:

```sh
cat << EOF > kubectl.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kube-pod
spec:
  containers:
  - name: kubectl-container
    image: cgr.dev/ORGANIZATION/kubectl-fips
    command: ["/usr/bin/kubectl", "version"]
  imagePullSecrets:
  - name: cgsecret
EOF
```

Again, be sure to replace `ORGANIZATION` with your organization’s name.

The above provides configuration for a pod that will pull the `kubectl` Chainguard Image from your organization, then run a container with a command that outputs the current `kubectl` version.

Run the following to create the pod using the configuration file:

```sh
kubectl create -f kubectl.yaml
```

The pod should now be created. Run the following command to see information on the pod and associated container:

```sh
kubectl describe pod kube-pod
```

```
Name:             kube-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             kind-control-plane/172.19.0.2
Start Time:       Tue, 26 Nov 2024 16:30:24 -0500
Labels:           <none>
Annotations:      <none>
Status:           Running
IP:               10.244.0.4
IPs:
  IP:  10.244.0.4
Containers:
  kubectl-container:
    Container ID:  containerd://e9bc0e28ae161ff9ce84842f560478728c5986ff2dc2a41f02e90b49a3919211
    Image:         cgr.dev/$ORGANIZATION/kubectl-fips
    Image ID:      cgr.dev/$ORGANIZATION/kubectl@sha256:034d5e90723d49a31e6e98ad9ad787946143e9ea7a3728bfb38645d99305dc52
    Port:          <none>
    Host Port:     <none>
    Command:
      /usr/bin/kubectl
      version
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
...
```

In the configuration file, we provided the `/usr/bin/kubectl version` command. The above output shows this command completed. We can view the output of the command:

```sh
kubectl logs kube-pod
```

```
Client Version: v1.31.3
Kustomize Version: v5.4.2
Server Version: v1.30.0
```

The `kubectl` Chainguard Image has now been loaded into the cluster and used to run a command. To access cluster information from the container, you will need to [configure a security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for the pod or container.

Once you're finished testing, you can shut down and delete the example `kind` cluster with the following command:

```sh
kind delete cluster
```

## Documentation and Resources

- [Chainguard Academy: Authenticating to Chainguard Registry with a Pull Token](https://edu.chainguard.dev/chainguard/chainguard-registry/authenticating/#authenticating-with-the-chainctl-credential-helper)
- [Kubernetes Reference: Kubectl Documentation](https://kubernetes.io/docs/reference/kubectl/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4083

# request-4083
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4083` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4083/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

nginx-stable image configured with Ruby for optimized application support

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Description

The Ruby + Nginx Docker image provides a secure and efficient environment for running Ruby applications alongside an Nginx web server. This image is ideal for serving Ruby applications, handling static content, or acting as a reverse proxy for dynamic web applications.

## Usage
To try out the image, run:

```sh
docker run -p 8080:8080 cgr.dev/ORGANIZATION/request-4083:latest
```
After starting the container, navigate to `localhost:8080` in your web browser. You should find the default nginx welcome page.

You can also use the nginx Image to serve your own custom content. As an example, first create a folder to contain static HTML that will be served by nginx:

```sh
mkdir -p ~/html
```

Next, create a file called `index.html` in the `html` folder:

```sh
cat > ~/html/index.html <<EOF
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Nginx</title>
</head>
<body>
  <h2>Hello World from Nginx!</h2>
</body>
</html>
EOF
```

You can then instruct the nginx Image to serve the `index.html` file:

```sh
docker run \
 -v $(pwd)/html:/usr/share/nginx/html \
 -p 8080:8080 \
 cgr.dev/chainguard/request-4083:latest
```
If you navigate to `localhost:8080` in your web browser, it will return our custom HTML: `Hello World from Nginx!`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opensearch-dashboards-fips

# opensearch-dashboards-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opensearch-dashboards-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opensearch-dashboards-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-azure

# cloud-provider-azure-controller-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-azure-controller-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-azure-controller-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Controller manager for Azure CLI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Where possible, the cloud-provider-azure-controller-manager Chainguard Image is built for compatibility with the [Microsoft official image for cloud-provider-azure-controller-manager](https://oci.dag.dev/?image=mcr.microsoft.com/oss/kubernetes/azure-cloud-node-manager:v1.31.1).

## Getting Started

### Creating a self-managed k8s cluster in Azure

When creating a managed AKS cluster with `az aks create`, the daemonSet will default to using the upstream image at `mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager`. In order integrate this image with Azure, you will need to create a self-managed k8s cluster. After creation of this cluster, this image can be installed through the upstream helm chart with the following command.

```bash
cat <<EOF > values.yaml
cloudControllerManager:
  imageName: "cloud-provider-azure-controller-manager"
  imageRepository: "cgr.dev"
  imageTag: "latest"

cloudNodeManager:
  imageName: "cloud-provider-azure-node-manager"
  imageRepository: "cgr.dev"
  imageTag: "latest"
EOF
helm install --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --values values.yaml
```

## Documentation and Resources
* [Microsoft Azure Documentation: https://azure.github.io/azure-workload-identity/docs/installation/self-managed-clusters.html](https://azure.github.io/azure-workload-identity/docs/installation/self-managed-clusters.html)
* [Azure Architecture Blog: Self-managed Kubernetes on Azure](https://techcommunity.microsoft.com/t5/azure-architecture-blog/self-managed-kubernetes-on-azure/ba-p/3122730)
* [Blog: How to create a self-managed Kubernetes cluster in Azure manually](https://medium.com/@nabil.abdi/how-to-create-a-self-managed-kubernetes-cluster-in-azure-manually-48d91919142e)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### calico-fips

# calico-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/calico-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/calico-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation

There are several ways you can install Calico onto a Kubernetes cluster. This document follows method recommended in the [official Calico documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart#install-calico) which involves using the Tigera Calico operator. 

#### Install Tigera Operator

```yaml
helm repo add projectcalico https://projectcalico.docs.tigera.io/charts
helm repo update

helm install calico projectcalico/tigera-operator \
    --namespace tigera-operator \
    --create-namespace \
    --set autoDiscovery.clusterName=foo \
    --set tigeraOperator.registry=cgr.dev \
    --set tigeraOperator.image=cgr.dev/ORGANIZATION/calico-fips \
    --set tigeraOperator.version=latest
```

After setting up and connecting to the Kubernetes cluster where you want to install Calico, install the Tigera Calico operator and custom resource definitions (CRDs).

#### Create ImageSet 

> For Calico versions < 3.28, omit `calico/key-cert-provisioner` in the example
> below, as this was only introduced in v3.28.

ImageSet is a CRD provided by the Tigera operator. It is required to define
which images are used for Calico deployments.

Note, we do not pass the registry or image names here, only the image digests.
The registry is passed when creating a Calico cluster.

```yaml
apiVersion: operator.tigera.io/v1
kind: ImageSet
metadata:
  name: calico-v3.26.1
spec:
  images:
    - image: calico/node
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-node:latest)
    - image: calico/cni
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-cni:latest)
    - image: calico/kube-controllers
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-kube-controllers:latest)
    - image: calico/pod2daemon-flexvol
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-pod2daemon-flexvol:latest)
    - image: calico/csi
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-csi:latest)
    - image: calico/typha
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-typha:latest)
    - image: calico/node-driver-registrar
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-node-driver-registrar:latest)
    - image: calico/key-cert-provisioner
      digest: ... # Replace with $(crane digest cgr.dev/ORGANIZATION/calico-key-cert-provisioner:latest)
    # This isn't used on Linux, but it needs to have a value containing a valid digest.
    - image: calico/windows-upgrade
      digest: sha256:0000000000000000000000000000000000000000000000000000000000000000
```

#### Using different image names

Providing an ImageSet allows you to specify alternative image digests, but it
does not allow you to swap in custom image names. If you wish to use images that
are named differently, you'll need to first re-tag them.

For example, `/some/registry/node-fips:` would need to be re-tagged to
`/some/registry/node:`. The digest would be the same for both image tags.

#### Create Calico installation

Once the ImageSet is completed, specify the image registry and the image prefix
to use.

Our images follow `calico-` naming format, i.e `calico-node`, do we define an
`imagePrefix`.

```yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  variant: Calico
  registry: cgr.dev
  imagePath: <YOUR-ORGANIZATION>
  imagePrefix: calico-
```

The combination of these `ImageSet` and `Installation` CRDs serve as a drop in replacement for [Step 2 of the upstream documentation](https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart#install-calico). Together, these correctly rename the Calico images to their `cgr.dev` variants.

After creating the CRDs, you can ensure that the pods are running with a command like the following.

```shell
kubectl get pods -n calico-system
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openldap-fips

# openldap-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openldap-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openldap-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenLDAP is a free, open-source implementation of the Lightweight Directory Access Protocol (LDAP) developed by the OpenLDAP Project.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### whereabouts

# whereabouts
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/whereabouts` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/whereabouts/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Whereabouts is a simple IPAM (IP Address Management) solution for Kubernetes. To get more information about Whereabouts, please visit the [official project repository](https://github.com/k8snetworkplumbingwg/whereabouts).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is an official [Whereabouts documentation](https://github.com/k8snetworkplumbingwg/whereabouts/#installation) that provides detailed information on how to deploy and configure Whereabouts.

To deploy whereabouts, you can use the manifests available in the official repository at ./docs/crds folder.

```bash
git clone https://github.com/k8snetworkplumbingwg/whereabouts && cd whereabouts
kubectl apply \
    -f doc/crds/daemonset-install.yaml \
    -f doc/crds/whereabouts.cni.cncf.io_ippools.yaml \
    -f doc/crds/whereabouts.cni.cncf.io_overlappingrangeipreservations.yaml
```

Then patch the image to use the Chainguard image:

```bash
kubectl -n kube-system patch daemonset whereabouts --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/imagePullPolicy", "value":"IfNotPresent"}]'
kubectl -n kube-system set image daemonset/whereabouts whereabouts=cgr.dev/chainguard/whereabouts:latest
```

To test the deployment, you can create a pod with a network attachment definition:

> **Note:** The following example assumes you have deployed multus cni in your cluster. If you haven't, you can follow the instructions in the official repository at [k8snetworkplumbingwg/multus-cni](https://github.com/k8snetworkplumbingwg/multus-cni).

```bash
cat <<'EOF' | kubectl apply -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: whereabouts-conf
spec:
  config: '{
      "cniVersion": "0.3.0",
      "name": "whereaboutsexample",
      "type": "macvlan",
      "master": "eth0",
      "mode": "bridge",
      "ipam": {
        "type": "whereabouts",
        "range": "192.168.2.225/28"
      }
    }'
EOF
```

Then create a deployment that uses the network attachment definition:

```bash
cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-deployment
  labels:
    app: netshoot-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: netshoot-pod
  template:
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: whereabouts-conf
      labels:
        app: netshoot-pod
    spec:
      containers:
      - name: netshoot
        image: nicolaka/netshoot
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
EOF
```

After creating the deployment, you should see a pod running:

```bash
$ k get po
NAME                                  READY   STATUS    RESTARTS   AGE
netshoot-deployment-8dcd8565b-zm49h   1/1     Running   0          45m
```

Then you can exec into the pod and check the IP address:

```bash
$ k exec -it netshoot-deployment-8dcd8565b-zm49h -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 12:27:a2:24:3a:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.244.2.2/24 brd 10.244.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::1027:a2ff:fe24:3a10/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
3: net1@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 2a:d2:d1:26:b3:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.2.225/28 brd 192.168.2.239 scope global net1
       valid_lft forever preferred_lft forever
    inet6 fe80::28d2:d1ff:fe26:b33c/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
```

Voila! You have successfully deployed Whereabouts and assigned an IP address to a pod.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-gcp

# crossplane-gcp
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-gcp` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-gcp/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane GCP Providers deliver Kubernetes-native APIs for provisioning and managing Google Cloud resources through Crossplane.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Crossplane GCP providers are comparable to [upstream GCP providers](https://github.com/crossplane-contrib/provider-upjet-gcp) with the following architectural differences:

- **Upstream providers** can be deployed independently and automatically resolve their dependencies
- **Chainguard providers** require manual installation of the family provider and use `skipDependencyResolution: true` for component providers to prevent automatic upstream dependency resolution
- **Deployment pattern**: Install the Chainguard family provider first, then add individual component providers as needed
- **Functionality**: Provides equivalent GCP resource management capabilities with this modified deployment approach

## Getting Started

### Using the GCP Family Provider

For comprehensive GCP resource management, install the family provider that includes all GCP services:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-family-gcp
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-provider-family:latest
```

### Using Individual Component Providers

For targeted deployments, install specific component providers alongside the family provider. Use `skipDependencyResolution: true` to prevent default upstream family provider installation:

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gcp-storage
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-storage:latest
  skipDependencyResolution: true
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-gcp-gke
spec:
  package: cgr.dev/ORGANIZATION/crossplane-gcp-gke:latest
  skipDependencyResolution: true
```

## Configuration

After installing your desired providers, configure GCP credentials using a ProviderConfig:

```bash
# Create service account key secret
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: gcp-secret
  namespace: crossplane-system
type: Opaque
stringData:
  creds: |
    $(cat /path/to/service-account-key.json)
EOF

# Create ProviderConfig
cat <<EOF | kubectl apply -f -
apiVersion: gcp.m.upbound.io/v1beta1
kind: ClusterProviderConfig
metadata:
  name: default
spec:
  projectID: <your-project-id>
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: gcp-secret
      key: creds
EOF
```

Once configured, you can create GCP resources. Example Cloud Storage bucket creation:

```yaml
apiVersion: storage.gcp.m.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-secure-bucket
spec:
  forProvider:
    location: US-CENTRAL1
    project: your-project-id
  providerConfigRef:
    name: default
```

## Available Images

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `ghcr.io/crossplane-contrib/provider-family-gcp`          | `cgr.dev/ORGANIZATION/crossplane-gcp-provider-family`     |
| `ghcr.io/crossplane-contrib/provider-gcp-compute`         | `cgr.dev/ORGANIZATION/crossplane-gcp-compute`             |
| `ghcr.io/crossplane-contrib/provider-gcp-cloudplatform`   | `cgr.dev/ORGANIZATION/crossplane-gcp-cloudplatform`       |
| `ghcr.io/crossplane-contrib/provider-gcp-container`       | `cgr.dev/ORGANIZATION/crossplane-gcp-container`           |
| `ghcr.io/crossplane-contrib/provider-gcp-dns`             | `cgr.dev/ORGANIZATION/crossplane-gcp-dns`                 |
| `ghcr.io/crossplane-contrib/provider-gcp-kms`             | `cgr.dev/ORGANIZATION/crossplane-gcp-kms`                 |
| `ghcr.io/crossplane-contrib/provider-gcp-pubsub`          | `cgr.dev/ORGANIZATION/crossplane-gcp-pubsub`              |
| `ghcr.io/crossplane-contrib/provider-gcp-storage`         | `cgr.dev/ORGANIZATION/crossplane-gcp-storage`             |

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### amazon-cloudwatch-agent-operator-fips

# amazon-cloudwatch-agent-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/amazon-cloudwatch-agent-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/amazon-cloudwatch-agent-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based FIPS compliant image of  Amazon CloudWatch Agent Operator developed to manage the CloudWatch Agent on kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For detailed instructions on the Amazon CloudWatch Agent Operator, refer to the [official documentation](https://docs.aws.amazon.com/cloudwatch/). Ensure that you have appropriate permissions set up to allow CloudWatch to collect and send metrics and logs.

The source code and instructions for contributing to the operator can be found on [GitHub](https://github.com/aws/amazon-cloudwatch-agent-operator).

## Installation
There are several methods to install and configure the Amazon CloudWatch Agent Operator:

### 1. Using Helm Chart
To deploy the operator using Helm charts, you can use the following command. This command overrides the default image to use the Chainguard image
```bash
helm repo add aws-observability https://aws-observability.github.io/helm-charts
helm repo update aws-observability
helm install amazon-cloudwatch-agent-operator aws-observability/amazon-cloudwatch-observability \
  --create-namespace \
  --namespace amazon-cloudwatch-operator \
  --set clusterName=my-cluster-name \
  --set region=my-cluster-region \
  --set manager.image.repositoryDomainMap.public=cgr.dev/chainguard \
  --set manager.image.repository=amazon-cloudwatch-agent-operator-fips \
  --set manager.image.tag=latest
```

Refer to the [values.yaml](https://github.com/aws-observability/helm-charts/blob/main/charts/amazon-cloudwatch-observability/values.yaml) file for more configuration options.

### 2. Using k8s Manifests
You can deploy cloudwatch agent and its operator using k8s manifests by following the steps outlined in the [CloudWatch Setup Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-metrics.html). 

You can replace the default amazon-cloudwatch-agent-operator image with the Chainguard image by modifying the amazon-cloudwatch-observability-controller-manager deployment by replacing the manager image with the Chainguard image.

```
    spec:
      containers:
        command:
        - /manager
        image: cgr.dev/chainguard/amazon-cloudwatch-agent-operator-fips:latest
```

### 3. Deployment from Gith
An easier way is setting up the deployment referring their [GitHub](https://github.com/aws/amazon-cloudwatch-agent-operator), Running `make deploy` creates all the k8s resources.

```
git clone https://github.com/aws/amazon-cloudwatch-agent-operator.git
cd amazon-cloudwatch-agent-operator
make deploy
```
This command will create all necessary resources, and you can customize the deployment by modifying your CloudWatch configuration in resource definition. More details can be found in the repository [README](https://github.com/aws/amazon-cloudwatch-agent-operator/blob/main/README.md).

## Additional Resources
- [Amazon CloudWatch Documentation](https://docs.aws.amazon.com/cloudwatch/)
- [Helm Chart Documentation](https://github.com/aws-observability/helm-charts/tree/main)
- [CloudWatch Agent Operator GitHub Repository](https://github.com/aws/amazon-cloudwatch-agent-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### open-liberty

# open-liberty
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/open-liberty` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/open-liberty/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open Liberty is a highly composable, fast to start, dynamic application server runtime environment.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Open Liberty Chainguard image was built to work as a drop-in replacement for the official [`openliberty/open-liberty` image](https://hub.docker.com/_/open-liberty).
This image supports the same environment variables as the [`openliberty/open-liberty`](https://hub.docker.com/_/open-liberty) image but also has a number of key differences, including the following:

* The GID for the default user is 1001 instead of 0
* Open Liberty is located in `/usr/share/java/open-liberty` instead of `/opt/ol/wlp`
* The runtime and buildtime helpers can be found in `/usr/share/java/open-liberty/helpers` instead of `/opt/ol/helpers`
* The class cache is located in `/output/.classCache` instead of `/opt/java/.scc`
* This image is Wolfi-based, unlike upstream, which leverages Ubuntu and UBI

## Getting Started

To get started with Chainguard's Open Liberty image, derive an image containing your application.

Example Dockerfile:

```dockerfile
FROM cgr.dev/ORGANIZATION/open-liberty:latest

COPY --chown=1001:1001 server.xml /config/server.xml
COPY --chown=1001:1001 path/to/application.jar /config/dropins/application.jar

RUN features.sh && configure.sh
```

Copy your application to the `/config/dropins` folder. Any artifacts placed here will be automatically deployed by Open Liberty. These artifacts can be updated, added, and removed without restarting the server.

The server manifest, `server.xml`, contains all of the features we may want to enable. Append any additional features your application leverages to the server manifest.

The `features.sh` script will leverage `featureUtility` to install any features defined in the server manifest. The `configure.sh` script will apply the server configuration, any iFixes in `/fixes`, and regenerate the class cache.

## Documentation and Resources

* [Official Open Liberty documentation](https://openliberty.io/docs/latest/overview.html).
* [Official Open Liberty guides](https://openliberty.io/guides)
* [Build an application image with Open Liberty](https://openliberty.io/docs/latest/container-images.html#build)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azuredisk-csi-fips

# azuredisk-csi-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azuredisk-csi-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azuredisk-csi-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Azure Disk CSI driver enables the provisioning and management of Azure Disks through Kubernetes.This driver provides an interface for attaching, detaching, and managing persistent disks on Azure, helping applications achieve durable and high-performing storage.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Example Usage with Chainguard Image

This guide outlines steps to test volume provisioning with the Azure Disk CSI driver. The Azure Disk CSI driver enables the provisioning and management of Azure Disks through Kubernetes.

### Prerequisites

To test the Azure Disk CSI driver, you need:

- Azure CLI
- Access to an Azure account
- An AKS cluster
- Proper IAM roles and policies configured for Azure Disk CSI driver, with permissions to create and attach disks to the AKS nodes.

### Install the Azure Disk CSI Driver

The Azure Disk CSI driver can be installed via Helm. Ensure you have the Helm repo added:

```shell
helm repo add azuredisk-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/charts
helm repo update
```

Then, install the driver with the following command, ensuring appropriate values are set in the configuration file:

```shell
helm install azuredisk-csi-driver azuredisk-csi-driver/azuredisk-csi-driver \
--namespace kube-system \
--set image.azuredisk.repository=cgr.dev/chainguard/azuredisk-csi-fips \
--set image.azuredisk.tag=latest \
--set image.azuredisk.pullPolicy=IfNotPresent \
--set serviceAccount.node=new-csi-azuredisk-node-sa \
--set serviceAccount.create=true \
--set rbac.name=new-csi-azuredisk \
--set controller.hostNetwork=false \
--set controller.replicas=1 \
--set linux.hostNetwork=false \
--set linux.dsName=new-csi-azuredisk-node \
--set windows.dsName=new-csi-azuredisk-node-win
```

If you face any issues with the above helm install, you might have to annotate the below

Annotate and label the CSI driver for Helm management:

```shell
kubectl annotate csidriver disk.csi.azure.com \
  meta.helm.sh/release-name=azuredisk-csi-driver \
  meta.helm.sh/release-namespace=kube-system

kubectl label csidriver disk.csi.azure.com \
  app.kubernetes.io/managed-by=Helm
```

Check that the CSI driver controller and node pods are running:

```shell
kubectl get pods -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver"
```

### Step 1: Create a StorageClass for Azure Disk

Create a StorageClass to provision disks using the Azure Disk CSI driver. This StorageClass should specify `disk.csi.azure.com` as the provisioner.

```yml
kubectl apply -f -<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azure-disk
provisioner: disk.csi.azure.com
volumeBindingMode: WaitForFirstConsumer
EOF
```

### Step 2: Create a PersistentVolumeClaim (PVC)

Request a PersistentVolumeClaim using the Azure Disk StorageClass created in Step 1.

```yml
kubectl apply -f -<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-disk-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: azure-disk
  resources:
    requests:
      storage: 5Gi
EOF
```

### Step 3: Create a Pod to Use the PVC

Create a Pod that uses the PVC to test the volume's functionality. This Pod will write a test file to the mounted volume.

```yml
kubectl apply -f -<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: azure-disk-test-pod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "echo 'Hello from Azure Disk!' > /mnt/azure/hello.txt && sleep 3600"]
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: azure
  volumes:
  - name: azure
    persistentVolumeClaim:
      claimName: azure-disk-pvc
EOF
```

Verify that the Pod is created and enters the Running state:

```shell
kubectl get pod azure-disk-test-pod
```

Verify the PVC has been created and is bound to a PersistentVolume (PV):

```shell
kubectl get pvc azure-disk-pvc
```

Example output:

```
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
azure-disk-pvc   Bound    pvc-1234abcd-56ef-78gh-ijkl-mnopqrstuvwx   5Gi        RWO            azure-disk     10s
```

### Step 4: Verify Data Written to the Disk

Check that the data written by the Pod to the Azure Disk is successfully stored.

```shell
kubectl exec azure-disk-test-pod -- cat /mnt/azure/hello.txt
```

Expected output:

```
Hello from Azure Disk!
```

### Step 5: Check Logs of the Azure Disk CSI Driver

Check the logs of the Azure Disk CSI driver's controller and node pods to ensure that there are no errors during the volume provision and attachment process.

#### Controller Logs

```shell
kubectl logs -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver" -c csi-provisioner
```

#### Node Logs

```shell
kubectl logs -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver" -c azuredisk
```

### Step 6: Clean Up

Once testing is complete, clean up the resources created:

```shell
kubectl delete pod azure-disk-test-pod
kubectl delete pvc azure-disk-pvc
kubectl delete storageclass azure-disk
```

If you installed the Azure Disk CSI driver with Helm and want to remove it:

```shell
helm uninstall azuredisk-csi-driver -n kube-system
```

---

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-node-exporter-iamguarded

# prometheus-node-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-node-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-node-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for hardware and OS metrics exposed by LINUX kernels

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Node Exporter IAMGuarded is a security-enhanced variant of Node Exporter designed to be deployed using its companion Node Exporter IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Node Exporter deployments.

## Helm Chart Installation

The Node Exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install node-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Node Exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/prometheus-node-exporter-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install node-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/node-exporter:4.5.11
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Node Exporter IAMGuarded installation using standard Node Exporter verification methods. The deployment functions as a standard Node Exporter instance, so all typical Node Exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Node Exporter Configuration

When using the Kube-Prometheus chart, you can override the Node Exporter image under the `node-exporter` section in your `values.yaml`:

```yaml
"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-kubernetes-fips

# newrelic-kubernetes-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-kubernetes-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-kubernetes-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant minimal [newrelic-kubernetes](https://github.com/newrelic/nri-kubernetes) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `newrelic-kubernetes-fips` image is a FIPS 140-2/140-3 compliant version designed to be a drop-in replacement for the upstream [`newrelic/nri-kubernetes`](https://github.com/newrelic/nri-kubernetes) image in FIPS-required environments. This image integrates seamlessly with the New Relic Infrastructure agent to provide comprehensive Kubernetes monitoring capabilities.

For non-FIPS environments, see [`newrelic-kubernetes`](https://images.chainguard.dev/directory/image/newrelic-kubernetes/overview).

### FIPS support

The `newrelic-kubernetes-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The `newrelic-kubernetes-fips` images are drop-in replacements for the upstream `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) Helm chart.

### Helm Installation

Add the New Relic Helm repository and install the nri-bundle with FIPS images:

```sh
helm repo add newrelic https://helm-charts.newrelic.com
helm repo update
```

Create a values file for the FIPS-compliant installation:

```sh
cat > fips-values.yaml <<EOF
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle-fips
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kubernetes-fips
      tag: latest
EOF
```

Install the Helm chart with the FIPS values:

```sh
helm install nri-bundle newrelic/nri-bundle \
  --namespace newrelic \
  --create-namespace \
  -f fips-values.yaml
```

Be sure to replace `ORGANIZATION` with your organization's name in the Chainguard Registry, `$CLUSTER_NAME` with your cluster identifier, and `$LICENSE_KEY` with your New Relic license key.

For advanced configuration options including resource limits, custom attributes, and integration settings, refer to the [official New Relic Kubernetes integration documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/installation/kubernetes-integration-install-configure/).

## Documentation and Resources

- [New Relic Kubernetes Integration Documentation](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/get-started/introduction-kubernetes-integration/)
- [nri-bundle Helm Chart](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle)
- [GitHub Repository](https://github.com/newrelic/nri-kubernetes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trivy-operator-fips

# trivy-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trivy-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trivy-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant container image for Trivy Operator, providing automated security scanning for Kubernetes workloads with enhanced cryptographic compliance.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `trivy-operator-fips` container image is comparable to the [upstream Trivy Operator image](https://github.com/aquasecurity/trivy-operator) with improved security and FIPS compliance. Switching to the Chainguard image should not require any significant changes to your existing setup.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To deploy the Chainguard Trivy Operator FIPS image with Helm, first add the Aqua Security Helm repository:

```shell
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update
```

Next create a values file. The following is a minimal example:

```yaml
# values.yaml

image:
  registry: "cgr.dev"
  repository: "ORGANIZATION/trivy-operator-fips"
  tag: "latest"

trivy:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/trivy-fips"
    tag: "latest-dev"
```

Note that we're using the `-dev` variant of the `trivy-fips` image. That's because
the `trivy-fips` image does not include a shell. You could also consider adding
`bash` to the image with [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly-console/).

Finally, install Trivy Operator. This example assumes the values file is named `values.yaml`:

```shell
helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace \
  -f values.yaml
```

## Documentation and Resources

For more information about Trivy Operator, refer to the following resources:

- [Trivy Operator GitHub Repository](https://github.com/aquasecurity/trivy-operator)
- [Trivy Operator Documentation](https://aquasecurity.github.io/trivy-operator/latest/)
- [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentofu

# opentofu
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentofu` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentofu/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OpenTofu](https://opentofu.org/) is an open-source infrastructure as code tool that allows you to declaratively manage your cloud infrastructure. OpenTofu is a fork of Terraform managed by the Linux Foundation.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's OpenTofu container image is comparable to the [OpenTofu image maintained by the Linux Foundation](https://opentofu.org/docs/intro/install/docker/). Like most of Chainguard's container images, the OpenTofu image does not operate as the root user and includes only the minimum packages needed to function. Note that this image sets `opentofu` as the entrypoint.

> [!IMPORTANT]
> As of this writing, Chainguard does not offer any hardened [providers](https://opentofu.org/docs/language/providers/) for the OpenTofu image, although we may do so in the future.

## Getting Started

In order to use Chainguard's OpenTofu container image, you'll need an existing configuration. If you don't already have one in place, you can follow these instructions to set up an example configuration and then apply it.

First create a new directory and navigate into it:

```shell
mkdir opentofu-test && cd $_
```

Then create a `main.tf` file to hold the configuration. This example generates and outputs a string of sixteen random characters:

```shell
cat > ./main.tf <<EOF
terraform {
  required_providers {
	random = {
  	source  = "hashicorp/random"
	}
  }
}

provider "random" {}

resource "random_string" "random" {
  length = 16
}

output "random" {
  value = random_string.random.result
}
EOF
```

With the example configuration in place, run the following command to initialize the working directory:

```shell
docker run --rm \
  -v "${PWD}":/work \
  -w /work \
  cgr.dev/ORGANIZATION/opentofu init
```

Finally, you can apply the configuration:

```
docker run --rm \
  -v "${PWD}":/work \
  -w /work \
  cgr.dev/ORGANIZATION/opentofu apply
```
```
. . .

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

random = "E2rURfL2Wsc)kf8I"
```

## Documentation and Resources

* [OpenTofu Documentation](https://opentofu.org/docs/)
* [OpenTofu Project GitHub Repository](https://github.com/opentofu/opentofu)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ghidra

# ghidra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ghidra` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ghidra/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Ghidra application image offering both GUI and headless modes of operation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

The Ghidra image allows for reverse engineering within a convenient, containerized environment. Both GUI and headless modes of operation are supported, as is PyGhidra.

### Prerequisites

* XQuartz or X11 installed and configured locally
  * If using XQuartz on macOS, ensure that the `Allow connections from network clients` option is checked in the Security menu
* Depending on the operating system, the image's `DISPLAY=:0` environment variable may need to be overridden
  * Most of the time, `-e DISPLAY=host.docker.internal:0` will work, but in certain cases, the local IP (not `localhost` or `127.0.0.1`) may be required (e.g., `192.168.1.100:0`).

### Example Usage

```bash
$ IP=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}')
$ xhost +IP
xhost; docker run --rm -it --net=host -e DISPLAY="${IP}":0 cgr.dev/ORGANIZATION/ghidra:latest
```

### Troubleshooting

If the GUI does not display, ensure that XQuartz or X11 are configured correctly.

Complete XQuartz configuration:
```bash
$ defaults write org.xquartz.X11 nolisten_tcp -bool false
$ defaults write org.xquartz.X11 no_auth -bool false
$ defaults write org.xquartz.X11 enable_iglx -bool true
$ mkdir -p ~/.xinitrc.d
$cat << 'EOF' > ~/.xinitrc.d/xhost-config.sh
#!/bin/sh

xhost +127.0.0.1
xhost +localhost
xhost +$(hostname)
xhost +$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}')
EOF

$ chmod +x ~/.xinitrc.d/xhost-config.sh
```

## Documentation and Resources

Documentation for installing and using Ghidra can be found on the NSA's public [Ghidra repository](https://github.com/NationalSecurityAgency/ghidra).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dotnet-fips

# dotnet-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dotnet-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dotnet-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard .NET images are available on `cgr.dev` as two variants: `dotnet-sdk-fips` and `dotnet-runtime-fips`. The SDK variant contains additional tooling to facilitate development and building, while the runtime variant contains only the runtime to execute .NET applications. Both the `sdk-fips` and `runtime-fips` images also have `latest-dev` version that contain a shell and various other tools for development.

### SDK
```
docker pull cgr.dev/chainguard/dotnet-sdk-fips:latest
```

### Runtime
```
docker pull cgr.dev/chainguard/dotnet-runtime-fips:latest
```

### Supported SDK Feature Bands

TL;DR: Chainguard's .NET SDK FIPS images provide `1xx` feature bands exclusively. We are looking into providing tags for our SDK images with other feature bands, but due to technical limitations, we aren't doing so today.

Each release of the .NET project is versioned according to the runtime (i.e `9.0.8`) and each release includes one or more 'feature bands' of the SDK (i.e `9.0.109`, `9.0.304`). [The download page for .NET 9.0 illustrates this](https://dotnet.microsoft.com/en-us/download/dotnet/9.0).

The SDK images provided by Microsoft are tagged such that the SDK is tagged with the version of the most recent feature band (i.e `mcr.microsoft.com/dotnet/sdk:9.0.304`).

It has been difficult for Chainguard to reliably provide additional feature bands for various technical reasons. And Microsoft has, in some cases, changed how they tag their source code repositories, disrupting how our packages are versioned and, resultantly, how our images are tagged.

We are working on changes to provide additional feature bands with our .NET SDK FIPS image (i.e `9.0.109`, `9.0.304`). However, until those changes are implemented, our `dotnet-sdk-fips` image will include, and will be tagged exclusively, with the version of the `1xx` feature band (i.e `9.0.109`).

## FIPS Enablement
Our .NET `runtime` and `sdk` images have [FIPS enabled](https://edu.chainguard.dev/chainguard/chainguard-images/images-features/fips-images/) versions. However, the underlying .NET core runtime does not include any mechanisms to enforce FIPS compliance according to [Microsoft's official documentation](https://learn.microsoft.com/en-us/dotnet/standard/security/fips-compliance). Accordingly, it is up you and/or your developers to ensure that your application is using FIPS compliant algorithms and that the runtime environment is also properly configured to run in FIPS mode.

## Usage

The `dotnet-sdk-fips` image can be used directly for simple cases, or with a multi-stage build using the `dotnet-sdk-fips` as the builder and `dotnet-runtime-fips` as the final target container.

To get started, go to your current dotnet application directory (or where you house your dotnet applications) and execute the following command. This command should be able to detect the dotnet project in your directory and create a base for the docker initialization.

```docker init```

This command should create the following files.

```
Dockerfile
compose.yaml
README.Docker.md
.dockerignore
```

After the files have been created, replace the contents within the created Dockerfile with the following

```Dockerfile
FROM cgr.dev/chainguard/dotnet-sdk-fips:latest AS build

COPY --chown=nonroot:nonroot . /source

# If your project resides in a sub directory, make sure you are pointing to that directory. ex: If your project resided in a directory called 'app', you would set the destination to /source/app
WORKDIR /source

RUN dotnet publish --use-current-runtime --self-contained false -o Release

# If you are running an ASPNET project, you can instead pull our ASPNET image cgr.dev/chainguard/aspnet-runtime-fips:latest
FROM cgr.dev/chainguard/dotnet-runtime-fips:latest AS final
WORKDIR /

# Copy everything needed to run the app from the "build" stage.
COPY --from=build source .

ENTRYPOINT ["dotnet", "Release/dotnet.dll"]
```

This will build your application using the SDK image and then copy the built application over to the Runtime image which will then start.

You can run and publish a local image with the following command
```
docker compose up -d --build
```

You can also remove the container using the following
```
docker compose down
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spicedb-operator-fips

# spicedb-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spicedb-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spicedb-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This is the FIPS-compliant variant of the SpiceDB Operator, a Kubernetes operator for managing SpiceDB clusters, providing automated deployment, scaling, and management of SpiceDB instances.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `spicedb-operator` image is designed to be a drop-in replacement for the upstream [`authzed/spicedb-operator`](https://github.com/authzed/spicedb-operator) image.

### FIPS Support
The `spicedb-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Installing the SpiceDB Operator

To install the FIPS-compliant SpiceDB Operator on your Kubernetes cluster, first download the operator bundle:

```sh
curl -LO https://github.com/authzed/spicedb-operator/releases/latest/download/bundle.yaml
```

Then replace the operator image with the Chainguard FIPS image and apply:

```sh
sed -i 's|ghcr.io/authzed/spicedb-operator:.*|cgr.dev/ORGANIZATION/spicedb-operator-fips:latest|g' bundle.yaml
kubectl apply --server-side -f bundle.yaml
```

### Creating a SpiceDB Cluster with FIPS-Compliant Components

Once the operator is installed, you can create a SpiceDB cluster using FIPS-compliant images:

```yaml
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: spicedb-config
  namespace: default
stringData:
  preshared_key: "somerandomkeyatleastthirtytwocharacters"
  datastore_uri: "memory://"
---
apiVersion: authzed.com/v1alpha1
kind: SpiceDBCluster
metadata:
  name: spicedb
  namespace: default
spec:
  config:
    replicas: 1
    datastoreEngine: memory
    # Use FIPS-compliant SpiceDB image:
    image: "cgr.dev/ORGANIZATION/spicedb-fips:latest"
  secretName: spicedb-config
EOF
```

For detailed configuration options, see the [SpiceDB Operator documentation](https://github.com/authzed/spicedb-operator/).

## Documentation and Resources

* [SpiceDB Operator Documentation](https://github.com/authzed/spicedb-operator)
* [SpiceDB Documentation](https://authzed.com/docs/spicedb/getting-started/discovering-spicedb)
* [SpiceDB on GitHub](https://github.com/authzed/spicedb)

Additional FIPS-related resources:
* [Chainguard FIPS Images Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cephcsi

# cephcsi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cephcsi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cephcsi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CephCSI is the Container Storage Interface (CSI) driver for Ceph, providing support for RBD and CephFS.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cephcsi` image is compatible with the upstream [Ceph CSI](https://github.com/ceph/ceph-csi) image (`quay.io/cephcsi/cephcsi`). 

Currently, the Chainguard `cephcsi` image does not support `SELinux`; support is actively in development.

## Getting Started

### Basic Usage

The Ceph Container Storage Interface (CSI) driver is deployed using [Rook Ceph](https://rook.io/docs/rook/latest-release/Getting-Started/intro/), a Kubernetes operator that automates the deployment and management of a Ceph storage cluster. Rook has [prerequisites](https://rook.io/docs/rook/latest-release/Getting-Started/Prerequisites/prerequisites/) that need to be met before deployment, such as, at least one local storage device and a Linux kernel built with the RBD module.

Rook can be deployed by using [manifests](https://rook.io/docs/rook/latest-release/Getting-Started/quickstart) or [helm charts](https://rook.io/docs/rook/latest-release/Helm-Charts/helm-charts/). 

#### Deploy the Rook Operator
The [rook operator](https://rook.io/docs/rook/latest-release/Helm-Charts/operator-chart/#installing) can be configured to use the Chainguard CephCSI image:

```sh
cat > rook-operator-values.yaml <<EOF
csi:
  cephcsi:
    image: cgr.dev/ORGANIZATION/cephcsi
    tag: latest
EOF

helm repo add rook-release https://charts.rook.io/release
helm install rook-ceph rook-release/rook-ceph -n rook-ceph --create-namespace -f rook-operator-values.yaml
```
Wait for the operator to be available:
```sh
$ kubectl wait --for=condition=Available -n rook-ceph deployment/rook-ceph-operator
$ kubectl get pods -n rook-ceph
NAME                                           READY   STATUS    RESTARTS   AGE
ceph-csi-controller-manager-778798b996-n6wh7   1/1     Running   0          31s
rook-ceph-operator-64d5db6dcb-w66tw            1/1     Running   0          31s
```

#### Deploy the Ceph Cluster
Install the [ceph cluster chart](https://rook.io/docs/rook/latest-release/Helm-Charts/ceph-cluster-chart/):
```sh
helm install --create-namespace --namespace rook-ceph rook-ceph-cluster \
   --set operatorNamespace=rook-ceph rook-release/rook-ceph-cluster
```

If you have local storage available, `rook-ceph-osd` pods should be ready:

```sh
$ kubectl wait --for=condition=ready -n rook-ceph pod -l app=rook-ceph-osd
$ kubectl get pods -n rook-ceph
NAME                                                        READY   STATUS      RESTARTS   AGE
ceph-csi-controller-manager-778798b996-n6wh7                1/1     Running     0          2m29s
rook-ceph-exporter-5c01e877fcb9-f5bf658cd-bpffz             1/1     Running     0          31s
rook-ceph-mds-ceph-filesystem-a-755d58b858-52fqg            2/2     Running     0          34s
rook-ceph-mds-ceph-filesystem-b-9bf8fb4c8-b4xsq             2/2     Running     0          32s
rook-ceph-mgr-a-59cc5fcfbd-4kgqq                            2/2     Running     0          76s
rook-ceph-mon-a-6f99b7946f-shq25                            2/2     Running     0          100s
rook-ceph-operator-64d5db6dcb-w66tw                         1/1     Running     0          2m29s
rook-ceph-osd-0-5b8b9fdf8c-nwssh                            2/2     Running     0          41s
rook-ceph-osd-prepare-5c01e877fcb9-4nxb7                    0/1     Completed   0          55s
rook-ceph-tools-6f9c54c5f-74gx8                             1/1     Running     0          106s
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-84dcc577bd-9x99v   6/6     Running     0          95s
rook-ceph.cephfs.csi.ceph.com-nodeplugin-hbqpg              3/3     Running     0          95s
```

#### Testing the Ceph CSI Driver

To confirm that the Ceph CSI driver is working correctly, you can create a **Persistent Volume Claim (PVC)** and a test pod that uses it.

By default, the Rook Ceph cluster Helm chart deploys a **storage class** named `ceph-filesystem` which is required for provisioning storage. This storage class uses the Ceph CSI driver to create and manage volumes. You can find the default values in the [Rook Ceph GitHub repository](https://github.com/rook/rook/blob/ffcb0d31d6ff5668c03d3cf5033623760defc44d/deploy/charts/rook-ceph-cluster/values.yaml#L565).

1.  **Create a PVC** that requests storage from the `ceph-filesystem` storage class.

  ```yaml
  kubectl apply -f - <<EOF
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: my-cephfs-pvc
    namespace: default
  spec:
    accessModes:
      - ReadWriteMany
    storageClassName: ceph-filesystem
    resources:
      requests:
        storage: 1Gi
  EOF
  kubectl wait --for=jsonpath='{.status.phase}'=Bound pvc/my-cephfs-pvc --timeout=300s
  ```

2.  **Create a test pod** and mount the PVC. The pod will be stuck in a waiting state if it fails to mount the volume.

  ```yaml
  kubectl apply -f - <<EOF
  apiVersion: v1
  kind: Pod
  metadata:
    name: test-pod
    namespace: default
  spec:
    containers:
      - name: busybox
        image: busybox
        command: ["sh", "-c", "echo 'Hello from the test pod!' > /data/testfile.txt"]
        volumeMounts:
          - name: cephfs-volume
            mountPath: /data
    volumes:
      - name: cephfs-volume
        persistentVolumeClaim:
          claimName: my-cephfs-pvc
  EOF
  ```

  If the pod successfully starts, you've confirmed that the Ceph CSI driver is functional and able to provision and mount volumes.

For further exploration and more information, use these resources:

  * [Ceph CSI GitHub Repository](https://github.com/ceph/ceph-csi)
  * [Rook Ceph Documentation](https://rook.io/docs/rook/latest-release/Getting-Started/intro/)
  * [Ceph Documentation](https://docs.ceph.com/)
  * [Kubernetes CSI Documentation](https://kubernetes-csi.github.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-operator

# flux-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Flux Operator is a Kubernetes controller for managing the lifecycle of Flux CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `flux-operator` container image is designed to be a drop-in replacement for the upstream [flux-operator image](https://github.com/controlplaneio-fluxcd/flux-operator/pkgs/container/flux-operator).

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/flux-operator
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm install flux-operator oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator \
  --namespace flux-system \
  --create-namespace -f values.yaml
```

### Use the Chainguard images of the Flux component controllers

In order to deploy the Flux components (e.g. kustomize and helm controllers) using the Chainguard images, please refer to the official guide about the customization of the Flux instance, documented [here](https://fluxcd.control-plane.io/operator/flux-kustomize/).

Please find below an example.

#### Use Chainguard Kustomize, Helm, and source controller images

```yml
apiVersion: fluxcd.controlplane.io/v1
kind: FluxInstance
metadata:
  name: flux
  namespace: flux-system
spec:
  distribution:
    version: "2.6.x"
    registry: "ghcr.io/fluxcd"
    artifact: "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
  cluster:
    type: kubernetes
    size: medium
  kustomize:
    patches:
      - patch: |
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: cgr.dev/ORGANIZATION/flux-kustomize-controller
        target:
          kind: Deployment
          name: kustomize-controller
      - patch: |
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: cgr.dev/ORGANIZATION/flux-helm-controller
        target:
          kind: Deployment
          name: helm-controller
      - patch: |
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: cgr.dev/ORGANIZATION/flux-source-controller
        target:
          kind: Deployment
          name: source-controller
      - patch: |
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: cgr.dev/ORGANIZATION/flux-notification-controller
        target:
          kind: Deployment
          name: notification-controller
```

## Documentation and Resources
- [flux-operator](https://fluxcd.control-plane.io/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### karma

# karma
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/karma` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/karma/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A dashboard for managing alerts from Alertmanager

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`karma` is comparable to the upstream [karma](https://hub.docker.com/layers/lmierzwa/karma/v0.120/images/sha256-c9364c1e2dc2e4bbfb286e70f31a1517e7ccf9ceb997f79177f0b0cb21eb9c36?context=explore) image, with the following differences:

- Like all other Chainguard Images, `karma` features a stripped down, minimal design
- This base image comes with apk and BusyBox and reports as being a Chainguard image.
- It has few-to-zero CVEs
- It does not run as the root user

## Getting Started

Karma is dashboard for managing alerts from AlertManager. Karma requires an alertmanager instance to be available. Both Karma and AlertManager requires config files.
The following is an example `altertmanager.yaml` configuration file:

```
global:
  resolve_timeout: 30s
route:
group_by: ["alertname"]
group_wait: 5s
group_interval: 10s
repeat_interval: 999h
receiver: "default"
routes:
  - receiver: "default"
    group_by: []
    match_re:
      alertname: .*
    continue: true
  - receiver: "pagination"
    group_by: ["alertname", "instance"]
    match_re:
      alertname: Pagination Test
    continue: false
  - receiver: "by-cluster-service"
    group_by: ["alertname", "cluster", "service"]
    match_re:
      alertname: .*
    continue: true
  - receiver: "by-name"
    group_by: [alertname]
    match_re:
      alertname: .*
    continue: true
  - receiver: "by-cluster"
    group_by: [cluster]
    match_re:
      alertname: .*
    continue: true

inhibit_rules:
  - source_match:
      severity: "critical"
    target_match:
      severity: "warning"
    # Apply inhibition if the alertname and cluster is the same in both
    equal: ["alertname", "cluster"]
receivers:
  - name: "default"
  - name: "pagination"
  - name: "by-cluster-service"
  - name: "by-name"
  - name: "by-cluster"
```

More information can be found in the [Karma configuration documentation](https://github.com/prymitive/karma/blob/main/docs/CONFIGURATION.md).

To test out this image, deploy a prometheus alertmanager image:

```
docker run -d \
    --rm \
    --network karma \
    --name prom \
    -p 9093:9093 \
    -v /alertmanager.yaml:/etc/alertmanager/alertmanager.yml \
    cgr.dev/ORGANIZATION/prometheus-alertmanager:latest
```

Start a karma container by running the command below

```
docker run -d \
    --rm \
    --network karma \
    --name karma \
    -p 8083:8080 -e ALERTMANAGER_URI=http://prom:9093/ \
    -v /acls.yaml:/etc/acls.yaml -v /karma.yaml:/etc/karma.yaml \
    cgr.dev/ORGANIZATION/karma:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### management-api-for-apache-cassandra

# management-api-for-apache-cassandra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/management-api-for-apache-cassandra` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/management-api-for-apache-cassandra/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RESTful / Secure Management Sidecar for Apache Cassandra

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Compatibility Notes
This image is configured with the `cassandra` user/group set to uid/gid `999:999`, and membership in the `999` group only, e.g.:
```
bash-5.3$ id
uid=999(cassandra) gid=999(cassandra) groups=999(cassandra)
```

The comparable Apache Cassandra image configures the `cassandra` user as a member of the `cassandra` and root (`0`) groups, e.g.:
```
[cassandra@81d871d73c84 /]$ id
uid=999(cassandra) gid=999(cassandra) groups=999(cassandra),0(root)
```

# Usage

You can run the Management API as a standalone Docker container:

 > docker run -p 8080:8080 -it --rm cgr.dev/chainguard/management-api-for-apache-cassandra:latest

 > curl http://localhost:8080/api/v0/probes/liveness
 OK

 # Check service and C* are running
 > curl http://localhost:8080/api/v0/probes/readiness
 OK

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ceph-csi-operator

# ceph-csi-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ceph-csi-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ceph-csi-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Operator for Ceph CSI driver management in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Ceph-csi-operator Image is comparable to the official Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting started

### Kubernetes Installation
The docs recommends installing the ceph operator by installing their [all-in-one manifest file](https://github.com/ceph/ceph-csi-operator/blob/main/docs/kubernetes-installation.md#2-install-the-ceph-csi-operator).
```
kubectl create -f deploy/all-in-one/install.yaml
```
Remember to change the upstream image to chainguard image in the manifest before installing. A command like this could help:
```
sed -i "s|quay.io/cephcsi/ceph-csi-operator:.*|cgr.dev/ORGANIZATION/REPO_NAME:latest|g" deploy/all-in-one/install.yaml
```

Once deployed, you could create Ceph-Csi drivers, CephConnection, ClientProfile etc. and verify installation

## Additional Resources
- [Ceph CSI Operator GitHub](https://github.com/ceph/ceph-csi-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver

# tritonserver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image supports the [Python](https://github.com/triton-inference-server/python_backend), [ONNX Runtime](https://github.com/triton-inference-server/onnxruntime_backend), [OpenVINO](https://github.com/triton-inference-server/openvino_backend) and [TensorRT](https://github.com/triton-inference-server/tensorrt_backend) backends only.

## Getting Started

You can test this image locally with `docker`:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v ${YOUR_MODELS_DIRECTORY:-$PWD}:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver:latest \
 --model-repository=/models
```

If you wish to run the server on CPU only, omit the ` --gpus all` line.

### Examples

The following examples will use a shared repository for all the backends, you can get started by create a project directory and navigate into it:

```sh
mkdir -p ~/triton-examples && cd $_
```

Then download the example model server, client script, and configuration files:

```sh
curl https://codeload.github.com/chainguard-dev/triton-examples/tar.gz/main | \
 tar -xz --strip=1 triton-examples-main
```

After downloading these files, your folder structure should be as follows:

```
.
├── client.py
├── onnxruntime-backend
│   ├── fetch-model.sh
│   └── onnxruntime
│       ├── 1
│       │   └── model.onnx
│       └── config.pbtxt
├── openvino-backend
│   ├── fetch-model.sh
│   └── openvino
│       ├── 1
│       │   └── model.onnx
│       └── config.pbtxt
├── python-backend
│   └── python
│       ├── 1
│       │   └── model.py
│       └── config.pbtxt
├── README.md
└── tensorrt-backend
    ├── fetch-model.sh
    ├── model.onnx
    └── tensorrt
        ├── 1
        └── config.pbtxt
```

You can now connect to the server using a client for each of the examples. For simplicity, we will run a client script on the host machine, but client inference can be containerized using the [Python Chainguard Container Image](https://images.chainguard.dev/directory/image/python/overview) for inclusion in your orchestration setup.

Assuming that you have Python on your system's path as `python`, create a virtual environment:

```sh
python3 -m venv venv && source venv/bin/activate
```

Install the Triton client library using `pip`:

```sh
pip install 'tritonclient[grpc]'
```

The client now should be runnable under the current directory:

```bash
python3 ./client.py --help
```

```
usage: Tritonserver Client Tests [-h] [-s SERVER] model

Testing for Tritonserver

positional arguments:
  model                Model that will be used with the client

options:
  -h, --help           show this help message and exit
  -s, --server SERVER  Host that will be used for the GRPC client (e.g.: localhost:8001)
```

#### Python backend

The following example runs a variant of the [add_sub](https://github.com/triton-inference-server/python_backend/tree/main/examples/add_sub) example for the Triton Server Python backend.

Change your working directory to the `python-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/python-backend
```

Run the following command to mount the model repository and run the server specified in the `model.py` file:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `python` model:

```
+---------+---------+--------+
| Model   | Version | Status |
+---------+---------+--------+
| python  | 1       | READY  |
+---------+---------+--------+
```

Then run the client script:

```sh
python ../client.py python
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.5522413  0.64158934 0.19804768 0.87941355 0.5255043 ]\n [0.03742671 0.5047181  0.5687971  0.7528154  0.09557169]\n [0.8530532  0.3704309  0.11962368 0.2563551  0.7490047 ]\n [0.61212635 0.43093833 0.44432703 0.20261322 0.06146438]\n [0.24954486 0.0787174  0.1349516  0.717098   0.46025884]]"
        ],
        "expected": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "output": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed elementwise addition and subtraction operations on two sample vectors.

### ONNX Runtime backend

Change your working directory to the `onnxruntime-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/onnxruntime-backend
```

This model requires an `onnx` model that will be fetched from the internet, you can run the script on the current directory to fetch it to the model storage location for the onnxruntime model:

```bash
./fetch-model.sh
```
```
+ mkdir -p onnxruntime/1
+ curl -fSLo ./onnxruntime/1/model.onnx https://github.com/triton-inference-server/onnxruntime_backend/raw/604ee7ae2d75d0204ec756aaf7d7edf5317e7dcc/test/initializer_as_input/models/add_with_initializer/1/model.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   269  100   269    0     0   2402      0 --:--:-- --:--:-- --:--:--  2402
+ set +x
Model successfully fetched to onnxruntime/1/model.onnx
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `onnxruntime` model:

```
+-------------+---------+--------+
| Model       | Version | Status |
+-------------+---------+--------+
| onnxruntime | 1       | READY  |
+-------------+---------+--------+
```

Then run the client script:

```sh
python ../client.py onnxruntime
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.04237414 0.63609475 0.88362867 0.724177   0.240701  ]\n [0.358571   0.16024649 0.12010413 0.47096097 0.09345072]\n [0.6444194  0.61650777 0.6638608  0.49962732 0.3688811 ]\n [0.0204376  0.6174347  0.05064286 0.04272859 0.49577346]\n [0.68124044 0.77822125 0.6928203  0.50161165 0.25527555]]"
        ],
        "expected": "[[0.08474828 1.2721895  1.7672573  1.448354   0.481402  ]\n [0.717142   0.32049298 0.24020825 0.94192195 0.18690144]\n [1.2888387  1.2330155  1.3277216  0.99925464 0.7377622 ]\n [0.0408752  1.2348694  0.10128573 0.08545718 0.9915469 ]\n [1.3624809  1.5564425  1.3856406  1.0032233  0.5105511 ]]",
        "output": "[[0.08474828 1.2721895  1.7672573  1.448354   0.481402  ]\n [0.717142   0.32049298 0.24020825 0.94192195 0.18690144]\n [1.2888387  1.2330155  1.3277216  0.99925464 0.7377622 ]\n [0.0408752  1.2348694  0.10128573 0.08545718 0.9915469 ]\n [1.3624809  1.5564425  1.3856406  1.0032233  0.5105511 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed the scalar multiplication of a vector by the scalar 2.

### OpenVINO backend

Change your working directory to the `openvino-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/openvino-backend
```

This model can run using an `onnx` model which will be fetched from the internet, you can run the script on the current directory to fetch it to the model storage location for the openvino model:

```bash
./fetch-model.sh
```
```
+ mkdir -p openvino/1
+ curl -fSLo ./openvino/1/model.onnx https://github.com/onnx/models/raw/b1eeaa1ac722dcc1cd1a8284bde34393dab61c3d/validated/vision/classification/resnet/model/resnet50-caffe2-v1-9.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 97.7M  100 97.7M    0     0  5391k      0  0:00:18  0:00:18 --:--:-- 10.1M
+ set +x
Model successfully fetched to openvino/1/model.onnx
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `onnxruntime` model:

```
+----------+---------+--------+
| Model    | Version | Status |
+----------+---------+--------+
| openvino | 1       | READY  |
+----------+---------+--------+
```

Then run the client script:

```sh
python ../client.py openvino
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[[[0.76338285 0.46184912 0.92636037 ... 0.4257808  0.61404836\n    0.9067718 ]\n   [0.65512913 0.74693495 0.07375129 ... 0.37925065 0.4888047\n    0.04267222]\n   [0.04240799 0.08182416 0.69489807 ... 0.4103226  0.054923\n  0.0582601 ]\n   ...\n   [0.9834254  0.7005278  0.11914089 ... 0.29851222 0.14448294\n    0.65900624]\n   [0.154907760.6532571  0.8287187  ... 0.36543208 0.12733477\n    0.3147746 ]\n   [0.45976332 0.68108255 0.8520731  ... 0.99021596 0.9573471\n    0.7810805 ]]\n\n  [[0.0842445  0.3005944  0.3265607  ... 0.6121345  0.5080284\n    0.85021585]\n   [0.24282897 0.4927684  0.4689886  ... 0.99156994 0.75396144\n    0.4774928 ]\n   [0.80796444 0.00248269 0.13700046 ... 0.14362834 0.8269185\n    0.28405726]\n   ...\n   [0.8429374  0.13909613 0.65293604 ... 0.04426242 0.19225791\n    0.33422643]\n   [0.26046273 0.6121224  0.576417   ... 0.46340346 0.608027\n    0.39018032]\n   [0.7119001  0.4588718  0.15979071... 0.3650059  0.83611363\n    0.6298459 ]]\n\n  [[0.00699139 0.36632583 0.6074161  ... 0.08094972 0.55059016\n    0.0456534 ]\n   [0.3950255  0.6318781  0.43853968 ... 0.09412231 0.06041615\n    0.84371537]\n   [0.06924959 0.74535745 0.61118585 ... 0.07594369 0.4584373\n    0.41392347]\n   ...\n   [0.47875118 0.52679694 0.2972078  ... 0.40715238 0.58498055\n    0.6465085 ]\n   [0.31188497 0.51325756 0.22442417 ... 0.31170854 0.8710871\n    0.2910038 ]\n   [0.6793682  0.49418375 0.41446647 ... 0.6936627  0.9575656\n    0.14582857]]]]"
        ],
        "expected": "(1,1000)",
        "output": [
            1,
            1000
        ],
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed a translation of a vector to a specific 1 by 1000 matrix shape

### TensorRT backend

Change your working directory to the `tensorrt-backend` directory. This directory will be mounted on our image as our model repository:

```sh
cd ~/triton-examples/tensorrt-backend
```

This model requires the translation of an `onnx` model into a `plan` TensorRT engine, first, fetch the `onnx` model from the internet with the following command:

```bash
./fetch-model.sh
```
```
+ curl -fSLo ./model.onnx https://raw.githubusercontent.com/triton-inference-server/onnxruntime_backend/refs/heads/main/test/initializer_as_input/models/add_with_initializer/1/model.onnx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   269  100   269    0     0   1252      0 --:--:-- --:--:-- --:--:--  1257
+ set +x
Model successfully fetched to the current working directory
```

Then, translate the model to a `model.plan` file by using the next command, it will place the file in your current directory:

```bash
docker run \
  --gpus all \
  --rm -it \
  -u "$(id -u)" \
  -e "LD_LIBRARY_PATH=/usr/local/tensorrt/lib" \
  -v "${PWD}:/work" \
  -w "/work" \
  --entrypoint /usr/local/tensorrt/bin/trtexec \
  cgr.dev/ORGANIZATION/tritonserver:latest \
  --onnx=model.onnx --saveEngine=model.plan --fp16
```

Move the model to the `tensorrt` model repository:

```bash
mv ./model.plan tensorrt/1/model.plan
```

Run the following command to mount the model repository and run the server:

```sh
docker run -it \
 -p 8000:8000 -p 8001:8001 -p 8002:8002 \
 -v $PWD:/models \
 --gpus all \
 cgr.dev/ORGANIZATION/tritonserver:latest \
 --model-repository=/models
```

You should see output detailing the running Triton Inference Server process. Included in this output should be the status of the `tensorrt` model:

```
+----------+---------+--------+
| Model    | Version | Status |
+----------+---------+--------+
| tensorrt | 1       | READY  |
+----------+---------+--------+
```

Then run the client script:

```sh
python ../client.py tensorrt
```

If the test is successful, you should receive output similar to the following:

```json
[
    {
        "input": [
            "[[0.5522413  0.64158934 0.19804768 0.87941355 0.5255043 ]\n [0.03742671 0.5047181  0.5687971  0.7528154  0.09557169]\n [0.8530532  0.3704309  0.11962368 0.2563551  0.7490047 ]\n [0.61212635 0.43093833 0.44432703 0.20261322 0.06146438]\n [0.24954486 0.0787174  0.1349516  0.717098   0.46025884]]"
        ],
        "expected": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "output": "[[1.1044827  1.2831787  0.39609537 1.7588271  1.0510086 ]\n [0.07485342 1.0094362  1.1375942  1.5056309  0.19114338]\n [1.7061064  0.7408618  0.23924737 0.5127102  1.4980094 ]\n [1.2242527  0.86187667 0.88865405 0.40522644 0.12292876]\n [0.49908972 0.1574348  0.2699032  1.434196   0.9205177 ]]",
        "successful": true
    }
]
```

This shows that the client successfully connected to the model server and executed an element-wise addition of the scalar 1 to all elements on a random matrix

## Documentation and Resources

- [Triton Inference Server Python Backend](https://github.com/triton-inference-server/python_backend)
- [Triton Inference Server ONNX Runtime Backend](https://github.com/triton-inference-server/onnxruntime_backend)
- [Triton Inference Server OpenVINO Backend](https://github.com/triton-inference-server/openvino_backend)
- [Triton Inference Server Tensorrt Backend](https://github.com/triton-inference-server/tensorrt_backend)
- [Triton Inference Server Documentation](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault-k8s-fips

# vault-k8s-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault-k8s-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault-k8s-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### harbor-fips

# harbor-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/harbor-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/harbor-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openbao-fips

# openbao-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openbao-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openbao-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with OpenBao, FIPS compliant.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using openbao FIPS

The Chainguard openbao image contains the [openbao](https://www.openbao.org/) server binary and supporting config. The image is intended to be a drop-in
replacement for the upstream [openbao/openbao](https://hub.docker.com/r/openbao/openbao) or
[openbao](https://hub.docker.com/r/openbao/openbao) images and compatible with the [OpenBao Helm
chart](https://github.com/openbao/openbao-helm).

The default entrypoint starts a single-node instance of the server in development mode for testing
and development. Note that the container should be given the `IPC_LOCK` capability.

You can start the container with:

```
$ docker run --cap-add IPC_LOCK -p 8200:8200 cgr.dev/ORGANIZATION/openbao-fips
==> OpenBao server configuration:

Administrative Namespace:
             Api Address: http://0.0.0.0:8200
                     Cgo: enabled
         Cluster Address: https://0.0.0.0:8201
   Environment Variables: HOME, HOSTNAME, PATH, PWD, SHLVL, SSL_CERT_FILE
              Go Version: go1.23.2 X:systemcrypto
              Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level:
           Recovery Mode: false
                 Storage: inmem
                 Version: OpenBao v2.0.2, built '2024-10-10T15:09:44Z'
             Version Sha: 96853bb4de27ab8ffd1b0c2898c691460d43edeb

==> OpenBao server started! Log data will stream in below:
...
```

To configure openbao for production or other environments, supply a configuration file in the `/openbao/config` directory e.g:

```shell
docker run -v $PWD/openbao.hcl:/openbao/config/openbao.hcl cgr.dev/ORGANIZATION/openbao server
```

You can also supply config via the `BAO_LOCAL_CONFIG` variable e.g:

```shell
docker run --cap-add=IPC_LOCK -e 'BAO_LOCAL_CONFIG={"storage": {"file": {"path": "/openbao/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 cgr.dev/ORGANIZATION/openbao-fips server
```

### Helm Chart Usage

This image and the `openbao-k8s` image can be used with the [Helm chart](https://github.com/openbao/openbao-helm). To replace the official
images with the Chainguard images, provide the chart with the following values:

```yaml
injector:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao-k8s-fips"
    tag: "latest"

  agentImage:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao-fips"
    tag: "latest"

server:
  image:
    registry: "cgr.dev"
    repository: "ORGANIZATION/openbao-fips"
    tag: "latest"
```

Assuming these values are saved in `cgr_values.yaml`, you should be able to run:

```shell
helm repo add openbao https://openbao.github.io/openbao-helm
helm install openbao openbao/openbao --values cgr_values.yaml
```

### User

The image starts as root and switches to the lower privileged `openbao` user in the entrypoint
script.

### Differences to openbao/openbao image

This image is not identical to the openbao/openbao image. In particular:

 - The openbao binary and entrypoint script are stored in `/usr/bin`
 - The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the Openbao image uses Alpine (which is musl based)

This image supports the same environment variables as the
[openbao/openbao](https://hub.docker.com/r/openbao/openbao) image.

### Persisting Storage Data

If using the file data storage plugin, please configure it to write to `/openbao/file`.

### Persisting Logs

By default logs will be streamed to stdout and stderr, but can be configured to write to
`/openbao/logs`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-operator

# postgres-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Creates and manages PostgreSQL clusters running in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The operator can be installed by using the provided
[Helm](https://opensource.zalando.com/postgres-operator/docs/quickstart.html#deployment-options) chart which saves you the manual steps. The charts for both the Postgres Operator and its UI are hosted via the `gh-pages` branch.
They only work only with Helm v3. Helm v2 support was dropped with v1.8.0.

```bash
# add repo for postgres-operator
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator

# install the postgres-operator
helm install postgres-operator postgres-operator-charts/postgres-operator  \
 --set image.registry=cgr.dev \
 --set image.repository=chainguard/postgres-operator \
 --set image.tag=latest
```

### Check if Postgres Operator is running

Starting the operator may take a few seconds. Check if the operator pod is
running before applying a Postgres cluster manifest.

```bash
# if you've created the operator using yaml manifests
kubectl get pod -l name=postgres-operator

# if you've created the operator using helm chart
kubectl get pod -l app.kubernetes.io/name=postgres-operator
```

If the operator doesn't get into `Running` state, either check the latest K8s
events of the deployment or pod with `kubectl describe` or inspect the operator
logs:

```bash
kubectl logs "$(kubectl get pod -l name=postgres-operator --output='name')"
```

### Create a Postgres cluster

If the operator pod is running it listens to new events regarding `postgresql`
resources. Now, it's time to submit your first Postgres cluster manifest.

```bash
# create a Postgres cluster
cat <<EOF > "${TMPDIR}/minimal-postgres-manifest.yaml"
apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: acid-minimal-cluster
spec:
  teamId: "acid"
  volume:
    size: 1Gi
  numberOfInstances: 2
  users:
    zalando:  # database owner
    - superuser
    - createdb
    foo_user: []  # role for application foo
  databases:
    foo: zalando  # dbname: owner
  preparedDatabases:
    bar: {}
  postgresql:
    version: "16"
EOF

kubectl create -f "${TMPDIR}/minimal-postgres-manifest.yaml" 
```

After the cluster manifest is submitted and passed the validation the operator
will create Service and Endpoint resources and a StatefulSet which spins up new
Pod(s) given the number of instances specified in the manifest. All resources
are named like the cluster. The database pods can be identified by their number
suffix, starting from `-0`. They run the [Spilo](https://github.com/zalando/spilo)
container image by Zalando. As for the services and endpoints, there will be one
for the master pod and another one for all the replicas (`-repl` suffix). Check
if all components are coming up. Use the label `application=spilo` to filter and
list the label `spilo-role` to see who is currently the master.

```bash
# check the deployed cluster
kubectl get postgresql

# check created database pods
kubectl get pods -l application=spilo -L spilo-role

# check created service resources
kubectl get svc -l application=spilo -L spilo-role
```

### Connect to the Postgres cluster via psql

```bash
# get name of master pod of acid-minimal-cluster
export PGMASTER=$(kubectl get pods -o jsonpath={.items..metadata.name} -l application=spilo,cluster-name=acid-minimal-cluster,spilo-role=master -n default)

# set up port forward
kubectl port-forward $PGMASTER 6432:5432 -n default
```

Open another CLI and connect to the database using e.g. the psql client.
When connecting with a manifest role like `foo_user` user, read its password
from the K8s secret which was generated when creating `acid-minimal-cluster`.
As non-encrypted connections are rejected by default set SSL mode to `require`:

```bash
export PGPASSWORD=$(kubectl get secret postgres.acid-minimal-cluster.credentials.postgresql.acid.zalan.do -o 'jsonpath={.data.password}' | base64 -d)
export PGSSLMODE=require
psql -U postgres -h localhost -p 6432
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-43

# request-43
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-43` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-43/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jre-crac

# jre-crac
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jre-crac` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jre-crac/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based OpenJDK JRE image with [CRaC](https://openjdk.org/projects/crac/) support. Used for running Java applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## CRaC Application Example

This section outlines how you can build and run a Java application leveraging CRaC with the Chainguard JRE CRaC Image.

In this example, we'll be using the SpringBoot PetClinic application, with the docs provided [here](https://github.com/pushkarnk/springboot-petclinic-crac).

Start by cloning the source code for SpringBoot PetClinic:

```bash
git clone https://github.com/spring-projects/spring-petclinic && cd spring-petclinic
```

Now, edit the `pom.xml`, and add `org.crac` as a dep, under the dependencies section:

```xml
    <dependency>
      <groupId>org.crac</groupId>
      <artifactId>crac</artifactId>
      <version>1.4.0</version>
    </dependency>
```

Then create a multistage Dockerfile, copying the program after it has been built to the JRE CRaC image:

```dockerfile
FROM cgr.dev/ORGANIZATION/jdk-crac

COPY . /home/build/

RUN ./mvnw package

FROM cgr.dev/ORGANIZATION/jre-crac

COPY --from=0 /home/build/target/spring-petclinic-3.3.0-SNAPSHOT.jar /app/

CMD ["-XX:CRaCMinPid=70000", "-XX:CRaCCheckpointTo=/app/checkpoint", "-jar", "/app/spring-petclinic-3.3.0-SNAPSHOT.jar"]
```

In this example, we've set a high minimum PID as, by default, the process will run with PID 1. We must set the minimum PID as it will
conflict with the PID of the process used for restore later. It's also generally a good practice as lower PIDs are typically allocated
for other system processes and they must not clash on restore.

Following that, you can build the image:

```bash
docker build -t petclinic .
```

Note that this example tags the image with `petclinic`. You can now run the image by referencing this tag, as in the following command:

```bash
docker run --privileged -v ./checkpoint:/app/checkpoint --name petclinic-before petclinic
```

Wait until we see that it has `started on port 8080`.

Open a new terminal, and take a checkpoint:

```bash
docker exec petclinic-before jcmd spring-petclinic JDK.checkpoint
```

On moving back to the original terminal, you'll see the container has stopped. Let's resume the program from the checkpoint:

```bash
docker run --privileged -v ./checkpoint:/app/checkpoint --name petclinic-after petclinic -XX:CRaCRestoreFrom=/app/checkpoint
```

The program should have successfully restored from the checkpoint!:

```bash
2024-10-31T13:29:52.236Z  INFO 70473 --- [Attach Listener] o.s.c.support.DefaultLifecycleProcessor  : Restarting Spring-managed lifecycle beans after JVM restore
2024-10-31T13:29:52.258Z  INFO 70473 --- [Attach Listener] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-10-31T13:29:52.268Z  INFO 70473 --- [Attach Listener] o.s.c.support.DefaultLifecycleProcessor  : Spring-managed lifecycle restart completed (restored JVM running for 211 ms)
```

## Differences between our JRE and JRE CRaC images

### JRE CRaC includes CRaC CRIU

CRaC CRIU allows you to restore you Java programs using the CRaC API quickly with fewer resources.

### JRE CRaC runs as root by default

To facilitate an easier workflow for performing checkpoints/restores, the image runs as root by default. It is not possible to leverage CRaC at runtime as non-root.

If you need to use a non-root user, specify `java` via the `USER` directive in the Dockerfile.

### JRE CRaC disables rseq

Running with rseq enabled breaks restores leveraging CRaC:

```bash
pie: 70001: Error (criu/pie/restorer.c:467): failed sys_rseq(0x7f453767a4a0, 0x20, 0x0, 0x53053053) = -22
pie: 70001: Error (criu/pie/restorer.c:2055): Restorer fail 70001
Error (criu/cr-restore.c:2605): Restoring FAILED
```

If you need to re-enable rseq, pass `GLIBC_TUNABLES=glibc.pthread.rseq=1` to the `ENV` directive in the Dockerfile.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flannel-fips

# flannel-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flannel-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flannel-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant Flannel image for Kubernetes. FIPS-compliant Flannel is a network fabric for Kubernetes, providing a way to manage network configurations across a cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [upstream Flannel image](https://quay.io/repository/coreos/flannel). Switching to the Chainguard image should not require any changes to your existing setup.

Note that Chainguard's flannel-fips image runs as **root** by default, which is required for network operations.

### FIPS Support

The flannel-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

WireGuard backend cannot be supported in the flannel-fips image because WireGuard's cryptographic implementations do not comply with FIPS 140-2/140-3 requirements. WireGuard uses modern cryptographic primitives (ChaCha20, Poly1305, Curve25519) that are not included in the FIPS-approved algorithms list. For FIPS-compliant environments, use alternative backends like VXLAN, host-gw, or IPSec which can use FIPS-validated cryptographic modules.

**Important**: The Flannel Fips image runs as **root** by default, which is required for network operations.

## Getting Started

To deploy the Chainguard Flannel image with Helm, first add the Flannel Helm repository:

```shell
helm repo add flannel https://flannel-io.github.io/flannel/
helm repo update
```

Next create a values file. The following is a minimal example:

```yaml
# values.yaml

# Image configuration
image:
  repository: "cgr.dev/ORGANIZATION/flannel-fips"
  tag: "latest"
```

Finally, install Flannel. This example assumes the values file is named `values.yaml`:

```shell
helm install flannel-fips flannel/flannel \
  --namespace kube-flannel \
  --create-namespace \
  -f values.yaml
```

### Troubleshooting

For troubleshooting, you can use the `-dev` variant which includes additional tools:

```shell
kubectl exec -it -n kube-flannel <flannel-pod-name> -- /bin/sh
```
## Documentation and Resources

For more information about Flannel, refer to the following resources:

- [Flannel GitHub Repository](https://github.com/flannel-io/flannel)
- [Flannel Documentation](https://github.com/flannel-io/flannel/tree/master/Documentation)
- [Flannel CNI Plugin Documentation](https://github.com/flannel-io/cni-plugin/blob/main/README.md)
- [Kubernetes Networking with Flannel](https://kubernetes.io/docs/concepts/cluster-administration/networking/)

For FIPS-specific information:

- [FIPS 140-2 Compliance](https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules/search)
- [Chainguard FIPS Documentation](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-admin-tools

# temporal-admin-tools
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-admin-tools` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-admin-tools/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Administrative command-line tools for Temporal workflow management

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `temporal-admin-tools` container image is comparable to the
[temporalio/admin-tools image](https://hub.docker.com/r/temporalio/admin-tools),
but does NOT contain the legacy [`tctl`](https://github.com/temporalio/tctl)
command-line tool.

`tctl` is deprecated and will reach End of Support on September 30, 2025, after
which it is expected to be removed from the upstream image. Users should migrate
to the modern `temporal` CLI, which provides equivalent functionality and is
actively maintained.

## Getting Started

The `temporal-admin-tools` image is designed to run alongside a Temporal
deployment and provide administrative access through command-line tools.

### Deploy with Helm

The recommended way to deploy Temporal with admin tools is using the official
Helm chart.

Add the Temporal Helm repository:

```shell
helm repo add temporalio https://go.temporal.io/helm-charts
helm repo update
```

Create a `values.yaml` file to use the Chainguard image:

```yaml
admintools:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/temporal-admin-tools
    tag: latest

# Optional: If deploying temporal and you wish to leverage the Chainguard image
# for the charts dependency on 'elasticsearch':
elasticsearch:
  image: cgr.dev/ORGANIZATION/elasticsearch
  imageTag: "7"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Install Temporal with admin tools:

```shell
helm install temporal temporalio/temporal -f values.yaml
```

### Access Administrative Tools

Once deployed, you can access the admin tools container:

```shell
kubectl exec -it deployment/temporal-admintools -- /bin/bash
```

From within the container, you can run administrative commands:

```shell
# List namespaces
temporal operator namespace list

# Check cluster health
temporal operator cluster health

# Manage database schemas
temporal-cassandra-tool setup-schema
```

### Standalone Usage

You can also run the container directly for development or testing:

```shell
docker run -it --rm cgr.dev/ORGANIZATION/temporal-admin-tools:latest /bin/bash
```

## Documentation and Resources

For more information on using Temporal administrative tools, refer to:

- [Temporal CLI documentation](https://docs.temporal.io/cli)
- [Temporal Helm Charts](https://github.com/temporalio/helm-charts)
- [Self-hosted Temporal deployment guide](https://docs.temporal.io/self-hosted-guide/deployment)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4089

# request-4089
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4089` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4089/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for vllm, a high-throughput and memory-efficient inference and serving engine for LLMs

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Running `vllm-openai`

`vllm-openai` requires specific environment configurations for optimal performance with GPUs. For detailed examples and setup instructions, refer to [TESTING.md](https://github.com/chainguard-images/images-private/blob/main/images/request-3495/TESTING.md).

For additional guidance, consult the [upstream documentation](https://github.com/vllm-project/vllm) to ensure proper configuration and usage of `vllm-openai`.

Once the environment prerequisites are met, you can launch the container as follows:

```bash
docker run --runtime nvidia --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HUGGING_FACE_HUB_TOKEN=<secret>" \
    -p 8000:8000 \
    --ipc=host \
    cgr.dev/chainguard/request-4089:latest \
    --model mistralai/Mistral-7B-v0.1
```
## Testing GPU Access
To verify that vllm-openai has access to your connected GPUs, run the following command:

```bash
docker run --rm -it --gpus all cgr.dev/chainguard/request-4089:latest
Python 3.10.14 (main, Apr  2 2024, 15:40:32) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.get_device_name(0)
'Tesla V100-SXM2-16GB'
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dotnet

# dotnet
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dotnet` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dotnet/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for .NET and the .NET Tools.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's .NET Images are comparable to the .NET images available from Microsoft.  Like most Chainguard images, the .NET images come with only the minimum dependencies needed to function and do not include things like a shell or package manager.

The Chainguard .NET images are available on `cgr.dev` as two variants: `dotnet-sdk` and `dotnet-runtime`. The SDK variant contains additional tooling to facilitate development and building, while the runtime variant contains only the runtime to execute .NET applications. Both the SDK and Runtime images also have `latest-dev` versions that contain a shell and various other tools for development.

To download the SDK image, you would run a command like the following:
 
```shell
docker pull cgr.dev/$ORGANIZATION/dotnet-sdk:latest
```

And to download the Runtime image, you would run the following:

```shell
docker pull cgr.dev/$ORGANIZATION/dotnet-runtime:latest
```

For simple cases, you can use the SDK image directly, or with a multi-stage build using the SDK image as the builder and the Runtime image as the final target container.

### Supported SDK Feature Bands

TL;DR: Chainguard's .NET SDK images provide `1xx` feature bands exclusively. We are looking into providing tags for our SDK images with other feature bands, but due to technical limitations, we aren't doing so today.

Each release of the .NET project is versioned according to the runtime (i.e `9.0.8`) and each release includes one or more 'feature bands' of the SDK (i.e `9.0.109`, `9.0.304`). [The download page for .NET 9.0 illustrates this](https://dotnet.microsoft.com/en-us/download/dotnet/9.0).

The SDK images provided by Microsoft are tagged such that the SDK is tagged with the version of the most recent feature band (i.e `mcr.microsoft.com/dotnet/sdk:9.0.304`).

It has been difficult for Chainguard to reliably provide additional feature bands for various technical reasons. And Microsoft has, in some cases, changed how they tag their source code repositories, disrupting how our packages are versioned and, resultantly, how our images are tagged.

We are working on changes to provide additional feature bands with our .NET SDK image (i.e `9.0.109`, `9.0.304`). However, until those changes are implemented, our `dotnet-sdk` image will include, and will be tagged exclusively, with the version of the `1xx` feature band (i.e `9.0.109`).

## Getting Started

Begin by going to your .NET application directory (or the location where you house your .NET applications) and execute the following command. This command will detect the .NET project in your directory and create a base for the Docker initialization:

```shell
docker init
```

This command will create the following files:

```
Dockerfile
compose.yaml
README.Docker.md
.dockerignore
```

After the files have been created, replace the contents within the created Dockerfile with the following

```Dockerfile
FROM cgr.dev/ORGANIZATION/dotnet-sdk:latest AS build

COPY --chown=nonroot:nonroot . /source

WORKDIR /source

RUN dotnet publish --use-current-runtime --self-contained false -o Release

# If you are running an ASPNET project, you can instead pull our ASPNET image cgr.dev/ORGANIZATION/aspnet-runtime:latest
FROM cgr.dev/ORGANIZATION/dotnet-runtime:latest AS final
WORKDIR /

COPY --from=build source .

ENTRYPOINT ["dotnet", "Release/dotnet.dll"]
```

Note that if your project resides in a sub directory, make sure you are pointing to that directory. For example, if your project resided in a directory called 'app', you would set the destination to `/source/app`.

This will build your application using the SDK image and then copy the built application over to the Runtime image which will then start.

You can run and publish a local image with the following command:

```shell
docker compose up -d --build
```

You can also remove the container using the following command:

```shell
docker compose down
```

## Documentation and Resources

* [Microsoft .NET documentation](https://learn.microsoft.com/en-us/dotnet/)
* [`microsoft/dotnet-sdk` Docker Hub entry](https://hub.docker.com/r/microsoft/dotnet-sdk)
* [`microsoft/dotnet-runtime` Docker Hub entry](https://hub.docker.com/r/microsoft/dotnet-runtime) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos-operator

# thanos-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the [thanos-operator](https://github.com/banzaicloud/thanos-operator) for managing Thanos components in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `thanos-operator` image is a drop-in replacement for the upstream [banzaicloud/thanos-operator](https://hub.docker.com/r/banzaicloud/thanos-operator/) container image. It is fully compatible with the official [thanos-operator Helm chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator) and supports all core functionality for managing Thanos components in Kubernetes. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy this image using the [thanos-operator Helm chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/thanos-operator
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `thanos-operator` helm chart

```shell
helm repo add banzaicloud-stable https://kubernetes-charts.banzaicloud.com
helm repo update
helm install thanos-operator banzaicloud-stable/thanos-operator -f values.yaml --wait
```

## Documentation
- [Thanos-Operator Github Repository](https://github.com/banzaicloud/thanos-operator)
- [Thanos-Operator Helm Chart](https://github.com/banzaicloud/thanos-operator/tree/master/charts/thanos-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### git-iamguarded

# git-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/git-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/git-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Git image for use with Iamguarded charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Chainguard's Git Iamguarded Image allows you to run ordinary Git commands in CI/CD pipelines and also locally via Docker, and is compatible with Iamguarded charts.

### Docker Setup

To make sure you have the latest version of the Image available, start by running a `docker pull` command:

```shell
docker pull cgr.dev/ORGANIZATION/git-iamguarded
```

Then, run the Image with the `--version` flag to make sure the Image is functional:

```shell
docker run -it --rm cgr.dev/ORGANIZATION/git-iamguarded --version
```

You will receive output similar to this:

```
git version 2.43.0
```

### Cloning a Repository Locally

Because your local system user's unique identifier might differ from that of the container, you'll need to set up special permissions for the target directory if you want to use this Image to clone repositories locally. Once you've configured these permissions, you'll be able to set up a volume and have the contents of the cloned repository replicated on your host machine.

First, create a target directory somewhere in your home folder and set the required permissions:

```shell
mkdir ~/workspace
chmod go+wrx ~/workspace
```

Now you can use `docker run` to execute the `git clone` command, using the directory you just set up as a volume shared between your local machine and the container Image:

```shell
docker run -it -v ~/workspace:/home/git --rm cgr.dev/ORGANIZATION/git-iamguarded clone https://github.com/chainguard-images/.github.git
```

Here, the volume is mounted to the `/home/git` directory in the container.

This will return output like the following:

```
Cloning into '.github'...
remote: Enumerating objects: 251, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 251 (delta 15), reused 22 (delta 10), pack-reused 218
Receiving objects: 100% (251/251), 216.59 KiB | 1.04 MiB/s, done.
Resolving deltas: 100% (88/88), done.
```

You can now check the contents of your `workspace` directory, where you will find the cloned repository:

```shell
ls -a ~/workspace/
```
```
.  ..  .github
```

If you do not want to make the destination directory world-writable, you can run the git executable inside the container with your UID, thus giving it access to the directory:

```shell
docker run -it -v ~/workspace:/home/git -u $(id -u) --rm cgr.dev/ORGANIZATION/git-iamguarded clone https://github.com/chainguard-images/.github.git
```
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kibana-iamguarded-fips

# kibana-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kibana-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kibana-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Your window into the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `kibana-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Elastic license is required to use this image!

To run Kibana in FIPS mode, you will need to provide a license key. To obtain a license for Kibana/Elasticsearch, see their subscriptions page [here](https://www.elastic.co/subscriptions).

Chainguard recommends Platinum license.

## FIPS Mode Configuration Required

This image has FIPS mode enabled by default at the Node.js environment level. When deploying with the IAMGuarded Helm chart, you **must** configure Kibana to run in FIPS mode by setting:

```yaml
extraConfiguration:
  xpack.security.fipsMode.enabled: true
```

Failure to set this configuration will result in a configuration mismatch error:
```
Configuration mismatch error. xpack.security.fipsMode.enabled is set to false and the configured Node.js environment has FIPS enabled
```

## Overview

Kibana IAMGuarded is a security-enhanced variant of Kibana designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Kibana deployments.

## Helm Chart Installation

The Kibana IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kibana
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kibana oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
# Main Kibana image
image:
  repository: ORGANIZATION/kibana-iamguarded-fips

# OS Shell image for volume permissions
volumePermissions:
  image:
    repository: ORGANIZATION/os-shell-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Kibana image
image:
  registry: myregistry.example.com
  repository: mirrored/kibana-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kibana oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kibana
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kibana:12.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kibana IAMGuarded installation using standard Kibana verification methods. The deployment functions as a standard Kibana instance, so all typical Kibana validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Kibana IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Kibana and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-environment-configs

# crossplane-function-environment-configs
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-environment-configs` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-environment-configs/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Crossplane function that manages environment-specific configurations for resources in compositions

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `crossplane-function-environment-configs` image is based on the [Crossplane function-environment-configs](https://github.com/crossplane-contrib/function-environment-configs) project. This Chainguard Image provides a secure, minimal runtime environment with the following differences from upstream images:

* Built on Wolfi rather than a traditional Linux distribution, resulting in a smaller attack surface
* Runs as a non-root user (uid 65532) by default for enhanced security
* Contains minimal dependencies with few-to-zero CVEs
* Includes both the function binary and compatibility layer for seamless integration

## Getting Started

The `crossplane-function-environment-configs` image is designed to work with Crossplane compositions for managing environment-specific configurations. The image contains a Crossplane function that can be used to inject environment-specific settings into your resources.

### Basic Usage

You can run the function directly to verify it's working:

```sh
docker run --rm cgr.dev/ORGANIZATION/crossplane-function-environment-configs:latest --help
```

### Using with Crossplane

Create a function definition for use in your Crossplane cluster:

```sh
cat > crossplane-function-environment-configs.yaml <<EOF
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: crossplane-function-environment-configs
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-environment-configs:latest
EOF
```

Apply the function to your cluster:

```sh
kubectl apply -f crossplane-function-environment-configs.yaml
```

### Integration in Compositions

Use the function in your Crossplane compositions to inject environment-specific configurations:

```sh
cat > composition-example.yaml <<EOF
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: example-with-env-configs
spec:
  compositeTypeRef:
    apiVersion: example.com/v1alpha1
    kind: XExample
  functions:
  - name: environment-configs
    type: function
    source: Function
    ref:
      name: crossplane-function-environment-configs
    input:
      apiVersion: environmentconfigs.fn.crossplane.io/v1beta1
      kind: Input
      spec:
        environmentConfigs:
        - ref:
            name: dev-config
          policy:
            merge: merge
        - ref:
            name: common-config
          policy:
            merge: replace
EOF
```

### Development with the `-dev` Variant

For debugging and development, use the `-dev` variant which includes additional tools:

```sh
docker run -it cgr.dev/ORGANIZATION/crossplane-function-environment-configs:latest-dev sh
```

## Configuration

The function accepts configuration through its input specification. Key configuration options include:

### Environment Config References

Specify which environment configs to apply:

```yaml
spec:
  environmentConfigs:
  - ref:
      name: my-environment-config
    policy:
      merge: merge  # or "replace"
```

### Merge Policies

* `merge`: Merge environment config with existing values
* `replace`: Replace existing values with environment config

## Troubleshooting

### Crossplane Version Compatibility

If you encounter errors like "incompatible Crossplane version: package is not compatible with Crossplane version (): Invalid Semantic Version", this typically occurs when:

1. **Using `latest` tags**: Crossplane requires semantic versioning for compatibility checks. Ensure your Crossplane deployment uses specific version tags (e.g., `2.0.2`) instead of `latest`.

2. **Version detection issues**: If the error persists with proper version tags, you can bypass version constraints by adding `ignoreCrossplaneConstraints: true` to your Function specification:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: crossplane-function-environment-configs
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-environment-configs:latest
  ignoreCrossplaneConstraints: true  # Add this line
```

## Documentation and Resources

* [Crossplane Function Environment Configs Documentation](https://github.com/crossplane-contrib/function-environment-configs)
* [Crossplane Functions Overview](https://docs.crossplane.io/latest/packages/functions/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### qdrant

# qdrant
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/qdrant` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/qdrant/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[qdrant](https://github.com/qdrant/qdrant) Qdrant is a high-performance, massive-scale Vector Database for the next generation of AI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Qdrant

This image should be a drop-in replacement for the upstream image, and works by default in the helm charts.

To install, follow the steps here: https://qdrant.tech/documentation/guides/installation

But override the image variable in the helm chart:

```shell
$ helm repo add qdrant https://qdrant.to/helm
$ helm upgrade --install qdrant --set image.repository=cgr.dev/chainguard/qdrant --set image.tag=latest qdrant/qdrant
```

The only notable difference is that this image contains both a root and a non-root user, so you can't/don't need to use the `useUnprivileged` [helm variable](https://github.com/qdrant/qdrant-helm/blob/2ddefd61ccd9da092739eaf13f9a76b8b3cfd55e/charts/qdrant/values.yaml#L7C7-L7C7)

Because the helm chart uses the same image for initializing file system permissions and running the final app, we have to run as a root user by default.
The image can still be run as a non-root user (in this case `qdrant`), and the helm chart properly sets that up by default.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### image-factory

# image-factory
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/image-factory` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/image-factory/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Image Factory is a flexible artifact-build service for Talos Linux, offering automated creation of ISOs, disks, cloud images, and installers and ensuring reproductible builds.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream [image-factory](ghcr.io/siderolabs/image-factory:latest) image.
Key differences from the standard image-factory image:
- Cross-architecture builds are not supported. Unlike the upstream image, this variant cannot build ARM images on AMD containers or AMD images on ARM containers.
- ISO generation is unavailable when using the ARM version of the image.

## Prerequisites
To run the Image Factory container successfully, the host environment must provide the following (a single registry can be used for 1-3):
1. an OCI registry to store schematics (private)
2. an OCI registry to store cached assets (private)
3. an OCI registry to store installer images (should allow public read-only access)
4. a container image signing key: ECDSA P-256 private key in PEM format
5. partitionable loop devices: the container needs access to loop devices that support partitions.

More details regarding the setup can be found [here](https://docs.siderolabs.com/talos/v1.9/learn-more/image-factory#running-your-own-image-factory).

## Getting Started

Image Factory can be deployed either as a standalone container or inside a Kubernetes cluster. This section provides minimal examples to help you start the service using the supported deployment methods. These examples assume you have already set up the prerequisites (registry, signing key, and partitionable loop devices).

### Running with Docker

You can run Image Factory directly as a container.
Example:
```bash
docker run -d --rm --name image-factory \
  -p 8080:8080 \
  --privileged \
  -v /dev:/dev \
  -v $PWD/cache-signing-key.key:/cache-signing-key.key:ro \
  cgr.dev/ORGANIZATION/image-factory \
  -image-registry ghcr.io \
  -external-url http://localhost:8080 \
  -schematic-service-repository <SCHEMATIC-REGISTRY-IP>:<SCHEMATIC-REGISTRY-PORT>/image-factory/schematic \
  -installer-internal-repository <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs \
  -installer-external-repository <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs \
  -cache-repository <CACHE-REGISTRY-IP>:<CACHE-REGISTRY-PORT>/cache \
  -cache-signing-key-path /cache-signing-key.key \
```

After the container starts, the Image Factory API is available on http://localhost:8080 .
You can now submit build requests using the API or CLI tools that interact with Image Factory. Example:

```bash
cat > "metal-amd64.yaml" <<'EOF'
customization:
    extraKernelArgs: # optional
        - vga=791
    meta: # optional, allows to set initial Talos META
      - key: 0xa
        value: "{}"
    systemExtensions: # optional
      officialExtensions: # optional
        - siderolabs/gvisor
        - siderolabs/amd-ucode
    secureboot: # optional, only applies to SecureBoot images
       # optional, include well-known UEFI certificates into auto-enrollment database (SecureBoot ISO only)
      includeWellKnownCertificates: true
overlay: # optional
  image: ghcr.io/siderolabs/sbc-raspberry-pi # overlay image
  name: rpi_generic # overlay name
  options: # optional, any valid yaml, depends on the overlay implementation
    data: "mydata"
EOF

SCHEMATIC_ID=$(curl -fsSL -X POST --data-binary @"./metal-amd64.yaml" "http://localhost:8080/schematics" | jq -r '.id')
# Download raw image
curl -o "./metal-amd64.raw.zst" "http://localhost:8080/image/${SCHEMATIC_ID}/v1.11.5/metal-amd64.raw.zst"
```

### Running in Kubernetes

Image Factory can be deployed using a simple Kubernetes manifest. Example:
```bash
cat > "image-factory.yaml" <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: image-factory
  namespace: image-factory
  labels:
    app: image-factory
spec:
  replicas: 1
  selector:
    matchLabels:
      app: image-factory
  template:
    metadata:
      labels:
        app: image-factory
    spec:
      containers:
        - name: image-factory
          image: cgr.dev/ORGANIZATION/image-factory
          securityContext:
            privileged: true
          args:
            - -image-registry
            - ghcr.io

            - -external-url
            - http://<NODE_IP>:30080

            - -schematic-service-repository
            - <SCHEMATIC-REGISTRY-IP>:<SCHEMATIC-REGISTRY-PORT>/image-factory/schematic

            - -installer-internal-repository
            - <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs

            - -installer-external-repository
            - <INSTALLER-REGISTRY-IP>:<INSTALLER-REGISTRY-PORT>/siderolabs

            - -cache-repository
            - <CACHE-REGISTRY-IP>:<CACHE-REGISTRY-PORT>/cache

            - -cache-signing-key-path
            - /cache-signing-key.key
          ports:
            - containerPort: 8080
              name: http
          volumeMounts:
            - name: dev
              mountPath: /dev
            - name: cache-signing-key
              mountPath: /cache-signing-key.key
              subPath: cache-signing-key.key
              readOnly: true
      volumes:
        - name: dev
          hostPath:
            path: /dev
            type: Directory
        - name: cache-signing-key
          secret:
            secretName: cache-signing-key
---
apiVersion: v1
kind: Service
metadata:
  name: image-factory
  namespace: image-factory
  labels:
    app: image-factory
spec:
  selector:
    app: image-factory
  type: NodePort
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 30080
EOF

cat > "metal-amd64.yaml" <<'EOF'
customization:
    extraKernelArgs: # optional
        - vga=791
    meta: # optional, allows to set initial Talos META
      - key: 0xa
        value: "{}"
    systemExtensions: # optional
      officialExtensions: # optional
        - siderolabs/gvisor
        - siderolabs/amd-ucode
    secureboot: # optional, only applies to SecureBoot images
       # optional, include well-known UEFI certificates into auto-enrollment database (SecureBoot ISO only)
      includeWellKnownCertificates: true
overlay: # optional
  image: ghcr.io/siderolabs/sbc-raspberry-pi # overlay image
  name: rpi_generic # overlay name
  options: # optional, any valid yaml, depends on the overlay implementation
    data: "mydata"
EOF

kubectl apply -f image-factory.yaml
node_ip=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
factory_url="http://${node_ip}:30080"

# You can now interact with the image-factor API via nodeport service
SCHEMATIC_ID=$(curl -fsSL -X POST --data-binary @"./metal-amd64.yaml" "${factory_url}/schematics" | jq -r '.id')
# Download raw image
curl -o "./metal-amd64.raw.zst" "${factory_url}/image/${SCHEMATIC_ID}/v1.11.5/metal-amd64.raw.zst"
```

## Documentation and Resources

For more information about Image-Factory in container images, please refer to the [official documentation](https://docs.siderolabs.com/talos/v1.9/learn-more/image-factory) or to the [official repository](https://github.com/siderolabs/image-factory).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-no-backend

# tritonserver-no-backend
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-no-backend` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-no-backend/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

This is a **base image** of Triton Inference Server that does **not include any pre-installed inference backends**. It provides the core Triton server infrastructure (HTTP, GRPC, and metrics services) and CUDA toolkit.

For a complete Triton image with common backends (Python, ONNX Runtime, OpenVINO, TensorRT) pre-installed, see the `tritonserver` image.

## Use Cases

This base image is ideal for:

- Custom Triton deployments requiring specific backend versions
- Minimizing image size by including only required backends
- Building specialized inference servers with custom backend combinations
- Multi-stage Docker builds where backends are added separately

## Getting Started

### Basic Health Check

You can verify the base server functionality with an empty model repository:

```sh
docker run -d --name triton-base \
  -p 8000:8000 -p 8001:8001 \
  cgr.dev/ORGANIZATION/tritonserver-no-backend:latest \
  --model-repository=/models
```

Check server health:

```sh
curl http://localhost:8000/v2/health/live
curl http://localhost:8000/v2/health/ready
```

Query server metadata:

```sh
curl http://localhost:8000/v2
```

### Building Custom Images

Use this as a base image to add your own backends:

```dockerfile
FROM cgr.dev/ORGANIZATION/tritonserver-no-backend:latest

# Add your custom backends or models
COPY --from=custom-backend /path/to/backend /opt/tritonserver/backends/
COPY models/ /models/

ENTRYPOINT ["/opt/tritonserver/bin/tritonserver"]
CMD ["--model-repository=/models"]
```

## What's Included

- Triton Inference Server core binary
- CUDA 12.9 toolkit
- HTTP, GRPC, and Metrics service infrastructure
- TensorRT binaries (for model conversion utilities)

## What's NOT Included

This image does not include any inference backends. For backend support, you need to:

1. Use the full `tritonserver` image with pre-installed backends, or
2. Build a custom image layering your required backends on top of this base image

## Documentation and Resources

- [Triton Inference Server Documentation](https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html)
- [Triton Backend Repository](https://github.com/triton-inference-server/backend)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cephcsi-fips

# cephcsi-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cephcsi-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cephcsi-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CephCSI is the Container Storage Interface (CSI) driver for Ceph, providing support for RBD and CephFS.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `cephcsi-fips` image is compatible with the upstream [Ceph CSI](https://github.com/ceph/ceph-csi) image (`quay.io/cephcsi/cephcsi`). 

Currently, the Chainguard `cephcsi-fips` image does not support `SELinux`; support is actively in development.

### FIPS support

Chainguard's `cephcsi-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Basic Usage

The Ceph Container Storage Interface (CSI) driver is deployed using [Rook Ceph](https://rook.io/docs/rook/latest-release/Getting-Started/intro/), a Kubernetes operator that automates the deployment and management of a Ceph storage cluster. Rook has [prerequisites](https://rook.io/docs/rook/latest-release/Getting-Started/Prerequisites/prerequisites/) that need to be met before deployment, such as, at least one local storage device and a Linux kernel built with the RBD module.

Rook can be deployed by using [manifests](https://rook.io/docs/rook/latest-release/Getting-Started/quickstart) or [helm charts](https://rook.io/docs/rook/latest-release/Helm-Charts/helm-charts/).

#### Deploy the Rook Operator
The [rook operator](https://rook.io/docs/rook/latest-release/Helm-Charts/operator-chart/#installing) can be configured to use the Chainguard CephCSI image:

```sh
cat > rook-operator-values.yaml <<EOF
csi:
  cephcsi:
    image: cgr.dev/ORGANIZATION/cephcsi-fips
    tag: latest
EOF

helm repo add rook-release https://charts.rook.io/release
helm install rook-ceph rook-release/rook-ceph -n rook-ceph --create-namespace -f rook-operator-values.yaml
```
Wait for the operator to be available:
```sh
$ kubectl wait --for=condition=Available -n rook-ceph deployment/rook-ceph-operator
$ kubectl get pods -n rook-ceph
NAME                                           READY   STATUS    RESTARTS   AGE
ceph-csi-controller-manager-778798b996-n6wh7   1/1     Running   0          31s
rook-ceph-operator-64d5db6dcb-w66tw            1/1     Running   0          31s
```

#### Deploy the Ceph Cluster
Install the [ceph cluster chart](https://rook.io/docs/rook/latest-release/Helm-Charts/ceph-cluster-chart/):
```sh
helm install --create-namespace --namespace rook-ceph rook-ceph-cluster \
   --set operatorNamespace=rook-ceph rook-release/rook-ceph-cluster
```

If you have local storage available, `rook-ceph-osd` pods should be ready:

```sh
$ kubectl wait --for=condition=ready -n rook-ceph pod -l app=rook-ceph-osd
$ kubectl get pods -n rook-ceph
NAME                                                        READY   STATUS      RESTARTS   AGE
ceph-csi-controller-manager-778798b996-n6wh7                1/1     Running     0          2m29s
rook-ceph-exporter-5c01e877fcb9-f5bf658cd-bpffz             1/1     Running     0          31s
rook-ceph-mds-ceph-filesystem-a-755d58b858-52fqg            2/2     Running     0          34s
rook-ceph-mds-ceph-filesystem-b-9bf8fb4c8-b4xsq             2/2     Running     0          32s
rook-ceph-mgr-a-59cc5fcfbd-4kgqq                            2/2     Running     0          76s
rook-ceph-mon-a-6f99b7946f-shq25                            2/2     Running     0          100s
rook-ceph-operator-64d5db6dcb-w66tw                         1/1     Running     0          2m29s
rook-ceph-osd-0-5b8b9fdf8c-nwssh                            2/2     Running     0          41s
rook-ceph-osd-prepare-5c01e877fcb9-4nxb7                    0/1     Completed   0          55s
rook-ceph-tools-6f9c54c5f-74gx8                             1/1     Running     0          106s
rook-ceph.cephfs.csi.ceph.com-ctrlplugin-84dcc577bd-9x99v   6/6     Running     0          95s
rook-ceph.cephfs.csi.ceph.com-nodeplugin-hbqpg              3/3     Running     0          95s
```

#### Testing the Ceph CSI Driver

To confirm that the Ceph CSI driver is working correctly, you can create a **Persistent Volume Claim (PVC)** and a test pod that uses it.

By default, the Rook Ceph cluster Helm chart deploys a **storage class** named `ceph-filesystem` which is required for provisioning storage. This storage class uses the Ceph CSI driver to create and manage volumes. You can find the default values in the [Rook Ceph GitHub repository](https://github.com/rook/rook/blob/ffcb0d31d6ff5668c03d3cf5033623760defc44d/deploy/charts/rook-ceph-cluster/values.yaml#L565).

1.  **Create a PVC** that requests storage from the `ceph-filesystem` storage class.

  ```yaml
  kubectl apply -f - <<EOF
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: my-cephfs-pvc
    namespace: default
  spec:
    accessModes:
      - ReadWriteMany
    storageClassName: ceph-filesystem
    resources:
      requests:
        storage: 1Gi
  EOF
  kubectl wait --for=jsonpath='{.status.phase}'=Bound pvc/my-cephfs-pvc --timeout=300s
  ```

2.  **Create a test pod** and mount the PVC. The pod will be stuck in a waiting state if it fails to mount the volume.

  ```yaml
  kubectl apply -f - <<EOF
  apiVersion: v1
  kind: Pod
  metadata:
    name: test-pod
    namespace: default
  spec:
    containers:
      - name: busybox
        image: busybox
        command: ["sh", "-c", "echo 'Hello from the test pod!' > /data/testfile.txt"]
        volumeMounts:
          - name: cephfs-volume
            mountPath: /data
    volumes:
      - name: cephfs-volume
        persistentVolumeClaim:
          claimName: my-cephfs-pvc
  EOF
  ```

  If the pod successfully starts, you've confirmed that the Ceph CSI driver is functional and able to provision and mount volumes.

For further exploration and more information, use these resources:

  * [Ceph CSI GitHub Repository](https://github.com/ceph/ceph-csi)
  * [Rook Ceph Documentation](https://rook.io/docs/rook/latest-release/Getting-Started/intro/)
  * [Ceph Documentation](https://docs.ceph.com/)
  * [Kubernetes CSI Documentation](https://kubernetes-csi.github.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-alloy-fips

# grafana-alloy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-alloy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-alloy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cfssl

# cfssl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cfssl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cfssl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[CFSSL](https://cfssl.org/) is Cloudflare's PKI and TLS toolkit

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## CFSSL: Cloudflare's PKI toolkit

To read more about `cfssl` see the [launch blog post](https://blog.cloudflare.com/introducing-cfssl/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-operator-fips

# opentelemetry-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Operator for OpenTelemetry Collector

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard OpenTelemetry Operator for Kubernetes Image is comparable to the official OpenTelemetry Operator Image. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function; for example, it does not include a package manager.

## Getting Started

To get started with Chainguard's OpenTelemetry Operator for Kubernetes Image, deploy it using the [official Helm chart](https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator):

Use the following `values.yaml` file to configure the Helm chart:

```yaml
manager:
  image:
    repository: cgr.dev/ORGANIZATION/opentelemetry-operator
    tag: latest
  collectorImage:
    repository: otel/opentelemetry-collector-k8s
```

Deploy the Helm chart:

```shell
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm install opentelemetry-operator open-telemetry/opentelemetry-operator \
  --values values.yaml
```

## Example

Now create a simple `OpenTelemetryCollector` instance:

```shell
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
  name: simplest
spec:
  config:
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318
    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 10s

    exporters:
      debug: {}

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [debug]
EOF
```

### Documentation and Resources
For further configuration, please reference the official usage documentation and Helm chart.

- [Official usage documentation](https://opentelemetry.io/docs/kubernetes/operator/)
- [Official Helm chart](https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-snapshotter-fips

# kubernetes-csi-external-snapshotter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-snapshotter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-snapshotter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Sidecar container that watches Kubernetes Snapshot CRD objects and triggers CreateSnapshot/DeleteSnapshot against a CSI endpoint. This container image includes the snapshotter, snapshot-controller and snapshot-validation-webhook.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-snapshotter-fips` container image collection is a drop-in replacement for the following images:

- `k8s.gcr.io/sig-storage/csi-snapshotter`
- `k8s.gcr.io/sig-storage/snapshot-controller`
- `k8s.gcr.io/sig-storage/snapshot-validation-webhook`

Chainguard Container Images are designed with minimalism and security in mind, and thus the `kubernetes-csi-external-snapshotter-fips` image has the following differences from the upstream image:
* We set the entrypoints to `usr/bin/{component}`, where as the upstream sets it to `/{component}`.

### FIPS Support

The `kubernetes-csi-external-snapshotter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Snapshotter

To deploy the snapshotter, apply the manifests found in the upstream project [here](https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/csi-snapshotter). You'll need to adjust the `image` to use `cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshotter-fips` instead. You can do this by extending the existing [kustomization file](https://github.com/kubernetes-csi/external-snapshotter/blob/master/deploy/kubernetes/csi-snapshotter/kustomization.yaml) as follows:

```yaml
# ...
images:
  - name: registry.k8s.io/sig-storage/csi-snapshotter
    newName: cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshotter-fips
    digest: <insert image digest>
```

### Snapshot Controller

To deploy the snapshotter, apply the manifests found in the upstream project [here](https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/snapshot-controller). You'll need to adjust the `image` to use `cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshot-controller-fips` instead. You can do this by extending the existing [kustomization file](https://github.com/kubernetes-csi/external-snapshotter/blob/master/deploy/kubernetes/snapshot-controller/kustomization.yaml) as follows:

```yaml
# ...
images:
  - name: registry.k8s.io/sig-storage/snapshot-controller
    newName: cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshot-controller-fips
    digest: <insert image digest>
```

### Validation Webhook

> As of Feb 2025, upstream looks to have deleted 'snapshot-validation-webhook'
> from the main branch. It still exists in the latest git release at this time:
> v8.1.11. It's likely this image will be depreciated in a future release.

To deploy the webhook, refer to the [documentation in the upstream project](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/deploy/kubernetes/webhook-example#how-to-deploy-the-webhook). You'll just need to replace the container spec's `image` value with `cgr.dev/ORGANIZATION/kubernetes-csi-external-snapshot-validation-webhook-fips`.

You can verify that the webhook is working by following [these instructions](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/deploy/kubernetes/webhook-example#verify-the-webhook-works) to submit an invalid snapshot definition and see whether it gets rejected.

Once all the components are deployed, we can try to apply one valid and one invalid snapshot to check the behaviour.

Apply the below invalid Snapshot, this should be rejected by the validating webhook.

```
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-demo-v1
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass-v1
  source: # Only one of the two fields should be set for a snapshot. Therefore this snapshot is invalid.
    persistentVolumeClaimName: pvc 
    volumeSnapshotContentName: vsc 
```

We can then try to apply the below valid Snapshot which should be allowed by the validating webhook.

```
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: new-snapshot-demo-v1
spec:
  volumeSnapshotClassName: csi-hostpath-snapclass-v1
  source:
    persistentVolumeClaimName: hpvc
```

## Documentation and Resources
- [Official Usage Guide](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1?tab=readme-ov-file#usage)
- [Example Configs](https://github.com/kubernetes-csi/external-snapshotter/tree/v8.1.1/examples/kubernetes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### velero

# velero
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/velero` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/velero/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Backup and migrate Kubernetes applications and their persistent volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Velero] (https://velero.io/docs/v1.13/) (formerly Heptio Ark) gives you tools to back up and restore your Kubernetes cluster resources and persistent volumes. You can run Velero with a cloud provider or on-premises.

Velero lets you:
* Take backups of your cluster and restore in case of loss.
* Migrate cluster resources to other clusters.
* Replicate your production cluster to development and testing clusters.

## Installation and Usage

```bash
docker run cgr.dev/chainguard/velero:latest help
```

For more information, refer to the velero documentation:
- [Velero GitHub](https://github.com/vmware-tanzu/velero)

When deploying velero helm charts with a kubectl image ensure to use
`-dev` tags as the velero upstream helm chart expects presence of `sh`
and `which` commands in the kubectl image. See this
[vmware-tanzu/helm-charts#591](https://github.com/vmware-tanzu/helm-charts/issues/591)
upstream issue. And at the same time kubectl images typically do not
ship with a `sh`.

At low level, Velero delegates the backup/restore calls to restic, kopia, etc.
Restic is currently in deprecation phase, and may result in error `panic: EVP_DigestInit_ex`.
To handle this, its recommendated to use kopia. Check Velero docs for right kopia configuration.
One method to use kopia, while using velero helm chart, is by adding below extraArgs:
```
server:
  extraArgs:
    - --uploader-type=kopia
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics-operator-config-reloader-fips

# victoriametrics-operator-config-reloader-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics-operator-config-reloader-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics-operator-config-reloader-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Config reloader component for VictoriaMetrics Operator that watches and reloads configurations for VMAgent, VMAuth, and VMAlert.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Victoriametrics-operator-config-reloader-fips Chainguard image is comparable to the official victoriametrics/operator:config-reloader-latest image from Docker Hub.

## Usage

To install the VictoriaMetrics operator using the Helm chart, refer to the
installation instructions provided in the README of the relevant chart:

- [victoria-metrics-operator/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-operator/README.md)
- [victoria-metrics-k8s-stack/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-k8s-stack/README.md)).

For additional information, see the [quick start guide](https://docs.victoriametrics.com/operator/quick-start).

Below is an example:

```bash
helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update
```

Specify the Chainguard image when deploying the chart:

```bash
helm install vmoperator vm/victoria-metrics-operator \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/victoriametrics-operator \
    --set image.tag=latest
```

This image is the config-reloader sidecar used by the VictoriaMetrics Operator. It is automatically injected into VMAgent, VMAuth, and VMAlert pods when using the operator.

To use this image with the VictoriaMetrics Operator Helm chart:

```yaml
operator:
useCustomConfigReloader: true

env:
- name: VM_CUSTOMCONFIGRELOADERIMAGE
    value: cgr.dev/ORGANIZATION/victoriametrics-operator-config-reloader-fips:latest
```

```bash
helm upgrade --install vm-operator vm/victoria-metrics-operator
-f values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### stakater-reloader

# stakater-reloader
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/stakater-reloader` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/stakater-reloader/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Overview
This image is a drop-in replacement for the stakater-reloader image available upstream at `ghcr.io/stakater/reloader`.

### Usage with Helm
```bash
helm repo add reloader https://stakater.github.io/stakater-charts
helm install reloader reloader/reloader \
  --set reloader.deployment.image=cgr.dev/ORGANIZATION/stakater-reloader \
  --set reloader.deployment.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cilium

# cilium
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cilium` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cilium/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Cilium](https://cilium.io/) is an open source, cloud native solution for providing, securing, and observing network connectivity between workloads using eBPF.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Cilium Containers

Cilium is open source software for transparently securing the network connectivity between application services deployed using Linux container management platforms like Docker and Kubernetes. At the foundation of Cilium is a new Linux kernel technology called eBPF (short for Extended Berkely Package Filter), which enables the dynamic insertion of powerful security visibility and control logic within Linux itself. Because eBPF runs inside the Linux kernel, Cilium security policies can be applied and updated without any changes to the application code or container configuration.

Hubble is a fully distributed networking and security observability platform built on top of Cilium and eBPF to enable deep visibility into the communication and behavior of services as well as the networking infrastructure in a completely transparent manner.

For details on how you can work with these Cilium container images, check out our guide on [Getting Started with the Cilium Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/cilium/) on Chainguard Academy.

Chainguard offers several Cilium images, as described in the next sections. 

## cilium-agent

Cilium agents serve as the core data-plane component of Cilium, deployed as a DaemonSet on every node within the cluster. These agents implement the Kubernetes Container Networking Interface (CNI) and are responsible for several critical functions:

- **Network Policy Enforcement**: Implements and enforces network security policies using eBPF programs loaded into the Linux kernel
- **Load Balancing**: Provides Layer 3, 4, and 7 load balancing capabilities for services
- **Service Mesh Integration**: Offers transparent service mesh functionality without requiring application changes
- **IP Address Management (IPAM)**: Manages IP address allocation for pods across the cluster
- **Network Connectivity**: Establishes secure network connectivity between pods, both within and across nodes

Each agent contains an embedded Hubble server that provides deep visibility into network traffic, security events, and the overall health of the Kubernetes cluster. The agents communicate with the Cilium operator for cluster-wide coordination and with the Linux kernel through eBPF programs for high-performance data path operations.

### Understanding SBOM Version Information

The cilium-agent SBOM may show certain packages with versions that appear to differ from the primary Cilium version. This is intentional and expected behavior:

- **hubble**: The Hubble CLI package always references the latest version for backward compatibility. Hubble maintains compatibility across Cilium versions, allowing administrators to use the newest Hubble CLI features regardless of the Cilium agent version deployed.

- **cilium-compat**: This is a virtual package that points to the most recent Cilium release. It provides symlinks and directory structures for compatibility but does not contain functional binaries itself. The version number reflects the compatibility mapping rather than executable code within your specific image version.

These version references in the SBOM are by design and do not indicate that components from different releases are being mixed at runtime. The functional Cilium agent binaries and core components match your selected image version (e.g., 1.17 images contain Cilium 1.17 functional components).

For example, when inspecting a `cilium-agent:1.17` image, you may see `cilium-1.18-compat` and `hubble=1.18.x` in `/etc/apk/world`. This reflects the compatibility layer and CLI versioning strategy, not the version of the running Cilium data plane.

## cilium-operator-generic

The Cilium operator serves as the centralized control plane component of Cilium, deployed as a single instance (or in high-availability mode) to manage cluster-wide operations. This generic operator variant is cloud-agnostic and provides several key functions:

- **Resource Management**: Creates, updates, and manages Cilium Custom Resource Definitions (CRDs) including CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy, and CiliumEndpoint resources
- **Network Policy Compilation**: Translates Kubernetes NetworkPolicy and Cilium-specific policies into eBPF programs that are distributed to agents
- **Certificate Management**: Handles TLS certificate lifecycle for secure communication between Cilium components

This generic variant works across different cloud providers and on-premises environments, making it suitable for multi-cloud or hybrid deployments where cloud-specific integrations are not required.

## cilium-operator-aws

The AWS-specific Cilium operator extends the core control plane functionality with deep integration into AWS services and infrastructure. In addition to all the capabilities of the generic operator, this variant provides specialized AWS features:

- **ENI Management**: Integrates with AWS Elastic Network Interface (ENI) allocation and management for advanced networking scenarios
- **VPC Integration**: Leverages AWS VPC routing and security groups for enhanced network isolation and policy enforcement
- **AWS Load Balancer Integration**: Coordinates with AWS Application Load Balancer (ALB) and Network Load Balancer (NLB) for service exposure
- **IAM Integration**: Utilizes AWS Identity and Access Management (IAM) roles and policies for secure access to AWS APIs
- **EKS Optimization**: Includes specific optimizations and integrations for Amazon Elastic Kubernetes Service (EKS) clusters

This operator is specifically designed for production workloads running on AWS infrastructure where native cloud integration is required for optimal performance, security, and operational efficiency.

## cilium-hubble-relay

Hubble Relay serves as the central aggregation and coordination service for network observability data across the entire Kubernetes cluster. It acts as an intermediary between the distributed Hubble servers (embedded in each Cilium agent) and observability clients, providing several critical functions:

- **gRPC API Gateway**: Exposes a unified gRPC API that clients can use to query network flows, security events, and service dependencies across the entire cluster
- **Load Balancing**: Distributes observability queries across multiple Hubble servers to ensure optimal performance and availability
- **Data Filtering and Querying**: Provides advanced filtering capabilities allowing users to query specific network flows, protocols, security events, or time ranges
- **Multi-Cluster Support**: In ClusterMesh deployments, aggregates observability data from multiple connected Kubernetes clusters

Hubble Relay is essential for any deployment requiring comprehensive network observability, enabling tools like the Hubble CLI and Hubble UI to provide insights into application connectivity, performance, and security across the entire infrastructure.

## cilium-hubble-ui

The Hubble UI is a modern, web-based visualization platform built as a ReactJS application and served through nginx. It provides an intuitive, graphical interface for network administrators, security teams, and developers who need to understand, monitor, and troubleshoot network connectivity and security policies in their Kubernetes environments.

## cilium-hubble-ui-backend

The Hubble UI Backend serves as the data processing and API layer that bridges the gap between raw network observability data and the user-friendly Hubble UI interface. This backend component is essential for the Hubble UI to function effectively, handling the computational complexity of processing network observability data while providing a clean, performant interface for the React-based frontend.

## cilium-clustermesh-apiserver

Cilium Cluster Mesh connects multiple Kubernetes clusters, allowing pods in one cluster to access services in others, as long as all clusters use Cilium as their CNI. This is achieved by deploying a clustermesh-apiserver to sync shared state across clusters:

- **Multi-Cluster Service Discovery**: Enables services in one cluster to discover and connect to services running in other clusters, creating a unified service mesh across cluster boundaries
- **Cross-Cluster Load Balancing**: Distributes traffic across service endpoints that span multiple clusters, providing high availability and optimal resource utilization
- **Shared Identity Management**: Synchronizes security identities across clusters, ensuring consistent network policy enforcement in multi-cluster scenarios
- **Secure Communication**: Establishes secure, encrypted communication channels between clusters using mutual TLS authentication
- **Service Export/Import**: Manages which services are exported from each cluster and which remote services are imported for local consumption

The ClusterMesh API Server is deployed as a LoadBalancer service in each participating cluster, enabling Cilium agents across clusters to establish secure connections and exchange routing information. This creates a transparent, scalable solution for multi-cluster deployments without requiring complex VPN setups or network overlays.

## Documentation and Resources

Refer to the [Cilium docs on cilium.io](https://cilium.io/) and their [GitHub repository](https://github.com/cilium/cilium) for more information about this software.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### docker-cli

# docker-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/docker-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/docker-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [Docker CLI](https://github.com/docker/cli) container image.

This image contains solely the Docker CLI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

When using Docker CLI, volume mount the Docker socket in the container:

```bash
docker run -v /var/run/docker.sock:/var/run/docker.sock cgr.dev/ORGANIZATION/docker-cli:latest ...
```

Command line options:

```
Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Common Commands:
  run         Create and run a new container from an image
  exec        Execute a command in a running container
  ps          List containers
  build       Build an image from a Dockerfile
  pull        Download an image from a registry
  push        Upload an image to a registry
  images      List images
  login       Log in to a registry
  logout      Log out from a registry
  search      Search Docker Hub for images
  version     Show the Docker version information
  info        Display system-wide information

Management Commands:
  builder     Manage builds
  checkpoint  Manage checkpoints
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  plugin      Manage plugins
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Swarm Commands:
  config      Manage Swarm configs
  node        Manage Swarm nodes
  secret      Manage Swarm secrets
  service     Manage Swarm services
  stack       Manage Swarm stacks
  swarm       Manage Swarm

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

Global Options:
      --config string      Location of client config files (default
                           "/home/nonroot/.docker")
  -c, --context string     Name of the context to use to connect to the
                           daemon (overrides DOCKER_HOST env var and
                           default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket to connect to
  -l, --log-level string   Set the logging level ("debug", "info",
                           "warn", "error", "fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default
                           "/home/nonroot/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default
                           "/home/nonroot/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default
                           "/home/nonroot/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Run 'docker COMMAND --help' for more information on a command.

For more help on how to use Docker, head to https://docs.docker.com/go/guides/
```

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-exporter-fips

# kafka-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dragonfly

# dragonfly
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dragonfly` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dragonfly/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dragonfly is a modern drop-in replacement for Redis and Memcached, offering better performance, multithreading, and lower memory overhead.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard Dragonfly image is **fully compatible with the official [DragonflyDB](https://github.com/dragonflydb/dragonfly)** images. You can use them as a drop-in replacement in any Kubernetes setup or Helm-based deployment. 

## Getting Started
We can use helm charts for deploying images. We can create a values.yaml that'll override upstream images with Chainguard images.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/dragonfly
  tag: latest
```

Add the official Dragonfly Helm chart repo and install the chart using your override:

```bash
helm repo add dragonfly https://dragonflydb.github.io/helm-charts/
helm repo update

helm install dragonfly dragonfly/dragonfly \
  --namespace dragonfly-system \
  --create-namespace \
  --wait \
  -f values.yaml
```

## Documentation & Resources
Please refer to the upstream [documentation](https://www.dragonflydb.io/docs) for a [getting started](https://www.dragonflydb.io/docs/getting-started) guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-fips

# prometheus-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### node

# node
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/node` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/node/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for running NodeJS apps

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Where possible, the Node Chainguard Image is built for compatibility with the [Docker official image for Node](https://hub.docker.com/_/node/).

The Node Chainguard Image runs as a nonroot user (`node`) by default. A `USER root` statement may be required before performing tasks requiring elevated permissions.
Note: This image uses a different entrypoint(`/usr/bin/node`) than the official Node image.

Chainguard's `node` container image comes in multiple variants, each designed for different user needs and operational requirements.

The standard `node` variant provides a minimal container image that includes tools commonly needed for production use and compatibility, such as Node.js runtime and essential libraries. This is the default choice for most users, aimed at production deployments and smooth migration from external Node container images, but without unnecessary extras. The `-dev` variant (also known as "Development" variant) adds extra utilities like a shell, package manager (e.g., apk), and debugging tools on top of the standard runtime. These are useful when building or troubleshooting applications inside the container, or when needing a familiar interactive environment with broad compatibility.

Importantly, Chainguard's `node` container image also comes with a `-slim` variant that is even more minimal than the standard variant and contains only the critical files necessary to run Node.js applications. As such, it doesn't include a shell, package manager, debuggers, or utility tools, meaning that the image's size and attack surface are kept as small as possible. `-slim` variants are best suited for advanced users who want maximum security and smallest possible footprint. They're ideal for locked-down production environments or cases with strict compliance requirements, but users give up conveniences like shell access or running shell-based entrypoint scripts.

## Getting Started

### Example: Distroless CLI Application

In this example, we'll write a `.js` script that prints a message, then prints the message reversed. The script will use one dependency, the [`text-reverse`](https://www.npmjs.com/package/text-reverse) package. The script will optionally take one positional argument—if no argument is passed, a default message will be printed and reversed, otherwise the passed argument will be printed and reversed.

First, let's create a project structure for our example:

```sh
mkdir -p ~/node-reverse/bin && cd ~/node-reverse
```

This creates the following folder structure and sets our working directory to the root `node-reverse`folder:

```
node-reverse
└── bin
```

Now let's create a `package.json` file, which provides metadata about the project, including dependencies:

```sh
cat << 'EOF' > package.json
{
    "name": "linky_hello",
    "version": "1.0.0",
    "description": "Say hello to Linky",
    "main": "bin",
    "bin": {
        "linky_hello": "./bin/index.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
        "text-reverse": "^1.0.0"
    }
}
EOF
```

The above defines a package, `linky_hello`, that depends on `text-reverse`, and which will run the code in `bin/index.js` on `npm run start`.

Let's create our application code now:

```sh
cat << 'EOF' > bin/index.js
#!/usr/bin/env node

const reverse=require('text-reverse');

const run_argument=process.argv[2]

if (run_argument) {
    console.log(run_argument)
    console.log(reverse(run_argument))    
} else {
    const message="Hello, Linky!"
    const reversed=reverse(message)
    console.log(message  + "🐙")
    console.log("🐙" + reversed)
}
EOF
```

This application code first looks at any arguments passed to the script. If a positional argument is passed when the script is run, it will print that argument, then print its reverse. If no argument is passed, a default message will be printed and reversed.

Finally, let's create a `Dockerfile` for our image build:

```sh
cat << 'EOF' > Dockerfile
FROM cgr.dev/chainguard/node:latest
ENV NODE_ENV=production

WORKDIR /app

COPY --chown=node:node package.json .
ADD ./bin ./bin
RUN npm install

ENTRYPOINT ["node", "bin/index.js"]
EOF
```

This `Dockerfile` sets the `file NODE_ENV` environment variable to `production`, copies our `package.json` and `bin` directory, installs our dependency with `npm install`, and runs our `.js` script.

Build the image, tagging it `node-reverse`:

```sh
docker build . -t node-reverse
```

Finally, run the container:

```sh
docker run node-reverse
```

You should see the following output:

```
Hello, Linky!🐙
🐙!ykniL ,olleH
```

You can also pass an argument to the `docker run node-reverse` command to change the output:

```sh
docker run node-reverse "Hello, Chainguard User\!"
```

This should produce the following output:

```
Hello, Chainguard User!
!resU draugniahC ,olleH
```

## Example: Express.js Server

In this example, we'll create an [Express.js](https://expressjs.com/) server that allows retrieval of a JSON-formatted list of animals and the addition of new animals via POST request.

First, create a folder for our example:

```sh
mkdir -p ~/node-express && cd $_
```

Create a `package.json` file, which provides metadata about the project, including dependencies:

```sh
cat << 'EOF' > package.json
{
  "name": "Express Server",
  "version": "1.0.0",
  "description": "A server that allows getting and posting dummy data in JSON format",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.14.1",
    "express": "^4.13.3"
  }
}
EOF
```

Next, add our server application code:

```sh
cat << 'EOF' > server.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

//Allow all requests from all domains
app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "POST, GET");
  next();
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

var animals = [
    {
        "id": "234kjw",
        "text": "octopus"
    },
    {
        "id": "as82w",
        "text": "penguin"
    },
    {
        "id": "234sk1",
        "text": "whale"
    }
];

app.get('/animals', function(req, res) {
    console.log("GET From SERVER");
    res.send(animals);
});

app.post('/animals', function(req, res) {
    var animal = req.body;
    console.log(req.body);
    animals.push(animal);
    res.status(200).send("Successfully posted animal\n");
});

console.log("🐙🐧🐋 Server running. Retrieve animals from http://localhost:6069/animals")
app.listen(6069);
EOF
```

Finally, create a `Dockerfile` for our image build:

```sh
cat << 'EOF' > Dockerfile
FROM cgr.dev/chainguard/node
ENV NODE_ENV=production

WORKDIR /app

COPY --chown=node:node ["package.json", "server.js", "./"]

RUN npm install --omit-dev

CMD [ "server.js" ]
EOF
```

Build the image:

```sh
docker build . -t node-express
```

Finally, run the server container:

```sh
 docker run --rm -p 6069:6069 node-express
```

You should see the following message:

```
🐙🐧🐋 Server running. Retrieve animals from http://localhost:6069/animals
```

Visit [http://localhost:6069/animals](http://localhost:6069/animals) to view the served JSON data.

You can post new data to the running application:

```sh
 curl -H 'Content-Type: application/json' \
 -d '{ "id":9001,"text":"gnu"}' \
 -X POST \
 http://localhost:6069/animals
```

After posting, refresh the page on [http://localhost:6069/animals](http://localhost:6069/animals) to view the additional data.

## Documentation and Resources

- [Chainguard Academy: Getting Started with the Node Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/node/)
- [Chainguard Academy: How to Port a Sample Application to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/?utm_source=blog&utm_medium=website&utm_campaign=FY25-EC-Blog_sourced)
- [Learning Lab: Chainguard's Node Image](https://www.chainguard.dev/events/chainguards-node-image)
- [Blog: Migrating a Node.js application to Chainguard Images](https://www.chainguard.dev/unchained/migrating-a-node-js-application-to-chainguard-images)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azure-functions-node

# azure-functions-node
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azure-functions-node` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azure-functions-node/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for code projects. It extends the Azure platform with the capability to implement code triggered by many events occurring in Azure, on-premises or other 3rd party service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is based on the upstream [azure-functions/node](https://hub.docker.com/r/microsoft/azure-functions-node) image, but follows the slim variant to reduce image size and improve performance.

Key differences:
- Slim base: Uses a smaller footprint compared to the full azure-functions/node image, which can lead to faster cold start times and reduced resource consumption.
- Extension Bundles: Supports only Azure Functions Extension Bundles v4. Earlier versions (v3 or v2) are not supported, as v4 provides improved performance, stability, and access to the latest Azure Functions features.
These changes are intended to optimize app performance and keep the image aligned with the latest platform capabilities. 

Chainguard's Azure Functions Node image is smaller in size compared to the original image and has few-to-zero CVEs.

## Getting Started

Azure Functions is a managed platform-as-a-service provider which offers scalable and serverless hosting for code projects. It extends the Azure platform with the capability to implement code triggered by many events occurring in Azure, on-premises or other 3rd party service. The Azure Functions Node image offers support for writing and running Functions code in Javascript.

### Creating and running a minimal Function locally

This section outlines how you can run an Azure Function application locally with the Chainguard Azure Functions Node Image.

Start by creating a sample http triggered function named `HelloWolfi`:

```sh
mkdir HelloWolfi

cat >HelloWolfi/index.js <<EOL
module.exports = async function (context, req) {
    context.log('HTTP trigger processed a request.');
    const name = (req.query.name || (req.body && req.body.name));
    context.res = {
        status: 200,
        body: name ? \`Hello, \${name}!\` : "Pass a name in the query string or request body."
    };
};
EOL

cat >HelloWolfi/function.json <<EOL
{
    "bindings": [
      {
        "authLevel": "anonymous",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": ["get", "post"]
      },
      {
        "type": "http",
        "direction": "out",
        "name": "res"
      }
    ]
}
EOL
```

Then, create the **host.json** metadata file which contains configuration options for all functions in a Function App. For more information about the this file check the [host.json reference](https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json). Make sure to use version 4 of Azure Functions Extension Bundles, since version 3 and 2 are not supported.

```sh
cat >host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Information"
      },
      "console": {
          "isEnabled": true,
          "DisableColors": true
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Following that, you can create a Dockerfile to copy your Function code to the Chainguard image and build the new image.

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/chainguard/azure-functions-node

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-node-function .
```

You can now run the image locally with the following command:

```sh
docker run -p 8080:80 wolfi-node-function
```
```
WEBSITES_INCLUDE_CLOUD_CERTS is not set to true.
info: Host.Triggers.Warmup[0]
      Initializing Warmup Extension.
info: Host.Startup[503]
      Initializing Host.
...
info: Microsoft.Azure.WebJobs.Hosting.JobHostService[0]
      Starting JobHost
...
info: Host.Startup[314]
      Loading functions metadata
info: Host.Startup[326]
      Reading functions metadata (Custom)
info: Host.Startup[327]
      0 functions found (Custom)
info: Host.Startup[315]
      1 functions loaded
info: Host.Startup[0]
      Generating 1 job function(s)
info: Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcher[0]
      Worker process started and initialized.
info: Host.Startup[0]
      Found the following functions:
      Host.Functions.HelloWolfi
      
info: Microsoft.Azure.WebJobs.Script.WebHost.WebScriptHostHttpRoutesManager[0]
      Initializing function HTTP routes
      Mapped function route 'api/HelloWolfi' [get,post] to 'HelloWolfi'
...
info: Host.Startup[412]
      Host initialized (48ms)
info: Host.Startup[413]
      Host started (59ms)
info: Host.Startup[0]
      Job host started
Hosting environment: Production
Content root path: /azure-functions-host
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
```

Now that the function launched properly, you can test it by making a request to the **/api/HelloWolfi** endpoint:

```sh
curl http://127.0.0.1:8080/api/HelloWolfi?name=Chainguard
```
```
Hello, Chainguard!
```

### Creating and running a minimal Function in an Azure Function App

The most common use case for an Azure Functions image is deploying it within an Azure Function App. You can use the Chainguard Azure Functions Node image for this purpose.
The following example demonstrates how to deploy a queue-triggered function that responds to messages in an Azure Storage Queue by creating a copy of a file in Azure Blob Storage.

Start by creating the function and its metadata file:

```sh
mkdir HelloWolfi

cat >HelloWolfi/index.js <<EOL
module.exports = async function(context) {
    context.log.warn('Node.js Queue trigger function processed', context.bindings.myQueueItem);
    context.bindings.myOutputBlob = context.bindings.myInputBlob;
};
EOL

cat >HelloWolfi/function.json <<EOL
{
    "bindings": [
      {
        "queueName": "blobfunctionqueue-items",
        "connection": "AzureWebJobsStorage",
        "name": "myQueueItem",
        "type": "queueTrigger",
        "direction": "in"
      },
      {
        "name": "myInputBlob",
        "type": "blob",
        "path": "samples-workitems/{queueTrigger}",
        "connection": "AzureWebJobsStorage",
        "direction": "in"
      },
      {
        "name": "myOutputBlob",
        "type": "blob",
        "path": "samples-workitems/{queueTrigger}-Copy",
        "connection": "AzureWebJobsStorage",
        "direction": "out"
      }
    ],
    "disabled": false
}
EOL

cat >host.json <<EOL
{
    "version": "2.0",
    "logging": {
      "logLevel": {
        "default": "Warning"
      }
    },
    "extensionBundle": {
      "id": "Microsoft.Azure.Functions.ExtensionBundle",
      "version": "[4.*, 5.0.0)"
    }
}
EOL
```

Then, create a Dockerfile to copy the Function to the Chainguard image and built the image.

```sh
cat >Dockerfile <<EOL
FROM cgr.dev/chainguard/azure-functions-node

COPY . /home/site/wwwroot
EOL

docker build -t wolfi-queue-function .
```

Next, tag your image as needed and push it to your container registry by following [these steps](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-javascript#publish-the-container-image-to-a-registry).

Once the image is published, [provision the required Azure resources](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-javascript#create-supporting-azure-resources-for-your-function) and [configure your Function App](https://learn.microsoft.com/en-us/azure/azure-functions/functions-deploy-container-apps?tabs=acr%2Cbash&pivots=programming-language-javascript#create-and-configure-a-function-app-on-azure-with-the-image) to use the container image.

After setup, create an **Azure Storage Queue** named `blobfunctionqueue-items` and a **Blob Container** named `samples-workitems` in your storage account. Upload a file to the container.

Ensure the Function App’s managed identity has the correct roles assigned to the storage account:
- **Storage Queue Data Reader**
- **Storage Blob Data Contributor**

These roles allow the function to read from the queue and write to the blob container.

Restart the Function App to apply the updated configuration. Then, add a message to the queue containing the name of the uploaded file. Within a few seconds, the function should trigger and process the file, creating a copy in the designated container.

You can monitor execution logs in Azure Application Insights (note that logs may appear with a slight delay).

## Documentation and Resources

For more information about Azure Functions in container images, please refer to the [official documentation](https://learn.microsoft.com/en-us/azure/azure-functions/functions-container-apps-hosting).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chrony_exporter-fips

# chrony_exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chrony_exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chrony_exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-enabled Wolfi-based image for Chrony Exporter - a Prometheus exporter for Chrony NTP metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Chrony Exporter. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's chrony_exporter-fips image maintains functional parity with the [upstream image](https://quay.io/repository/superq/chrony-exporter).

The exporter listens on port `9123` by default and exposes metrics at the `/metrics` endpoint.

### FIPS Support

The `chrony_exporter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Docker

To run the Chrony Exporter with Docker, connecting via Unix socket:

```shell
docker run -d \
  --name chrony_exporter \
  -p 9123:9123 \
  -v /var/run/chrony:/var/run/chrony:ro \
  cgr.dev/ORGANIZATION/chrony_exporter-fips:latest \
  --chrony.address=unix:///var/run/chrony/chronyd.sock
```

Alternatively, connect via UDP (port 323):

```shell
docker run -d \
  --name chrony_exporter \
  -p 9123:9123 \
  cgr.dev/ORGANIZATION/chrony_exporter-fips:latest \
  --chrony.address=host.docker.internal:323
```

To verify the exporter is running, check the metrics endpoint:

```shell
curl http://localhost:9123/metrics
```

### Kubernetes

The chrony_exporter is typically deployed as a sidecar container alongside Chrony in a DaemonSet to monitor NTP synchronization on each node. The exporter can connect to Chrony via Unix socket or UDP (port 323).

Example DaemonSet deployment with Chrony exporter as a sidecar using UDP connection:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: chrony-exporter
  labels:
    app: chrony-exporter
spec:
  selector:
    matchLabels:
      app: chrony-exporter
  template:
    metadata:
      labels:
        app: chrony-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9123"
        prometheus.io/path: "/metrics"
    spec:
      containers:
      - name: chrony
        image: cturra/ntp:latest
        securityContext:
          capabilities:
            add:
            - SYS_TIME
        env:
        - name: NTP_SERVERS
          value: "time.google.com"
        - name: ENABLE_SYSCLK
          value: "false"
      - name: chrony-exporter
        image: cgr.dev/ORGANIZATION/chrony_exporter-fips:latest
        args:
        - "--chrony.address=127.0.0.1:323"
        ports:
        - containerPort: 9123
          name: metrics
          protocol: TCP
        resources:
          requests:
            cpu: 10m
            memory: 16Mi
          limits:
            cpu: 100m
            memory: 64Mi
---
apiVersion: v1
kind: Service
metadata:
  name: chrony-exporter
  labels:
    app: chrony-exporter
spec:
  selector:
    app: chrony-exporter
  ports:
  - port: 9123
    targetPort: 9123
    name: metrics
```

The exporter connects to Chrony via UDP on port 323 using localhost (both containers share the same network namespace in a pod).

### Command Line Options

Common command line options:

- `--chrony.address`: Address of the Chrony daemon. Supports Unix socket (`unix:///var/run/chrony/chronyd.sock`) or UDP (`localhost:323`)
- `--collector.sources`: Enable sources collector
- `--web.listen-address`: Address to listen on for web interface and telemetry (default: `:9123`)
- `--web.telemetry-path`: Path under which to expose metrics (default: `/metrics`)

## Documentation and Resources

- [Chrony Exporter GitHub](https://github.com/SuperQ/chrony_exporter)
- [Chrony NTP Documentation](https://chrony-project.org/documentation.html)
- [Prometheus Documentation](https://prometheus.io/docs/introduction/overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-iamguarded-fips

# minio-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MinIO is a high-performance, S3 compatible object store. This FIPS-compliant iamguarded variant is specifically designed to work with the iamguarded Helm chart in FIPS-140 compliant environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MinIO IAMGuarded FIPS is a security-enhanced, FIPS-140 compliant variant of MinIO designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard MinIO deployments and meets FIPS-140 compliance requirements.

## Helm Chart Installation

The MinIO IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Basic Installation

Once authenticated you can install the chart with standard Helm commands and your organization name:

```bash
helm install minio oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio \
  --set "global.org=$ORGANIZATION" \
  --set image.repository=cgr.dev/$ORGANIZATION/minio-iamguarded-fips \
  --set clientImage.repository=cgr.dev/$ORGANIZATION/minio-iamguarded-client-fips
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

To view all available configuration options:

```bash
helm show values oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Registry Configuration

For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MinIO server image (FIPS)
image:
  registry: myregistry.example.com
  repository: mirrored/minio-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# MinIO client image (FIPS)
clientImage:
  registry: myregistry.example.com
  repository: mirrored/minio-client-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions (FIPS)
defaultInitContainers:
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded-fips
      digest: sha256:... # Use specific digest instead of tag

# MinIO Object Storage image
console:
  registry: myregistry.example.com
  repository: mirrored/minio-object-browser-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Standalone Docker Usage

While this image is optimized for use with the iamguarded Helm chart, it can also be run standalone:

```bash
docker run -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minio \
  -e MINIO_ROOT_PASSWORD=minio123 \
  cgr.dev/$ORGANIZATION/minio-iamguarded-fips:latest server /data --console-address ":9001"
```

### MinIO Client (FIPS)

The FIPS-compliant MinIO client image is also available:

```bash
docker run cgr.dev/$ORGANIZATION/minio-iamguarded-client-fips:latest --help
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-s3-controller

# aws-s3-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-s3-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-s3-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

S3 controller is an ACK service controller for Amazon Simple Storage Service (S3).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's AWS-S3-Controller image is a lean, Wolfi-based container image. It is comparable to the [S3-controller image published by AWS](https://gallery.ecr.aws/aws-controllers-k8s/s3-controller) in functionality and has minimal dependencies.

## Getting Started

The ACK (short for AWS Controllers for Kubernetes) service controller has a separate Helm chart that installs the necessary supporting artifacts as a Kubernetes deployment. This includes the ACK service controller, custom resource definitions (CRDs), and Kubernetes Role-Based Access Control (RBAC) manifests.

You can find Helm charts for ACK service controllers in the [ACK registry within the Amazon ECR Public Gallery](https://gallery.ecr.aws/aws-controllers-k8s).

```bash
export SERVICE=s3
export RELEASE_VERSION=$(curl -sL https://api.github.com/repos/aws-controllers-k8s/${SERVICE}-controller/releases/latest | jq -r '.tag_name | ltrimstr("v")')
export ACK_SYSTEM_NAMESPACE=ack-system
export AWS_REGION=us-west-2

aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws

helm install --create-namespace -n $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller \
  oci://public.ecr.aws/aws-controllers-k8s/$SERVICE-chart --version=$RELEASE_VERSION --set=aws.region=$AWS_REGION --set-image.repository=cgr.dev/ORGANIZATION/aws-s3-controller --set=image.tag=latest
```

> [!NOTE]
> This Helm deployment will be fully functional once the ACK controllers have the required AWS IAM credentials to manage AWS resources. The ACK documentation includes resources on how to [Configure IAM Permissions](https://aws-controllers-k8s.github.io/community/docs/user-docs/irsa/).

## Documentation and Resources

Please refer the [AWS Controllers documentation](https://aws-controllers-k8s.github.io/community/docs) for information on different ACK controllers and accessing different ACK resources.

You can explore the following resources to learn more about S3-controller:
* [AWS S3 Controller GitHub Project](https://github.com/aws-controllers-k8s/s3-controller/)
* [AWS S3 Controller Deployment using Helm charts](https://aws-controllers-k8s.github.io/community/docs/user-docs/install/)
* [AWS Controllers documentation](https://aws-controllers-k8s.github.io/community/docs)
* [Working with S3 buckets with ACK controllers](https://aws-controllers-k8s.github.io/community/docs/user-docs/resource-crud/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-335

# request-335
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-335` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-335/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter-plugin-trivy

# kyverno-policy-reporter-plugin-trivy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter-plugin-trivy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter-plugin-trivy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This Plugin for Policy Reporter brings additional Trivy specific information to the Policy Reporter UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `kyverno-policy-reporter-plugin-trivy` image is compatible with the upstream Trivy Policy Reporter plugin. It provides vulnerability scanning and security reporting capabilities integrated with Policy Reporter.

## Prerequisites
- Kubernetes cluster
- Kyverno installed and running
- Trivy Operator for vulnerability scanning
- Policy Reporter with UI enabled

## Getting Started

### Installing with Helm

First, install Kyverno if not already installed:

```shell
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno --namespace kyverno
```

Next, install the Trivy Operator for vulnerability scanning:

```shell
helm repo add aqua https://aquasecurity.github.io/helm-charts
helm repo update
helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace
```

Install the Trivy Operator Policy Reporter Adapter to convert VulnerabilityReports to PolicyReports:

```shell
helm repo add fjogeleit https://fjogeleit.github.io/trivy-operator-polr-adapter
helm repo update
helm install trivy-operator-polr-adapter fjogeleit/trivy-operator-polr-adapter \
  --namespace trivy-system
```

Then, install Policy Reporter with the Trivy plugin enabled:

```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm repo update

helm install policy-reporter policy-reporter/policy-reporter \
  --namespace kyverno \
  --set ui.enabled=true \
  --set plugin.trivy.enabled=true \
  --set plugin.trivy.image.registry=cgr.dev \
  --set plugin.trivy.image.repository=ORGANIZATION/kyverno-policy-reporter-plugin-trivy \
  --set plugin.trivy.image.tag=latest
```

### Verifying the Installation

Check that all components are running:

```shell
kubectl get pods -n kyverno
kubectl get pods -n trivy-system
```

You should see pods for:
- **Kyverno namespace**: Kyverno controllers (admission, background, cleanup, reports), Policy Reporter, Policy Reporter Trivy Plugin
- **Trivy-system namespace**: Trivy Operator, Trivy Operator Policy Reporter Adapter

### Testing the Plugin

The Trivy plugin processes vulnerability data from the Trivy Operator and sends it to Policy Reporter. To test the complete workflow:

```shell
# Create a test pod for Trivy Operator to scan
kubectl run nginx-test --image=nginx:1.24 --namespace=default

# Wait for the pod to be ready and Trivy to scan it
kubectl wait --for=condition=ready pod nginx-test --namespace=default --timeout=60s

# Wait for Trivy Operator to scan and adapter to create PolicyReport
# This may take a few minutes for vulnerability database download and scanning
timeout 300 bash -c 'until kubectl get policyreport trivy-vuln-polr-pod-nginx-test --namespace=default >/dev/null 2>&1; do sleep 10; done' || \
  echo "PolicyReport not created yet, continuing anyway..."

# Port-forward to the Policy Reporter UI
kubectl port-forward -n kyverno svc/policy-reporter-ui 8080:8080 &

# Check for Trivy vulnerability results
curl -s "http://127.0.0.1:8080/proxy/default/core/v1/namespaced-resources/results?sources=trivy&categories=Vulnerability+Scan&namespaces=default&page=1&offset=10"

# Check for pod-specific vulnerability data
curl -s "http://127.0.0.1:8080/proxy/default/core/v2/namespace-scoped/resource-results?kinds=Pod&namespaces=default&search&page=1" | \
  jq '.items[] | select(.name=="nginx-test")'
```

You should see vulnerability reports for the nginx:1.24 image. The plugin automatically:
1. **Monitors** VulnerabilityReports created by Trivy Operator
2. **Processes** vulnerability data from scanned container images
3. **Forwards** enriched vulnerability information to Policy Reporter
4. **Provides** data through Policy Reporter's API and UI

## Configuration

The plugin supports various configuration options through the Policy Reporter Helm chart values. Key configuration options include:

- **Image configuration**: Set custom registry, repository, and tag
- **Resource limits**: Configure CPU and memory limits
- **Service configuration**: Customize service ports and types
- **Security settings**: Configure security contexts and policies

## Documentation and Resources

- [Policy Reporter Documentation](https://kyverno.github.io/policy-reporter/)
- [Trivy Documentation](https://trivy.dev/)
- [Trivy Operator Documentation](https://aquasecurity.github.io/trivy-operator/)
- [Policy Reporter Helm Chart](https://github.com/kyverno/policy-reporter/tree/main/charts/policy-reporter)
- [Trivy Operator Helm Chart](https://github.com/aquasecurity/trivy-operator/tree/main/deploy/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### librechat-fips

# librechat-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/librechat-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/librechat-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant AI chat application.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

LibreChat is an open-source AI chat application that allows users to interact with various AI models through a unified interface. Chainguard's librechat-fips container image is a FIPS-compliant version comparable to the upstream [LibreChat image available on Docker Hub](https://hub.docker.com/r/librechat/librechat).

*Important:** When deploying the Chainguard LibreChat image to Kubernetes, you must use the Chainguard IAMGuarded MongoDB Helm chart as a separate installation:

```bash
# Deploy MongoDB using Chainguard IAMGuarded chart
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --namespace librechat \
  --create-namespace \
  --set auth.rootPassword=PASSWORD

# Then deploy LibreChat with mongodb.enabled=false
helm install librechat oci://ghcr.io/danny-avila/librechat-chart/librechat \
  --namespace librechat \
  --values values.yaml  # mongodb.enabled: false in values
```

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced TLS security** - TLS configurations restricted to FIPS-approved ciphers and algorithms (TLS 1.2/1.3 with AES-GCM)

The FIPS version is rigorously tested with TLS-enabled Redis connections to ensure all cryptographic operations comply with FIPS 140-2 requirements.

## Getting Started

LibreChat FIPS requires a MongoDB database and several environment variables for encryption and authentication. Below are examples for both Docker and Kubernetes deployments.

### Running with Docker

#### Basic Setup (Non-TLS)

First, start a MongoDB container:

```bash
docker run -d --name librechat-mongo \
  -e MONGO_INITDB_DATABASE=LibreChat \
  -p 27017:27017 \
  cgr.dev/ORGANIZATION/mongodb:latest
```

Generate required secrets:

```bash
JWT_SECRET=$(openssl rand -base64 32)
JWT_REFRESH_SECRET=$(openssl rand -base64 32)
CREDS_KEY=$(openssl rand -base64 32)
CREDS_IV=$(openssl rand -base64 16)
```

Run LibreChat FIPS:

```bash
docker run -d --name librechat-fips \
  --link librechat-mongo:mongo \
  -p 3080:3080 \
  -e MONGO_URI=mongodb://mongo:27017/LibreChat \
  -e JWT_SECRET="${JWT_SECRET}" \
  -e JWT_REFRESH_SECRET="${JWT_REFRESH_SECRET}" \
  -e CREDS_KEY="${CREDS_KEY}" \
  -e CREDS_IV="${CREDS_IV}" \
  cgr.dev/ORGANIZATION/librechat-fips:latest
```

Access the application at `http://localhost:3080`.

#### Advanced Setup with TLS Redis

For production deployments requiring FIPS-compliant TLS connections with Redis:

**Start Redis with TLS:**

```bash
docker run -d --name librechat-redis \
  -v "${CERTS_DIR}:${CERTS_DIR}:ro" \
  -v "/tmp/redis-tls.conf:/tmp/redis-tls.conf:ro" \
  -p 6380:6380 \
  cgr.dev/ORGANIZATION/redis:latest \
  redis-server /tmp/redis-tls.conf
```

**Start LibreChat FIPS with TLS Redis:**

```bash
docker run -d --name librechat-fips \
  --link librechat-mongo:mongo \
  --link librechat-redis:redis \
  -v "${CERTS_DIR}:${CERTS_DIR}:ro" \
  -p 3080:3080 \
  -e MONGO_URI=mongodb://mongo:27017/LibreChat \
  -e JWT_SECRET="${JWT_SECRET}" \
  -e JWT_REFRESH_SECRET="${JWT_REFRESH_SECRET}" \
  -e CREDS_KEY="${CREDS_KEY}" \
  -e CREDS_IV="${CREDS_IV}" \
  -e USE_REDIS=true \
  -e REDIS_URI=rediss://redis:6380 \
  -e REDIS_CA="${CERTS_DIR}/ca-cert.pem" \
  cgr.dev/ORGANIZATION/librechat-fips:latest
```

**Verify TLS connection:**

```bash
# Test Redis TLS connectivity
docker exec librechat-redis redis-cli -p 6380 \
  --tls --cacert "${CERTS_DIR}/ca-cert.pem" ping

# Verify TLS protocol version
echo 'QUIT' | openssl s_client -connect localhost:6380 \
  -tls1_2 -CAfile "${CERTS_DIR}/ca-cert.pem" 2>&1 | grep "Protocol"
```

### Deploying with Helm on Kubernetes

LibreChat FIPS can be deployed to Kubernetes using the official Helm chart with Chainguard FIPS images.

First, create a values file with your configuration:

```yaml
# values.yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/librechat-fips
  tag: latest
  pullPolicy: Always

mongodb:
  enabled: false  # Use external MongoDB

librechat:
  configEnv:
    MONGO_URI: "mongodb://root:PASSWORD@mongodb:27017/LibreChat?authSource=admin"
    CREDS_KEY: ""  # Set via secret
    CREDS_IV: ""   # Set via secret
    JWT_SECRET: ""  # Set via secret
    JWT_REFRESH_SECRET: ""  # Set via secret
    ALLOW_REGISTRATION: "true"
    ALLOW_SOCIAL_LOGIN: "true"
```

Create Kubernetes secrets for sensitive values:

```bash
# Generate secret values
JWT_SECRET=$(openssl rand -base64 32)
JWT_REFRESH_SECRET=$(openssl rand -base64 32)
CREDS_KEY=$(openssl rand -base64 32)
CREDS_IV=$(openssl rand -base64 16)

# Create the secret
kubectl create secret generic librechat-credentials-env \
  --namespace=librechat \
  --from-literal=JWT_SECRET="${JWT_SECRET}" \
  --from-literal=JWT_REFRESH_SECRET="${JWT_REFRESH_SECRET}" \
  --from-literal=CREDS_KEY="${CREDS_KEY}" \
  --from-literal=CREDS_IV="${CREDS_IV}"
```

Deploy MongoDB using Helm (if not using an external database):

```bash
helm install mongodb oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mongodb \
  --namespace librechat \
  --create-namespace \
  --set auth.rootPassword=PASSWORD
```

Install LibreChat FIPS:

```bash
helm install librechat oci://ghcr.io/danny-avila/librechat-chart/librechat \
  --namespace librechat \
  --create-namespace \
  --values values.yaml
```

Verify the deployment:

```bash
kubectl get pods -n librechat
kubectl logs -n librechat -l app.kubernetes.io/name=librechat-librechat
```

You should see logs indicating:
- `Connected to MongoDB`
- `Server listening on all interfaces at port 3080`

## Required Environment Variables

LibreChat FIPS requires the following environment variables:

| Variable | Description | Example |
|----------|-------------|---------|
| `MONGO_URI` | MongoDB connection string | `mongodb://mongo:27017/LibreChat` |
| `JWT_SECRET` | Secret for JWT token signing | Generated with `openssl rand -base64 32` |
| `JWT_REFRESH_SECRET` | Secret for refresh token signing | Generated with `openssl rand -base64 32` |
| `CREDS_KEY` | Encryption key for credentials | Generated with `openssl rand -base64 32` |
| `CREDS_IV` | Initialization vector for encryption | Generated with `openssl rand -base64 16` |

Optional environment variables for Redis and additional configuration:

| Variable | Description | Default |
|----------|-------------|---------|
| `USE_REDIS` | Enable Redis caching | `false` |
| `REDIS_URI` | Redis connection URI (use `rediss://` for TLS) | - |
| `REDIS_CA` | Path to Redis CA certificate for TLS | - |
| `ALLOW_REGISTRATION` | Enable user registration | `false` |
| `ALLOW_SOCIAL_LOGIN` | Enable social authentication | `false` |
| `OPENAI_API_KEY` | API key for OpenAI integration | - |
| `ANTHROPIC_API_KEY` | API key for Anthropic Claude integration | - |

## Documentation and Resources

- [LibreChat Official Documentation](https://docs.librechat.ai/)
- [LibreChat GitHub Repository](https://github.com/danny-avila/LibreChat)
- [LibreChat Redis TLS Configuration](https://github.com/danny-avila/LibreChat/blob/main/redis-config/README.md)
- [LibreChat Helm Chart](https://github.com/danny-avila/LibreChat/tree/main/helm/librechat)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio

# minio
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Minio.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using MinIO

The Chainguard MinIO image contains the `minio` server binary.
The default entrypoint just runs the `minio` binary without any flags.

```shell
$ docker run cgr.dev/chainguard/minio
NAME:
  minio - High Performance Object Storage

DESCRIPTION:
  Build high performance data infrastructure for machine learning, analytics and application data workloads with MinIO

USAGE:
  minio [FLAGS] COMMAND [ARGS...]

COMMANDS:
  server  start object storage server

FLAGS:
  --certs-dir value, -S value  path to certs directory (default: "/root/.minio/certs")
  --quiet                      disable startup and info messages
  --anonymous                  hide sensitive information from logging
  --json                       output logs in JSON format
  --help, -h                   show help
  --version, -v                print the version

VERSION:
  DEVELOPMENT.2023-03-24T21-41-23Z
```

To start MinIO in a server configuration, make sure to override the `MINIO_ROOT_USER` and `MINIO_ROOT_PASSWORD` environment variables,
and pass a data volume to the `server` command.

```shell
$ docker run -v $(pwd):/data -e MINIO_ROOT_USER=MYNAME -e MINIO_ROOT_PASSWORD=MYPASSWORD cgr.dev/chainguard/minio server /data
MinIO Object Storage Server
Copyright: 2015-2024 MinIO, Inc.
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Version: DEVELOPMENT.2024-04-18T19-09-19Z (go1.22.2 linux/arm64)

API: http://172.17.0.3:9000  http://127.0.0.1:9000 
WebUI: http://172.17.0.3:37953 http://127.0.0.1:37953 

Docs: https://min.io/docs/minio/linux/index.html
Status:         1 Online, 0 Offline. 
STARTUP WARNINGS:
- The standard parity is set to 0. This can lead to data loss.
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### livekit-server

# livekit-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/livekit-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/livekit-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

livekit-server is an open-source media server for real-time audio, video, and data, designed for low latency and scalability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `livekit-server` container image is comparable to the [livekit/livekit](https://github.com/livekit/livekit) image, with the following differences:

* Like all other Chainguard Containers, `livekit-server` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

### Deploy with Helm Chart

**Create a values.yaml**

`values.yaml`
```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/livekit-server
  tag: latest

livekit:
  keys:
    devkey: "secret-key"
```

**Install the LiveKit Helm chart:**
```bash
helm install livekit-server livekit/livekit-server \
  --namespace default \
  --create-namespace \
  -f values.yaml
```

**Verify the deployment:**
```bash
kubectl get pods -n default
kubectl get services -n default
```

**Access the server:**
```bash
kubectl port-forward deployment/livekit-server 7880:7880
```

**Test the connection:**
```bash
# Check if the server is responding
curl http://localhost:7880
```

## Documentation and Resources

- **[Official Documentation](https://docs.livekit.io)**
- **[GitHub Repository](https://github.com/livekit/livekit)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### proxysql

# proxysql
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/proxysql` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/proxysql/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [proxysql](https://github.com/sysown/proxysql).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Compatibility Notes

This Chainguard Container differs from the external ProxySQL image in the following ways:  

**User and Group IDs:**
- Chainguard image runs as UID/GID `65532` (user `proxysql`, group `proxysql`)
- The external image typically runs as UID/GID `999`  

**Security Context:**
- Chainguard image runs as non-root by default (`run-as: proxysql`)
- Does not require root privileges

**File Permissions:**
- `/etc/proxysql.cnf`: `0640` (root:proxysql) - readable by proxysql group
- `/var/lib/proxysql`: `0755` (proxysql:proxysql) - writable by proxysql user
- `/etc/proxysql`: `0755` (proxysql:proxysql) - writable by proxysql user

## Usage

With `Helm`:

```shell
helm repo add dysnix https://dysnix.github.io/charts/
helm repo update
helm install proxysql dysnix/proxysql \
    --namespace proxysql \
    --create-namespace \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/proxysql \
    --set image.tag=latest \
    --set podSecurityContext.runAsUser=65532 \
    --set podSecurityContext.runAsGroup=65532 \
    --set podSecurityContext.fsGroup=65532 \
    --wait
```

Please note that [official Helm chart](https://github.com/ProxySQL/kubernetes/tree/master) is outdated and no longer maintaining.

When deploying with Helm charts, ensure you set the appropriate `podSecurityContext` to match the Chainguard image's UID/GID as shown in the example above.

With `Docker`:

```shell
$ docker run cgr.dev/chainguard/proxysql:latest
2023-06-28 13:27:29 [INFO] Using config file /etc/proxysql.cnf
Renaming database file /var/lib/proxysql/proxysql.db
2023-06-28 13:27:29 [INFO] Current RLIMIT_NOFILE: 1048576
2023-06-28 13:27:29 [INFO] Using OpenSSL version: OpenSSL 3.1.0 14 Mar 2023
2023-06-28 13:27:29 [INFO] No SSL keys/certificates found in datadir (/var/lib/proxysql). Generating new keys/certificates.
2023-06-28 13:27:29 [INFO] ProxySQL version 2.5.3-89-g86ce115
2023-06-28 13:27:29 [INFO] Detected OS: Linux d90ca7f378f8 5.15.49-linuxkit-pr #1 SMP PREEMPT Thu May 25 07:27:39 UTC 2023 aarch64
2023-06-28 13:27:29 [INFO] ProxySQL SHA1 checksum: 491223ebbd1a1dd43c69f24cefa2b269dde73162
2023-06-28 13:27:29 [INFO] SSL keys/certificates found in datadir (/var/lib/proxysql): loading them.
2023-06-28 13:27:29 [INFO] Loaded built-in SQLite3
Standard ProxySQL MySQL Logger rev. 2.5.0421 -- MySQL_Logger.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL Cluster rev. 0.4.0906 -- ProxySQL_Cluster.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL Statistics rev. 1.4.1027 -- ProxySQL_Statistics.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL HTTP Server Handler rev. 1.4.1031 -- ProxySQL_HTTP_Server.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Using UUID: 588c8cc0-1168-46e5-93b9-c53a0923686f , randomly generated. Writing it to database
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD ADMIN VARIABLES TO RUNTIME' was '0x3A8D4652D65FCE60', with epoch '1687958849'
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL VARIABLES TO RUNTIME' was '0xAA126AC5C26167ED', with epoch '1687958849'
Standard ProxySQL Admin rev. 2.0.6.0805 -- ProxySQL_Admin.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] ProxySQL SHA1 checksum: 491223ebbd1a1dd43c69f24cefa2b269dde73162
Standard MySQL Threads Handler rev. 0.2.0902 -- MySQL_Thread.cpp -- Thu Jun 22 15:09:08 2023
Standard MySQL Authentication rev. 0.2.0902 -- MySQL_Authentication.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL USERS TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
2023-06-28 13:27:29 [INFO] Dumping mysql_servers_incoming
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2023-06-28 13:27:29 [INFO] Dumping mysql_servers LEFT JOIN mysql_servers_incoming
+-------------+--------------+----------+------+
| mem_pointer | hostgroup_id | hostname | port |
+-------------+--------------+----------+------+
+-------------+--------------+----------+------+
2023-06-28 13:27:29 [INFO] Dumping mysql_servers JOIN mysql_servers_incoming
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | mem_pointer | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2023-06-28 13:27:29 [INFO] New mysql_group_replication_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_galera_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_aws_aurora_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_hostgroup_attributes table
2023-06-28 13:27:29 [INFO] MySQL_HostGroups_Manager::commit() locked for 3ms
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD PROXYSQL SERVERS TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
Standard Query Processor rev. 2.0.6.0805 -- Query_Processor.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL QUERY RULES TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
In memory Standard Query Cache (SQC) rev. 1.2.0905 -- Query_Cache.cpp -- Thu Jun 22 15:09:08 2023
Standard MySQL Monitor (StdMyMon) rev. 2.0.1226 -- MySQL_Monitor.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] For information about products and services visit: https://proxysql.com/
2023-06-28 13:27:29 [INFO] For online documentation visit: https://proxysql.com/documentation/
2023-06-28 13:27:29 [INFO] For support visit: https://proxysql.com/services/support/
2023-06-28 13:27:29 [INFO] For consultancy visit: https://proxysql.com/services/consulting/
2023-06-28 13:27:29 [INFO] Latest ProxySQL version available: 2.5.3-89-g86ce115
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-wait-for

# k8s-wait-for
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-wait-for` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-wait-for/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for waiting for a k8s service, job or pods to enter a desired state.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### proxysql-fips

# proxysql-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/proxysql-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/proxysql-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [proxysql](https://github.com/sysown/proxysql).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Compatibility Notes

This Chainguard Container differs from the external ProxySQL image in the following ways:  

**User and Group IDs:**
- Chainguard image runs as UID/GID `65532` (user `proxysql`, group `proxysql`)
- The external image typically runs as UID/GID `999`  

**Security Context:**
- Chainguard image runs as non-root by default (`run-as: proxysql`)
- Does not require root privileges

**File Permissions:**
- `/etc/proxysql.cnf`: `0640` (root:proxysql) - readable by proxysql group
- `/var/lib/proxysql`: `0755` (proxysql:proxysql) - writable by proxysql user
- `/etc/proxysql`: `0755` (proxysql:proxysql) - writable by proxysql user

### FIPS Support

The `proxysql-fips` Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Usage

With `Helm`:

```shell
helm repo add dysnix https://dysnix.github.io/charts/
helm repo update
helm install proxysql dysnix/proxysql \
    --namespace proxysql \
    --create-namespace \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/proxysql-fips \
    --set image.tag=latest \
    --set podSecurityContext.runAsUser=65532 \
    --set podSecurityContext.runAsGroup=65532 \
    --set podSecurityContext.fsGroup=65532 \
    --wait
```

Please note that [official Helm chart](https://github.com/ProxySQL/kubernetes/tree/master) is outdated and no longer maintaining.

When deploying with Helm charts, ensure you set the appropriate `podSecurityContext` to match the Chainguard image's UID/GID as shown in the example above.

With `Docker`:

```shell
$ docker run cgr.dev/chainguard/proxysql:latest
2023-06-28 13:27:29 [INFO] Using config file /etc/proxysql.cnf
Renaming database file /var/lib/proxysql/proxysql.db
2023-06-28 13:27:29 [INFO] Current RLIMIT_NOFILE: 1048576
2023-06-28 13:27:29 [INFO] Using OpenSSL version: OpenSSL 3.1.0 14 Mar 2023
2023-06-28 13:27:29 [INFO] No SSL keys/certificates found in datadir (/var/lib/proxysql). Generating new keys/certificates.
2023-06-28 13:27:29 [INFO] ProxySQL version 2.5.3-89-g86ce115
2023-06-28 13:27:29 [INFO] Detected OS: Linux d90ca7f378f8 5.15.49-linuxkit-pr #1 SMP PREEMPT Thu May 25 07:27:39 UTC 2023 aarch64
2023-06-28 13:27:29 [INFO] ProxySQL SHA1 checksum: 491223ebbd1a1dd43c69f24cefa2b269dde73162
2023-06-28 13:27:29 [INFO] SSL keys/certificates found in datadir (/var/lib/proxysql): loading them.
2023-06-28 13:27:29 [INFO] Loaded built-in SQLite3
Standard ProxySQL MySQL Logger rev. 2.5.0421 -- MySQL_Logger.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL Cluster rev. 0.4.0906 -- ProxySQL_Cluster.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL Statistics rev. 1.4.1027 -- ProxySQL_Statistics.cpp -- Thu Jun 22 15:09:08 2023
Standard ProxySQL HTTP Server Handler rev. 1.4.1031 -- ProxySQL_HTTP_Server.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Using UUID: 588c8cc0-1168-46e5-93b9-c53a0923686f , randomly generated. Writing it to database
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD ADMIN VARIABLES TO RUNTIME' was '0x3A8D4652D65FCE60', with epoch '1687958849'
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL VARIABLES TO RUNTIME' was '0xAA126AC5C26167ED', with epoch '1687958849'
Standard ProxySQL Admin rev. 2.0.6.0805 -- ProxySQL_Admin.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] ProxySQL SHA1 checksum: 491223ebbd1a1dd43c69f24cefa2b269dde73162
Standard MySQL Threads Handler rev. 0.2.0902 -- MySQL_Thread.cpp -- Thu Jun 22 15:09:08 2023
Standard MySQL Authentication rev. 0.2.0902 -- MySQL_Authentication.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL USERS TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
2023-06-28 13:27:29 [INFO] Dumping mysql_servers_incoming
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2023-06-28 13:27:29 [INFO] Dumping mysql_servers LEFT JOIN mysql_servers_incoming
+-------------+--------------+----------+------+
| mem_pointer | hostgroup_id | hostname | port |
+-------------+--------------+----------+------+
+-------------+--------------+----------+------+
2023-06-28 13:27:29 [INFO] Dumping mysql_servers JOIN mysql_servers_incoming
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | mem_pointer | gtid_port | weight | status | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+-------------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2023-06-28 13:27:29 [INFO] New mysql_group_replication_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_galera_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_aws_aurora_hostgroups table
2023-06-28 13:27:29 [INFO] New mysql_hostgroup_attributes table
2023-06-28 13:27:29 [INFO] MySQL_HostGroups_Manager::commit() locked for 3ms
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD PROXYSQL SERVERS TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
Standard Query Processor rev. 2.0.6.0805 -- Query_Processor.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] Computed checksum for 'LOAD MYSQL QUERY RULES TO RUNTIME' was '0x0000000000000000', with epoch '1687958849'
In memory Standard Query Cache (SQC) rev. 1.2.0905 -- Query_Cache.cpp -- Thu Jun 22 15:09:08 2023
Standard MySQL Monitor (StdMyMon) rev. 2.0.1226 -- MySQL_Monitor.cpp -- Thu Jun 22 15:09:08 2023
2023-06-28 13:27:29 [INFO] For information about products and services visit: https://proxysql.com/
2023-06-28 13:27:29 [INFO] For online documentation visit: https://proxysql.com/documentation/
2023-06-28 13:27:29 [INFO] For support visit: https://proxysql.com/services/support/
2023-06-28 13:27:29 [INFO] For consultancy visit: https://proxysql.com/services/consulting/
2023-06-28 13:27:29 [INFO] Latest ProxySQL version available: 2.5.3-89-g86ce115
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-azure-controller-fips

# cluster-api-azure-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-azure-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-azure-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Cluster API provider for Microsoft Azure infrastructure management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `cluster-api-azure-controller-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Compatibility Notes

Chainguard's cluster-api-azure-controller image is compatible with the upstream [Cluster API Provider Azure](https://github.com/kubernetes-sigs/cluster-api-provider-azure). This image contains only the minimum set of dependencies needed to run the Azure infrastructure provider components.

## Getting Started

The Cluster API Provider for Azure enables you to create and manage Kubernetes clusters on Microsoft Azure using Cluster API. It provides declarative APIs for provisioning and managing Azure infrastructure resources including Virtual Machines, Virtual Networks, and Load Balancers.

### Prerequisites

- A management cluster with Cluster API core components installed
- `clusterctl` CLI tool
- Microsoft Azure account with appropriate permissions
- Azure service principal credentials configured

### Installation

Initialize the Azure infrastructure provider using clusterctl:

```bash
clusterctl init --infrastructure azure
```

Or manually install using the Chainguard image by applying the InfrastructureProvider resource:

```bash
kubectl apply -f - <<EOF
apiVersion: operator.cluster.x-k8s.io/v1alpha2
kind: InfrastructureProvider
metadata:
  name: azure
  namespace: capz-system
spec:
  version: v1.20.2
  configSecret:
    name: capz-manager-bootstrap-credentials
  deployment:
    containers:
    - name: manager
      imageUrl: cgr.dev/ORGANIZATION/cluster-api-azure-controller-fips:latest
EOF
```

### Usage Example

Create an Azure cluster using Cluster API resources:

```yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureClusterIdentity
metadata:
  name: azure-identity
spec:
  type: ServicePrincipal
  allowedNamespaces:
    list:
      - azure-infrastructure-system
  clientID: "00000000-0000-0000-0000-000000000000"
  clientSecret:
    name: azure-credentials
    namespace: azure-infrastructure-system
  tenantID: "22222222-2222-2222-2222-222222222222"
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureCluster
metadata:
  name: my-azure-cluster
spec:
  identityRef:
    kind: AzureClusterIdentity
    name: azure-identity
  location: eastus
  resourceGroup: my-cluster-rg
  subscriptionID: "12345678-1234-1234-1234-123456789012"
  networkSpec:
    vnet:
      name: my-cluster-vnet
      cidrBlocks:
      - "10.0.0.0/8"
    subnets:
    - name: control-plane-subnet
      cidrBlocks:
      - "10.0.0.0/16"
      role: control-plane
    - name: node-subnet
      cidrBlocks:
      - "10.1.0.0/16"
      role: node
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureMachineTemplate
metadata:
  name: my-cluster-control-plane
spec:
  template:
    spec:
      vmSize: Standard_D2s_v3
      image:
        marketplace:
          publisher: cncf-upstream
          offer: capi
          sku: ubuntu-2004-gen1
          version: latest
      osDisk:
        osType: Linux
        diskSizeGB: 50
        managedDisk:
          storageAccountType: Premium_LRS
```

### Configuration

The controller requires an Azure service principal with the following permissions:
- Contributor role on the subscription or resource group
- Network Contributor role (if managing virtual networks)

Create and configure the credentials secret:

```bash
kubectl create secret generic capz-manager-bootstrap-credentials \
  --from-literal=clientSecret="$AZURE_CLIENT_SECRET" \
  --namespace capz-system

kubectl patch secret capz-manager-bootstrap-credentials \
  --namespace capz-system \
  --patch '{
    "data": {
      "clientId": "'$(echo -n "$AZURE_CLIENT_ID" | base64 -w0)'",
      "tenantId": "'$(echo -n "$AZURE_TENANT_ID" | base64 -w0)'",
      "subscriptionId": "'$(echo -n "$AZURE_SUBSCRIPTION_ID" | base64 -w0)'"
    }
  }'
```

## Documentation and Resources

* [Cluster API Provider Azure GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-provider-azure)
* [Cluster API Documentation](https://cluster-api.sigs.k8s.io/)
* [Microsoft Azure Documentation](https://docs.microsoft.com/en-us/azure/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cluster-api-ipam-provider-in-cluster

# cluster-api-ipam-provider-in-cluster
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cluster-api-ipam-provider-in-cluster` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cluster-api-ipam-provider-in-cluster/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An IPAM provider for Cluster API that manages pools of IP addresses using Kubernetes resources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's cluster-api-ipam-provider-in-cluster image is a drop-in replacement for the upstream Cluster API IPAM Provider In-Cluster - registry.k8s.io/capi-ipam-ic/cluster-api-ipam-in-cluster-controller. Chainguard's image contains only the minimum set of dependencies needed to run the IPAM provider manager.

## Getting Started

The Cluster API IPAM Provider In-Cluster manages IP address pools for Cluster API clusters using Kubernetes custom resources. It provides automatic IP address allocation and management for nodes and services within your cluster infrastructure.

### Basic Usage

You can test the container by running it directly:

```shell
docker run --rm cgr.dev/chainguard/cluster-api-ipam-provider-in-cluster:latest --help
```

### Deployment with Cluster API

The IPAM provider is typically deployed as part of a Cluster API management cluster. Initialize your management cluster with the required providers:

```bash
clusterctl init \
  --infrastructure docker \
  --ipam in-cluster \
  --core cluster-api \
  --bootstrap kubeadm \
  --control-plane kubeadm
```

### Creating IP Pools

Create IP pools using the `InClusterIPPool` custom resource:

```yaml
apiVersion: ipam.cluster.x-k8s.io/v1alpha2
kind: InClusterIPPool
metadata:
  name: my-ip-pool
  namespace: default
spec:
  addresses:
    - 10.0.0.0/24
  prefix: 24
  gateway: 10.0.0.1
```

Apply the IP pool configuration:

```bash
kubectl apply -f ippool.yaml
```

### Cluster Configuration

When creating clusters that use the IPAM provider, reference the IP pool in your cluster configuration:

```yaml
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: my-cluster

```

The IPAM provider will automatically:
- Monitor IP pool resources for changes
- Allocate IP addresses to cluster nodes as they're created
- Track IP address usage and availability
- Update pool status with allocation information

## Documentation and Resources

* [Cluster API IPAM Provider In-Cluster GitHub Repository](https://github.com/kubernetes-sigs/cluster-api-ipam-provider-in-cluster)
* [Cluster API IPAM Provider Documentation](https://cluster-api.sigs.k8s.io/developer/providers/contracts/ipam)
* [Cluster API Quick Start](https://cluster-api.sigs.k8s.io/user/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-iamguarded

# prometheus-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus is a monitoring system and time series database

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus IAMGuarded is a security-enhanced variant of Prometheus designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Prometheus deployments.

## Helm Chart Installation

The Prometheus IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Prometheus server image
server:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Thanos image for long-term storage (when enabled)
server:
  thanos:
    image:
      registry: myregistry.example.com
      repository: mirrored/thanos-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# Alertmanager image for alert management
alertmanager:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-alertmanager-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/prometheus:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Prometheus IAMGuarded installation using standard Prometheus verification methods. The deployment functions as a standard Prometheus instance, so all typical Prometheus validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Prometheus IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Prometheus and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Prometheus Server Configuration

When using the Kube-Prometheus chart, you can override the Prometheus server image under the `prometheus` section in your `values.yaml`:

```yaml
prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sql_exporter-fips

# sql_exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sql_exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sql_exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Database-agnostic SQL Exporter for Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
sql_exporter-fips  is the FIPS version of our SQL Exporter image, which is a database-agnostic SQL Exporter for Prometheus. which is a drop-in replacement for the [official sql_exporter image from Docker Hub](https://hub.docker.com/r/burningalchemist/sql_exporter). Like most other Chainguard Images, the SQL Exporter FIPS image has few-to-zero CVEs and does not run as the root user.

## Getting Started

To deploy Chainguard's SQL Exporter image with the official Helm chart, you can run a command like the following:

Add the Helm repo:
```shell
helm repo add sql_exporter https://burningalchemist.github.io/sql_exporter/
helm repo update
```

Prepare the custom values `values.yaml`
```shell
image:
  repository: cgr.dev/ORGANIZATION/sql_exporter
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Install the chart:

```shell
helm upgrade --install sql_exporter/sql-exporter -f values.yaml
```

Wait for the deployment to complete, and you should have the SQL Exporter running in your cluster.

```shell
kubectl wait --for condition=ready pod -l app.kubernetes.io/instance=sql-exporter --timeout=120s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### caddy-fips

# caddy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/caddy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/caddy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### buildkit

# buildkit
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/buildkit` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/buildkit/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Buildkit is a concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `buildkit` container image is comparable to the upstream [BuildKit image](https://hub.docker.com/r/moby/buildkit) maintained by Moby. As with other Chainguard Containers, the `buildkit` image was designed with minimalism in mind, and therefore doesn't contain things like a shell or package manager. The image has tags with prefix: `rootless` that corresponds to the upstream [Buildkit rootless image tag](https://hub.docker.com/r/moby/buildkit/tags).

## Getting Started

You can use the `buildkit` container image to run the BuildKit daemon with the following command:

```shell
docker run -d --name buildkitd --privileged cgr.dev/ORGANIZATION/buildkit:latest
```

This example includes the `-d` flag which tells Docker to run the container in the background.

Next, create a `BUILDKIT_HOST` environment variable, specifying the running container's address. This will set the BuildKit daemon as your remote builder:

```shell
export BUILDKIT_HOST=docker-container://buildkitd
```

Following that you can use the containerized daemon. As an example, create a Dockerfile:

```shell
cat > Dockerfile <<EOF
FROM scratch
EOF
```

Then run the following command to build an image using this Dockerfile:

```shell
buildctl build \
	--frontend=dockerfile.v0 \
	--local context=. \
	--local dockerfile=.
```
```
[+] Building 0.0s (2/2) FINISHED                                                         	 
 => [internal] load build definition from Dockerfile                                 	0.0s
 => => transferring dockerfile: 51B                                                  	0.0s
 => [internal] load .dockerignore                                                    	0.0s
 => => transferring context: 34B  
```

### Daemonless mode

You can also run the client and an ephemeral daemon in a single container. The BuildKit project refers to this method as "daemonless mode."

This method depends on using the `buildctl-daemonless.sh` script. Because Chainguard's standard `buildkit` variant does not have a shell, you will need to use the [development variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/) to use daemonless mode.

Again, if you don't already have a Dockerfile you can create one with the following command:

```shell
cat > Dockerfile <<EOF
FROM scratch
EOF
```

Then run a command like the following to build an image using this Dockerfile:

```shell
docker run \
  --rm \
  --privileged \
  -v $(pwd):/tmp/work \
  --entrypoint buildctl-daemonless.sh \
  cgr.dev/ORGANIZATION/buildkit:latest-dev \
  	build \
  	--frontend dockerfile.v0 \
  	--local context=/tmp/work \
  	--local dockerfile=/tmp/work
```
```
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 51B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 transferring context: 34B done
#2 DONE 0.0s
```

This example mounts the working directory to the container's `/tmp/work` directory and specifies the `buildctl-daemonless.sh` script as the entrypoint. Again, be sure to specify the `latest-dev` development variant of the `buildkit` image.

## Documentation and Resources

* [BuildKit Documentation](https://docs.docker.com/build/buildkit/)
* [BuildKit GitHub Repository](https://github.com/moby/buildkit)
* [Buildkit Rootless Documentation](https://github.com/moby/buildkit/blob/master/docs/rootless.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-alertmanager-iamguarded

# prometheus-alertmanager-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-alertmanager-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-alertmanager-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Alertmanager handles alerts sent by client applications such as the Prometheus server

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Alertmanager IAMGuarded is a security-enhanced variant of Alertmanager designed to be deployed using the Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Alertmanager deployments and is integrated as part of the complete Prometheus monitoring solution.

## Helm Chart Installation

The Alertmanager IAMGuarded image is deployed as part of the Prometheus IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Prometheus server image
server:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Thanos image for long-term storage (when enabled)
server:
  thanos:
    image:
      registry: myregistry.example.com
      repository: mirrored/thanos-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# Alertmanager image for alert management
alertmanager:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-alertmanager-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/prometheus
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/prometheus:VERSION
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Alertmanager IAMGuarded installation using standard Alertmanager verification methods. The deployment functions as a standard Alertmanager instance, so all typical Alertmanager validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Prometheus IAMGuarded chart (which includes Alertmanager) provides security-minded defaults while acknowledging the cluster-specific nature of both Prometheus, Alertmanager, and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Alertmanager Configuration

When using the Kube-Prometheus chart, you can override the Alertmanager image under the `alertmanager` section in your `values.yaml`:

```yaml
alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sealed-secrets-controller-fips

# sealed-secrets-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sealed-secrets-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sealed-secrets-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes controller and tool for one-way encrypted Secrets, enabling safe GitOps-friendly secret management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview
Sealed Secrets is used to safely manage encrypted Kubernetes Secrets and is designed to run as a native Kubernetes controller. Sealed Secrets FIPS is a FIPS 140-2 compliant, security-enhanced variant of Sealed Secrets. This image provides the Sealed Secrets Controller component.

## FIPS Compliance
This image is built with FIPS-validated cryptographic modules and uses `openssl-config-fipshardened` to enforce FIPS mode. The image will panic if FIPS mode cannot be initialized, ensuring compliance in regulated environments.

### Basic Installation

To deploy sealed secrets with the Chainguard image, create a `values.yaml` file with the image information - such as:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/sealed-secrets-controller-fips
  tag: latest
```

Then install the controller using Helm:

```shell
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets \
  --namespace kube-system \
  --create-namespace \
  -f values.yaml
```

This deploys the Sealed Secrets controller in the `kube-system` namespace using the specified image. This is the default namespace that `kubeseal` tool for encrypting secrets is expected, so changing the namespace will also require providing `--controller-namespace` argument to `kubeseal` whenever encrypting a secret.

## Encrypting Secrets
To encrypt a secret, use the `kubectl` to create a Kubernetes Secret YAML file (unless you already have it) and then use `kubeseal` CLI tool to encrypt it. Such as:

```shell
kubectl create secret generic \
  --namespace default mysecret \
  --dry-run=client \
  --from-literal=password=supersecret \
  -o yaml >secret.yaml

kubeseal <secret.yaml -o yaml >sealedsecret.yaml
```

This generates a `SealedSecret` that can be safely committed to version control.

### Applying Sealed Secrets
Once encrypted, apply the SealedSecret to your cluster:

```shell
kubectl apply -f mysealedsecret.yaml
```

The controller will decrypt it and create the actual Kubernetes Secret.

## Documentation and Resources
Please refer to the [upstream documentation](https://github.com/bitnami-labs/sealed-secrets) for more details.

For configuration options and full documentation, refer to the [Sealed Secrets Helm Chart on Artifact Hub](https://artifacthub.io/packages/helm/bitnami-labs/sealed-secrets).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-webhook-certgen-fips

# kube-webhook-certgen-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-webhook-certgen-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-webhook-certgen-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Forked version, maintained by ingress-nginx project!
NOTE: this is the ingress-nginx projects fork of `kube-webhook-certgen`. The
[original project](https://github.com/jet/kube-webhook-certgen) is no longer
maintained.

## Versioning Strategy
NOTE: This image follows semantic versioning aligned with the [ingress-nginx-controller images](https://images.chainguard.dev/directory/image/ingress-nginx-controller/versions). While the [ingress-nginx project](https://github.com/kubernetes/ingress-nginx/tree/main/images/kube-webhook-certgen) uses independent tagging for their build system, both implementations provide the same core functionality. The Chainguard version tags correspond to the ingress-nginx-controller releases to maintain consistency.

If you're migrating from the [original jet/kube-webhook-certgen project](https://github.com/jet/kube-webhook-certgen) (which is no longer maintained) or using Helm charts like [kube-prometheus-stack](https://artifacthub.io/packages/helm/prometheus-community/kube-prometheus-stack?modal=values&path=prometheusOperator.admissionWebhooks.patch.image) that reference older image versions, you can use our semantically tagged versions as drop-in replacements.

## Prometheus operator
Below is an example of how to deploy the prometheus operator, which utilizes
this image.

First, add the helm operator:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
```

Then, use the following Terraform configuration to deploy the Prometheus
Operator. Note, we're utilizing the[Chainguard prometheus operator image](https://images.chainguard.dev/directory/image/prometheus-operator/overview),
as well as the Chainguard kube-webhook-certgen image:

```bash
helm install prometheus-operator prometheus-community/kube-prometheus-stack \
  --set prometheusOperator.image.registry=cgr.dev \
  --set prometheusOperator.image.repository=chainguard/prometheus-operator \
  --set prometheusOperator.image.tag=latest
  --set prometheusOperator.admissionWebhooks.patch.image.registry=cgr.dev \
  --set prometheusOperator.admissionWebhooks.patch.image.repository=chainguard/kube-webhook-certgen-fips \
  --set prometheusOperator.admissionWebhooks.patch.image.tag=latest
```

For more information, refer to the following resources:
- [prometheus operator docs](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)
- [kube-webhook-certgen docs](https://github.com/kubernetes/ingress-nginx/tree/main/images/kube-webhook-certgen)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kaniko-warmer

# kaniko-warmer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kaniko-warmer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kaniko-warmer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Build Container Images In Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage

To use the warmer image, you can run it as a standalone pod with a volume mount to populate the cache. The following example demonstrates how to do this:

```bash
cat <<EOX | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: basecache-pvc
spec:
  resources:
    requests:
      storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
---
apiVersion: v1
kind: Pod
metadata:
  name: kaniko-warmer
spec:
  containers:
  - name: kaniko-warmer
    image: cgr.dev/ORGANIZATION/kaniko-warmer:latest
    args: ["--cache-dir=/cache",
           "--image=alpine"] # The image to pull to populate the cache
    volumeMounts:
      - name: basecache
        mountPath: /cache
  restartPolicy: Never
  volumes:
    - name: basecache
      persistentVolumeClaim:
        claimName: basecache-pvc
EOX
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-conformance

# kube-conformance
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-conformance` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-conformance/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for running Kubernetes conformance tests

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the official Kubernetes conformance tests and can be used as a drop-in replacement for `registry.k8s.io/conformance:latest`. It runs the same conformance test suite and supports the same environment variables for configuration.

## Getting Started

To run the conformance tests on your Kubernetes cluster, you can create a job with the following configuration:

```yaml
# First create a service account with appropriate permissions
apiVersion: v1
kind: ServiceAccount
metadata:
  name: conformance-serviceaccount
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: conformance-serviceaccount-cluster-admin
subjects:
- kind: ServiceAccount
  name: conformance-serviceaccount
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
# Then create the conformance test job
apiVersion: batch/v1
kind: Job
metadata:
  name: kube-conformance
  namespace: default
spec:
  template:
    spec:
      serviceAccountName: conformance-serviceaccount
      containers:
      - name: kube-conformance
        image: cgr.dev/chainguard/kube-conformance:latest
        env:
        - name: E2E_FOCUS
          value: "\\[Conformance\\]"
        - name: E2E_PARALLEL
          value: "1"
        - name: E2E_PROVIDER
          value: "local"
        - name: E2E_VERBOSITY
          value: "4"
        - name: RESULTS_DIR
          value: "/tmp/results"
        volumeMounts:
        - name: results
          mountPath: /tmp/results
      volumes:
      - name: results
        emptyDir: {}
      restartPolicy: Never
  backoffLimit: 0
```

The kube-conformance image can also be used with [Sonobuoy](https://sonobuoy.io/), which is a diagnostic tool that makes it easier to run the Kubernetes conformance tests:

```bash
# Install sonobuoy CLI
sonobuoy run --sonobuoy-image cgr.dev/chainguard/sonobuoy:latest --plugin-env=e2e.E2E_FOCUS="[Conformance]" --kube-conformance-image cgr.dev/chainguard/kube-conformance:latest

# Wait for completion
sonobuoy status

# Get results
outdir=$(sonobuoy retrieve)
sonobuoy results $outdir
```

## Documentation and Resources

The conformance tests can be configured with the following environment variables:

- `E2E_FOCUS`: Test filter to select which tests to run (default: `\[Conformance\]`)
- `E2E_PARALLEL`: Number of tests to run in parallel (default: `1`)
- `E2E_PROVIDER`: Kubernetes provider for the tests (default: `local`)
- `E2E_SKIP`: Tests to skip (default: none)
- `E2E_VERBOSITY`: Verbosity level for the tests (default: `4`)
- `KUBECONFIG`: Path to kubeconfig file (defaults to in-cluster config)
- `RESULTS_DIR`: Directory to store test results (default: `/tmp/results`)

Additional resources:

- [Kubernetes Conformance Tests Documentation](https://github.com/kubernetes/kubernetes/tree/master/test/conformance)
- [Sonobuoy Documentation](https://sonobuoy.io/docs/)
- [Kubernetes Conformance Program](https://www.cncf.io/certification/software-conformance/)
- [Certified Kubernetes Conformance Program](https://github.com/cncf/k8s-conformance)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tensorflow

# tensorflow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tensorflow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tensorflow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

An Open Source Machine Learning Framework for Everyone

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's TensorFlow CPU image is comparable to the [CPU accelerated TensorFlow image with Jupyter (`tensorflow/tensorflow:latest-jupyter`)](https://hub.docker.com/r/tensorflow/tensorflow/tags/?name=latest-jupyter) while the GPU image is comparable to the [`tensorflow/tensorflow:latest-gpu-jupyter`](https://hub.docker.com/r/tensorflow/tensorflow/tags/?name=latest-gpu-jupyter) image. 

Chainguard's TensorFlow CPU images have tags ending with `-cpu-jupyter` and the GPU images have tags ending with `-gpu-jupyter`. Note that the `latest` and `latest-dev` tags for Chainguard's TensorFlow image point to the GPU variant.

## Getting Started

### CPU

In order to use Chainguard's TensorFlow CPU variant image, run the following command in your project's directory:

```shell
docker run --rm --name=tensorflow-cpu -p 8888:8888 -v $(pwd):/tf cgr.dev/ORGANIZATION/tensorflow:2.18.0-cpu
```

You will need to retrieve the token from the logs of the container to access the Jupyter UI. The logs will look like this:

```shell
docker logs tensorflow-cpu
# truncated
[I 2025-01-24 16:20:06.742 ServerApp] Jupyter Server 2.15.0 is running at:
[I 2025-01-24 16:20:06.742 ServerApp] http://b7834ef33453:8888/tree?token=403a50321893cf6c986b0a1f7fd5862ef4f25bb9989d5b87
[I 2025-01-24 16:20:06.742 ServerApp]     http://127.0.0.1:8888/tree?token=403a50321893cf6c986b0a1f7fd5862ef4f25bb9989d5b87
[I 2025-01-24 16:20:06.742 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

You can then access the Jupyter UI by visiting the given URL. For example: `http://127.0.0.1:8888/tree?token=403a50321893cf6c986b0a1f7fd5862ef4f25bb9989d5b87`.

To visit the JupyterLab UI, we can click on `View` followed by `Open JupyterLab` to access the JupyterLab UI.

### GPU

In order to use Chainguard's TensorFlow CPU variant image, run the following command:

```shell
docker run --pull always --entrypoint bash -it --rm --gpus all  cgr.dev/ORGANIZATION/tensorflow:latest bash
```

Then, within the container, run the following commands:

```
nvidia-smi
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
```

You can also try running Python scripts. To illustrate, create a file named `test.py` and add the following content to it:

```
import tensorflow as tf
from tensorflow.keras import layers, models, datasets
import numpy as np

# Load a smaller subset of CIFAR-10
(x_train, y_train), (x_test, y_test) = datasets.cifar10.load_data()
x_train, y_train = x_train[:500], y_train[:500]
x_test, y_test = x_test[:100], y_test[:100]

# Normalize pixel values
x_train, x_test = x_train / 255.0, x_test / 255.0

# Convert to NumPy arrays and ensure correct dtype
x_train = np.array(x_train, dtype=np.float32)
x_test = np.array(x_test, dtype=np.float32)
y_train = np.array(y_train, dtype=np.int64).reshape(-1)
y_test = np.array(y_test, dtype=np.int64).reshape(-1)

# Build a very simple model
model = models.Sequential([
    layers.Flatten(input_shape=(32, 32, 3)),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# Train with a smaller batch size
print("Training the model on GPU...")
with tf.device('/GPU:0'):
    history = model.fit(x_train, y_train, epochs=1, batch_size=16)

# Evaluate
print("\nEvaluating the model on test data...")
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"\nTest accuracy: {test_acc * 100:.2f}%")
```

Then run the following command to execute the Python script:

```
python test.py
```

## Documentation and Resources

* [TensorFlow documentation for CPU-only images](https://www.tensorflow.org/install/docker#examples_using_cpu-only_images).
* [TensorFlow documentation for GPU-enabled images](https://www.tensorflow.org/install/docker#examples_using_gpu-enabled_images).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-keycloak-fips

# crossplane-keycloak-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-keycloak-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-keycloak-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Crossplane provider for Keycloak FIPS version

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

These images provide Crossplane providers for Keycloak.

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-keycloak
  namespace: crossplane-system
spec:
  package: cgr.dev/chainguard/crossplane-keycloak-fips:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keda

# keda
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keda` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keda/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the Keda binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image is a drop-in replacement for the KEDA manager available upstream at `ghcr.io/kedacore/keda`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### configmap-reload

# configmap-reload
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/configmap-reload` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/configmap-reload/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

`configmap-reload` is a simple binary to trigger a reload when Kubernetes ConfigMaps or Secrets, mounted into pods, are updated.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install my-release prometheus-community/alertmanager \
    --set configmapReload.enabled=true \
    --set configmapReload.image=cgr.dev/chainguard/configmap-reload \
    --set image.tag=latest
    <other configuration parameters here>
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm-operator

# helm-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `helm-operator` container image contains a Kubernetes operator for managing Helm releases. This container image uses a helm-operator implementation based on the operator-sdk framework, not the legacy FluxCD Helm Operator.

## Getting Started

Create a `watches.yaml` file that defines which custom resources the operator should watch:

```yaml
cat > watches.yaml <<EOF
---
- group: example.com
  version: v1
  kind: MyApp
  chart: helm-charts/myapp
EOF
```

Create a deployment manifest:

```yaml
cat > helm-operator-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helm-operator
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helm-operator
  template:
    metadata:
      labels:
        app: helm-operator
    spec:
      containers:
      - name: helm-operator
        image: cgr.dev/ORGANIZATION/helm-operator:latest
        command:
        - /usr/bin/helm-operator
        args:
        - run
        - --watches-file=/opt/watches.yaml
        volumeMounts:
        - name: watches
          mountPath: /opt/watches.yaml
          subPath: watches.yaml
      volumes:
      - name: watches
        configMap:
          name: helm-operator-watches
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: helm-operator-watches
  namespace: default
data:
  watches.yaml: |
    ---
    - group: example.com
      version: v1
      kind: MyApp
      chart: helm-charts/myapp
EOF
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry. Additionally, for information on creating secrets and deploying on Kubernetes, you can review our guide on [Authenticating to the Chainguard Registry](https://edu.chainguard.dev/chainguard/chainguard-registry/authenticating/#authenticating-with-kubernetes).

Deploy the operator:

```shell
kubectl apply -f helm-operator-deployment.yaml
```

## Documentation and Resources

- [Operator SDK Documentation](https://sdk.operatorframework.io/)
- [Helm Documentation](https://helm.sh/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-azure-fips

# cloud-provider-azure-controller-manager-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-azure-controller-manager-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-azure-controller-manager-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS Controller manager for Azure CLI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Where possible, the `cloud-provider-azure-controller-manager-fips` Chainguard Image is built for compatibility with [Microsoft's official image for `cloud-provider-azure-controller-manager`](https://oci.dag.dev/?image=mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager:v1.31.1).

## Getting Started

### Creating a self-managed k8s cluster in Azure

When creating a managed AKS cluster with `az aks create`, the daemonSet will default to using the upstream image at `mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager`. In order integrate this image with Azure, you will need to create a self-managed k8s cluster. After creation of this cluster, this image can be installed through the upstream helm chart with the following command.

```bash
cat <<EOF > values.yaml
cloudControllerManager:
  imageName: "cloud-provider-azure-controller-manager-fips"
  imageRepository: "cgr.dev"
  imageTag: "latest"

cloudNodeManager:
  imageName: "cloud-provider-azure-node-manager-fips"
  imageRepository: "cgr.dev"
  imageTag: "latest"
EOF
helm install --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --values values.yaml
```

## Documentation and Resources
* [Microsoft Azure Documentation: https://azure.github.io/azure-workload-identity/docs/installation/self-managed-clusters.html](https://azure.github.io/azure-workload-identity/docs/installation/self-managed-clusters.html)
* [Azure Architecture Blog: Self-managed Kubernetes on Azure](https://techcommunity.microsoft.com/t5/azure-architecture-blog/self-managed-kubernetes-on-azure/ba-p/3122730)
* [Blog: How to create a self-managed Kubernetes cluster in Azure manually](https://medium.com/@nabil.abdi/how-to-create-a-self-managed-kubernetes-cluster-in-azure-manually-48d91919142e)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### consul

# consul
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/consul` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/consul/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [Consul](https://www.consul.io/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Consul

The Chainguard Consul image contains the `consul` binary and a `docker-entrypoint.sh` script.

This script expects to be run as `root` and uses `su-exec` to drop permissions to a `consul` user itself.
The default entrypoint uses the entrypoint script.

```shell
$ docker run cgr.dev/chainguard/consul
==> Starting Consul agent...
              Version: '1.15.2'
           Build Date: '2023-03-30 17:51:19 +0000 UTC'
              Node ID: '82ed4fdf-4602-c15b-6547-6a85588a0de4'
            Node name: 'd1503dbb6c54'
           Datacenter: 'dc1' (Segment: '<all>')
               Server: true (Bootstrap: false)
          Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: 8502, gRPC-TLS: 8503, DNS: 8600)
         Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
    Gossip Encryption: false
     Auto-Encrypt-TLS: false
            HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2
             gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2
     Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2

==> Log data will now stream in as it occurs:
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### komodo

# komodo
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/komodo` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/komodo/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard images for [Komodo](https://github.com/moghtech/komodo), a DevOps platform for building and deploying software across multiple servers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Komodo images are comparable to the official Komodo images found in [the project's official GitHub repository](https://github.com/moghtech/komodo).

## Getting Started

Komodo is composed of multiple container images:

```shell
cgr.dev/$ORGANIZATION/komodo-core:latest
cgr.dev/$ORGANIZATION/komodo-periphery:latest
cgr.dev/$ORGANIZATION/komodo-frontend:latest
cgr.dev/$ORGANIZATION/komodo-cli:latest
```

| Image | Description |
|-------|-------------|
| `komodo-core` | Main API server with built-in web UI, handles authentication, database, and orchestration |
| `komodo-periphery` | Agent that runs on managed servers, executes deployments and reports system stats |
| `komodo-frontend` | Standalone nginx-based frontend (optional, core includes the UI) |
| `komodo-cli` | Command-line interface for interacting with Komodo API |

## Individual Component Usage

### komodo-core

The core server requires MongoDB and provides the web UI and API:

```bash
docker run -d \
  -p 9120:9120 \
  -e KOMODO_DATABASE_ADDRESS="mongodb:27017" \
  -e KOMODO_PASSKEY="your-secure-passkey" \
  -e KOMODO_JWT_SECRET="your-jwt-secret" \
  -e KOMODO_LOCAL_AUTH="true" \
  cgr.dev/$ORGANIZATION/komodo-core:latest
```

### komodo-periphery

The periphery agent runs on managed servers and connects to core:

```bash
docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e PERIPHERY_PORT="8120" \
  -e PERIPHERY_PASSKEYS="your-secure-passkey" \
  -e PERIPHERY_SSL_ENABLED="false" \
  cgr.dev/$ORGANIZATION/komodo-periphery:latest
```

### komodo-cli

The CLI interacts with the Komodo API using API keys:

```bash
docker run --rm \
  -e KOMODO_ADDRESS="http://your-komodo-core:9120" \
  -e KOMODO_API_KEY="your-api-key" \
  -e KOMODO_API_SECRET="your-api-secret" \
  cgr.dev/$ORGANIZATION/komodo-cli:latest servers list
```

### komodo-frontend

Standalone nginx frontend (optional, as core already includes the UI):

```bash
docker run -d -p 8080:8080 cgr.dev/$ORGANIZATION/komodo-frontend:latest
```

## Usage with Docker Compose

The following is an example of deploying Komodo with Docker Compose:

```yaml
version: "3.8"
services:
  mongodb:
    image: cgr.dev/$ORGANIZATION/mongodb:latest
    command: ["--dbpath", "/data", "--bind_ip_all"]
    volumes:
      - mongodb-data:/data

  komodo-core:
    image: cgr.dev/$ORGANIZATION/komodo-core:latest
    ports:
      - "9120:9120"
    environment:
      KOMODO_HOST: "http://localhost:9120"
      KOMODO_PORT: "9120"
      KOMODO_DATABASE_ADDRESS: "mongodb:27017"
      KOMODO_PASSKEY: "your-secure-passkey"
      KOMODO_JWT_SECRET: "your-jwt-secret"
      KOMODO_LOCAL_AUTH: "true"
      KOMODO_ENABLE_NEW_USERS: "true"
    depends_on:
      - mongodb

  komodo-periphery:
    image: cgr.dev/$ORGANIZATION/komodo-periphery:latest
    environment:
      PERIPHERY_PORT: "8120"
      PERIPHERY_PASSKEYS: "your-secure-passkey"
      PERIPHERY_SSL_ENABLED: "false"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  mongodb-data:
```

Be sure to replace `$ORGANIZATION` with the name used for your organization's private repository within the Chainguard registry.

## Documentation and Resources

Please refer to the [upstream documentation](https://github.com/moghtech/komodo) for full instructions on how to use and deploy Komodo.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-vllm-backend-fips

# tritonserver-vllm-backend-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-vllm-backend-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-vllm-backend-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution with vllm backend

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting started
The Triton Server with vLLM backend container provides GPU-accelerated large language model inference through NVIDIA's Triton Inference Server with the vLLM backend for optimized performance.

### Basic vLLM Model Serving

Set up a simple vLLM model repository and serve the `facebook/opt-125m` model:

```bash
# Create model repository structure
mkdir -p model_repository/vllm_model/1

# Download model configuration
wget -P model_repository/vllm_model/1 https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/model_repository/vllm_model/1/model.json
wget -P model_repository/vllm_model https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/model_repository/vllm_model/config.pbtxt

# Start Triton server with vLLM backend
docker run --gpus all -d \
  --name triton-vllm \
  -p 8000:8000 -p 8001:8001 -p 8002:8002 \
  --shm-size=1G --ulimit memlock=-1 --ulimit stack=67108864 \
  -v $(pwd):/workspace -w /workspace \
  cgr.dev/ORGANIZATION/tritonserver-vllm-backend-fips:latest \
  --model-repository ./model_repository
```

The server will take 2-5 minutes to initialize as it downloads and loads the model.

### Health Check and Model Status

Check if the server and model are ready:

```bash
# Check server health
curl http://localhost:8000/v2/health/ready

# Check model status
curl http://localhost:8000/v2/models/vllm_model/ready

# Get model metadata
curl http://localhost:8000/v2/models/vllm_model
```

### gRPC Client Inference

Test text generation using the gRPC interface:

```bash
# Download sample client and prompts
wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/client.py
wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/prompts.txt

# Run client (requires tritonclient[grpc])
docker run --rm --net=host \
  -v $(pwd):/workspace -w /workspace \
  --entrypoint python3 \
  python:3.12-slim \
  -c "pip install tritonclient[grpc] && python3 client.py -u localhost:8001"
```

Refer to the [vLLM documentation](https://docs.vllm.ai/) for detailed configuration options.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vitess-lite

# vitess-lite
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vitess-lite` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vitess-lite/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Vitess is a database clustering system for horizontal scaling of MySQL through generalized sharding.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy Vitess on Kubernetes, you can use the [Vitess Operator for Kubernetes](https://vitess.io/docs/get-started/operator/).

> [!WARNING]
> For the best experience, please refer to the [Vitess Operator Compatibility Matrix](https://github.com/planetscale/vitess-operator#compatibility) to ensure compatibility between your version of Vitess and Kubernetes.

Let's follow the official [Operator Example](https://github.com/vitessio/vitess/tree/main/examples/operator) to deploy a Vitess cluster:

1. Install the Operator

```shell
kubectl apply -f https://raw.githubusercontent.com/vitessio/vitess/refs/heads/main/examples/operator/operator.yaml
```

2. Download the `VitessCluster` resource

```shell
curl -sLO https://raw.githubusercontent.com/vitessio/vitess/refs/heads/main/examples/operator/101_initial_cluster.yaml
```

3. Replace the images with the Chainguard Image

```shell
sed -i "s|vitess/lite:v<CURRENT_VITESS_VERSION>|cgr.dev/chainguard/vitess-lite:latest|g" 101_initial_cluster.yaml
```

4. Apply the resource

```shell
kubectl apply -f 101_initial_cluster.yaml
```

5. Check the status of the cluster

```shell
NAME                                                         READY   STATUS    RESTARTS   AGE
example-commerce-x-x-zone1-vtorc-c13ef6ff-5dc567c466-h8xbx   1/1     Running   0          86s
example-etcd-faf13de3-1                                      1/1     Running   0          101s
example-etcd-faf13de3-2                                      1/1     Running   0          106s
example-etcd-faf13de3-3                                      1/1     Running   0          106s
example-vttablet-zone1-2469782763-bfadd780                   3/3     Running   0          86s
example-vttablet-zone1-2548885007-46a852d0                   3/3     Running   0          86s
example-zone1-vtadmin-c03d7eae-6db4c646bc-vmdj6              2/2     Running   0          106s
example-zone1-vtctld-1d4dcad0-5b797d9f9b-7svm9               1/1     Running   0          106s
example-zone1-vtgate-bc6cde92-659bbdbb5d-6xtzh               1/1     Running   0          86s
vitess-operator-68dd5f96-4v5sz                               1/1     Running   0          4h46m
```

6. Create a [sample schema](https://vitess.io/docs/get-started/operator/#setup-port-forward) to ensure the cluster is operational

```shell
POD_NAME=$(kubectl get pods -l planetscale.com/component=vtctld -o jsonpath="{.items[0].metadata.name}")
SVC_NAME=$(kubectl get svc -l planetscale.com/component=vtctld -o jsonpath="{.items[0].metadata.name}")
VTGATE_SVC_NAME=$(kubectl get svc -l planetscale.com/component=vtgate -o jsonpath="{.items[0].metadata.name}")
kubectl exec -it $POD_NAME -- bash -c "cd /tmp && curl -sLO https://raw.githubusercontent.com/vitessio/vitess/refs/heads/main/examples/operator/create_commerce_schema.sql"
kubectl exec -it $POD_NAME -- bash -c "cd /tmp && curl -sLO https://raw.githubusercontent.com/vitessio/vitess/refs/heads/main/examples/operator/vschema_commerce_initial.json"
kubectl exec -it $POD_NAME -- bash -c "cd /tmp && vtctldclient --server=$SVC_NAME.default.svc.cluster.local:15999 ApplySchema --sql-file="create_commerce_schema.sql" commerce"
kubectl exec -it $POD_NAME -- bash -c "cd /tmp && vtctldclient --server=$SVC_NAME.default.svc.cluster.local:15999 ApplyVSchema --vschema-file="vschema_commerce_initial.json" commerce"
kubectl exec -it $POD_NAME -- bash -c "mysql -h $VTGATE_SVC_NAME.default.svc.cluster.local -P 3306 -u user -e 'SHOW DATABASES;'" | grep "commerce"
```

## Error Logs

While testing the image, we noticed that the following error-severity logs also appear in the official upstream `vitess/lite` image:

- `Config File "vtconfig" Not Found in "[/]".`
- `can't connect to syslog`
- `Client received GoAway with error`
- `Cannot start query service: Unknown database 'vt_commerce'`
- `unable to connect to tablet`
- `Error transitioning to the desired state`

But eventually, the cluster becomes operational, all Pods are Ready and Running, and the schema is created successfully.

### Notes

This image includes percona-server which is bundled with the DBD::Module

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### akhq-fips

# akhq-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/akhq-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/akhq-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using akhq-fips

AKHQ provides two upstream methods for installing: Helm or Docker.

The Chainguard Containers for AKHQ are designed to be a drop in replacement for either method. To use them, simply replace the appropriate `image:` path with the Chainguard specific AKHQ image. Below is an example values file for doing this with helm:

```yaml
image:
  repository: "cgr.dev/chainguard/akhq-fips"
  tag: "latest"
```

Using the above values, the helm commands become, to install Argo Workflows:

```bash
helm repo add akhq https://akhq.io/

helm install akhq akhq/akhq \
	--namespace akhq \
	--create-namespace \
  --set image.repository="cgr.dev/chainguard/akhq-fips"
  --set image.tag="latest"
```

Using Docker:

```bash
docker run -d \
    -p 8080:8080 \
    -v /tmp/application.yml:/usr/share/java/akhq/application.yml \
    cgr.dev/chainguard/akhq-fips:latest
```

> NOTE: Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### buildkit-fips

# buildkit-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/buildkit-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/buildkit-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Buildkit is a concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `buildkit-fips` container image is comparable to the upstream [BuildKit image](https://hub.docker.com/r/moby/buildkit) maintained by Moby. As with other Chainguard Containers, the `buildkit-fips` image was designed with minimalism in mind, and therefore doesn't contain things like a shell or package manager.

### FIPS Support

The `buildkit-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can use the `buildkit-fips` container image to run the BuildKit daemon with the following command:

```shell
docker run -d --name buildkitd --privileged cgr.dev/ORGANIZATION/buildkit-fips:latest
```

This example includes the `-d` flag which tells Docker to run the container in the background.

Next, create a `BUILDKIT_HOST` environment variable, specifying the running container's address. This will set the BuildKit daemon as your remote builder:

```shell
export BUILDKIT_HOST=docker-container://buildkitd
```

Following that you can use the containerized daemon. As an example, create a Dockerfile:

```shell
cat > Dockerfile <<EOF
FROM scratch
EOF
```

Then run the following command to build an image using this Dockerfile:

```shell
buildctl build \
	--frontend=dockerfile.v0 \
	--local context=. \
	--local dockerfile=.
```
```
[+] Building 0.0s (2/2) FINISHED                                                         	 
 => [internal] load build definition from Dockerfile                                 	0.0s
 => => transferring dockerfile: 51B                                                  	0.0s
 => [internal] load .dockerignore                                                    	0.0s
 => => transferring context: 34B  
```

### Daemonless mode

You can also run the client and an ephemeral daemon in a single container. The BuildKit project refers to this method as "daemonless mode."

This method depends on using the `buildctl-daemonless.sh` script. Because Chainguard's standard `buildkit-fips` variant does not have a shell, you will need to use the [development variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/) to use daemonless mode.

Again, if you don't already have a Dockerfile you can create one with the following command:

```shell
cat > Dockerfile <<EOF
FROM scratch
EOF
```

Then run a command like the following to build an image using this Dockerfile:

```shell
docker run \
  --rm \
  --privileged \
  -v $(pwd):/tmp/work \
  --entrypoint buildctl-daemonless.sh \
  cgr.dev/ORGANIZATION/buildkit-fips:latest-dev \
  	build \
  	--frontend dockerfile.v0 \
  	--local context=/tmp/work \
  	--local dockerfile=/tmp/work
```
```
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 51B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 transferring context: 34B done
#2 DONE 0.0s
```

This example mounts the working directory to the container's `/tmp/work` directory and specifies the `buildctl-daemonless.sh` script as the entrypoint. Again, be sure to specify the `latest-dev` development variant of the `buildkit-fips` image.

## Documentation and Resources

* [BuildKit Documentation](https://docs.docker.com/build/buildkit/)
* [BuildKit GitHub Repository](https://github.com/moby/buildkit)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-secret-generator

# kubernetes-secret-generator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-secret-generator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-secret-generator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller for automatically generating and updating secrets

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-secret-generator` container image is comparable to the [mittwald/kubernetes-secret-generator](https://quay.io/repository/mittwald/kubernetes-secret-generator?tab=tags&tag=latest) image on quay.io, with the following differences:

* Like all other Chainguard Containers, `kubernetes-secret-generator` features a stripped down, minimal design
* It has few-to-zero CVEs

## Getting Started

To get started with `kubernetes-secret-generator`, we can leverage the official Helm chart provided by Mittwald. Below is a simple example of how to deploy `kubernetes-secret-generator` using Helm.

Let's start by adding the Helm chart repository: 

```bash
helm repo add mittwald https://helm.mittwald.de
helm repo update
```

Next, we can install the `kubernetes-secret-generator` chart:

```bash
helm install my-secret-generator mittwald/kubernetes-secret-generator \
  --set image.registry=cgr.dev \
  --set image.repository=ORGANIZATION/kubernetes-secret-generator \
  --set image.tag=latest
```

Make sure to replace `ORGANIZATION` with your actual organization name in the Chainguard Registry.

Let's verify that the deployment was successful:

```bash
kubectl get pods -l app.kubernetes.io/name=kubernetes-secret-generator
```

You should see a pod running for the `kubernetes-secret-generator`.

To test the functionality, you can create a dummy `Secret` resource. Here's an example YAML file:

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: string-secret
  annotations:
    secret-generator.v1.mittwald.de/autogenerate: password
data:
  username: c29tZXVzZXI=
```

once you apply this YAML file, the `kubernetes-secret-generator` will automatically generate a password and add it to the `Secret`.

```bash
kubectl apply -f secret.yaml
```

You can then check the generated secret:

```bash
kubectl get secret string-secret -o yaml
```

You should see the generated password in the output.

## Documentation and Resources

- **[Official Documentation](https://github.com/mittwald/kubernetes-secret-generator/tree/master?tab=readme-ov-file#automatically-generated-secrets-for-kubernetes)**
- **[GitHub Repository](https://github.com/mittwald/kubernetes-secret-generator)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### shadowsocks-rust

# shadowsocks-rust
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/shadowsocks-rust` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/shadowsocks-rust/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Shadowsocks-rust is a Rust implementation of the Shadowsocks protocol, aimed at ensuring secure and private internet access by encrypting connections and circumventing internet restrictions.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

Create a configuration file `config.json`:

```bash
cat <<EOF > config.json
{
    "server": "127.0.0.1",
    "server_port": 8388,
    "local_port": 1080,
    "local_address": "127.0.0.1",
    "password": "password",
    "timeout": 300,
    "method": "aes-256-gcm"
}
EOF
```

* Start the `sslocal`:

```bash
docker run \
  --name sslocal-rust \
  --restart always \
  -p 1080:1080/tcp \
  -v /path/to/config.json:/etc/shadowsocks-rust/config.json \
  -dit cgr.dev/chainguard/shadowsocks-rust-ssserver:latest
```

* Start the `ssserver`:

```bash
docker run \
  --name ssserver-rust \
  --restart always \
  -p 8388:8388/tcp \
  -p 8388:8388/udp \
  -v /path/to/config.json:/etc/shadowsocks-rust/config.json \
  -dit cgr.dev/chainguard/shadowsocks-rust-sslocal:latest
```

Jump to the official [Getting Started](https://github.com/shadowsocks/shadowsocks-rust?tab=readme-ov-file#getting-started) guide for more detailed usage.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-infrastructure-bundle-fips

# newrelic-infrastructure-bundle-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-infrastructure-bundle-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-infrastructure-bundle-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-infrastructure-bundle](https://github.com/newrelic/infrastructure-bundle) container image with FIPS-compliant cryptography.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `newrelic-infrastructure-bundle-fips` container image is comparable to [the newrelic-infrastructure-bundle image maintained by Newrelic](https://hub.docker.com/r/newrelic/infrastructure-bundle). Like most other Chainguard container images, the newrelic-infrastructure-bundle-fips image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

**Important:** The FIPS image is built with JDK 11 to achieve container-level FIPS compliance, not JDK 8 which relied on kernel-level FIPS. This architectural change ensures FIPS cryptographic validation is enforced at the container level, independent of the underlying host system. The Java integrations included in this bundle (such as `nri-jmx`) leverage the BouncyCastle FIPS provider for cryptographic operations.

## FIPS Support

The `newrelic-infrastructure-bundle-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module and BouncyCastle FIPS for Java cryptography. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle-fips
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output-fips
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoria-metrics

# victoria-metrics
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoria-metrics` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoria-metrics/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

VictoriaMetrics standalone image is a fast, cost-effective and scalable monitoring solution and time series database

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's victoria-metrics standalone image is comparable to the [upstream victoria-metrics image](https://hub.docker.com/r/victoriametrics/victoria-metrics). Switching to the Chainguard image should not require any changes to your existing setup. 

## Getting Started
### Helm chart
You can install victoria-metrics using the [standalone helm chart](https://github.com/VictoriaMetrics/helm-charts/tree/master/charts/victoria-metrics-single), you can use a `values.yaml` like the one below, to change the image.
```
server:
  image:
    registry: cgr.dev/ORGANIZATION
    repository: victoria-metrics
    tag: latest
```
To install the helm chart, use:
```
helm install vm oci://ghcr.io/victoriametrics/helm-charts/victoria-metrics-single --namespace victoriametrics --create-namespace -f values.yaml
```
### Docker 
```
docker run -it --rm -v /path/to/victoria-metrics-data:/victoria-metrics-data -p 8428:8428 cgr.dev/ORGANIZATION/victoria-metrics:latest
```
This will run the service on port 8428, all the data will be stored at /path/to/victoria-metrics-data.

## Documentation and Resources
- [Upstream Documentation](https://docs.victoriametrics.com/victoriametrics/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-pushgateway-iamguarded-fips

# prometheus-pushgateway-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-pushgateway-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-pushgateway-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Push acceptor for ephemeral and batch jobs.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-pushgateway-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Docker

Run the Pushgateway with Docker:

```shell
docker run -d --name pushgateway -p 9091:9091 cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded-fips:latest
```

Push a metric to the gateway. The URL format is `/metrics/job/<job_name>`:

```shell
echo 'my_job_batch_size 100' | curl -X POST --data-binary @- http://localhost:9091/metrics/job/my_job
```

Verify the metric was received:

```shell
curl http://localhost:9091/metrics | grep my_job_batch_size
```

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/prometheus-pushgateway-iamguarded-fips
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install pushgateway prometheus-community/prometheus-pushgateway -f values.yaml
```

## Documentation and Resources

- [Prometheus Pushgateway Documentation](https://prometheus.io/docs/instrumenting/pushing/)
- [Prometheus Documentation](https://prometheus.io/docs/)
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-2354

# request-2354
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-2354` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-2354/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Cilium](https://cilium.io/) is an open source, cloud native solution for providing, securing, and observing network connectivity between workloads using eBPF.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Cilium Containers

Cilium is open source software for transparently securing the network connectivity between application services deployed using Linux container management platforms like Docker and Kubernetes. At the foundation of Cilium is a new Linux kernel technology called eBPF (short for Extended Berkely Package Filter), which enables the dynamic insertion of powerful security visibility and control logic within Linux itself. Because eBPF runs inside the Linux kernel, Cilium security policies can be applied and updated without any changes to the application code or container configuration.

Hubble is a fully distributed networking and security observability platform built on top of Cilium and eBPF to enable deep visibility into the communication and behavior of services as well as the networking infrastructure in a completely transparent manner.

For details on how you can work with these Cilium container images, check out our guide on [Getting Started with the Cilium Chainguard Containers](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/cilium/) on Chainguard Academy.

Chainguard offers several Cilium images, as described in the next sections. 

## cilium-agent

Cilium agents serve as the core data-plane component of Cilium, deployed as a DaemonSet on every node within the cluster. These agents implement the Kubernetes Container Networking Interface (CNI) and are responsible for several critical functions:

- **Network Policy Enforcement**: Implements and enforces network security policies using eBPF programs loaded into the Linux kernel
- **Load Balancing**: Provides Layer 3, 4, and 7 load balancing capabilities for services
- **Service Mesh Integration**: Offers transparent service mesh functionality without requiring application changes
- **IP Address Management (IPAM)**: Manages IP address allocation for pods across the cluster
- **Network Connectivity**: Establishes secure network connectivity between pods, both within and across nodes

Each agent contains an embedded Hubble server that provides deep visibility into network traffic, security events, and the overall health of the Kubernetes cluster. The agents communicate with the Cilium operator for cluster-wide coordination and with the Linux kernel through eBPF programs for high-performance data path operations.

## cilium-operator-generic

The Cilium operator serves as the centralized control plane component of Cilium, deployed as a single instance (or in high-availability mode) to manage cluster-wide operations. This generic operator variant is cloud-agnostic and provides several key functions:

- **Resource Management**: Creates, updates, and manages Cilium Custom Resource Definitions (CRDs) including CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy, and CiliumEndpoint resources
- **Network Policy Compilation**: Translates Kubernetes NetworkPolicy and Cilium-specific policies into eBPF programs that are distributed to agents
- **Certificate Management**: Handles TLS certificate lifecycle for secure communication between Cilium components

This generic variant works across different cloud providers and on-premises environments, making it suitable for multi-cloud or hybrid deployments where cloud-specific integrations are not required.

## cilium-operator-aws

The AWS-specific Cilium operator extends the core control plane functionality with deep integration into AWS services and infrastructure. In addition to all the capabilities of the generic operator, this variant provides specialized AWS features:

- **ENI Management**: Integrates with AWS Elastic Network Interface (ENI) allocation and management for advanced networking scenarios
- **VPC Integration**: Leverages AWS VPC routing and security groups for enhanced network isolation and policy enforcement
- **AWS Load Balancer Integration**: Coordinates with AWS Application Load Balancer (ALB) and Network Load Balancer (NLB) for service exposure
- **IAM Integration**: Utilizes AWS Identity and Access Management (IAM) roles and policies for secure access to AWS APIs
- **EKS Optimization**: Includes specific optimizations and integrations for Amazon Elastic Kubernetes Service (EKS) clusters

This operator is specifically designed for production workloads running on AWS infrastructure where native cloud integration is required for optimal performance, security, and operational efficiency.

## cilium-hubble-relay

Hubble Relay serves as the central aggregation and coordination service for network observability data across the entire Kubernetes cluster. It acts as an intermediary between the distributed Hubble servers (embedded in each Cilium agent) and observability clients, providing several critical functions:

- **gRPC API Gateway**: Exposes a unified gRPC API that clients can use to query network flows, security events, and service dependencies across the entire cluster
- **Load Balancing**: Distributes observability queries across multiple Hubble servers to ensure optimal performance and availability
- **Data Filtering and Querying**: Provides advanced filtering capabilities allowing users to query specific network flows, protocols, security events, or time ranges
- **Multi-Cluster Support**: In ClusterMesh deployments, aggregates observability data from multiple connected Kubernetes clusters

Hubble Relay is essential for any deployment requiring comprehensive network observability, enabling tools like the Hubble CLI and Hubble UI to provide insights into application connectivity, performance, and security across the entire infrastructure.

## cilium-hubble-ui

The Hubble UI is a modern, web-based visualization platform built as a ReactJS application and served through nginx. It provides an intuitive, graphical interface for network administrators, security teams, and developers who need to understand, monitor, and troubleshoot network connectivity and security policies in their Kubernetes environments.

## cilium-hubble-ui-backend

The Hubble UI Backend serves as the data processing and API layer that bridges the gap between raw network observability data and the user-friendly Hubble UI interface. This backend component is essential for the Hubble UI to function effectively, handling the computational complexity of processing network observability data while providing a clean, performant interface for the React-based frontend.

## cilium-clustermesh-apiserver

Cilium Cluster Mesh connects multiple Kubernetes clusters, allowing pods in one cluster to access services in others, as long as all clusters use Cilium as their CNI. This is achieved by deploying a clustermesh-apiserver to sync shared state across clusters:

- **Multi-Cluster Service Discovery**: Enables services in one cluster to discover and connect to services running in other clusters, creating a unified service mesh across cluster boundaries
- **Cross-Cluster Load Balancing**: Distributes traffic across service endpoints that span multiple clusters, providing high availability and optimal resource utilization
- **Shared Identity Management**: Synchronizes security identities across clusters, ensuring consistent network policy enforcement in multi-cluster scenarios
- **Secure Communication**: Establishes secure, encrypted communication channels between clusters using mutual TLS authentication
- **Service Export/Import**: Manages which services are exported from each cluster and which remote services are imported for local consumption

The ClusterMesh API Server is deployed as a LoadBalancer service in each participating cluster, enabling Cilium agents across clusters to establish secure connections and exchange routing information. This creates a transparent, scalable solution for multi-cluster deployments without requiring complex VPN setups or network overlays.

## Documentation and Resources

Refer to the [Cilium docs on cilium.io](https://cilium.io/) and their [GitHub repository](https://github.com/cilium/cilium) for more information about this software.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-prometheus-configurator

# newrelic-prometheus-configurator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-prometheus-configurator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-prometheus-configurator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-prometheus-configurator](https://github.com/newrelic/newrelic-prometheus-configurator) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle). chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: chainguard/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/chainguard/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: chainguard/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: chainguard/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-dns-iamguarded-fips

# external-dns-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-dns-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-dns-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image to configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

external-dns IAMGuarded is a security-enhanced variant of external-dns designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard external-dns deployments.

## Helm Chart Installation

The external-dns IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install external-dns oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
# Main external-dns image
image:
  repository: $ORGANIZATION/external-dns-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main external-dns image
image:
  registry: myregistry.example.com
  repository: mirrored/external-dns-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```
#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install external-dns oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/external-dns
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/external-dns:8.8.2
   Digest: sha256:c36ed7e1c6c82782fa91aabeacf0107fd1c2bfeaca601109281845124cba8481
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your external-dns IAMGuarded installation using standard external-dns verification methods. The deployment functions as a standard external-dns instance, so all typical external-dns validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The external-dns IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both external-dns and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-bench

# kube-bench
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-bench` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-bench/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [kube-bench](https://github.com/aquasecurity/kube-bench).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### az

# az
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/az` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/az/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Azure CLI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Azure Command-Line Interface (CLI) used to create and manage Azure resources.
The Azure CLI is available across Azure services and is designed to get you
working quickly with Azure, with an emphasis on automation.

### Docker setup

To make sure you have the latest image version available, start by running a `docker pull` command:

```shell
docker pull cgr.dev/chainguard/az
```

Then, run the image with the `--version` flag to make sure it is functional:

```shell
docker run -it --rm cgr.dev/chainguard/az --version
```
You should get output similar to this:

```
azure-cli                         2.55.0

core                              2.55.0
telemetry                          1.1.0
...
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-operator-fips

# grafana-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Usage

Use `kubectl` to create a namespace to be used by Grafana Operator:

```bash
kubectl create ns grafana-operator
```

Deploy Grafana Operator within the namespace with the Helm chart:

> The upstream helm chart is not tagged with `latest` so we need to set the version explicitly. Always use the [latest supported version of the chart](https://grafana.github.io/grafana-operator/docs/installation/helm/).

```bash
  helm upgrade \
    -n grafana-operator \
    -i grafana-operator oci://ghcr.io/grafana/helm-charts/grafana-operator \
    --version v5.16.0 \
    --set image.repository=cgr.dev/ORGANIZATION/grafana-operator-fips \
    --set image.tag=latest
```

For more documentation, checkout the [official documentation](https://grafana.github.io/grafana-operator/docs/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics

# victoriametrics
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

VictoriaMetrics can be deployed as a single node (all image tags without a "-cluster" suffix) or as a distributed cluster. See the github repository for reference: https://github.com/VictoriaMetrics/VictoriaMetrics/tree/master as well as their public facing documentation: https://docs.victoriametrics.com/

In clustered mode, the VictoriaMetrics application itself is broken into 3 different services:
* vmstorage - stores the raw data and returns the queried data on the given time range for the given label filters
* vminsert - accepts the ingested data and spreads it among vmstorage nodes according to consistent hashing over metric name and all its labels
* vmselect - performs incoming queries by fetching the needed data from all the configured vmstorage nodes
* vmalert - executes a list of given alerting / monitoring rules against Prometheus HTTP API

This image group also contains several standalone services (that DO vary between clustered and single mode):
* vmagent - A lightweight metrics collection agent.
* vmauth - A service that provides authentication and authorization for VictoriaMetrics services. It acts as HTTP proxy, which can authorize, route and load balance requests across VictoriaMetrics components or any other HTTP backends.

## Usage

You can install the VictoriaMetrics components using Helm. Below are the Helm install commands for each component:

### Install `vmagent`

```bash
helm install vmagent victoria-metrics-agent --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics \
  --set image.repository=cgr.dev/chainguard-private/victoriametrics-vmagent \
  --set image.tag=latest
```

### Install `vmauth`

```bash
helm install vmauth victoria-metrics-auth --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics \
  --set image.repository=cgr.dev/chainguard-private/victoriametrics-vmauth \
  --set image.tag=latest
```

Note: You will need to set the config and for sample testing purpose, you can take inspiration from this example:

```bash
cat <<YAML | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: vmauth-config
  namespace: victoriametrics
data:
  auth.yml: |
    users:
      - username: "user1"
        password: "pass1"
        url_prefix: "http://localhost:8428/"
      - username: "user2"
        password: "pass2"
        url_prefix: "http://localhost:8429/"
    unauthorized_user:
      url_prefix: "http://localhost:8428/"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vmauth
  namespace: victoriametrics
spec:
  selector:
    matchLabels:
      app: vmauth
  template:
    metadata:
      labels:
        app: vmauth
    spec:
      containers:
      - name: vmauth
        image: cgr.dev/chainguard-private/victoriametrics-vmauth:latest
        args:
          - "-auth.config=/config/auth.yml"
        ports:
        - containerPort: 8427
        volumeMounts:
        - name: vmauth-config
          mountPath: /config
      volumes:
      - name: vmauth-config
        configMap:
          name: vmauth-config
YAML
```

### Install `vminsert`, `vmselect`, `vmstorage`

```bash
helm install vminsert victoria-metrics-cluster --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics-cluster \
  --set vminsert.image.repository=cgr.dev/chainguard-private/victoriametrics-vminsert \
  --set vminsert.image.tag=latest \
  --set vminsert.image.variant="" \
  --set vmselect.image.repository=cgr.dev/chainguard-private/victoriametrics-vmselect \
  --set vmselect.image.tag=latest \
  --set vmselect.image.variant="" \
  --set vmstorage.image.repository=cgr.dev/chainguard-private/victoriametrics-vmstorage \
  --set vmstorage.image.tag=latest \
  --set vmstorage.image.variant=""
```

Note: We use `vmstorage.image.variant=""` because our images are already coming with `cluster` suffix, so we no longer need to specify it. For further reference, refer to [official docs](https://docs.victoriametrics.com)

### Install `vmalert`

You can use [this example](https://docs.victoriametrics.com/victoriametrics-cloud/alerting-vmalert-victoria-metrics-cloud/#helm-chart) and override the image to
use chainguard images like shown below. Note the server.config is your alerting
rules, so you will have to customize those as per your own needs, as well as
other things that are pertinent to your own setup.

```bash
cat <<EOF > /tmp/helminstall
server:
  datasource:
    url: "your PROMETHEUS HTTP API server here"
  image:
    repository: cgr.dev/chainguard-private/victoriametrics-vmalert
    tag: latest
  notifier:
    alertmanager:
      url: http://localhost:9093
  config:
    alerts:
      groups:
        - name: common
          rules:
            - alert: instanceIsDown
              for: 1m
              expr: up == 0
              labels:
                severity: critical
              annotations:
                summary: "{{ $labels.job }} instance: {{$labels.instance }} is not up"
                description: "Job {{ $labels.job }}  instance: {{$labels.instance }} is not up for the last 1 minute"
EOF

helm install vmalert victoria-metrics-alert --namespace victoriametrics \
--create-namespace --repo https://victoriametrics.github.io/helm-charts/ \
-f /tmp/helminstall

helm install vminsert victoria-metrics-cluster --repo https://victoriametrics.github.io/helm-charts/ \
  --namespace victoriametrics-cluster \
  --set server.image.repository=cgr.dev/chainguard-private/victoriametrics-vmalert \
  --set server.image.tag=latest \
  --set server.image.variant=""
  --set server.config="{...}"
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dynamic-localpv-provisioner

# dynamic-localpv-provisioner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dynamic-localpv-provisioner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dynamic-localpv-provisioner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dynamic Local Volumes for Kubernetes Stateful workloads.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `dynamic-localpv-provisioner` container image is a drop-in replacement for the upstream [openebs/provisioner-localpv](https://github.com/openebs/dynamic-localpv-provisioner) image. It offers the same functionality as the upstream for dynamically deploying Stateful Persistent Node-Local Volumes & Filesystems for Kubernetes. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.  

## Getting Started

You can deploy this image using the official [OpenEBS LocalPV Provisioner Helm chart](https://github.com/openebs/dynamic-localpv-provisioner/blob/develop/deploy/helm/charts/README.md). Be sure to override the operator image by setting the following values in a `values.yaml` file:

```yaml
localpv:
  name: localpv-provisioner
  enabled: true
  image:
    registry: "cgr.dev"
    repository: ORGANIZATION/dynamic-localpv-provisioner
    tag: latest
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `LocalPV Provisioner` helm chart

```shell
helm repo add openebs-localpv https://openebs.github.io/dynamic-localpv-provisioner
helm repo update
helm install openebs-localpv openebs-localpv/dynamic-localpv-provisioner -f values.yaml --wait
```

## Documentation and Resources:
- [OpenEBS LocalPV Provisioner GitHub Repository](https://github.com/openebs/dynamic-localpv-provisioner)
- [OpenEBS LocalPV Provisioner Helm Chart](https://github.com/openebs/dynamic-localpv-provisioner/blob/develop/deploy/helm/charts/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### perl

# perl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/perl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/perl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for building Perl applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `perl` Chainguard Image provides a minimal Perl runtime suitable for workloads such as web applications, CLI utilities, interfacing with APIs, or other tasks.
For external dependencies we provide a `-dev` variant which contains the `cpan`, `cpanm` and `cpm` package managers, `apk` and the `busybox` shell and utilities.

## Getting started

You can test this image locally with `docker`:

```bash
docker run --rm -it cgr.dev/ORGANIZATION/perl:latest
```

## Example: HTTP server using external library

The following build demonstrates how a standard HTTP server could be implemented using Chainguard's perl development image.

First, create a project folder and change the working directory to that folder:

```sh
mkdir -p ~/perl-http-server && cd $_
```

Next, write a file defining your HTTP server (`app.pl`):

```perl
#!/usr/bin/env perl
use strict;
use warnings;
use HTTP::Daemon;

my $d = HTTP::Daemon->new(LocalPort => 8080) or die "Can't create server: $!";
print "Server running at: " . $d->url . "\n";

while (my $c = $d->accept) {
    while (my $r = $c->get_request) {
        # Here you can write handlers for HTTP requests
        $c->send_response(HTTP::Response->new(200, "OK", ['Content-Type' => 'text/plain'], "Hello, Perl!"));
    }
    $c->close;
    undef $c;
}
```
Write a `Dockerfile` to define our image build:

```Dockerfile
FROM cgr.dev/ORGANIZATION/perl:latest-dev

COPY ./app.pl /

RUN cpanm HTTP::Daemon

ENTRYPOINT [ "perl" ]
CMD [ "/app.pl" ]
```

Build the image, tagging it `perl-http-server`:

```shell
docker build -t "localhost/perl-http-server:latest" .
```

Run the image exposing the port defined in the application code:

```sh
docker run -p 8080:8080 localhost/perl-http-server:latest
```

You should see output similar to the following on the container logs:

```
Server running at: http://127.0.0.1:8080/
```

When fetching the contents of `localhost:8080` via a tool like `curl`, you will see the following:

```
Hello, Perl!
```

## Documentation References

- [Perl Documentation](https://www.perl.org/docs.html)
- [Perl docker image documentation](https://hub.docker.com/_/perl/)
- [CPAN FAQ](https://www.cpan.org/misc/cpan-faq.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clang

# clang
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clang` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clang/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Clang](https://clang.llvm.org) is a compiler front end for the C, C++, Objective-C, and Objective-C++ programming languages, as well as the OpenMP, OpenCL, RenderScript, CUDA, SYCL, and HIP frameworks

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

To illustrate working with the Clang Chainguard Image, this section outlines how you can use it to compile a "Hello World!" program written in C. 

To begin, run the following command to create a file named `hello.c` to hold the C code.

```shell
cat > /tmp/hello.c <<EOF
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}
EOF
```

To simplify cleanup, this command places the file in the `/tmp` temporary directory. 

Next, run the following `docker` command. This will mount the contents of your local `/tmp` directory (including the `hello.c` file) into the container's `work` directory. Once there, Clang will compile the C code into an executable program named `hello`.

```shell
docker run --rm -v /tmp:/work cgr.dev/chainguard/clang:latest hello.c -o /work/hello
```

The `hello` program will be stored back in your local `/tmp` directory. You can test that everything worked correctly by executing this program.

```shell
/tmp/hello
```
```
Hello World!
```

Be aware that, depending on your local machine's operating system, you may not be able to execute this file directly like this. This may be because the program is built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview/). This creates an executable in the Executable and Linkable Format, the standard file format for Linux executables. Other systems might expect a different format; for example, this executable can't run directly on MacOS systems, which instead expect the Mach-O format. It could also be that your machine's `/tmp` directory was mounted with the `noexec` option, preventing anything stored in that directory from being executed.

If you receive an error when trying to run the `hello` program, you can try using another Wolfi-based image to execute it, like so. 

```shell
docker run --rm -v /tmp:/work cgr.dev/chainguard/bash /work/hello
```
```
. . .
Hello World!
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-statsd-exporter-fips

# prometheus-statsd-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-statsd-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-statsd-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus StatsD Exporter image for exporting metrics to StatsD.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides a secure, minimal environment for running the Prometheus StatsD Exporter. It maintains functional parity with the upstream [prometheus-statsd-exporter](https://github.com/prometheus/statsd_exporter) image and is compatible with Prometheus and standard StatsD clients. Switching to the Chainguard image should not require changes to your existing Kubernetes setup, provided the StatsD UDP port (default: 9125) and Prometheus metrics endpoint (default: 9102) are correctly configured and accessible.

## Getting Started

The easiest way to deploy this image is with the [prometheus-statsd-exporter Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-statsd-exporter).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/prometheus-statsd-exporter-fips
  tag: "latest"
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the prometheus-statsd-exporter using helm

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-statsd-exporter prometheus-community/prometheus-statsd-exporter -f values.yaml
```

Check that the pods are running
```shell
kubectl get pods -n default
NAME                                          READY   STATUS    RESTARTS   AGE
prometheus-statsd-exporter-56cffb4694-52p5x   1/1     Running   0          17m
```

Also you can check the logs of container
```shell
kubectl logs prometheus-statsd-exporter-56cffb4694-52p5x
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:296 msg="Starting StatsD -> Prometheus Exporter" version="(version=0.28.0, branch=HEAD, revision=c0a390a2c43f77863278615b47d46e886bdca726)"
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:297 msg="Build context" context="(go=go1.23.2, platform=linux/amd64, user=root@783240c1e627, date=20241025-13:53:47, tags=unknown)"
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:346 msg="Accepting StatsD Traffic" udp=:9125 tcp=:9125 unixgram=""
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:347 msg="Accepting Prometheus Requests" addr=:9102
```

## Documentation and Resources:

For more information, please refer to [the official documentation for StatsD Exporter project](https://github.com/prometheus/statsd_exporter).
- [Prometheus StatsD Exporter Github Repository](https://github.com/prometheus/statsd_exporter)
- [StatsD Exporter Helm Chart](https://prometheus-community.github.io/helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trufflehog-fips

# trufflehog-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trufflehog-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trufflehog-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

TruffleHog is a tool that allows you to discover, classify, validate, and analyze leaked credentials.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with [upstream image](https://hub.docker.com/r/trufflesecurity/trufflehog). Switching to Chainguard image should not require any changes to your existing setup.

## Getting Started

To quickly scan a remote GitHub repository for secrets, use the following command:

```shell
docker run --rm -it -v "$PWD:/pwd" cgr.dev/ORGANIZATION/trufflehog-fips:latest github --repo https://github.com/trufflesecurity/test_keys
```

This command runs TruffleHog in a Docker container and scans the specified repository for exposed secrets like API keys or passwords. The repository test_keys contains intentionally exposed test credentials, so you can use it to verify that the tool is working.

The following output is an example of the results you might see after running the command:

```
2025-02-25T20:59:23Z	info-0	trufflehog	running source	{"source_manager_worker_id": "FyaZ4", "with_units": true}
2025-02-25T20:59:23Z	info-0	trufflehog	Completed enumeration	{"source_manager_worker_id": "FyaZ4", "num_repos": 1, "num_orgs": 0, "num_members": 0}
2025-02-25T20:59:24Z	info-0	trufflehog	scanning repo	{"source_manager_worker_id": "FyaZ4", "unit_kind": "repo", "unit": "https://github.com/trufflesecurity/test_keys.git", "repo": "https://github.com/trufflesecurity/test_keys.git"}
...
... <INTENTIONALLY EXPOSED SECRETS LISTED HERE>
...
2025-02-25T20:59:25Z	info-0	trufflehog	finished scanning	{"chunks": 14, "bytes": 6959, "verified_secrets": 4, "unverified_secrets": 2, "scan_duration": "2.274323584s", "trufflehog_version": "3.88.13", "verification_caching": {"Hits":0,"Misses":6,"HitsWasted":0,"AttemptsSaved":0,"VerificationTimeSpentMS":5787}}
```

## Documentation and Resources
Refer to upstream [Quick Start documentation](https://github.com/trufflesecurity/trufflehog/tree/main?tab=readme-ov-file#rocket-quick-start) to learn more about usage of this image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5277

# request-5277
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5277` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5277/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ruby

# ruby
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ruby` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ruby/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Ruby base image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Ruby image is meant to serve as a drop-in replacement for the official Ruby image from Docker Hub. There are, however, a number of differences between the two images that one should be aware of before migrating to the Chainguard Ruby image:

* The Chainguard Ruby image does not run as the root user and contains only the minimum packages it needs to operate.
* Ruby applications typically require the installation of third-party dependencies through [Rubygems](https://rubygems.org/). This means that using a fully distroless image for building your application would not work, as these do not include a package manager. In cases like this, you’ll need to implement a multi-stage Docker build that uses one of Chainguard's `-dev` Image variants to set up the application.
* [Bundler](https://bundler.io/), a popular tool for installing Ruby gems, typically installs to `/usr/lib/bundle`. The default installation location in the Chainguard Ruby image is `/home/nonroot`, which can cause issues for dependencies that expect to find gems in `/usr/lib/bundle`.
* Environment variables, especially gem paths, sometimes differ from those in the official Ruby Image.
* The Chainguard Ruby Image does not default to using `UTF-8`. You will need to specify this yourself.

To better understand the differences between Chainguard's Ruby image and alternatives, it may be helpful to review the upstream's Dockerfiles. For example, you can review the [`alpine3.21` Dockerfile available for Ruby 3.3](https://github.com/docker-library/ruby/blob/master/3.3/alpine3.21/Dockerfile).

## Getting Started

To better understand how you can work with the Chainguard Ruby Image, we encourage you to check out our guide on [getting started with Ruby](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/getting-started-ruby/). This resource demonstrates how you can use Chainguard's Ruby Image in both single- and multi-stage builds.

## Documentation and Resources

* [Getting Started with the Ruby Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/ruby/)
*  [Vulnerability comparison: ruby](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/ruby/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mongodb-exporter

# prometheus-mongodb-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mongodb-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mongodb-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus MongoDB Exporter image for exporting various metrics about MongoDB.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus MongoDB Exporter is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-mongodb-exporter prometheus-community/prometheus-mongodb-exporter \
 --set image.repository=cgr.dev/chainguard/prometheus-mongodb-exporter --set image.tag=latest
```

For more detail, please refer to the [MongoDB Exporter documentation](https://github.com/percona/mongodb_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### airflow-core

# airflow-core
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/airflow-core` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/airflow-core/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Airflow offers a platform to author, schedule, and monitor workflows programmatically. This image is a minimal, slimmed-down version of the official Apache Airflow with only core components.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's airflow-core image provides minimal set of dependencies and core components of Airflow, intended for use as a base image for other images. Scripts for installing databases have been excluded as they depend on aptitude. Databases provided in Wolfi can still be installed via apk on -dev tagged images by use of a Dockerfile.

## Getting Started

This image is optimized for size and only contains the core Airflow components. It provides a minimal set of dependencies and is intended for use as a base image for other images.

There are a few [known issues](https://github.com/apache/airflow/discussions/38425#discussioncomment-11754087) using Airflow core as a drop-in replacement within the Airflow Helm chart.

While the official documentation does not provide a clear way to deploy the image, here's an example using a Kubernetes manifest:

```shell
cat <<EOF > airflow-deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: airflow
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: airflow-dags-pv
  namespace: airflow
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "./dags"  # Ensure this path exists on your host
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: airflow-dags-pvc
  namespace: airflow
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: airflow-webserver
  namespace: airflow
spec:
  replicas: 1
  selector:
    matchLabels:
      component: webserver
  template:
    metadata:
      labels:
        component: webserver
    spec:
      volumes:
        - name: airflow-dags
          persistentVolumeClaim:
            claimName: airflow-dags-pvc
        - name: airflow-db
          emptyDir: {}
      initContainers:
        - name: init-db
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          command: ["bash", "-c", "airflow db init || airflow upgradedb"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-db
              mountPath: /airflow-db
      containers:
        - name: webserver
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          args: ["webserver"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: airflow-dags
              mountPath: /opt/airflow/dags
            - name: airflow-db
              mountPath: /airflow-db
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: airflow-scheduler
  namespace: airflow
spec:
  replicas: 1
  selector:
    matchLabels:
      component: scheduler
  template:
    metadata:
      labels:
        component: scheduler
    spec:
      volumes:
        - name: airflow-dags
          persistentVolumeClaim:
            claimName: airflow-dags-pvc
        - name: airflow-db
          emptyDir: {}
      initContainers:
        - name: init-db
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          command: ["bash", "-c", "airflow db init || airflow upgradedb"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-db
              mountPath: /airflow-db
      containers:
        - name: scheduler
          image: cgr.dev/ORGANIZATION/airflow-core:latest
          args: ["scheduler"]
          env:
            - name: AIRFLOW__CORE__EXECUTOR
              value: SequentialExecutor
            - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
              value: sqlite:////airflow-db/airflow.db
          volumeMounts:
            - name: airflow-dags
              mountPath: /opt/airflow/dags
            - name: airflow-db
              mountPath: /airflow-db
---
apiVersion: v1
kind: Service
metadata:
  name: airflow-webserver
  namespace: airflow
spec:
  selector:
    component: webserver
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
EOF
```

After deploying the image, we can experiment with it further by creating DAG files and copying them to Airflow Webserver/Worker Pods.

## Documentation and Resources
You can learn more about Airflow via the [official documentation](https://airflow.apache.org/docs/docker-stack/index.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pulumi

# pulumi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pulumi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pulumi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Pulumi Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

### Kubernetes Pod Example

In this directory, check the `examples/` folder.
You should find an example app for the following support Pulumi languages/runtimes:

- dotnet
- go
- java
- nodejs
- python
- yaml

This will show an example of using Pulumi SDKs to create an Nginx pod in
a kind cluster.

Try running these commands from this directory in the repo.

Set the desired language to the env var `TEST_LANG`:

```
export TEST_LANG=go
```

Start a kind cluster:

```
kind create cluster
```

Extract the kubeconfig, and modify it to use an internal IP:

```
KIND_IP="$(docker ps | grep 'control-plane' | awk '{print $1}' | xargs docker inspect | jq -r '.[0].NetworkSettings.Networks["kind"].IPAddress')"

mkdir .kube
kind get kubeconfig | yq '.clusters[].cluster.server = "https://'${KIND_IP}':6443"' \
    > ".kube/config"
```

Create a temporary Pulumi home directory, and do a local login:

```
mkdir .pulumi
docker run --rm --network kind \
    -w "/work/examples/smoketest-${TEST_LANG}" \
    -v "${PWD}:/work" \
    -e PULUMI_HOME=/work/.pulumi \
    cgr.dev/chainguard/pulumi:latest \
    login file://.
```

Decide a unique stack name:
```
export STACK_NAME="${TEST_LANG}-$(date +%s)"
```

Next, init a stack (for you decided language):

```
docker run --rm --network kind \
    -w "/work/examples/smoketest-${TEST_LANG}" \
    -v "${PWD}:/work" \
    -e PULUMI_HOME=/work/.pulumi \
    -e PULUMI_CONFIG_PASSPHRASE="${STACK_NAME}" \
    cgr.dev/chainguard/pulumi:latest \
    stack init --non-interactive --stack ${STACK_NAME}
```

Note: for some runtimes, you may need to install language-specific dependencies ahead of time.
Here is an example of preinstalling Node.js dependencies using `npm install`:

```
docker run --rm -w /work/smoketest-${lang} \
    -v "${TMPDIR}:/work" \
    --entrypoint npm \
    cgr.dev/chainguard/pulumi:latest \
    install
```

Finally, create the stack:

```
docker run --rm --network kind \
    -w "/work/examples/smoketest-${TEST_LANG}" \
    -v "${PWD}:/work" \
    -e PULUMI_HOME=/work/.pulumi \
    -e PULUMI_CONFIG_PASSPHRASE="${STACK_NAME}" \
    -e KUBECONFIG=/work/.kube/config \
    cgr.dev/chainguard/pulumi:latest \
    up --yes --config name=${STACK_NAME}
```

You should notice a pod in the default namespace has been created:

```
$ kubectl get pods
NAME            READY   STATUS    RESTARTS   AGE
go-1683319492   1/1     Running   0          24s
```

To teardown the stack, run the following:
```
docker run --rm --network kind \
    -w "/work/examples/smoketest-${TEST_LANG}" \
    -v "${PWD}:/work" \
    -e PULUMI_HOME=/work/.pulumi \
    -e PULUMI_CONFIG_PASSPHRASE="${STACK_NAME}" \
    -e KUBECONFIG=/work/.kube/config \
    cgr.dev/chainguard/pulumi:latest \
    destroy --yes
```

Now check for pods, there should not be any:
```
$ kubectl get pods
No resources found in default namespace.
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter-plugin-kyverno

# kyverno-policy-reporter-plugin-kyverno
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter-plugin-kyverno` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter-plugin-kyverno/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This Plugin for Policy Reporter brings additional Kyverno specific information to the Policy Reporter UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `kyverno-policy-reporter-plugin-kyverno` image is compatible with the upstream Kyverno Policy Reporter plugin. It provides enhanced policy reporting capabilities specifically designed for Kyverno policy management.

## Prerequisites
- Kubernetes cluster
- Kyverno installed and running
- Policy Reporter installed

## Getting Started

### Installing with Helm

First, install Kyverno if not already installed:

```shell
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno --namespace kyverno
```

Next, install Policy Reporter with the Kyverno plugin enabled:

```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm repo update

helm install policy-reporter policy-reporter/policy-reporter \
  --namespace kyverno \
  --set plugin.kyverno.enabled=true \
  --set plugin.kyverno.image.registry=cgr.dev \
  --set plugin.kyverno.image.repository=ORGANIZATION/kyverno-policy-reporter-plugin-kyverno \
  --set plugin.kyverno.image.tag=latest
```

### Verifying the Installation

Check that all components are running:

```shell
kubectl get pods -n kyverno
```

You should see pods for:
- Kyverno controllers (admission, background, cleanup, reports)
- Policy Reporter
- Policy Reporter Kyverno Plugin

### Testing the Plugin

Create a simple Kyverno policy:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-app-label
spec:
  admission: true
  background: true
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-app-label
    validate:
      message: All pods must have an 'app' label
      pattern:
        metadata:
          labels:
            app: ?*
  validationFailureAction: Audit
```

Apply the policy:

```shell
kubectl apply -f policy.yaml
```

Test the plugin API endpoint:

```shell
kubectl port-forward -n kyverno svc/policy-reporter-kyverno-plugin 8080:8080 &
curl -s http://localhost:8080/v1/policies | jq
```

You should see your policy listed in the response.

## Configuration

The plugin supports various configuration options through the Policy Reporter Helm chart values. Key configuration options include:

- **Image configuration**: Set custom registry, repository, and tag
- **Resource limits**: Configure CPU and memory limits
- **Service configuration**: Customize service ports and types
- **Security settings**: Configure security contexts and policies

## Documentation and Resources

- [Policy Reporter Documentation](https://kyverno.github.io/policy-reporter/)
- [Kyverno Documentation](https://kyverno.io/docs/)
- [Policy Reporter Helm Chart](https://github.com/kyverno/policy-reporter/tree/main/charts/policy-reporter)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### knative-eventing

# knative-eventing
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/knative-eventing` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/knative-eventing/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Event-driven application platform for Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard Knative Eventing Images are comparable to the official Knative Eventing Images. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started

You want to install Knative operator:
```
helm repo add knative-operator https://knative.github.io/operator
helm install knative-operator \
  --create-namespace \
  --namespace knative-operator \
  knative-operator/knative-operator \
  -f values.yaml
```
values.yaml
```
knative_operator:
  knative_operator:
    image: cgr.dev/ORGANIZATION/knative-operator
    tag: latest
  operator_webhook:
    image: cgr.dev/ORGANIZATION/knative-operator-webhook
    tag: latest
```
Once you have the operator up and running, create the KnativeEventing custom resource:
```
kubectl create ns knative-eventing
```
```
apiVersion: operator.knative.dev/v1beta1
kind: KnativeEventing
metadata:
  name: knative-eventing
  namespace: knative-eventing
spec:
  registry:
    override:
      eventing-controller/eventing-controller: cgr.dev/ORGANIZATION/knative-eventing-controller 
      eventing-webhook/eventing-webhook: cgr.dev/ORGANIZATION/knative-eventing-webhook 
      imc-controller/controller: cgr.dev/ORGANIZATION/knative-eventing-channel-controller 
      imc-dispatcher/dispatcher: cgr.dev/ORGANIZATION/knative-eventing-channel-dispatcher
      mt-broker-controller/mt-broker-controller: cgr.dev/ORGANIZATION/knative-eventing-mtchannel-broker
      mt-broker-ingress/ingress: cgr.dev/ORGANIZATION/knative-eventing-ingress
      mt-broker-filter/filter: cgr.dev/ORGANIZATION/knative-eventing-filter 
      job-sink/job-sink: cgr.dev/ORGANIZATION/knative-eventing-jobsink 
```
Once the CR is applied, verify that all components (deployments) are up and running in the knative-eventing namespace
```
kubectl get pods -n knative-eventing
```
Next, to verify functionality, you can create a broker:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: $BROKER_NAME
EOF
```
and create a sink:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: $SINK_NAME
  labels:
    app: $SINK_NAME
spec:
  containers:
    - name: $SINK_NAME
      image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display
---
apiVersion: v1
kind: Service
metadata:
  name: $SINK_NAME
spec:
  selector:
    app: $SINK_NAME
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
EOF
```
next, create trigger:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: trigger-to-sink
spec:
  broker: $BROKER_NAME
  filter:
    attributes:
      type: dev.knative.sources.ping
  subscriber:
    ref:
      apiVersion: v1
      kind: Service
      name: $SINK_NAME
EOF
```
Finally, a source:
```
kubectl apply -n "$NAMESPACE" -f - <<EOF
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: $PING_NAME
spec:
  schedule: "*/1 * * * *"
  contentType: "application/json"
  data: '{"message": "$EVENT_MESSAGE"}'
  sink:
    ref:
      apiVersion: eventing.knative.dev/v1
      kind: Broker
      name: $BROKER_NAME
EOF
```
Check logs in the newly created pod (from the Knative Service) to verify event delivery:
```
"message": "Hello from PingSource!"
```
This demonstrates the source to sink pattern working end-to-end.

For more eventing patterns, visit[ Knative Eventing Patterns](https://kubebyexample.com/learning-paths/developing-knative-kubernetes/introduction-knative-eventing)

## Documentation and Resources
- [Knative eventing docs](https://knative.dev/docs/eventing/)
- [Configuring the Eventing Operator custom resource](https://knative.dev/docs/install/operator/configuring-eventing-cr/)
- [Sending an event](https://knative.dev/docs/getting-started/first-source/#sending-an-event)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-nats-exporter-fips

# prometheus-nats-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-nats-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-nats-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant Wolfi-based Prometheus NATS Exporter image for exporting NATS metrics to Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `REPO_NAME` container image is comparable to the [natsio/prometheus-nats-exporter](https://hub.docker.com/r/natsio/prometheus-nats-exporter) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `REPO_NAME` features a stripped-down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user (runs as UID 65532)
* It does not include a shell or package manager in the production image (use the `-dev` variant for debugging)

### FIPS Support

The `REPO_NAME` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on [FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

### Supported NATS Versions

The exporter is compatible with NATS Server 2.x and works with:
* NATS Server monitoring endpoints (`/varz`, `/connz`, `/routez`, `/subsz`)
* NATS Streaming Server monitoring endpoints
* JetStream metrics (NATS Server 2.2+)

### Prometheus Integration

The exporter exposes metrics on port 7777 (default) and is compatible with:
* Prometheus 2.x and later
* Standard Prometheus scrape configurations
* Kubernetes ServiceMonitor resources (for Prometheus Operator)

## Getting Started

The `REPO_NAME` can be run as a standalone container or deployed to Kubernetes. It connects to a NATS server's monitoring endpoint and exposes Prometheus metrics on port 7777.

### Running with Docker

To run the exporter with a local NATS server:

```bash
docker run -d \
  --name nats-exporter \
  -p 7777:7777 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest \
  -varz http://nats-server:8222
```

Once running, you can verify the exporter is working by checking the metrics endpoint:

```bash
curl http://localhost:7777/metrics
```
```
# HELP gnatsd_varz_connections Current number of client connections
# TYPE gnatsd_varz_connections gauge
gnatsd_varz_connections 0
# HELP gnatsd_varz_in_msgs Number of messages received
# TYPE gnatsd_varz_in_msgs counter
gnatsd_varz_in_msgs 0
...
```

### Deploying to Kubernetes with Helm

The recommended way to deploy `REPO_NAME` to Kubernetes is using the official Helm chart. First, create a values file:

```bash
cat > nats-exporter-values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

natsUrl: http://nats:8222

serviceMonitor:
  enabled: true
  interval: 30s
EOF
```

Then install the chart:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install nats-exporter prometheus-community/prometheus-nats-exporter \
  -f nats-exporter-values.yaml
```

Verify the deployment:

```bash
kubectl get pods -l app.kubernetes.io/name=prometheus-nats-exporter
```
```
NAME                                     READY   STATUS    RESTARTS   AGE
nats-exporter-prometheus-nats-exporter   1/1     Running   0          30s
```

### Monitoring Multiple NATS Endpoints

The exporter can monitor multiple NATS server endpoints simultaneously. Create a values file with multiple endpoints:

```bash
cat > nats-exporter-multi.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

config:
  varz: http://nats-1:8222,http://nats-2:8222,http://nats-3:8222
  connz: true
  routez: true
  subz: true
EOF
```

## Configuration

The `REPO_NAME` supports various configuration options to customize metric collection:

### Command-Line Flags

The most commonly used flags are:

- `-varz <url>` - Monitor NATS server variables endpoint (comma-separated list for multiple servers)
- `-channelz <url>` - Monitor NATS Streaming channel metrics
- `-connz <url>` - Monitor connection metrics
- `-routez <url>` - Monitor route metrics
- `-subz <url>` - Monitor subscription metrics
- `-http_port <port>` - HTTP server port for metrics (default: 7777)

### Environment Variables

Configuration can also be provided via environment variables when running in containers:

```bash
docker run -d \
  -p 7777:7777 \
  -e VARZ_URL=http://nats-server:8222 \
  -e CONNZ_URL=http://nats-server:8222 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

### Prometheus Scrape Configuration

To configure Prometheus to scrape the exporter, add the following to your `prometheus.yml`:

```yaml
scrape_configs:
  - job_name: 'nats'
    static_configs:
      - targets: ['nats-exporter:7777']
```

When using the Prometheus Operator with the Helm chart, enable the ServiceMonitor in your values file:

```yaml
serviceMonitor:
  enabled: true
  interval: 30s
  scrapeTimeout: 10s
  labels:
    release: prometheus
```

This configuration instructs Prometheus to scrape NATS metrics every 30 seconds with a 10-second timeout.

## Documentation and Resources

For more information about working with the `REPO_NAME` image:

- [prometheus-nats-exporter GitHub Repository](https://github.com/nats-io/prometheus-nats-exporter) - Official documentation and source code
- [NATS Server Monitoring Documentation](https://docs.nats.io/running-a-nats-service/nats_admin/monitoring) - Details on NATS monitoring endpoints
- [Prometheus Documentation](https://prometheus.io/docs/introduction/overview/) - General Prometheus concepts and configuration
- [FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/) - Learn about FIPS compliance in Chainguard Images
- [Chainguard Academy](https://edu.chainguard.dev/) - Learn more about working with Chainguard Images

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### generic-device-plugin-fips

# generic-device-plugin-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/generic-device-plugin-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/generic-device-plugin-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant Kubernetes device plugin to schedule generic Linux devices

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's generic-device-plugin-fips image is meant to serve as a drop-in replacement for the [`squat/generic-device-plugin` image](https://hub.docker.com/r/squat/generic-device-plugin). Like most other Chainguard container images, the production variant comes with only the minimum dependencies needed to function.

## FIPS Support

This image includes FIPS-validated cryptographic modules. The application will panic if FIPS mode cannot be enabled, ensuring compliance in regulated environments.

## Usage

You can deploy using the upstream manifest and update the image:

```bash
kubectl apply -f https://raw.githubusercontent.com/squat/generic-device-plugin/main/manifests/generic-device-plugin.yaml
kubectl set image -n kube-system daemonset/generic-device-plugin generic-device-plugin=cgr.dev/ORGANIZATION/generic-device-plugin-fips:latest
```

Or deploy as a DaemonSet with a custom configuration:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: generic-device-plugin
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: generic-device-plugin
  template:
    metadata:
      labels:
        app: generic-device-plugin
    spec:
      priorityClassName: system-node-critical
      containers:
      - name: generic-device-plugin
        image: cgr.dev/ORGANIZATION/generic-device-plugin-fips:latest
        args:
        - --device
        - '{"name": "fuse", "groups": [{"count": 10, "paths": [{"path": "/dev/fuse"}]}]}'
        securityContext:
          privileged: true
        volumeMounts:
        - name: device-plugin
          mountPath: /var/lib/kubelet/device-plugins
        - name: dev
          mountPath: /dev
      volumes:
      - name: device-plugin
        hostPath:
          path: /var/lib/kubelet/device-plugins
      - name: dev
        hostPath:
          path: /dev
```

For more configuration options, see the [upstream documentation](https://github.com/squat/generic-device-plugin).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### frr-fips

# frr-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/frr-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/frr-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The FRRouting Protocol Suite

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis-operator

# redis-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Redis Operator is a Kubernetes operator image that automates Redis cluster deployment, scaling, and management in Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image for redis-operator is comparable to the original Redis operator images.

Our user defaults to running as user 65532, the original image also runs as 65532.
In both cases these are non-root users. Similar to the upstream image, our image
does not contain a shell or a package manager, and only the minimum set of tools
and dependencies needed to function.

## Getting Started

The Chainguard redis-operator image can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/redis-operator/redis-operator).

Add the helm repository:

```bash
helm repo add redis-operator https://ot-container-kit.github.io/helm-charts/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:

```yaml
# values.yaml
redisOperator:
  imageName: cgr.dev/ORGANIZATION/redis-operator
  imageTag: latest
  imagePullPolicy: Always
  
```

Deploy using helm:

```bash
helm install redis-operator redis-operator/redis-operator -f values.yaml
```

A few minutes after successful deployment, you should see the operator managing Redis instances.

## Documentation and Resources
For more information on how to deploy and configure redis-operator, please
refer to the [GitHub project documentation](https://github.com/OT-CONTAINER-KIT/redis-operator).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-redis-exporter-fips

# prometheus-redis-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-redis-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-redis-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Redis Exporter image for exporting metrics to Redis.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The easiest way to install the Prometheus Redis Exporter (FIPS) is to use the Helm chart.

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prometheus-redis-exporter prometheus-community/prometheus-redis-exporter \
 --set image.repository=cgr.dev/ORGANIZATION/prometheus-redis-exporter-fips \
 --set image.tag=latest
```

For more detail, please refer to the [Redis Exporter documentation](https://github.com/oliver006/redis_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-image-renderer

# grafana-image-renderer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-image-renderer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-image-renderer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Grafana backend plugin that handles rendering of panels & dashboards to PNGs using headless browser (Chromium/Chrome)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Where possible, the grafana-image-renderer Chainguard Image is built for compatibility with the [Grafana official image for grafana-image-renderer](https://oci.dag.dev/?image=grafana/grafana-image-renderer:latest).

## Getting Started

This image can be installed using the upstream [Grafana helm chart](https://grafana.github.io/helm-charts):

```shell
cat <<EOF > values.yaml
imageRenderer:
  enabled: true
  image:
    registry: "grafana-image-renderer"
    repository: "cgr.dev"
    tag: "latest"
EOF
helm install grafana --repo https://grafana.github.io/helm-charts --values values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### liquibase

# liquibase
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/liquibase` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/liquibase/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Liquibase is a database schema change management solution that enables you to revise and release database changes faster and safer from development to production.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Liquibase Chainguard image is meant to serve as a drop-in replacement for the [Liquibase Image on DockerHub](https://hub.docker.com/_/liquibase). Like most Chainguard images, this image is minimal and has few-to-zero CVEs and does not run as the root user.

## Getting Started

To begin, start the Liquibase container with a command like the following:

```shell
docker run --rm cgr.dev/ORGANIZATION/liquibase
```

> [!NOTE]
> This will return Liquibase's command-line usage instructions.

Next, create the first changelog file:

```
cat <<EOF > /tmp/liquibase/changelogs/example-changelog.sql
--liquibase formatted sql
--changeset your.name:1 labels:example-label context:example-context
--comment: example comment
create table person (
    id integer primary key autoincrement not null,
    name varchar(50) not null,
    address1 varchar(50),
    address2 varchar(50),
    city varchar(30)
)
--rollback DROP TABLE person;
--changeset your.name:2 labels:example-label context:example-context
--comment: example comment
create table company (
    id integer primary key autoincrement not null,
    name varchar(50) not null,
    address1 varchar(50),
    address2 varchar(50),
    city varchar(30)
)
--rollback DROP TABLE company;
--changeset other.dev:3 labels:example-label context:example-context
--comment: example comment
alter table person add column country varchar(2)
--rollback ALTER TABLE person DROP COLUMN country;
EOF
```

> [!NOTE]
> This example assumes that you have a SQLite database named `test_db.sqlite3` in the `/tmp/liquibase/db` directory.

Next, ensure the following Liquibase environment variables are set:

```shell
LIQUIBASE_COMMAND_URL=jdbc:sqlite:/tmp/liquibase/db/test_db.sqlite3
LIQUIBASE_SEARCH_PATH=/liquibase/changelogs
```

* `LIQUIBASE_COMMAND_URL` sets the [JDBC Connection URL](https://docs.liquibase.com/workflows/liquibase-community/using-jdbc-url-in-liquibase.html) that will be used to establish a connection between Liquibase and your database.
* `LIQUIBASE_SEARCH_PATH` sets the [search location](https://docs.liquibase.com/parameters/search-path.html) Liquibase will use to find any [changelog files](https://docs.liquibase.com/concepts/changelogs/home.html) to apply to your database.

Finally, run the migration:

```shell
docker run --rm -v "/tmp/liquibase/db:/liquibase/db" \
-v "/tmp/liquibase/changelogs:/liquibase/changelogs" \
-e LIQUIBASE_COMMAND_URL=jdbc:sqlite:/liquibase/db/test_db.sqlite3 \
-e LIQUIBASE_SEARCH_PATH=/liquibase/changelogs \
cgr.dev/ORGANIZATION/liquibase liquibase update --changelog-file=example-changelog.sql
```

If everything worked as expected, you will receive the following output:

```shell
####################################################
##   _     _             _ _                      ##
##  | |   (_)           (_) |                     ##
##  | |    _  __ _ _   _ _| |__   __ _ ___  ___   ##
##  | |   | |/ _` | | | | | '_ \ / _` / __|/ _ \  ##
##  | |___| | (_| | |_| | | |_) | (_| \__ \  __/  ##
##  \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___|  ##
##              | |                               ##
##              |_|                               ##
##                                                ## 
##  Get documentation at docs.liquibase.com       ##
##  Get certified courses at learn.liquibase.com  ## 
##                                                ##
####################################################
Starting Liquibase at 17:57:14 using Java 17.0.14-internal (version 4.31.1 #0 built at 2025-03-13 23:48+0000)
Liquibase Version: 4.31.1
WARNING: License service not loaded, cannot determine Liquibase Pro license status. Please consider re-installing Liquibase to include all dependencies. Continuing operation without Pro license.
Running Changeset: example-changelog.sql::1::your.name
Running Changeset: example-changelog.sql::2::your.name
Running Changeset: example-changelog.sql::3::other.dev

UPDATE SUMMARY
Run:                          3
Previously run:               0
Filtered out:                 0
-------------------------------
Total change sets:            3

Liquibase: Update has been successful. Rows affected: 6
Liquibase command 'update' was executed successfully.
```

### Liquibase with Kubernetes
Kubernetes is often a common choice for deploying and managing containerized applications.

Liquibase can be integrated with Kubernetes by embedding Liquibase into the startup process of an application with initContainers or through a Kubernetes Job process.

> [!NOTE]
> This example assumes that you have a MariaDB database pod configured and running on a [local Kubernetes cluster setup](https://kind.sigs.k8s.io/).
> The [MariaDB Kubernetes Operator](https://github.com/mariadb-operator/mariadb-operator) was used to deploy MariaDB by following the [Helm quickstart guide](https://github.com/mariadb-operator/mariadb-operator/blob/main/docs/helm.md) and [example manifests](https://github.com/mariadb-operator/mariadb-operator/tree/main/examples/manifests).
> All example resources are deployed into the `default` namespace.

To kick things off, create the changelog file:
```
cat <<EOF > /tmp/liquibase/changelogs/example-changelog-mariademo.sql
--liquibase formatted sql
--changeset your.name:1 labels:example-label context:example-context
--comment: example comment
create table person (
    id integer primary key auto_increment not null,
    name varchar(50) not null,
    address1 varchar(50),
    address2 varchar(50),
    city varchar(30)
)
--rollback DROP TABLE person;
--changeset your.name:2 labels:example-label context:example-context
--comment: example comment
create table company (
    id integer primary key auto_increment not null,
    name varchar(50) not null,
    address1 varchar(50),
    address2 varchar(50),
    city varchar(30)
)
--rollback DROP TABLE company;
--changeset other.dev:3 labels:example-label context:example-context
--comment: example comment
alter table person add column country varchar(2)
--rollback ALTER TABLE person DROP COLUMN country;
EOF
```

Next create a ConfigMap using the changelog file as the source:
```shell
kubectl create configmap liquibase-changelog --from-file=/tmp/liquibase/changelogs/
```

Following that, create the liquibase job manifest:
```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: liquibase-mariadb-demo
spec:
  template:
    spec:
      containers:
      - name: liquibase
        image: cgr.dev/ORGANIZATION/liquibase
        command: ["liquibase", "update", "--username=$(DATABASE_USERNAME)", "--password=$(DATABASE_PASSWORD)", "--changelog-file=example-changelog-mariademo.sql"]
        env:
        - name: LIQUIBASE_SEARCH_PATH
          value: /liquibase/test/changelogs
        - name: LIQUIBASE_COMMAND_URL
          value: "$MARIADB_JDBC_URL"
        - name: DATABASE_USERNAME
          value: "$MARIADB_USER"
        - name: DATABASE_PASSWORD
          value: "$MARIADB_PASS"
        volumeMounts:
        - name: liquibase-changelog-volume
          mountPath: /liquibase/test/changelogs
      volumes:
      - name: liquibase-changelog-volume
        configMap:
          name: liquibase-changelog
      restartPolicy: Never
  backoffLimit: 0
```

If everything worked as expected, your output should be similar to the following:

```shell
kubectl get pods
NAME                                                READY   STATUS      RESTARTS       AGE
liquibase-mariadb-demo-qg9nx                        0/1     Completed   0              4s
mariadb-0                                           1/1     Running     0              10m
mariadb-operator-8644965c85-88gdr                   1/1     Running     1 (171m ago)   4d12h
mariadb-operator-cert-controller-5d6bb78b65-c7b5g   1/1     Running     1 (171m ago)   4d12h
mariadb-operator-webhook-586d988ddf-jwwln           1/1     Running     1 (171m ago)   4d12h
```

```shell
kubectl logs liquibase-mariadb-demo-qg9nx
####################################################
##   _     _             _ _                      ##
##  | |   (_)           (_) |                     ##
##  | |    _  __ _ _   _ _| |__   __ _ ___  ___   ##
##  | |   | |/ _` | | | | | '_ \ / _` / __|/ _ \  ##
##  | |___| | (_| | |_| | | |_) | (_| \__ \  __/  ##
##  \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___|  ##
##              | |                               ##
##              |_|                               ##
##                                                ## 
##  Get documentation at docs.liquibase.com       ##
##  Get certified courses at learn.liquibase.com  ## 
##                                                ##
####################################################
Starting Liquibase at 18:57:03 using Java 17.0.14-internal (version 4.31.1 #0 built at 2025-03-13 23:48+0000)
Liquibase Version: 4.31.1
WARNING: License service not loaded, cannot determine Liquibase Pro license status. Please consider re-installing Liquibase to include all dependencies. Continuing operation without Pro license.
Running Changeset: example-changelog-mariademo.sql::1::your.name
Running Changeset: example-changelog-mariademo.sql::2::your.name
Running Changeset: example-changelog-mariademo.sql::3::other.dev

UPDATE SUMMARY
Run:                          3
Previously run:               0
Filtered out:                 0
-------------------------------
Total change sets:            3

Liquibase: Update has been successful. Rows affected: 3
Liquibase command 'update' was executed successfully.
```

## Documentation and Resources
- [Liquibase Docs - Getting Started](https://docs.liquibase.com/start/get-started/liquibase-sql.html)
- [Liquibase Docs - Database Tutorials](https://docs.liquibase.com/start/tutorials/home.html)
- [Liquibase Docs - Using Liquibase and Docker](https://docs.liquibase.com/workflows/liquibase-community/using-liquibase-and-docker.html)
- [Liquibase Blog - Using Liquibase in K8S](https://www.liquibase.com/blog/using-liquibase-in-kubernetes)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter-plugin-kyverno-fips

# kyverno-policy-reporter-plugin-kyverno-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter-plugin-kyverno-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter-plugin-kyverno-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This Plugin for Policy Reporter brings additional Kyverno specific information to the Policy Reporter UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `kyverno-policy-reporter-plugin-kyverno` image is compatible with the upstream Kyverno Policy Reporter plugin. It provides enhanced policy reporting capabilities specifically designed for Kyverno policy management.

### FIPS Support
The `kyverno-policy-reporter-plugin-kyverno-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Prerequisites
- Kubernetes cluster
- Kyverno installed and running
- Policy Reporter installed

## Getting Started

### Installing with Helm

First, install Kyverno if not already installed:

```shell
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno --namespace kyverno
```

Next, install Policy Reporter with the Kyverno plugin enabled:

```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm repo update

helm install policy-reporter policy-reporter/policy-reporter \
  --namespace kyverno \
  --set plugin.kyverno.enabled=true \
  --set plugin.kyverno.image.registry=cgr.dev \
  --set plugin.kyverno.image.repository=ORGANIZATION/kyverno-policy-reporter-plugin-kyverno \
  --set plugin.kyverno.image.tag=latest
```

### Verifying the Installation

Check that all components are running:

```shell
kubectl get pods -n kyverno
```

You should see pods for:
- Kyverno controllers (admission, background, cleanup, reports)
- Policy Reporter
- Policy Reporter Kyverno Plugin

### Testing the Plugin

Create a simple Kyverno policy:

```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-app-label
spec:
  admission: true
  background: true
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-app-label
    validate:
      message: All pods must have an 'app' label
      pattern:
        metadata:
          labels:
            app: ?*
  validationFailureAction: Audit
```

Apply the policy:

```shell
kubectl apply -f policy.yaml
```

Test the plugin API endpoint:

```shell
kubectl port-forward -n kyverno svc/policy-reporter-kyverno-plugin 8080:8080 &
curl -s http://localhost:8080/v1/policies | jq
```

You should see your policy listed in the response.

## Configuration

The plugin supports various configuration options through the Policy Reporter Helm chart values. Key configuration options include:

- **Image configuration**: Set custom registry, repository, and tag
- **Resource limits**: Configure CPU and memory limits
- **Service configuration**: Customize service ports and types
- **Security settings**: Configure security contexts and policies

## Documentation and Resources

- [Policy Reporter Documentation](https://kyverno.github.io/policy-reporter/)
- [Kyverno Documentation](https://kyverno.io/docs/)
- [Policy Reporter Helm Chart](https://github.com/kyverno/policy-reporter/tree/main/charts/policy-reporter)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher

# rancher
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Complete container management platform

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [rancher/rancher](https://hub.docker.com/r/rancher/rancher) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Docker

You can run the following command to use Chainguard's Rancher image:

```shell
docker container run \
  --rm \
  -it \
  --privileged \
  -p 80:80 -p 443:443 \
  -e CATTLE_BOOTSTRAP_PASSWORD='YOUR INITIAL PASSWORD' \
  cgr.dev/ORGANIZATION/rancher:latest
```

If you are deploying Rancher in an airgapped environment, you will also need to use the bundled system chart:

```shell
docker container run \
  --rm \
  -it \
  --privileged \
  -p 80:80 -p 443:443 \
  -e CATTLE_SYSTEM_CATALOG=bundled \
  -e CATTLE_BOOTSTRAP_PASSWORD='YOUR INITIAL PASSWORD' \
  cgr.dev/ORGANIZATION/rancher:latest
```

Now, jump to https://localhost:443 in your browser and log in with the username `admin` and the password you set in the `CATTLE_BOOTSTRAP_PASSWORD` environment variable. Process the certificate warning in your browser and you should see the Rancher quick start wizard.

### Kubernetes

For complete instructions on installing this image with Helm, please refer to the [Helm Chart documentation](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/install-upgrade-on-a-kubernetes-cluster). As a prerequisite, you may need to install `cert-manager` in your cluster.

The following is an example of how to use the Helm chart, using the Chainguard image.

Start by adding a `values.yaml` file to configure the Helm chart:

```yaml
cat <<EOF > values.yaml
image:
  rancherImage: cgr.dev/ORGANIZATION/rancher
  rancherImageTag: latest
  rancherImagePullPolicy: Always

hostname: rancher.my.org
bootstrapPassword: 'YOUR INITIAL PASSWORD'
useBundledSystemChart: true # only if deploying Rancher in an airgapped environment
EOF
```

Add the Helm repository:

```shell
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
```

Then Install the chart:

```shell
helm install rancher rancher \
  --namespace cattle-system \
  --create-namespace \
  --values values.yaml
```

## Documentation and Resources

Please refer the [Rancher documentation](https://ranchermanager.docs.rancher.com) for information.

You can explore the following resources to learn more about:
* [Installing Rancher on a Single Node Using Docker](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/other-installation-methods/rancher-on-a-single-node-with-docker)
* [Install/Upgrade Rancher on a Kubernetes Cluster](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/install-upgrade-on-a-kubernetes-cluster)
* [Setting up Local System Charts for Air Gapped Installations](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/resources/local-system-charts)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gcc-glibc

# gcc-glibc
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gcc-glibc` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gcc-glibc/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal GCC (GNU Compiler Collection) image for building C applications compatible with glibc.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The gcc-glibc Chainguard image was built to work as a drop-in replacement for the [gcc](https://hub.docker.com/_/gcc) official image from Docker Hub. 

Unlike many other Chainguard images, the gcc-glibc image includes a shell, allowing you to log into the container and run commands interactively. It also runs as the root user by default. Despite these two differences, the image is still designed to be secure and minimal, and does not include a package manager. If you need a package manager, you can use the `-dev` variant of this image.

It's also worth noting that Chainguard's gcc-glibc image sets an entrypoint to `/usr/bin/gcc`, while the official gcc image lands on a shell by default when no arguments are passed to the `docker run` command. You can always use the `--entrypoint` argument with `docker run` to override the entrypoint if needed.

## Getting Started
You can use the gcc-glibc image both to compile and to run C applications that are compatible with the GNU C Library (glibc). Consider the following `hello.c` program:

```c
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}
```

To compile this program using the gcc-glibc Chainguard image, you can use the following command:

```shell
docker run --rm -v ${PWD}:/work cgr.dev/ORGANIZATION/gcc-glibc /work/hello.c -o hello
```

This will create a Linux binary called `hello` in your current folder. If your program has a Makefile, you can instead run `make` by replacing the image's entrypoint:

```shell
docker run --rm -v ${PWD}:/work --entrypoint make cgr.dev/ORGANIZATION/gcc-glibc
```
This will execute the application's Makefile in the container.

### Using the gcc-glibc Image as a Runtime
To run the compiled program using the gcc-glibc image, you can use the following command:

```shell
docker run --rm -v ${PWD}:/work --entrypoint /work/hello cgr.dev/ORGANIZATION/gcc-glibc
```

This will replace the default entrypoint of the image, which is `/usr/bin/gcc`, with the `hello` binary you just compiled. Although this works and is a straightforward way to test your compiled program after  building it, consider using instead the [Chainguard glibc-dynamic image](https://images.chainguard.dev/directory/image/glibc-dynamic/overview) to run your compiled C applications in a slimmer and more production-ready runtime environment for C programs. The [Getting Started with the C/C++ Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/c/) guide on Chainguard Academy has detailed instructions on how to build multi-stage environments for C programs using both the gcc-glibc and glibc-dynamic images.

### Usage in a Dockerfile

The following Dockerfile builds the example `hello.c` program and sets the entry point to the compiled binary:

```Dockerfile
FROM cgr.dev/chainguard/gcc-glibc:latest

COPY hello.c /work

RUN gcc -o hello hello.c && \
  cp /work/hello /usr/bin/hello 
    
USER 65532

ENTRYPOINT ["/usr/bin/hello"]
```

For production environments, consider using a combination of gcc-glibc and [glibc-dynamic](https://images.chainguard.dev/directory/image/glibc-dynamic/overview) to build a final distroless image containing only what's necessary to run your compiled binary. The following example shows how to create such an image in a multi-stage Dockerfile:

```Dockerfile
FROM cgr.dev/chainguard/gcc-glibc:latest as builder

COPY hello.c /work

RUN gcc -o hello hello.c 

FROM cgr.dev/chainguard/glibc-dynamic:latest

COPY --from=builder /work/hello /usr/bin/

USER 65532

ENTRYPOINT ["/usr/bin/hello"]
```

For more details, check our [Getting Started with the C/C++ Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/c/) guide on Chainguard Academy.

## Documentation and Resources

- [Chainguard Academy: Choosing an Image for your Compiled Programs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/images-compiled-programs/compiled-programs/)
- [Video: Getting Started with the C/C++ Chainguard Images](https://youtu.be/g7fCIRJ8_pE?feature=shared)
- [Chainguard Academy: glibc vs musl](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/images-compiled-programs/glibc-vs-musl/)
- [Demos: glibc vs musl benchmarks](https://github.com/chainguard-dev/edu-images-demos/tree/main/glibc-vs-musl)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### airflow

# airflow
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/airflow` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/airflow/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, [wolfi](https://github.com/wolfi-dev)-based image for Apache Airflow.[Apache Airflow](https://github.com/apache/airflow) is a platform to programmatically author, schedule, and monitor workflows.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploying Apache Airflow with Helm

Deploying Apache Airflow with Chainguard's images is straightforward using the official Airflow Helm chart.

First, add the Airflow Helm repository:

```bash
helm repo add apache-airflow https://airflow.apache.org
```
Deploy Airflow using:

```bash
helm install airflow apache-airflow/airflow \
  --set images.airflow.repository=cgr.dev/chainguard/airflow \
  --set images.airflow.tag=latest
```

You can also customize your Helm deployment by editing the values.yaml after fetching the chart:

```helm fetch apache-airflow/airflow --untar```

Then edit values.yaml to use Chainguard's images/tags:

```bash 
image:
  repository: cgr.dev/chainguard/airflow
  tag: latest
```

Deploy your customized Helm chart:

```bash
helm install airflow .
```
For detailed instructions on deploying Apache Airflow via Helm, consult the official Apache Airflow Helm chart documentation.

Usage
With Apache Airflow running, access the web interface by navigating to http://localhost:8080. Login with the default credentials or the ones you have configured.

You can now manage workflows, create DAGs, and monitor your tasks.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### haproxy-ingress

# haproxy-ingress
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/haproxy-ingress` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/haproxy-ingress/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes ingress controller implementation for HAProxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Use It!

You can use this image with the `haproxy-ingress` project's [Helm chart](https://artifacthub.io/packages/helm/haproxy-ingress/haproxy-ingress). To begin, add the Helm chart's repository.

```shell
helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
```

Then run the following command to retrieve the latest information about the charts in the repository you just added.

```shell
helm repo update
```

Then install `haproxy-ingress` with the following command. This command directs Helm to install it using Chainguard's `haprox-ingress:latest` image.

```shell
helm install ingress haproxy-ingress/haproxy-ingress \
  --set controller.image.repository="cgr.dev/chainguard/haproxy-ingress" \
  --set controller.image.tag="latest"
```

Run the following command to confirm that the Pod is running and ready to use.

```shell
kubectl wait --for=condition=ready pod --selector "app.kubernetes.io/name=haproxy-ingress" --timeout=120s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sqlpad

# sqlpad
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sqlpad` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sqlpad/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal Wolfi-based image for sqlpad, which is a web application for generating and running SQL queries and visualizing the results. For more information, please refer to the [applications documentation](https://github.com/sqlpad/sqlpad) on github.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Important note about data and docker

Unless data volumes are mapped outside the containers, you will lose data inside SQLPad and various database when the containers are shutdown and removed.

If you are using these examples as a starter for something you are working on, you may want to ensure your data is safe before getting into any serious work.

## Running from command line

```sh
# The most minimal example, mapping port 3000 to local docker host
docker run -p 3000:3000 cgr.dev/chainguard/sqlpad:latest

# volume and env vars being set and run in background
# directory `~/docker-volumes` must be shared with docker to work
docker run --name sqlpad -p 127.0.0.1:3000:3000 --volume ~/docker-volumes/sqlpad-postgres:/var/lib/sqlpad --detach cgr.dev/chainguard/sqlpad:latest

# To list running docker images
docker ps

# To stop running docker image by name. (otherwise use container id from `docker ps`)
docker stop sqlpad
```

## Deploying via Helm
A Helm chart is provided for deploying sqlpad in Kubernetes. This can be found in the applications [GitHub repository](https://github.com/sqlpad/sqlpad/tree/master/sqlpad-charts).
Below is an example, using the Chainguard image with the vendor's Helm chart:
```bash
git clone https://github.com/sqlpad/sqlpad.git && cd sqlpad/sqlpad-charts
helm dependency update
helm -n sqlpad install sqlpad  \
    --namespace sqlpad \
    --create-namespace \
    --set image.repository=cgr.dev/chainguard/sqlpad\
    --set image.tag=latest \
    ./
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3743

# request-3743
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3743` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3743/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### steampipe

# steampipe
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/steampipe` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/steampipe/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Steampipe is the zero-ETL way to query APIs and services, used to expose data sources to SQL.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Steampipe Image is meant to provide [Steampipe package](https://github.com/turbot/steampipe) in a container. It currently does not have an external counterpart image which is actively maintained. Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

The current `steampipe` image's entrypoint is set to running the binary itself, so any `steampipe` subcommands passed to this image should work. The image supports steampipe [plugins](https://hub.steampipe.io/) and [queries](https://steampipe.io/docs/query/overview).

The usage instructions are similar to Steampipe CLI. 
Examples:

1. Start the Steampipe query engine (background service)
- This will persist your config/plugins and run the engine in the background:
```shell
docker run -d --name steampipe -v ~/.steampipe:/home/steampipe/.steampipe cgr.dev/ORGANIZATION/steampipe:latest service start --foreground
```
- Once running, you can check the service status:
```shell
docker exec steampipe steampipe service status
```
2. Run a query
- To open the interactive query shell:
```shell
docker exec -it steampipe steampipe query
```
3. Install a plugin
```shell
docker exec steampipe steampipe plugin install <PLUGIN>
```

## Documentation and Resources
- For more information, please refer to [the official documentation for steampipe project](https://github.com/turbot/steampipe/blob/develop/README.md) 
- [Running queries on Steampipe](https://steampipe.io/docs/query/overview).
- [Steampipe Plugins Guide](https://steampipe.io/docs/managing/plugins).
- [Steampipe Hub registry](https://hub.steampipe.io/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kiali-operator

# kiali-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kiali-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kiali-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kiali Operator that manages the lifecycle of Kiali in Kubernetes environments with Istio service mesh integration

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the upstream [quay.io/kiali/kiali-operator](https://quay.io/repository/kiali/kiali-operator) image. It uses the Ansible Operator SDK to manage Kiali deployments and is designed to be used in Kubernetes environments with Istio service mesh.

## Getting Started

The Kiali Operator is typically deployed in Kubernetes environments. You can deploy it using Helm, OperatorHub (via OLM), or as an Istio add-on.

### Deploying with Helm

```bash
# Add the Kiali Helm repository
helm repo add kiali https://kiali.org/helm-charts

# Install the Kiali Operator
helm install --namespace kiali-operator \
  --create-namespace kiali-operator \
  kiali/kiali-operator \
  --set image.repo=cgr.dev/ORGANIZATION \
  --set image.name=kiali-operator

# Deploy Kiali by creating a Kiali CR
kubectl apply -f - <<EOF
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
  name: kiali
  namespace: istio-system
spec:
  deployment:
    image_name: cgr.dev/ORGANIZATION/kiali
    image_version: latest
EOF
```

### Environment Variables

The Kiali Operator image respects the following environment variables:

- `ANSIBLE_DEBUG`: Set to "true" to enable additional debugging output
- `ANSIBLE_VERBOSITY`: Set the verbosity level (0-4)
- `WATCH_NAMESPACE`: The namespace to watch for Kiali CRs
- `POD_NAMESPACE`: The namespace the operator is deployed in
- `OPERATOR_NAME`: The name of the operator

## Documentation and Resources

- [Kiali Website](https://kiali.io)
- [Kiali Operator GitHub Repository](https://github.com/kiali/kiali-operator)
- [Kiali Documentation](https://kiali.io/docs/)
- [Ansible Operator SDK Documentation](https://sdk.operatorframework.io/docs/building-operators/ansible/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-operator

# minio-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MinIO Operator - Operator for MinIO on Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To deploy a MinIO cluster using the MinIO Operator, you can follow the steps below:

One of the ways of installing the MinIO Operator is Helm. You can use the following command to install the MinIO Operator with Sidecar container using Helm:

```bash
$ helm repo add minio https://operator.min.io/
$ helm install minio-operator minio/minio-operator \
    --namespace minio-operator \
    --set operator.image.repository=cgr.dev/chainguard/minio-operator
    --set operator.image.tag=latest
    --set operator.sidecarImage.repository=cgr.dev/chainguard/minio-operator-sidecar
    --set operator.sidecarImage.tag=latest
```

For more detail about the configurations options you can refer to the [official MinIO Operator Helm Chart documentation](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-operator-helm.html).

The next thing you just need to do is to create a MinIO Tenants. To do that you can follow along the official documentation [here](https://min.io/docs/minio/kubernetes/upstream/operations/deploy-manage-tenants.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cedar

# cedar
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cedar` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cedar/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [Cedar Policy](https://www.cedarpolicy.com/en) Language. The binary can be used to run, test, format, or evaluate Cedar policies.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

The image can be run directly and sets the cedar image as the entrypoint:

```
docker run cgr.dev/chainguard/cedar:latest
CLI interface for the Cedar Policy language.

Usage: cedar <COMMAND>

Commands:
  authorize    Evaluate an authorization request
  evaluate     Evaluate a Cedar expression
  validate     Validate a policy set against a schema
  check-parse  Check that policies successfully parse
  link         Link a template
  format       Format a policy set
  help         Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-6943

# request-6943
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-6943` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-6943/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### skaffold

# skaffold
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/skaffold` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/skaffold/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for running skaffold apps

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image includes `skaffold`, `helm`, `kubectl`, `kpt`, `kustomize`, and the `google-cloud-sdk.`

## Usage

This image should be a drop-in replacement for the upstream `skaffold-slim` image.
See the [full documentation](https://skaffold.dev/docs/install/#standalone-binary) for usage.

```
% docker run cgr.dev/chainguard/skaffold:latest
A tool that facilitates continuous development for Kubernetes applications.

  Find more information at: https://skaffold.dev/docs/getting-started/

End-to-end Pipelines:
  run               Run a pipeline
  dev               Run a pipeline in development mode
  debug             Run a pipeline in debug mode

Pipeline Building Blocks:
  build             Build the artifacts
  test              Run tests against your built application images
  deploy            Deploy pre-built artifacts
  delete            Delete any resources deployed by Skaffold
  render            Generate rendered Kubernetes manifests
  apply             Apply hydrated manifests to a cluster
  verify            Run verification tests against skaffold deployments

Getting Started With a New Project:
  init              Generate configuration for deploying an application

Other Commands:
  completion        Output shell completion for the given shell (bash, fish or zsh)
  config            Interact with the global Skaffold config file (defaults to `$HOME/.skaffold/config`)
  diagnose          Run a diagnostic on Skaffold
  fix               Update old configuration to a newer schema version
  schema            List JSON schemas used to validate skaffold.yaml configuration
  survey            Opens a web browser to fill out the Skaffold survey
  version           Print the version information

Usage:
  skaffold [flags] [options]

Use "skaffold <command> --help" for more information about a given command.
Use "skaffold options" for a list of global command-line options (applies to all commands).
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy

# envoy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Envoy](https://www.envoyproxy.io/) Cloud-native high-performance edge/middle/service proxy

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Envoy image is meant to serve as a drop-in replacement for the
`envoyproxy/envoy` image on DockerHub.

Like most of Chainguard's images, the Envoy image does not operate as the root
user and includes only the minimum packages needed to function.

## Getting Started

The Chainguard Envoy image comes with a default configuration stored at `/etc/envoy/envoy.yaml`. To run the image with Docker using this configuration you could run a command like the following:

```sh
docker run -p10000:10000 -p 9901:9901 cgr.dev/chainguard/envoy --config-path /etc/envoy/envoy.yaml
```

The `-p` options in this example connect network ports from your local machine into the container, allowing you to see Envoy in action by visiting `localhost:10000` or `localhost:9901` in your browser. The default configuration will proxy port `10000` to [envoyproxy.io](https://www.envoyproxy.io/) and port `9901` to the Envoy management port.

You can also run the image with a customized Envoy configuration. To do this, you'll need to [bind mount](https://docs.docker.com/engine/storage/bind-mounts/) your local configuration file into the envoy container:

```sh
docker run -p10000:10000 -p 9901:9901 -v $PWD/config.yaml:/etc/envoy cgr.dev/chainguard/envoy --config-path /etc/envoy/config.yaml
```

This example creates a bind mount so that Envoy is running with a local configuration file named `config.yaml`.

You can refer to the [overview in the envoy project's official documentation](https://www.envoyproxy.io/docs/envoy/latest/configuration/overview/overview) for more information on working with custom configurations.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitlab-fips

# gitlab-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitlab-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitlab-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant GitLab images providing a complete DevOps platform that meets Federal Information Processing Standards for cryptographic operations, source code management, CI/CD automation, and collaboration tools.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `gitlab-fips` images are FIPS-compliant versions based on the [upstream GitLab](https://gitlab.com/gitlab-org/gitlab) components and are compatible with the [official GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab). These images provide all the GitLab components in minimal, secure container images built on Wolfi with FIPS-validated cryptographic modules.

This FIPS-compliant image group includes the following components:

* `gitaly-fips` - Git repository storage service
* `gitlab-agent-fips` - GitLab Kubernetes Agent
* `gitlab-base-fips` - Base image with common GitLab functionality
* `gitlab-certificates-fips` - Certificate management for GitLab
* `gitlab-container-registry-fips` - GitLab's container registry
* `gitlab-exporter-fips` - Prometheus metrics exporter
* `gitlab-kas-fips` - GitLab Agent Server
* `gitlab-pages-fips` - GitLab Pages static site hosting
* `gitlab-runner-fips` - GitLab CI/CD runner
* `gitlab-runner-helper-fips` - Helper image for GitLab Runner
* `gitlab-shell-fips` - SSH access to Git repositories
* `gitlab-sidekiq-ce-fips` - Background job processing (Community Edition)
* `gitlab-toolbox-ce-fips` - Administrative toolbox (Community Edition)
* `gitlab-webservice-ce-fips` - Main GitLab web application (Community Edition)
* `gitlab-workhorse-ce-fips` - HTTP reverse proxy for GitLab (Community Edition)

These images maintain compatibility with the upstream GitLab components while providing enhanced security through minimal design, regular updates, and FIPS 140-3 Level 1 validated cryptographic modules.

## FIPS Compliance

These FIPS-compliant images include OpenSSL FIPS provider and are built with FIPS-validated cryptographic modules. Key FIPS features include:

* **FIPS-validated OpenSSL provider** - Uses OpenSSL FIPS provider for cryptographic operations
* **Approved algorithms only** - Restricted to FIPS-approved cryptographic algorithms
* **FIPS mode enforcement** - Cryptographic operations automatically use FIPS-validated modules
* **Enhanced SSH security** - SSH configurations restricted to FIPS-approved ciphers and algorithms

> [!IMPORTANT]
> Some images may include GnuPG, gpgme, and `libgcrypt` cryptographic modules in unapproved mode. The majority of Git repositories use SHA-1 for commit and tag identification, which can optionally be signed with GPG, SSH or S/MIME. SHA-1 is deprecated and will be [unapproved after 2030](https://www.nist.gov/news-events/news/2022/12/nist-retires-sha-1-cryptographic-algorithm). Please consider using SSH & S/MIME signing options with [SHA256](https://about.gitlab.com/blog/2024/08/19/gitlab-now-supports-sha256-repositories/) repositories.

## Getting Started

The `gitlab-fips` images are designed to work together as a complete FIPS-compliant GitLab deployment using the official GitLab Helm chart. Here's how to configure your GitLab installation to use Chainguard FIPS Images:

```sh
cat > gitlab-fips-values.yaml <<EOF
# Chainguard FIPS Images configuration for GitLab
global:
  gitlabBase:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-base-fips
      tag: latest
  certificates:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-certificates-fips
      tag: latest
gitlab:
  gitlab-exporter:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-exporter-fips
      tag: latest
  gitlab-shell:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-shell-fips
      tag: latest
    # FIPS-approved SSH configuration
    config:
      ciphers: ["aes128-ctr", "aes192-ctr", "aes256-ctr"]
      kexAlgorithms: ["ecdh-sha2-nistp384", "ecdh-sha2-nistp521"]
      macs: ["hmac-sha2-256", "hmac-sha2-512"]
      publicKeyAlgorithms: ["ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521"]
  gitaly:
    image:
      repository: cgr.dev/ORGANIZATION/gitaly-fips
      tag: latest
  gitlab-pages:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-pages-fips
      tag: latest
  kas:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-kas-fips
      tag: latest
  sidekiq:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-sidekiq-ce-fips
      tag: latest
  toolbox:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-toolbox-ce-fips
      tag: latest
  webservice:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-webservice-ce-fips
      tag: latest
  workhorse:
    image:
      repository: cgr.dev/ORGANIZATION/gitlab-workhorse-ce-fips
      tag: latest
registry:
  image:
    repository: cgr.dev/ORGANIZATION/gitlab-container-registry-fips
    tag: latest
gitlab-runner:
  runners:
    config: |
      [[runners]]
        [runners.kubernetes]
          helper_image = "cgr.dev/ORGANIZATION/gitlab-runner-helper-fips:latest"
  image:
    registry: cgr.dev
    image: ORGANIZATION/gitlab-runner-fips
    tag: latest
EOF
```

Install GitLab using the Helm chart with your FIPS values:

```sh
helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm upgrade --install gitlab gitlab/gitlab \
  --namespace gitlab-system \
  --create-namespace \
  --values gitlab-fips-values.yaml
```

> [!NOTE]
> Replace `ORGANIZATION` with your actual organization name in the Chainguard registry. The values above provide the minimal configuration for using Chainguard FIPS Images and should be combined with your additional GitLab configuration requirements.

For a development or testing environment, you can combine the above with these minimal settings:

```yaml
# Additional minimal configuration for development
global:
  ingress:
    configureCertmanager: false
    tls:
      enabled: false
  gitlab:
    gitlab-shell:
      minReplicas: 1
      maxReplicas: 1
    webservice:
      minReplicas: 1
      maxReplicas: 1
    gitlab-pages:
      resources:
        requests:
          memory: 250M
          cpu: 50m
certmanager:
  install: false
registry:
  hpa:
    minReplicas: 1
    maxReplicas: 1
nginx-ingress:
  controller:
    replicaCount: 1
    minAvailable: 0
prometheus:
  install: false
minio:
  resources:
    requests:
      cpu: 100m
redis:
  resources:
    requests:
      cpu: 100m
```

> [!WARNING]
> The minimal configuration above is not recommended for production environments. Please refer to the [GitLab Helm chart documentation](https://docs.gitlab.com/charts/) for production-ready configurations.

## Configuration

GitLab FIPS components can be configured through the Helm chart values or environment variables. Here are some common configuration scenarios for FIPS compliance:

### FIPS SSH Configuration

For the `gitlab-shell-fips` component, SSH is automatically configured with FIPS-approved ciphers and algorithms:

```yaml
gitlab:
  gitlab-shell:
    config:
      ciphers: ["aes128-ctr", "aes192-ctr", "aes256-ctr"]
      kexAlgorithms: ["ecdh-sha2-nistp384", "ecdh-sha2-nistp521"]
      macs: ["hmac-sha2-256", "hmac-sha2-512"]
      publicKeyAlgorithms: ["ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521"]
```

### FIPS GitLab Runner Configuration

Configure GitLab Runner with FIPS-compliant helper images:

```yaml
gitlab-runner:
  runners:
    config: |
      [[runners]]
        name = "chainguard-fips-runner"
        [runners.kubernetes]
          helper_image = "cgr.dev/ORGANIZATION/gitlab-runner-helper-fips:latest"
          privileged = false
```

### Resource Limits

Set appropriate resource limits for production environments:

```yaml
gitlab:
  webservice:
    resources:
      requests:
        memory: "2Gi"
        cpu: "1000m"
      limits:
        memory: "4Gi"
        cpu: "2000m"
```

### FIPS Verification

To verify FIPS mode is enabled, you can check the OpenSSL FIPS provider status within any container:

```sh
kubectl exec -it <gitlab-pod> -- openssl list -providers
```

For complete configuration options, refer to the [GitLab Helm chart values documentation](https://docs.gitlab.com/charts/charts/gitlab/).

## Documentation and Resources

For more information about working with GitLab FIPS and Chainguard Images:

* [GitLab Helm Chart Documentation](https://docs.gitlab.com/charts/)
* [GitLab Configuration Guide](https://docs.gitlab.com/ee/administration/)
* [GitLab Runner Documentation](https://docs.gitlab.com/runner/)
* [GitLab Agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/)
* [NIST FIPS 140-3 Information](https://csrc.nist.gov/publications/detail/fips/140/3/final)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tileserver-gl

# tileserver-gl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tileserver-gl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tileserver-gl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using tileserver-gl

To run the server, simply start the container - such as:

```
$ docker -p 8080:8080 run cgr.dev/chainguard/tileserver-gl
Starting tileserver-gl v5.0.0
No input file found
[DEMO] Downloading sample data (zurich_switzerland.mbtiles) from https://github.com/maptiler/tileserver-gl/releases/download/v1.3.0/zurich_switzerland.mbtiles
[INFO] Automatically creating config file for zurich_switzerland.mbtiles
[INFO] Only a basic preview style will be used.
[INFO] See documentation to learn how to create config.json file.
Run with --verbose to see the config file here.
Starting server
Listening at http://[::]:8080/
Startup complete
```

This will expose the web application on port 8080.

By default, `tileserver-gl` downloads a sample vector tile, as stated in the logs.

To provide a downloaded set of tiles, simply mount them as `/data` directory - such as:

```
$ docker run -p 8080:8080 -v /path/to/downloaded-tiles-directory:/data:ro cgr.dev/chainguard/tileserver-gl
```

This will allow cause `tileserver-gl` to serve the tiles provided in directory above.

### User

The image is using `nonroot` user account with UID / GID of 65532.

### Differences to maptiler/tileserver-gl image

This image is not identical to the maptiler/tileserver-gl image. In particular:

- the image runs as user `nonroot`
- The underlying OS is [Wolfi](https://wolfi.dev) (which is glibc based) whereas the upstream image is based on Ubuntu

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k3s-openssl

# k3s-openssl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k3s-openssl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k3s-openssl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [K3s](https://k3s.io/) and our FIPS OpenSSL provider.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

> ⚠️ This image is **not FIPS 140-3 compliant**.
> It includes the Chainguard FIPS-hardened OpenSSL provider for compatibility testing purposes,
> such as using FIPS-compatible CNI plugins or components that require a FIPS provider to be present.
>
> This image is intended for internal and development use where full FIPS enforcement is not required.

This image is comparable to the [rancher/k3s image on Docker Hub](https://hub.docker.com/r/rancher/k3s). While not FIPS compliant, the image bundles Chainguard's FIPS OpenSSL provider for testing. This image should not be used in production environments where FIPS compliance is necessary.

The quickest way to test it is locally with `docker`:

```bash
docker run --rm -v `pwd`:/etc/rancher/k3s --privileged -p 6443:6443 cgr.dev/ORGANIZATION/k3s-openssl

KUBECONFIG=k3s.yaml kubectl get po -A
```

You can also use it as a drop in replacement in `k3d`:

```bash
k3d cluster create -i cgr.dev/ORGANIZATION/k3s-openssl
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grpc-health-probe-fips

# grpc-health-probe-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grpc-health-probe-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grpc-health-probe-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A tool to perform health-checks for gRPC applications in Kubernetes and elsewhere

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [grpc-health-probe](https://github.com/grpc-ecosystem/grpc-health-probe/pkgs/container/grpc-health-probe) image. Switching to Chainguard image should not require any changes to your existing setup

## Getting Started

### Docker
We can start a gRPC-server like openfga and then check the health of the server using the Chainguard grpc-health-probe image:
```bash
docker network create grpc-health-probe-test
docker run --rm -d --net grpc-health-probe-test --name grpc-server cgr.dev/ORGANIZATION/openfga:latest run
docker run --rm --net grpc-health-probe-test cgr.dev/ORGANIZATION/grpc-health-probe-fips -addr grpc-server:8081
```

## Documentation and Resources
for more information, please refer to [the official documentation for grpc-health-probe](https://github.com/grpc-ecosystem/grpc-health-probe/blob/master/README.md).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trivy-fips

# trivy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trivy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trivy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `trivy-fips` container image is designed to be a drop-in replacement for the [Trivy image](https://hub.docker.com/r/aquasec/trivy). Like other Chainguard Containers, `trivy-fips` was designed with minimalism and security in mind. For example, it doesn't come with tools like a shell or package manager.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Trivy requires downloading a vulnerability database on its first run. This database is updated regularly and cached locally.

### Scanning Container Images

Scan a container image for vulnerabilities:

```shell
docker run --rm cgr.dev/ORGANIZATION/trivy-fips image python:3.4-alpine
```

### Scanning Local Filesystem

Scan the current directory for vulnerabilities:

```shell
docker run --rm -v $(pwd):/tmp/scan cgr.dev/ORGANIZATION/trivy-fips fs /tmp/scan
```

## Documentation and Resources

- [Trivy Documentation](https://aquasecurity.github.io/trivy/)
- [Trivy GitHub Repository](https://github.com/aquasecurity/trivy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pushprox

# pushprox
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pushprox` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pushprox/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PushProx is a client and proxy that allows transversing of NAT and other similar network topologies by Prometheus

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The `pushprox` Chainguard image is meant to serve as a drop-in replacement for the [PushProx image on DockerHub](https://hub.docker.com/r/prometheuscommunity/pushprox). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

## Prerequisites

* `prometheus`
* `prometheus-node-exporter` (component to scrape)

## Getting started

To begin, start the PushProx container with a command like the following:

```shell
# pushprox-proxy
docker run --rm cgr.dev/ORGANIZATION/pushprox --help

# pushprox-client
docker run --rm --entrypoint="/app/pushprox-client" cgr.dev/ORGANIZATION/pushprox --help
```

> [!NOTE]
> This will return pushprox-proxy and pushprox-client Command-line's usage instructions.

The PushProx client performs scrapes in a network environment that's not directly accessible by Prometheus. The PushProx proxy is accessible by both the Clients and Prometheus. Each client is identified by its fqdn.

Create isolated docker networks and deploy the target service (node_exporter) and the PushProx client on one network. Then deploy PushProx proxy and Prometheus will be deployed on the other.

Prometheus will scrape the target via the proxy. The client will then poll the proxy for scrape requests. The proxy routes the scrape to the client. This scrape request is executed by the client and the response containing metrics is posted to the proxy.

#### Create isolated networks
```shell
docker network create external-net
docker network create internal-net --internal
```

#### Deploy node_exporter
```shell
docker run -d --name target \
--network internal-net \
cgr.dev/ORGANIZATION/prometheus-node-exporter:latest
```

#### Deploy PushProx proxy
```shell
docker run -d --name pushprox-proxy \
--network external-net \
-p 8080:8080 \
cgr.dev/ORGANIZATION/pushprox:latest
```

#### Deploy PushProx client
```shell
docker run -d --name pushprox-client \
--network internal-net \
--entrypoint="/app/pushprox-client" \
cgr.dev/ORGANIZATION/pushprox:latest \
--proxy-url="http://pushprox-proxy:8080" \
--fqdn="target"
```

#### Connect client to external network
```shell
docker network connect external-net pushprox-client
```

#### Deploy prometheus

1. Create prometheus scrape config
```shell
cat << EOF > prometheus.yml
global:
  scrape_interval: 30s

scrape_configs:
  - job_name: pushprox
    proxy_url: http://pushprox-proxy:8080
    static_configs:
    - targets: ['target:9100']
EOF
```

2. Deploy prometheus
```shell
docker run -d --name $prometheus_container \
--network external-net \
-p 9090:9090 \
-v ./prometheus.yml:/etc/prometheus/prometheus.yml \
cgr.dev/ORGANIZATION/prometheus:latest \
--config.file=/etc/prometheus/prometheus.yml
```

#### Validate target is up and being scraped
```shell
curl http://localhost:9090/api/v1/targets | jq -r '.data.activeTargets'
```

expected response:
```json
[
  {
    "discoveredLabels": {
      "__address__": "target:9100",
      "__metrics_path__": "/metrics",
      "__scheme__": "http",
      "__scrape_interval__": "5s",
      "__scrape_timeout__": "5s",
      "job": "pushprox"
    },
    "labels": {
      "instance": "target:9100",
      "job": "pushprox"
    },
    "scrapePool": "pushprox",
    "scrapeUrl": "http://target:9100/metrics",
    "globalUrl": "http://target:9100/metrics",
    "lastError": "",
    "lastScrape": "2025-07-16T19:59:32.623643339Z",
    "lastScrapeDuration": 0.02758125,
    "health": "up",
    "scrapeInterval": "30s",
    "scrapeTimeout": "30s"
  }
]
```

## Documentation and Resources
- [PushProx Repo](https://github.com/prometheus-community/PushProx)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter-plugin-trivy-fips

# kyverno-policy-reporter-plugin-trivy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter-plugin-trivy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter-plugin-trivy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This Plugin for Policy Reporter brings additional Trivy specific information to the Policy Reporter UI

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `kyverno-policy-reporter-plugin-trivy-fips` image is compatible with the upstream Trivy Policy Reporter plugin. It provides vulnerability scanning and security reporting capabilities integrated with Policy Reporter.

### FIPS Support
The `kyverno-policy-reporter-plugin-trivy-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Prerequisites
- Kubernetes cluster
- Kyverno installed and running
- Trivy Operator for vulnerability scanning
- Policy Reporter with UI enabled

## Getting Started

### Installing with Helm

First, install Kyverno if not already installed:

```shell
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno --namespace kyverno
```

Next, install the Trivy Operator for vulnerability scanning:

```shell
helm repo add aqua https://aquasecurity.github.io/helm-charts
helm repo update
helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system \
  --create-namespace
```

Install the Trivy Operator Policy Reporter Adapter to convert VulnerabilityReports to PolicyReports:

```shell
helm repo add fjogeleit https://fjogeleit.github.io/trivy-operator-polr-adapter
helm repo update
helm install trivy-operator-polr-adapter fjogeleit/trivy-operator-polr-adapter \
  --namespace trivy-system
```

Then, install Policy Reporter with the Trivy plugin enabled:

```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm repo update

helm install policy-reporter policy-reporter/policy-reporter \
  --namespace kyverno \
  --set ui.enabled=true \
  --set plugin.trivy.enabled=true \
  --set plugin.trivy.image.registry=cgr.dev \
  --set plugin.trivy.image.repository=ORGANIZATION/kyverno-policy-reporter-plugin-trivy \
  --set plugin.trivy.image.tag=latest
```

### Verifying the Installation

Check that all components are running:

```shell
kubectl get pods -n kyverno
kubectl get pods -n trivy-system
```

You should see pods for:
- **Kyverno namespace**: Kyverno controllers (admission, background, cleanup, reports), Policy Reporter, Policy Reporter Trivy Plugin
- **Trivy-system namespace**: Trivy Operator, Trivy Operator Policy Reporter Adapter

### Testing the Plugin

The Trivy plugin processes vulnerability data from the Trivy Operator and sends it to Policy Reporter. To test the complete workflow:

```shell
# Create a test pod for Trivy Operator to scan
kubectl run nginx-test --image=nginx:1.24 --namespace=default

# Wait for the pod to be ready and Trivy to scan it
kubectl wait --for=condition=ready pod nginx-test --namespace=default --timeout=60s

# Wait for Trivy Operator to scan and adapter to create PolicyReport
# This may take a few minutes for vulnerability database download and scanning
timeout 300 bash -c 'until kubectl get policyreport trivy-vuln-polr-pod-nginx-test --namespace=default >/dev/null 2>&1; do sleep 10; done' || \
  echo "PolicyReport not created yet, continuing anyway..."

# Port-forward to the Policy Reporter UI
kubectl port-forward -n kyverno svc/policy-reporter-ui 8080:8080 &

# Check for Trivy vulnerability results
curl -s "http://127.0.0.1:8080/proxy/default/core/v1/namespaced-resources/results?sources=trivy&categories=Vulnerability+Scan&namespaces=default&page=1&offset=10"

# Check for pod-specific vulnerability data
curl -s "http://127.0.0.1:8080/proxy/default/core/v2/namespace-scoped/resource-results?kinds=Pod&namespaces=default&search&page=1" | \
  jq '.items[] | select(.name=="nginx-test")'
```

You should see vulnerability reports for the nginx:1.24 image. The plugin automatically:
1. **Monitors** VulnerabilityReports created by Trivy Operator
2. **Processes** vulnerability data from scanned container images
3. **Forwards** enriched vulnerability information to Policy Reporter
4. **Provides** data through Policy Reporter's API and UI

## Configuration

The plugin supports various configuration options through the Policy Reporter Helm chart values. Key configuration options include:

- **Image configuration**: Set custom registry, repository, and tag
- **Resource limits**: Configure CPU and memory limits
- **Service configuration**: Customize service ports and types
- **Security settings**: Configure security contexts and policies

## Documentation and Resources

- [Policy Reporter Documentation](https://kyverno.github.io/policy-reporter/)
- [Trivy Documentation](https://trivy.dev/)
- [Trivy Operator Documentation](https://aquasecurity.github.io/trivy-operator/)
- [Policy Reporter Helm Chart](https://github.com/kyverno/policy-reporter/tree/main/charts/policy-reporter)
- [Trivy Operator Helm Chart](https://github.com/aquasecurity/trivy-operator/tree/main/deploy/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### redis

# redis
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/redis` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/redis/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard image for [Redis](https://github.com/redis/redis), an in-memory database that persists on disk. Redis is a key-value store, supporting an array of different values, including Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, and Bitmaps.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Redis image is comparable to [the official Redis image on Docker Hub](https://hub.docker.com/_/redis), with some important differences:

### Entrypoint Differences
- **Upstream Redis (redis:8.x)**: Uses `docker-entrypoint.sh` script as entrypoint with `redis-server` as the default command. This wrapper script provides additional functionality such as automatic configuration file handling and initialization.
- **Chainguard Redis**: Uses `/usr/bin/redis-server` directly as the entrypoint, without a wrapper script. This provides a more minimal and secure approach but requires explicit configuration file specification when needed.

Chainguard also provides a `-slim` variant of the Redis image, without a shell, for more secure production use cases.

### Redis Module Loading

Due to the entrypoint differences, module loading behavior differs significantly:

- **Upstream Redis**: The `docker-entrypoint.sh` script automatically scans `/usr/local/lib/redis/modules/` directory and loads all `.so` files found there using the `--loadmodule` flag when starting Redis.
- **Chainguard Redis**: Modules are not automatically loaded since the image uses the Redis server binary directly. You must explicitly load modules via command-line flags or configuration file.

**Important:** Module support in Chainguard Redis images is only available for Redis 8.0 and 8.2 releases. Other versions do not include module support.

#### Loading Modules in Chainguard Redis

**Option 1: Using command-line flags**
```sh
docker run cgr.dev/ORGANIZATION/redis --loadmodule /usr/lib/redis/modules/mymodule.so
```

**Option 2: Using a configuration file**

Create a `redis.conf` file:
```conf
# Enable dynamic module commands (Redis 7.0+)
# Required for using MODULE LOAD command at runtime
enable-module-command yes
# Alternative: restrict to local connections only
# enable-module-command local

# Load modules at startup (recommended approach)
loadmodule /usr/lib/redis/modules/rejson.so
loadmodule /usr/lib/redis/modules/redisearch.so

# Standard Redis configurations
port 6379
bind 0.0.0.0
protected-mode no
```

Mount and use the configuration:
```sh
docker run -v $(pwd)/redis.conf:/etc/redis.conf cgr.dev/ORGANIZATION/redis /etc/redis.conf
```

**Security Note:** Starting with Redis 7.0, the `MODULE` command is disabled by default. The `enable-module-command` directive must be set in the configuration file to allow dynamic module loading at runtime.

### Other Key Differences
Unlike many other Chainguard images, the Redis image includes a shell, allowing you to interact with the Redis database using the Redis command-line interface, `redis-cli`. 

By default this image runs as a non-root user named `redis` with a uid of `65532`. Typically, Redis does not have a default data directory and instead defaults to whatever the working directory is for the Redis process. The Chainguard Redis image provides a default working directory of `/data` that is writeable by the `redis` user.

### Important license update

Redis version 7.4 and subsequent releases are no longer licensed under BSD-3-Clause; instead, the Redis project has adopted a dual licensing model. This means users have the choice to adopt either the Redis Source Available License v2 (RSALv2) or the Server Side Public License v1 (SSPLv1).

Please give careful consideration to these licensing conditions when using Redis. For more details, refer to the [upstream license information](https://github.com/redis/redis/blob/unstable/LICENSE.txt).

## Getting Started

## Redis Version
This will automatically pull the image to your local system and execute the command `redis --version`:

To run the Chainguard Redis image with Docker using default configuration you could run the following command:

```sh
docker run -p 6379:6379 --rm cgr.dev/ORGANIZATION/redis
```

This command forwards port `6379` (the default port for Redis) on the host machine to port `6379` on the container:

```
1:C 25 Oct 2024 17:12:32.419 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 25 Oct 2024 17:12:32.419 * Redis version=7.4.1, bits=64, commit=74b289a0, modified=1, pid=1, just started
1:C 25 Oct 2024 17:12:32.419 # Warning: no config file specified, using the default config. In order to specify a config file use /usr/bin/redis-server /path/to/redis.conf
1:M 25 Oct 2024 17:12:32.420 * monotonic clock: POSIX clock_gettime
1:M 25 Oct 2024 17:12:32.420 * Running mode=standalone, port=6379.
1:M 25 Oct 2024 17:12:32.421 * Server initialized
1:M 25 Oct 2024 17:12:32.421 * Ready to accept connections tcp
```

Following that, you can open another terminal and use `redis-cli` locally. Any commands you run through it will be forwarded to the `redis` process in the container:

```
$ redis-cli set test 10
OK
$ redis-cli get test
"10"
$ redis-cli
127.0.0.1:6379>
```

Alternatively, to test out Redis within the container, you can run the following command to access the container's shell:

```sh
docker run -it --entrypoint sh cgr.dev/ORGANIZATION/redis
```

Then run the `redis-server` command to start the `redis` process, and include the `--daemonize yes` option to prevent it from taking over the terminal:

```
/data $ redis-server --daemonize yes
```

Following that, you can run `redis-cli`, the Redis command-line interface, and begin testing the database:

```
/data $ redis-cli
127.0.0.1:6379> set test 20
OK
127.0.0.1:6379> get test
"20"
```

## Configuration

If you supply a different configuration file or change the user, UID, or `WORKDIR` instruction, you'll need to ensure the user running the `redis` process has permissions to access the relevant `redis.conf` and `dumb.rb` files.

When running in Docker using a volume, the Chainguard Redis image will automatically use a custom configuration instead of the default one. Here's an example that mounts a host volume containing a custom Redis configuration to the `/data` directory in the container:

```sh
docker run -d -v $(pwd):/data -p 6379:6379 cgr.dev/ORGANIZATION/redis
```

Again, this example forwards the local port `6379` to the container's port `6379`, the `redis` process's default port. 

Following that, you can run `redis-cli` commands from your local machine which are then forwarded to the container:

```
$ redis-cli set foo bar
OK
$ redis-cli get foo
"bar"
```

You can also open the `redis-cli` prompt locally and forward commands to the container from there:

```
$ redis-cli
127.0.0.1:6379> get foo
"bar"
```

## Documentation and Resources

* [Official Redis Documentation](https://redis.io/docs/latest/)
* (eBook) [How To Manage a Redis Database](https://www.digitalocean.com/community/books/how-to-manage-a-redis-database-ebook)
* (Tutorial) [How to Port a Sample Application to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/) — this article works through porting a small but complete application (built on NodeJS and Redis) to use Chainguard Images
* [Vulnerability Comparison: redis](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/redis/) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-cli-iamguarded

# aws-cli-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-cli-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-cli-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal IAMGuarded image with the [AWS CLI](https://aws.amazon.com/cli/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

IAMGuarded-compatible version of the AWS CLI image.

## Overview

This image provides the AWS CLI in an IAMGuarded-compatible format. It includes the `aws` command-line tool for interacting with Amazon Web Services.

## Usage

```bash
docker run --rm cgr.dev/chainguard-private/aws-cli-iamguarded:latest --version
```

## Configuration

The image runs with a non-root user (UID/GID 1001) and installs the AWS CLI at `/opt/iamguarded/aws-cli/`.
## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-server-fips

# metrics-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Metrics Server is a Kubernetes component that collects and provides resource usage metrics (CPU, memory) for nodes and pods.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard image for metrics server is comparable to the original, used by
the [supported helm chart](https://github.com/kubernetes-sigs/metrics-server?tab=readme-ov-file#installation).

Our user defaults to running as user 65532, whereas the original runs as 65534.
In both cases these are non-root users. Similar to the upstream image, our image
does not contain a shell or a package manager, and only the minimum set of tools
and dependencies needed to function.

## Getting Started

The Chainguard metrics server image, can be deployed using
[the following helm chart](https://artifacthub.io/packages/helm/metrics-server/metrics-server).

Add the helm repository:

```bash
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
```

Create a values.yaml, specifying the Chainguard image:

```bash
# values.yaml
image:
  repository: cgr.dev/ORGANIZATION/metrics-server-fips
  tag: latest
```

Deploy using helm:

```bash
helm install metrics-server metrics-server/metrics-server -f values.yaml
```

A few minutes after successful deployment, you should see metrics begin to
be published, example:

```bash
kubectl top node
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
control-plane   144m         1%     623Mi           2%
```

> If validating this image in a local 'kind' or 'k3d' cluster, you may need to
> disable tls, by setting 'args: ["--kubelet-insecure-tls"]' in values.yaml.
> Do not set this flag on a production environment.

## Documentation and Resources
For more information on how to deploy and configure metrics server, please
refer to the [GitHub project documentation](https://github.com/kubernetes-sigs/metrics-server).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-fips

# rabbitmq-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[RabbitMQ](https://github.com/rabbitmq/rabbitmq-server) is a message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using rabbitmq in FIPS mode

To use this image in FIPS mode, the rabbitmq server application needs to load an extra configuration file containing the following (in the old Rabbitmq config format):

```
[
    {crypto, [
        {fips_mode, true}
    ]}
].
```

The file is located in `/etc/erlang/releases/27/sys.config` in this image.

The file can be loaded by setting an environment variable that points to the file:

```
RABBITMQ_ADVANCED_CONFIG_FILE=/etc/erlang/releases/27/sys.config
```

### Verifying rabbitmq is in FIPS mode

To verify if rabbitmq is running with FIPS enabled, use the following command:

```
/usr/lib/rabbitmq/bin/rabbitmqctl environment |grep fips
```

If FIPS is enabled, the result will look like the following:
```
 {crypto,[{fips_mode,true},{rand_cache_size,896}]},
```

The `rabbitmqctl` command also outputs JSON, which can be parsed like this:

```
/usr/lib/rabbitmq/bin/rabbitmqctl environment --formatter json |jq '.crypto .fips_mode'
```

The result will be `true` if FIPS is enabled, or `false` if it is not.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tritonserver-pytorch-backend

# tritonserver-pytorch-backend
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tritonserver-pytorch-backend` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tritonserver-pytorch-backend/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton backend for the PyTorch TorchScript models.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `tritonserver-pytorch-backend` image is functionally comparable to the official NVIDIA [`nvcr.io/nvidia/tritonserver:*-pyt-python-py3`](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver) image. This image contains the PyTorch backend (`libtriton_pytorch.so`) and supporting libraries such as **TorchVision** and **Torch-TensorRT**, 

> [!IMPORTANT]
> This image is optimized for inference only. It does **not** include utilities for model training or conversion. Use a full PyTorch environment (e.g., the NVIDIA PyTorch image) to prepare and export models.

---

## Getting Started

The following instructions serve a TorchScript-exported ResNet-50 model using the Triton Inference Server with the PyTorch backend.

### Step 1: Export a TorchScript model using NVIDIA’s PyTorch container

```bash
MODEL_PATH=$(pwd)/model_repository/1
mkdir -p "$MODEL_PATH"

docker run --rm -v "$MODEL_PATH:/out" nvcr.io/nvidia/pytorch:25.04-py3   python3 -c '
import torch
import torchvision.models as models
model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
model.eval()
torch.jit.script(model).save("/out/model.pt")'
```

---

### Step 2: Create the model configuration file

```bash
cat > model_repository/config.pbtxt <<EOF
name: "resnet50"
platform: "pytorch_libtorch"
max_batch_size: 1
input [
  {
    name: "input"
    data_type: TYPE_FP32
    format: FORMAT_NCHW
    dims: [3, 224, 224]
  }
]
output [
  {
    name: "output"
    data_type: TYPE_FP32
    dims: [1000]
  }
]
EOF
```

---

### Step 3: Run Triton Inference Server using the Chainguard PyTorch backend image

```bash
docker run --rm --name triton -v "$(pwd)/model_repository:/models" -p8000:8000 -p8001:8001 -p8002:8002 cgr.dev/ORGANIZATION/tritonserver-pytorch-backend --model-repository=/models
```

---

### Step 5: Run inference with dummy input

Once the server becomes ready, create the inference request JSON:

```bash
python3 -c '
import json
with open("infer_input.json", "w") as f:
  json.dump({
    "inputs": [{
      "name": "input",
      "shape": [1, 3, 224, 224],
      "datatype": "FP32",
      "data": [0.0] * (1 * 3 * 224 * 224)
    }],
    "outputs": [{"name": "output"}]
  }, f)
'
```

Send the request:

```bash
curl -sf localhost:8000/v2/models/resnet50/infer   -H "Content-Type: application/json"   -d @infer_input.json | jq
```

---

You should see a JSON response with output logits of shape `[1, 1000]` indicating successful inference!

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hugo-fips

# hugo-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hugo-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hugo-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `hugo-fips` container image is based on the [klakegg/hugo image](https://hub.docker.com/r/klakegg/hugo) with these differences:

- Updated Hugo version
- No shell or package manager included (minimal Chainguard design)
- FIPS-validated cryptography

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Start by creating a new Hugo site. The following command will create a new directory named `my-site` to hold your site contents:

```shell
docker run --rm -v "$(pwd):/workspace" -w /workspace --user "$(id -u):$(id -g)" \
  cgr.dev/ORGANIZATION/hugo-fips:latest new site my-site
```

Navigate to your new site and start the development server:

```shell
cd my-site
docker run --rm -v "$(pwd):/workspace" -w /workspace -p 1313:1313 --user "$(id -u):$(id -g)" \
  cgr.dev/ORGANIZATION/hugo-fips:latest server --bind 0.0.0.0
```

This will return output telling you to navigate to `localhost:1313`. If you didn't add a theme any content to your Hugo site, navigating to this address your browser will show a **Page Not Found** message. This message indicates that Hugo is working, it just doesn't have any content to show.

## Documentation and Resources

- [Hugo Documentation](https://gohugo.io/documentation/)
- [Hugo Themes](https://themes.gohugo.io/)
- [Hugo Quick Start Guide](https://gohugo.io/getting-started/quick-start/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-downscaler

# kube-downscaler
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-downscaler` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-downscaler/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [kube-downscaler](https://codeberg.org/hjacobs/kube-downscaler), scale down Kubernetes deployments after work hours.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluent-operator-fips

# fluent-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluent-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluent-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### thanos

# thanos
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/thanos` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/thanos/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Thanos Image, a highly available Prometheus setup with long term storage

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `thanos` container image is functionally equivalent to the upstream [Thanos project](https://github.com/thanos-io/thanos). It is fully compatible with Thanos components such as sidecar, store, query, and compactor. This Chainguard image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

You can deploy `thanos` as a sidecar using the [kube-prometheus Helm chart](https://prometheus-community.github.io/helm-charts/). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
prometheus:
  prometheusSpec:
    thanos:
      image: cgr.dev/ORGANIZATION/thanos:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy `kube-prometheus-stack`

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install thanos --create-namespace -n monitoring prometheus-community/kube-prometheus-stack -f values-thanos.yaml --wait
```

## Documentation and Resources

* [Official Getting Started Guide](https://thanos.io/tip/thanos/getting-started.md/)
* [Thanos Github Repository](https://github.com/thanos-io/thanos)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-reflector

# kubernetes-reflector
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-reflector` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-reflector/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes controller for reflecting ConfigMaps, Secrets, and Certificates across namespaces

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is compatible with the [emberstack/kubernetes-reflector](https://github.com/emberstack/kubernetes-reflector) image. The main differences are:

* Our entrypoint is `/usr/bin/kubernetes-reflector` instead of `dotnet ES.Kubernetes.Reflector.dll`
* Our image includes a compatibility layer to ensure it works with the same environment variables and paths
* Our image runs a self-contained binary and does not have dotnet or aspnet packages installed

These changes should not affect normal operation, and the image should be a drop-in replacement for the upstream image in most configurations.

## Overview

Kubernetes Reflector is a Kubernetes controller created by Emberstack that can be used to automatically replicate resources across namespaces. This tool is particularly useful for:

* Replicating ConfigMaps and Secrets to multiple namespaces
* Working with cert-manager certificates and automatically reflecting the generated TLS Secrets to other namespaces
* Sharing common configuration across multiple namespaces

## Getting Started

The reflector can be deployed using the Helm chart from the Emberstack repository:

```shell
# Add the Emberstack Helm repository
helm repo add emberstack https://emberstack.github.io/helm-charts

# Update the Helm repositories
helm repo update

# Install the Helm chart with Chainguard's image
helm upgrade --install reflector emberstack/reflector \
  --namespace reflector \
  --create-namespace \
  --set image.repository=cgr.dev/ORGANIZATION/kubernetes-reflector \
  --set image.tag=latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage Examples

### Configuring Resources for Reflection

To reflect a resource, add the appropriate annotations to the source resource:

#### Reflect a ConfigMap

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  annotations:
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
data:
  key1: value1
```

#### Reflect a Secret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  annotations:
    reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
    reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2"
    reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
type: Opaque
data:
  username: dXNlcm5hbWU=  # username
  password: cGFzc3dvcmQ=  # password
```

## Configuration

### Environment Variables

The kubernetes-reflector image supports several environment variables to configure its behavior:

* `ASPNETCORE_HTTP_PORTS`: The port to listen on (default: 8080)
* `ES_Serilog__MinimumLevel__Default`: Log level (Verbose, Debug, Information, etc.)
* `ES_KubernetesClientConfiguration__VerifyConnection`: Whether to verify connection to Kubernetes API (true/false)
* `ES_KubernetesClientConfiguration__SkipTlsVerify`: Whether to skip TLS verification (true/false)
* `ES_KubernetesClientConfiguration__WatchReconnectTimeoutSeconds`: Timeout for reconnecting watches
* `ES_KubernetesClientConfiguration__ConnectionRetryIntervalMs`: Retry interval for connections

Example helm value overrides:

```yaml
env:
  - name: ES_Serilog__MinimumLevel__Default
    value: "Information"
  - name: ES_KubernetesClientConfiguration__SkipTlsVerify
    value: "false"
```

## Documentation and Resources

For more detailed information about kubernetes-reflector, please refer to:

* [GitHub Repository](https://github.com/emberstack/kubernetes-reflector)
* [Helm Chart Repository](https://artifacthub.io/packages/helm/emberstack/reflector)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### external-dns

# external-dns
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/external-dns` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/external-dns/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image to configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using External DNS

The Chainguard External DNS image is a drop-in replacement for the upstream image.
See the [upstream documentation](https://github.com/kubernetes-sigs/external-dns) for usage information specific to your environment.

```shell
$ docker run cgr.dev/chainguard/external-dns
usage: external-dns --source=source --provider=provider [<flags>]

ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS
providers.

Note that all flags may be replaced with env vars - `--flag` ->
`EXTERNAL_DNS_FLAG=1` or `--flag value` -> `EXTERNAL_DNS_FLAG=value`

Flags:
  --help                         Show context-sensitive help (also try
                                 --help-long and --help-man).
  --version                      Show application version.
  --server=""                    The Kubernetes API server to connect to
                                 (default: auto-detect)
  --kubeconfig=""                Retrieve target cluster configuration from
                                 a Kubernetes configuration file (default:
                                 auto-detect)
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluentd-kubernetes-daemonset

# fluentd-kubernetes-daemonset
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluentd-kubernetes-daemonset` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluentd-kubernetes-daemonset/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wolfi-based images that provide Fluentd DaemonSets for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Currently, Chainguard only provides an image for the Kinesis DaemonSet. Images for other DaemonSets are not currently provided, but may be requested.

The Chainguard Fluentd Kubernetes DaemonSet Images are comparable to the [official Fluentd Kubernetes DaemonSet Images from Docker Hub](https://hub.docker.com/r/fluent/fluentd-kubernetes-daemonset). However, the Chainguard images contain only the minimum set of tools and dependencies needed to function; for example, they do not include a package manager. Unlike many other Chainguard images, though, these images include a shell.

## Getting Started

### Kinesis DaemonSet

Create a new Kinesis stream in the AWS Management Console or using the AWS CLI by following the [AWS documentation](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html).

#### Deployment

```shell
cat > values.yaml <<EOF
variant: kinesis

image:
  repository: "cgr.dev/ORGANIZATION/fluentd-kubernetes-daemonset"
  pullPolicy: "Always"
  tag: "latest"

env:
  - name: K8S_NODE_NAME
    valueFrom:
      fieldRef:
        fieldPath: spec.nodeName
  - name: AWS_REGION
    value: "<AWS_REGION>"
  - name: AWS_ACCESS_KEY_ID
    value: "<AWS_ACCESS_KEY_ID>"
  - name: AWS_SECRET_ACCESS_KEY
    value: "<AWS_SECRET_ACCESS_KEY>"
  - name: AWS_PROFILE
    value: "<AWS_PROFILE>"
  - name: AWS_SESSION_TOKEN
    value: "<AWS_SESSION>"

fileConfigs:
  00_system.conf: |
    <system>
      log_level debug
    </system>
  04_outputs.conf: |
    <label @OUTPUT>
      <match **>
        @type kinesis_streams
        @id out_kinesis_streams
        endpoint https://<ENDPOINT>
        region <REGION>
        stream_name <STREAM_NAME>
    </label>
EOF
```

> [!NOTE]
> Replace the placeholder [values](https://github.com/fluent/helm-charts/blob/main/charts/fluentd/values.yaml) with your AWS [credentials](https://github.com/awslabs/aws-fluent-plugin-kinesis?tab=readme-ov-file#configuration-credentials) and the Kinesis stream details, including the [endpoint](https://docs.aws.amazon.com/general/latest/gr/ak.html), region, and stream name.

Deploy the [Fluentd Helm Chart](https://github.com/fluent/helm-charts/tree/main/charts/fluentd) with the provided `values.yaml` file:

```shell
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm install fluentd fluent/fluentd -f values.yaml
```

After a while, you should be see the `[DEBUG]` log in the `fluentd` Pods, indicating that the logs are being sent to the Kinesis stream:

```shell
$ kubectl logs daemonsets/fluentd

...
[debug]: #0 [out_kinesis_streams] fluentd-kubernetes-daemonset-test: Write chunk 62a9515075decf841a1cb6f2a29d21ef /  67 records /   40 KB
[debug]: #0 [out_kinesis_streams] fluentd-kubernetes-daemonset-test: Finish writing chunk
...
```

Finally, check the Kinesis records using the AWS Management Console or the AWS CLI:

```shell
aws --endpoint-url=https://<ENDPOINT> kinesis get-records \
  --shard-iterator "$(
    aws --endpoint-url=https://<ENDPOINT> \
      kinesis get-shard-iterator \
      --shard-iterator-type TRIM_HORIZON \
      --shard-id shardId-000000000000 \
      --stream-name <STREAM_NAME> \
      --query 'ShardIterator' \
      --output text
  )"
```

## Documentation and Resources
Refer to the official documentation on the Fluentd DaemonSets for Kubernetes for further guidance on setup and configuration.

- [Fluentd + Kubernetes documentation](https://docs.fluentd.org/container-deployment/kubernetes)
- [Fluentd Stream Processing with Kinesis](https://docs.fluentd.org/how-to-guides/kinesis-stream)
- [Fluentd Helm Chart](https://github.com/fluent/helm-charts/tree/main/charts/fluentd)
- [Fluentd Kinesis Plugin](https://github.com/awslabs/aws-fluent-plugin-kinesis)

## Image Tagging

This image supports multiple Ruby versions and produces image tags in the following format:

```shell
cgr.dev/ORGANIZATION/fluentd-kubernetes-daemonset:<fluentd-version>-<component>-rb<ruby-version>
```

At present, this image only supports `kinesis` component with Ruby starting from version 3.1.x to 3.4.x.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### coredns-fips

# coredns-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/coredns-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/coredns-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal FIPS image of CoreDNS for secure and flexible DNS-based service discovery in kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `coredns-fips` image is a drop-in replacement for the upstream [coredns/coredns](https://hub.docker.com/r/coredns/coredns) container image. It is fully compatible with the official [CoreDNS Helm chart](https://github.com/coredns/helm) and supports all standard CoreDNS plugins and functionality, including k8s service discovery and DNS forwarding. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS support

Chainguard's `coredns-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [coredns Helm chart](https://github.com/coredns/helm). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/coredns-fips
  tag: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `coredns` helm chart

```shell
helm repo add coredns https://coredns.github.io/helm
helm repo update
helm install coredns coredns/coredns --namespace=kube-system --create-namespace -f values.yaml --wait
```

## Documentation and Resources
- [coreDNS Github Repository](https://github.com/coredns/coredns)
- [coreDNS Helm Chart](https://github.com/coredns/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-gateway-fips

# envoy-gateway
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-gateway` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-gateway/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Manages Envoy Proxy as a Standalone or Kubernetes-based Application Gateway.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [upstream image](https://hub.docker.com/r/envoyproxy/gateway/tags). Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support
The envoy-gateway-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To install the [upstream Helm chart](https://gateway.envoyproxy.io/docs/install/install-helm/) with Chainguard's Envoy Gateway image you can use the following command:
```bash
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v0.0.0-latest -n envoy-gateway-system --create-namespace  --set deployment.envoyGateway.image.repository=cgr.dev/chainguard/envoy-gateway-fips --set deployment.envoyGateway.image.tag=latest
```

If you prefer to use a `values.yaml` file then you can override the image repository and tag as follows:
```yaml
deployment:
  envoyGateway:
    image:
      repository: cgr.dev/chainguard/envoy-gateway-fips
      tag: latest
```

## Documentation and Resources
Once the deployment is successful, you can access the envoy gateway by following the [official documentation](https://gateway.envoyproxy.io/docs/).

You can also find various application-specific tasks in [the documentation's **Tasks** section](https://gateway.envoyproxy.io/docs/tasks/).

For next steps following installation, please refer to [the official quickstart guide](https://gateway.envoyproxy.io/docs/tasks/quickstart/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1217

# request-1217
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1217` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1217/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rsyslog

# rsyslog
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rsyslog` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rsyslog/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[rsyslog](https://github.com/rsyslog/rsyslog) is a software utility used for log processing.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `rsyslog` image is a minimal container image that provides main `rsyslog` package. This image also provides the plugins as tags. Since there is no such official image for `rsyslog`, this image is custom built by Chainguard.

## Using rsyslog

The default ports are 514(tcp/udp) and 1601(tcp) for RELP.

Note that you may need to setup volumes.

To run with Docker using default configuration:

```sh
docker run --rm cgr.dev/ORGANIZATION/rsyslog:latest
```

## Plugins

To access the plugins, you can use the following tagging format:

```sh
docker run --rm cgr.dev/ORGANIZATION/rsyslog:<VERSION>-<PLUGIN>
```

There is a special tag `all` which includes all the plugins.

## Configuration

For configuration information, see https://www.rsyslog.com/doc/configuration/index.html and `/etc/rsyslog.conf`.

## Documentation and Resources
You can learn more about rsyslog via the [official documentation](https://www.rsyslog.com/doc/index.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-446

# request-446
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-446` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-446/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This Chainguard python-custom-fips image includes the official Python base packages along with specialized libraries optimized for applications requiring secure XML handling, cryptographic operations, and rich text rendering:

- libxslt: Provides XSLT processing capabilities.
- xmlsec: Essential for secure XML processing and digital signature verification.
- openssl: For enhanced cryptographic functions and SSL/TLS support.
- pango: Enables rich text rendering for graphical operations.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-for-fluent-bit-fips

# aws-for-fluent-bit-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-for-fluent-bit-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-for-fluent-bit-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Known Issues

### The Enable_Entity option is not supported
The original AWS image uses Fluent-Bit 1.9.10 which was end of life in December 2022.

AWS released a "patch" for the 1.9.10 version which adds the `Enable_Entity` option. At the time of writing there is no equivalent patch for current versions of Fluent-Bit.

This has been raised with the Fluent-Bit project as a [feature request](https://github.com/fluent/fluent-bit/issues/10340) in the hope that they can update the patch. Until this change is made, however, this image cannot support the `Enable_Entity` option.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spire-fips

# spire-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spire-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spire-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jre-fips

# jre-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jre-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jre-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This is a base image containing both the OpenJDK JRE and the Bouncy Castle crypto
libraries for FIPS.

When using the OpenJDK Chainguard Image for FIPS compliance, please
make sure to read the security policy and adapt your code as
needed. Follow these documents:

* [Bouncy Castle FIPS Java API User Guide]
* [Bouncy Castle FIPS Java API Upgrade Guide]

> **Note**:
> In this document, the registry and repository path will be referred as
> `cgr.dev/ORGANIZATION`. Make sure to replace those with the correct
> path of where your image is located.

## Available versions and variants

This image is currently available in the following versions and variants:

| Java version | Image name                |
|--------------|---------------------------|
| Java 21      | `jre-fips:openjdk-21`     |
| Java 17      | `jre-fips:openjdk-17`     |
| Java 11      | `jre-fips:openjdk-11`     |

## How are the `java.policy` and `java.security` files configured?

An updated version of the `java.security` configuration file is shipped under
the default location (`$JAVA_HOME/conf/security/java.security`) in this image and
is configured as described below:
* It excludes every default security provider except for the `SUN` provider,
    leaving only the following configuration:
    ```none
    security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider C:DEFRND[SHA256];ENABLE{ALL};
    security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider fips:BCFIPS
    security.provider.3=SUN
    ```

* It loads the `java.policy` file shipped under `/usr/lib/jvm/jdk-fips-config/java.policy`
    as an additional policy file, at position 2, leaving the policy configuration
    as:
    ```none
    policy.url.1=file:${java.home}/conf/security/java.policy
    policy.url.2=file:/usr/lib/jvm/jdk-fips-config/java.policy
    ```

    The additional policy file is configured as described in the BCFIPS user manual:
    ```none
    grant {
        permission java.lang.PropertyPermission "java.runtime.name", "read";

        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.internal.spec";
        permission java.lang.RuntimePermission "getProtectionDomain";
        permission java.lang.RuntimePermission "accessDeclaredMembers";

        permission org.bouncycastle.crypto.CryptoServicesPermission "tlsAlgorithmsEnabled";
        permission org.bouncycastle.crypto.CryptoServicesPermission "exportKeys";
    };
    ```

* It configures the `keystore.type` as `bcfks`, in order for Keystores to be
    FIPS-compliant.

* It sets the algorithms for the `KeyManagerFactory` and `TrustManagerFactory` as PKIX:
    ```none
    ssl.KeyManagerFactory.algorithm=PKIX
    ssl.TrustManagerFactory.algorithm=PKIX
    ```

* It sets BCFIPS to `approved_only` mode:
    ```none
    org.bouncycastle.fips.approved_only=true
    ```

## Using the provided Bouncy Castle libraries

Whenever possible ensure to use `--module-path
/usr/share/java/bouncycastle-fips`, as that allows one to execute
classes, jars, modules correctly with bouncycastle-fips JCA & JSSE
providers available to the JRE.

There are many additional environment variables preset in the image
that enable using `CLASSPATH` instead if desired.

> **TL;DR**: FIPS configuration via environment variables is exported by default,
> but if the application requires more configuration these must be patched accordingly.
> All environment variables and/or command-line options must be configured before
> running the application.
>
> The Bouncy Castle APIs must be used in accordance with the Security Policy provided
> for compliance. See the [Bouncy Castle Security Policy] for more information.

This image ships with the following components:
* BouncyCastle libraries for FIPS, shipped under `/usr/share/java/bouncycastle-fips`:
    * `bc-fips.jar`
    * `bctls-fips.jar`
    * `bcpkix-fips.jar`
* Java security configurations tailored to work with Bouncy Castle FIPS as established
  in the [user guide] and described in the previous section:
    * `$JAVA_HOME/conf/security/java.security`
    * `/usr/lib/jvm/jdk-fips-config/java.policy`

This image ships with the following environment variables exported by default:
* `JDK_JAVA_FIPS_OPTIONS="--add-exports java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED"`
* `JAVA_FIPS_CLASSPATH=/usr/share/java/bouncycastle-fips/*`
* `JAVA_TRUSTSTORE_OPTIONS="-Djavax.net.ssl.trustStoreType=FIPS"`

> **Warning**:
> These variable values **must not** be changed. If you need to use custom `CLASSPATH`
> or other JDK options, make sure to include these variables in your new variable declarations.
> Ensure that `JAVA_TRUSTSTORE_OPTIONS` is part of your `JDK_JAVA_OPTIONS` variable when
> using this image as a base image.

In addition, the following environment variables are also exported by default and can
be updated as needed:
* `CLASSPATH=$JAVA_FIPS_CLASSPATH:.:./*`
* `JDK_JAVA_OPTIONS=$JDK_JAVA_FIPS_OPTIONS $JAVA_TRUSTSTORE_OPTIONS`

When updating your classpath variable, make sure to keep the path to the
`bouncycastle-fips` folder in your classpath, so the Bouncy Castle libraries
are discoverable:
```shell
CLASSPATH="${JAVA_FIPS_CLASSPATH}:${CLASSPATH}"
```

When updating the `JDK_JAVA_OPTIONS` environment variable, make sure to specify
the exports options required for Bouncy Castle to work properly:
```shell
JDK_JAVA_OPTIONS="${JDK_JAVA_FIPS_OPTIONS} ${JDK_JAVA_OPTIONS}"
```

If you need the use of the converted keystore, make sure to also add the
`JAVA_TRUSTSTORE_OPTIONS` variable to your `JDK_JAVA_OPTIONS`:
```shell
JDK_JAVA_OPTIONS="${JAVA_TRUSTSTORE_OPTIONS} ${JDK_JAVA_OPTIONS}"
```

Alternatively, these can be also set as an argument to the JVM tools via the
`--class-path`/`-cp` and `-D` options. Please note these arguments take
precedence over the environment variables:
```shell
javac --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS} TestClass.java
java -cp "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVA_FIPS_OPTIONS} TestClass
jshell --class-path "${JAVA_FIPS_CLASSPATH}:." ${JDK_JAVAC_FIPS_OPTIONS}
```

> **Note**:
> `java -jar` ignores classpath options. If your target application is a runnable jar, you will need to
> specify module-path to bouncycastle-fips
> ```shell
> java --module-path /usr/share/java/bouncycastle-fips -jar myapp.jar
> ```

## Checking the configuration is being loaded correctly

As part of the effort to build this image, a set of tests was created that validates
that the BCFIPS and BCJSSE providers are in use.

Some of these tests are shipped in the image in
`/usr/lib/bcfips-policy-140-3`. They validate that allowed algorithms
are available, and disallowed ones are blocked.

## Using this as a base image

### Java 21 JRE

To consume this image as a base image, add it in the `FROM` statement of your Dockerfile. In order for the predefined
environment variables to be correctly consumed, `java -jar` **must not** be used, as it overrides `CLASSPATH` options.
Instead, add your jars to the `CLASSPATH` and invoke the main class directly:
```dockerfile
FROM cgr.dev/ORGANIZATION/jre-fips:openjdk-21

ENV CLASSPATH="${JAVA_FIPS_CLASSPATH}:./*"

CMD ["MyApp"]
```

This can also be worked into a multistage build using the JDK FIPS variant for compiling your application:
```dockerfile
FROM cgr.dev/ORGANIZATION/jdk-fips:openjdk-21

WORKDIR /src
COPY MyClass.java .

RUN javac MyClass.java && \
    jar cvf my-app.jar *.class

FROM cgr.dev/ORGANIZATION/jre-fips:openjdk-21

WORKDIR /jars
COPY --from=builder /src/my-app.jar .

ENV CLASSPATH="${JAVA_FIPS_CLASSPATH}:/jars/*"
CMD ["MyApp"]
```

[Bouncy Castle Security Policy]: https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp4743.pdf
[Bouncy Castle FIPS Java API User Guide]: https://downloads.bouncycastle.org/fips-java/BC-FJA-UserGuide-2.0.0.pdf
[Bouncy Castle FIPS Java API Upgrade Guide]: https://downloads.bouncycastle.org/fips-java/docs/BC-FJA%202.0.0%20Porting%20Guide.pdf

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vault

# vault
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vault` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vault/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for Vault, a cross-platform secrets manager and authentication tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard image is designed to work as a drop-in replacement for the
[vault image](https://hub.docker.com/r/hashicorp/vault).

This image supports the same environment variables, but has a number of
key differences, including:

* The directory for configuration files is `/etc/vault`
* The directory for filesystem driver (not used by default) is `/var/lib/vault`
* The directory for logs (not used by default) is `/var/log/vault`
* The vault binary and entrypoint script are stored in `/usr/bin`

Additionally, the Vault Chainguard image starts as the root user and
switches to the lower privileged `vault` user in the entrypoint script.

## Getting Started

The default entrypoint starts a single-node instance of the server in
development mode. Note that the container should be given the `IPC_LOCK`
capability:

```shell
docker run --cap-add IPC_LOCK cgr.dev/ORGANIZATION/vault
```

```
==> Vault server configuration:
Administrative Namespace:
         	Api Address: http://0.0.0.0:8200
                 	Cgo: enabled
     	Cluster Address: https://0.0.0.0:8201
   Environment Variables: GOTRACEBACK, HOME, HOSTNAME, PATH, PWD, SHLVL, SSL_CERT_FILE
          	Go Version: go1.23.2
          	Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", disable_request_limiter: "false", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
           	Log Level:
               	Mlock: supported: true, enabled: false
       	Recovery Mode: false
             	Storage: inmem
             	Version: Vault v1.17.6, built 2024-11-06T19:17:24Z
         	Version Sha: 69a720d5d940bfcd590d7c24f3c98f178673d796
. . .
==> Vault server started! Log data will stream in below:
. . .
```

### IPC\_LOCK Capability

If you run the container without `IPC_LOCK` capability, you will receive a warning:

```shell
docker run cgr.dev/ORGANIZATION/vault
```
```
Couldn't start vault with IPC_LOCK. Disabling IPC_LOCK, please use --cap-add IPC_LOCK
==> Vault server configuration:
. . .
```

`IPC_LOCK` is required for the memory lock (`mlock`) feature that prevents memory — which could potentially contain sensitive information — from being written to disk. For a full explanation of how it works, refer to the [official vault documentation](https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-security-concerns#ensure-mlock-is-enabled).

To turn on this capability, include the `--cap-add IPC_LOCK` argument:

```shell
docker run --cap-add IPC_LOCK cgr.dev/ORGANIZATION/vault
```

You can alternatively configure a Security Context in Kubernetes:

```
securityContext:
    runAsNonRoot: true
    runAsUser: 65532
    capabilities:
      add: ["IPC_LOCK"]
```

### Helm Chart Usage

This image and the `vault-k8s` image can be used with the [Helm chart](https://github.com/hashicorp/vault-helm). To replace the official images with the Chainguard images, provide the chart with the following values:

```
injector:
  image:
    repository: "cgr.dev/ORGANIZATION/vault-k8s"
    tag: "latest"

  agentImage:
    repository: "cgr.dev/ORGANIZATION/vault"
    tag: "latest"

server:
  image:
    repository: "cgr.dev/ORGANIZATION/vault"
    tag: "latest"
```

Assuming these values are saved in a file named `cgr_values.yaml`, you should be able to apply them by running the following commands:

```shell
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault --values cgr_values.yaml
```

## Configuration

To configure Vault for production or other environments you can mount a configuration file to the `/etc/vault` directory, as in this example:

```shell
docker run --cap-add=IPC_LOCK -v $PWD/vault.hcl:/etc/vault/vault.hcl cgr.dev/ORGANIZATION/vault server
```

You can also supply a vault configuration using the `VAULT_LOCAL_CONFIG` variable, like this:

```shell
docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/var/lib/vault"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' -p 8200:8200 cgr.dev/ORGANIZATION/vault server
```

### Persisting Data

If using the file data storage plugin, we recommend that you configure it to write to `/var/lib/vault`.

By default logs will be streamed to stdout and stderr, but can be configured to write to
`/var/log/vault`.

## Documentation and Resources

* [Official Vault Documentation](https://developer.hashicorp.com/vault/docs)
* [Vault Tutorials](https://developer.hashicorp.com/vault/tutorials)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nextcloud-server

# nextcloud-server
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nextcloud-server` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nextcloud-server/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nextcloud server, a safe home for all your data

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Nextcloud server. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's Nextcloud image maintains functional parity with the [upstream image](https://hub.docker.com/_/nextcloud/).

## Getting Started

### Docker

Simply run the image with the following command:

```shell
docker container run --pull always --rm -it -p 80:80 -p 443:443 cgr.dev/ORGANIZATION/nextcloud-server:latest
```

And jump to your browser to `http://localhost:80` to access the Nextcloud dashboard.

### Kubernetes

To deploy Nextcloud on Kubernetes, you can use the Helm chart provided by the Nextcloud community. First, add the Nextcloud Helm repository:

```shell
helm repo add nextcloud https://nextcloud.github.io/helm/
helm repo update
```

Override the default image repository and tag in the `values.yaml` file:

```shell
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/nextcloud-server
  tag: latest
EOF
```

Then, install the chart with the following command:

```shell
helm install nextcloud nextcloud/nextcloud -f values.yaml --wait
```

## Documentation and Resources
- [Nextcloud Helm Chart](https://github.com/nextcloud/helm)
- [Nextcloud Server documentation](https://docs.nextcloud.com/server/latest/admin_manual/contents.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ntia-conformance-checker

# ntia-conformance-checker
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ntia-conformance-checker` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ntia-conformance-checker/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Check SPDX SBOM for NTIA minimum elements

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azurefile-csi

# azurefile-csi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azurefile-csi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azurefile-csi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This driver allows Kubernetes to access Azure File volume using smb and nfs protocols, csi plugin name: file.csi.azure.com.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [azurefile-csi](https://oci.dag.dev/?image=mcr.microsoft.com/oss/kubernetes-csi/azurefile-csi:v1.32.1) image available from the Microsoft Artifact Registry. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Kubernetes

You can follow the [official documentation for running azurefile-csi on Kubernetes](https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/install-csi-driver-master.md) to run azurefile-csi.

Set the image on the Deployment and Daemonset:

```bash
$ kubectl set image -n kube-system deployment/csi-azurefile-controller azurefile=cgr.dev/ORGANIZATION/azurefile-csi:latest
deployment.apps/csi-azurefile-controller image updated
$ kubectl set image -n kube-system daemonset/csi-azurefile-node azurefile=cgr.dev/ORGANIZATION/azurefile-csi:latest
daemonset.apps/csi-azurefile-node image updated
```

### Helm

You can use the [official azurefile-csi-driver Helm chart](https://artifacthub.io/packages/helm/azurefile-csi-driver/azurefile-csi-driver) to install the `azurefile-csi-driver`, replacing the `azurefile` image in `values.yaml` with the Chainguard image.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  azurefile:
    repository: cgr.dev/ORGANIZATION/azurefile-csi
    tag: latest
```

Add the `azurefile-csi-driver` chart:

```bash
$ helm repo add azurefile-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/charts
"azurefile-csi-driver" has been added to your repositories
```

Install the `azurefile-csi-driver` chart with your custom `values.yaml` file:

```bash
$ helm install azurefile-csi azurefile-csi-driver/azurefile-csi-driver --values values.yaml
NAME: my-azurefile-csi-driver
LAST DEPLOYED: <DATE>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Azure File CSI Driver is getting deployed to your cluster.

To check Azure File CSI Driver pods status, please run:

  kubectl --namespace=default get pods --selector="app.kubernetes.io/name=my-azurefile-csi-driver" --watch
```

## Documentation and Resources

* [Official azurefile-csi repository](https://github.com/kubernetes-sigs/azurefile-csi-driver).
* [Use Azure Files Container Storage Interface (CSI) driver in Azure Kubernetes Service (AKS)](https://learn.microsoft.com/en-us/azure/aks/azure-files-csi)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### camunda

# camunda
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/camunda` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/camunda/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Camunda is a scalable platform for process orchestration and automation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `camunda` image is compatible with **Helm Chart 13.x (Camunda 8.8.x)** and later.

Starting with Helm chart 13.x, Camunda introduced a **unified orchestration image**. Earlier chart versions use a separate Zeebe-based image.

Chainguard provides images for both deployment models:

* `camunda-zeebe` for **Helm chart 12.x and earlier** (Camunda 8.7.x and older)
* `camunda` for **Helm chart 13.x and later** (Camunda 8.8.x and newer)

#### Warning about logs
While testing this image, some `ERROR` logs may appear that originate from the Camunda application itself.
By default, Camunda writes logs to the container filesystem under `/usr/local/camunda/logs`, which is not recommended for production use. Instead, disable filesystem logging and configure a logging driver to collect logs or emit them to stdout.
 For details, refer to the related [upstream issue](https://github.com/camunda/camunda-platform-helm/issues/2273) in the Camunda Helm chart repository.

## Getting Started

This section shows how to deploy Camunda 8 to a Kubernetes cluster using the official Helm chart and the Chainguard `camunda` image.

### Prerequisites

To follow these examples, you will need:

* A Kubernetes cluster
* `kubectl`
* `helm`

### Deploying with Helm

Add the Camunda Helm repository and update your local index:

```sh
helm repo add camunda https://helm.camunda.io
helm repo update
```

Create a `values.yaml` file to override the orchestration image with the Chainguard image:

```sh
cat > values.yaml <<EOF
orchestration:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/camunda
    tag: latest
EOF
```
Replace the `ORGANIZATION` placeholder with the name of your organization’s private repository in the Chainguard registry.

Camunda provides both a [quick install](https://docs.camunda.io/docs/self-managed/deployment/helm/install/quick-install/) guide and a [production install](https://docs.camunda.io/docs/self-managed/deployment/helm/install/production/) guide with additional configuration options.

Install Camunda using the values file:

```sh
helm install camunda-platform camunda/camunda-platform \
  --version <chart-version> \
  -f values.yaml
```

To determine which Helm chart versions are compatible with a given Camunda image tag, refer to the Camunda Helm chart [compatibility matrix](https://helm.camunda.io/camunda-platform/version-matrix/).

### Verifying the Deployment

Once the installation completes, verify that the pods are running:

```sh
kubectl get pods
```

```sh
NAME                                  READY   STATUS    RESTARTS   AGE
camunda-connectors-75fdbcc648-bd7sg   1/1     Running   0          2m
camunda-elasticsearch-master-0        1/1     Running   0          2m
camunda-zeebe-0                       1/1     Running   0          2m
```

If you are deploying Camunda locally, you can use port-forwarding to access the Camunda service:

```sh
kubectl port-forward svc/camunda-platform 8080:8080
```

With port-forwarding in place, you can verify connectivity to the orchestration API:

```sh
curl http://localhost:8080/v2/topology
```

You can also access the Camunda web interface in your browser at:

```
http://localhost:8080
```

## Documentation and Resources

For more detailed deployment options, configuration guidance, and usage examples, refer to the following resources:

* [Camunda Documentation](https://docs.camunda.io/)
* [Camunda GitHub Repository](https://github.com/camunda/camunda)
* [Camunda Helm Chart](https://docs.camunda.io/docs/self-managed/deployment/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### maven

# maven
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/maven` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/maven/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the Maven build system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Maven Chainguard image was built to work as a drop-in replacement for the official [Maven image on Docker Hub](https://hub.docker.com/_/maven). Like most of Chainguard's images, the Maven image does not operate as the root user and includes only the minimum packages needed to function.

Chainguard Maven images come with different versions of OpenJDK. This means you will need to ensure that you choose the correct image tag for your application needs.

## Getting Started

To illustrate how you can use Chainguard's Maven image, you will need a Java application for the Maven image to build. This overview will use a Spring Boot example application found in [this GitHub repository](https://github.com/chainguard-dev/learning-labs-java).

Clone the repository to your local machine and navigate into the project directory:

```shell
git clone https://github.com/chainguard-dev/learning-labs-java.git
cd learning-labs-java/
```

The example's Dockerfile uses the default Maven image from Docker Hub. Overwrite this file with the following command to instead use the Chainguard Maven Image: 

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/maven

WORKDIR /work

COPY src/ src/
COPY pom.xml pom.xml

RUN mvn clean package
RUN REPOSITORY=$(mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout) && rm -rf ${REPOSITORY}

WORKDIR /app

RUN cp /work/target/java-demo-app-1.0.0.jar .

ENTRYPOINT ["java", "-jar", "java-demo-app-1.0.0.jar"]
EOF
```

Then build an image using this Dockerfile with the following command:

```shell
docker build -t maven-app .
```

This command tags the image as `maven-app`. Run this image:

```shell
docker run --rm -p 8080:8080 maven-app
```

The app should now be running and you can interact with it by accessing it at [`localhost:8080/hello`](http://localhost:8080/hello), either in your browser or with `curl`, as in the following example:

```shell
curl localhost:8080/hello
```
```
Hello, World! I love Chainguard!
```

This shows that the application is working as expected. You can stop the container by pressing `CTRL + C` in the terminal where it's running.

### Using Chainguard's Maven image in a multi-stage build
‍
The image built in the previous example still includes build tooling and source code that aren't needed in the production image. Using a multi-stage build can reduce the number of dependencies.

To try this out, create a new Dockerfile named `Dockerfile.multi-stage`:

```shell
cat > Dockerfile.multi-stage <<EOF
FROM cgr.dev/chainguard/maven AS builder

WORKDIR /work

COPY src/ src/
COPY pom.xml pom.xml

RUN mvn clean package
RUN REPOSITORY=$(mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout) && rm -rf ${REPOSITORY}

FROM cgr.dev/chainguard/jre AS runner

WORKDIR /app

COPY --from=builder /work/target/java-demo-app-1.0.0.jar .

ENTRYPOINT ["java", "-jar", "java-demo-app-1.0.0.jar"]
EOF
```

Note that there are two `FROM` lines, the first one creates the `builder` image much as before and the second (named `runner`) copies the built JAR from the builder step into the smaller `cgr.dev/chainguard/jre` image. The result is a container image that only contains the JRE and the built application.

Using this multi-stage Dockerfile, build a new image:

```shell
docker build -f Dockerfile.multi-stage -t maven-app-multi-stage .
```

This command tags the image as `maven-app-multi-stage`. Run this image:

```shell
docker run --rm -p 8080:8080 maven-app-multi-stage
```

Again, the application will be accessible at [localhost:8080/hello](http://localhost:8080/hello):

```shell
curl localhost:8080/hello
```
```
Hello, World! I love Chainguard!
```

Once again, press `CTRL + C` to stop the running container.

## Documentation and Resources

* [Learning Lab: Chainguard's Java Container Image](https://www.youtube.com/watch?v=8v8xlFnRHfs)
* [Chainguard Blog: Building minimal and low CVE images for Java](https://www.chainguard.dev/unchained/building-minimal-and-low-cve-images-for-java)
* [Video: Building Minimal Images for Applications with Runtimes](https://edu.chainguard.dev/chainguard/chainguard-images/videos/minimal-runtime-images/)
* [Video: How to Migrate a Java Application to Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/videos/java-images/)
* [Vulnerability Comparison: maven](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/maven/)
* [Apache Maven Project Site](https://maven.apache.org/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### consul-k8s

# consul-k8s
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/consul-k8s` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/consul-k8s/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Helm

```sh
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install consul hashicorp/consul --set global.name=consul --create-namespace -n consul --set imageK8S=cgr.dev/chainguard/consul-k8s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-blackbox-exporter-iamguarded-fips

# prometheus-blackbox-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-blackbox-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-blackbox-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, ICMP and gRPC.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `prometheus-blackbox-exporter-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Prometheus Blackbox Exporter IAMGuarded is a security-enhanced variant of the Blackbox Exporter designed to be deployed using the Kube-Prometheus IAMGuarded Helm chart. This image provides additional security benefits over standard Blackbox Exporter deployments and allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, and ICMP.

## Kube-Prometheus Helm Chart Usage

This image is primarily used with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

### Blackbox Exporter Configuration

When using the Kube-Prometheus chart, you can override the Blackbox Exporter image under the `blackboxExporter` section in your `values.yaml`:

```yaml
blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### garage

# garage
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/garage` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/garage/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Garage is an S3-compatible distributed object storage service.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `garage` image is comparable to the upstream [Garage container image](https://hub.docker.com/r/dxflrs/garage) published by Deuxfleurs.

## Getting Started

Upstream publishes separate Helm chart branches for Garage v1.x and v2.x with
different configuration options:

* **v2.x** (latest): Use branch `main-v2` - uses `replicationFactor` and `consistencyMode`
* **v1.x**: Use branch `main-v1` - uses `replicationMode`

Clone the Helm chart for your desired version:

```shell
# For Garage v2.x (latest)
git clone -b main-v2 https://git.deuxfleurs.fr/Deuxfleurs/garage.git
```

Create a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/garage
  tag: latest
```

Install the chart:

```shell
helm install garage ./garage/script/helm/garage \
  --namespace garage \
  --create-namespace \
  -f values.yaml
```

The Helm chart generates the Garage configuration from values. For all
configuration options, refer to the [Garage Helm chart documentation](https://garagehq.deuxfleurs.fr/documentation/cookbook/kubernetes/).

## Usage

After deploying Garage, configure the cluster layout and create buckets using the `garage` CLI:

```shell
# Check cluster status and get node IDs
kubectl exec -n garage garage-0 -- garage status

# Assign nodes to the layout (use node IDs from status output)
kubectl exec -n garage garage-0 -- garage layout assign <node-id> -z dc1 -c 1G
kubectl exec -n garage garage-0 -- garage layout apply --version 1

# Create a bucket and access key
kubectl exec -n garage garage-0 -- garage bucket create my-bucket
kubectl exec -n garage garage-0 -- garage key create my-key
kubectl exec -n garage garage-0 -- garage bucket allow my-bucket --read --write --key my-key
kubectl exec -n garage garage-0 -- garage key info my-key --show-secret
```

Use the credentials from `key info` with any S3-compatible client. Port-forward to access the S3 API:

```shell
kubectl port-forward -n garage svc/garage 3900:3900 &
aws --endpoint-url http://localhost:3900 s3 cp myfile.txt s3://my-bucket/
aws --endpoint-url http://localhost:3900 s3 ls s3://my-bucket/
```

## Documentation and Resources

* [Garage Documentation](https://garagehq.deuxfleurs.fr/documentation/)
* [Garage Quick Start](https://garagehq.deuxfleurs.fr/documentation/quick-start/)
* [S3 Compatibility Reference](https://garagehq.deuxfleurs.fr/documentation/reference-manual/s3-compatibility/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opencost-fips

# opencost-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opencost-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opencost-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenCost give teams visibility into current and historical Kubernetes and cloud spend and resource allocation.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard OpenCost and OpenCost UI Images are comparable to the official [OpenCost image](https://ghcr.io/opencost/opencost) and [OpenCost UI image](https://ghcr.io/opencost/opencost-ui). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

OpenCost consists of following two images:  
 - cgr.dev/ORGANIZATION/opencost-fips:latest  
 - cgr.dev/ORGANIZATION/opencost-ui-fips:latest  
 
Refer to the [official Helm documentation](https://opencost.io/docs/installation/helm) for information on how to deploy OpenCost. The following is an example using the Helm chart, specifying the Chainguard images.

To get started with Chainguard's OpenCost and OpenCost UI image, we can use OpenCost Helm chart to deploy them.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
opencost:
  ui:
    enabled: true
    image:
      registry: cgr.dev
      repository: ORGANIZATION/opencost-ui-fips
      tag: latest
  image:
    registry: cgr.dev
    repository: ORGANIZATION/opencost-fips
    tag: latest
  prometheus:
    internal:
      enabled: true
      serviceName: "prometheus-server"
      serviceNamespace: "prometheus-system"

```

> [!NOTE]
> Prometheus is a prerequisite for OpenCost installation. OpenCost requires Prometheus for scraping metrics and data storage, so it is recommended to install Prometheus before deploying OpenCost, you can find more information on how to install Prometheus [here](https://opencost.io/docs/installation/prometheus).

Then deploy the Helm chart:

```shell

helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm repo update
helm install opencost opencost/opencost \
  --values values.yaml
```

## Documentation and Resources

- (OpenCost Documentation) [Managing with Helm](https://opencost.io/docs/installation/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gitness

# gitness
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gitness` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gitness/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the `gitness` [server application](https://github.com/harness/gitness).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To run `gitness`:

```
$ docker run -d \
  -p 3000:3000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/gitness:/data \
  --name gitness \
  --restart always \
  cgr.dev/chainguard/gitness

$ docker logs gitness
{"level":"info","time":"2023-09-30T16:31:40.085883346Z","message":"No valid profiler so skipping profiling ['']"}
{"level":"info","time":"2023-09-30T16:31:40.099510346Z","message":"Completed setup of system service 'gitness' (id: 1)."}
{"level":"info","time":"2023-09-30T16:31:40.100499137Z","message":"Completed setup of pipeline service 'pipeline' (id: 2)."}
{"level":"info","port":3000,"revision":"","repository":"","version":"0.0.0","time":"2023-09-30T16:31:40.100514721Z","message":"server started"}
{"level":"info","time":"2023-09-30T16:31:40.100516221Z","message":"gitrpc server started"}
{"level":"info","time":"2023-09-30T16:31:40.100517471Z","message":"gitrpc cron manager subroutine started"}
time="2023-09-30T16:31:40Z" level=debug msg="poller: request stage from remote server" thread=2
time="2023-09-30T16:31:40Z" level=debug msg="poller: request stage from remote server" thread=1
{"level":"info","time":"2023-09-30T16:31:41.560373846Z","message":"added 0 new entries to plugins"}
```

The server should then be available at `localhost:3000`.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-default-user-credential-updater

# rabbitmq-default-user-credential-updater
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-default-user-credential-updater` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-default-user-credential-updater/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [default-user-credential-updater](https://github.com/rabbitmq/default-user-credential-updater)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
For example, you can run it using the upstream RabbitMQ Cluster Operator deployment by
defining the `DEFAULT_USER_UPDATER_IMAGE` environment variable:

```shell
cat <<EOF > kustomization.yaml
resources:
- https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
patches:
- patch: |-
    - op: add
      path: "/spec/template/spec/containers/0/env/-"
      value: 
        name: DEFAULT_USER_UPDATER_IMAGE
        value: cgr.dev/chainguard/rabbitmq-default-user-credential-updater:latest
  target:
    kind: Deployment
    namespace: rabbitmq-system
    name: rabbitmq-cluster-operator
EOF

kustomize build . | kubectl apply -f -
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### minio-iamguarded

# minio-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/minio-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/minio-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MinIO is a high-performance, S3 compatible object store. This iamguarded variant is specifically designed to work with the iamguarded Helm chart.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MinIO IAMGuarded is a security-enhanced variant of MinIO designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard MinIO deployments.

## Helm Chart Installation

The MinIO IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Basic Installation

Once authenticated you can install the chart with standard Helm commands and your organization name:

```bash
helm install minio oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name.

To view all available configuration options:

```bash
helm show values oci://cgr.dev/$ORGANIZATION/iamguarded-charts/minio
```

### Registry Configuration

For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MinIO server image
image:
  registry: myregistry.example.com
  repository: mirrored/minio-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# MinIO client image
clientImage:
  registry: myregistry.example.com
  repository: mirrored/minio-client-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
defaultInitContainers:
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# MinIO Object Storage image
console:
  registry: myregistry.example.com
  repository: mirrored/minio-object-browser-iamguarded
  digest: sha256:... # Use specific digest instead of tag
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Standalone Docker Usage

While this image is optimized for use with the iamguarded Helm chart, it can also be run standalone:

```bash
docker run -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minio \
  -e MINIO_ROOT_PASSWORD=minio123 \
  cgr.dev/$ORGANIZATION/minio-iamguarded:latest server /data --console-address ":9001"
```

### MinIO Client

The MinIO client image is also available:

```bash
docker run cgr.dev/$ORGANIZATION/minio-iamguarded-client:latest --help
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### multus-cni

# multus-cni
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/multus-cni` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/multus-cni/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A CNI meta-plugin for multi-homed pods in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image provides a secure, minimal environment for running the [Multus CNI plugin](https://github.com/k8snetworkplumbingwg/multus-cni), a CNI meta-plugin that enables attaching multiple network interfaces to pods. It is functionally equivalent to the upstream image, and switching to the Chainguard image should not require any changes to your existing Kubernetes setup.

## Getting Started
The easiest way to deploy this image is using the [Multus CNI Helm chart](https://artifacthub.io/packages/helm/startechnica/multus).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/multus-cni
  pullPolicy: IfNotPresent
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the Multus CNI using helm

```shell
helm repo add startechnica https://startechnica.github.io/apps
helm repo update
helm install multus-cni startechnica/multus-cni --namespace multus-cni --create-namespace -f values.yaml
```

> The `multus-cni` helm chart defaults to `amd64`. If deploying `arm64` images,
add the following:
```
    --set nodeSelector."kubernetes\.io/arch"=arm64
```

### Verifying the Helm Installation
Once you've installed the `multus-cni` Helm chart, you can verify the deployment using the following commands:

```shell
kubectl get daemonset -n multus-cni 
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                     AGE
multus-cni-node   3         3         3       3            3           kubernetes.io/arch=amd64,kubernetes.io/os=linux   4m59s

kubectl get pod -n multus-cni 
NAME                    READY   STATUS    RESTARTS      AGE
multus-cni-node-5bzjg   1/1     Running   2 (24s ago)   4m40s
multus-cni-node-8hvcf   1/1     Running   2 (24s ago)   4m40s
multus-cni-node-vrkls   1/1     Running   2 (24s ago)   4m40s
```

To verify functionality, we can deploy a pod that uses a custom `NetworkAttachmentDefinition`

```shell
kubectl apply -f - <<EOF
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf
spec:
  config: '{
    "cniVersion": "0.3.0",
    "type": "macvlan",
    "master": "eth0",
    "mode": "bridge",
    "ipam": {
      "type": "host-local",
      "subnet": "10.42.0.0/24",
      "rangeStart": "10.42.0.20",
      "rangeEnd": "10.42.0.50",
      "gateway": "10.42.0.1"
    }
  }'
EOF
```

Then deploy a pod referencing that network
```shell
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: multus-test-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: test
    image: busybox
    command: ["sh", "-c", "ip a; sleep 3600"]
EOF
```

Use `kubectl exec` to verify multiple interfaces are attached and IPs are assigned.

```shell
kubectl exec multus-test-pod -- ip a
```

Expected output:
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue qlen 1000
    link/ether ea:80:a6:e4:0f:d7 brd ff:ff:ff:ff:ff:ff
    inet 10.42.0.4/24 brd 10.42.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::e880:a6ff:fee4:fd7/64 scope link
       valid_lft forever preferred_lft forever
```

## Documentation and Resources:

For more information, please refer to [the official documentation for multus-cni project](https://github.com/k8snetworkplumbingwg/multus-cni).
- [Multus CNI Github Repository](https://github.com/k8snetworkplumbingwg/multus-cni)
- [Multus CNI Helm Chart](https://artifacthub.io/packages/helm/startechnica/multus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### authentik-fips

# authentik-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/authentik-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/authentik-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Authentik](https://goauthentik.io/) is an open-source Identity Provider that provides single sign-on with support for SAML, OAuth2/OIDC, LDAP, and RADIUS protocols.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `authentik-fips` image is comparable to the [Authetnik Server Docker image](https://hub.docker.com/r/authentik/server). Like all Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager in the production variant, while maintaining full compatibility with Authentik functionality.

### FIPS Support

The `authentik-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module, ensuring cryptographic operations meet Federal Information Processing Standards requirements. This makes it suitable for government and regulated environments requiring FIPS-validated cryptography. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Getting Started with Docker

To run Authentik with Docker, you'll need to set up a PostgreSQL database and configure both the server and worker components. Authentik requires a shared network for the containers to communicate.

### Step 1: Create a Docker Network

```bash
docker network create authentik
```

### Step 2: Start a PostgreSQL database

```bash
docker run -d -p 5432:5432 \
  --name authentik-postgres \
  --network authentik \
  -e POSTGRES_DB=authentik \
  -e POSTGRES_USER=authentik \
  -e POSTGRES_PASSWORD=changeme \
  cgr.dev/ORGANIZATION/postgres:latest
```

### Step 3: Start the Authentik server

```bash
docker run -d -p 9000:9000 -p 9443:9443 \
  --name authentik-server \
  --network authentik \
  -e AUTHENTIK_SECRET_KEY=your-very-long-secret-key-at-least-50-characters-long \
  -e AUTHENTIK_POSTGRESQL__HOST=authentik-postgres \
  -e AUTHENTIK_POSTGRESQL__NAME=authentik \
  -e AUTHENTIK_POSTGRESQL__USER=authentik \
  -e AUTHENTIK_POSTGRESQL__PASSWORD=changeme \
  cgr.dev/ORGANIZATION/authentik-fips:latest server
```

### Step 4: Start the Authentik worker

```bash
docker run -d \
  --name authentik-worker \
  --network authentik \
  -e AUTHENTIK_SECRET_KEY=your-very-long-secret-key-at-least-50-characters-long \
  -e AUTHENTIK_POSTGRESQL__HOST=authentik-postgres \
  -e AUTHENTIK_POSTGRESQL__NAME=authentik \
  -e AUTHENTIK_POSTGRESQL__USER=authentik \
  -e AUTHENTIK_POSTGRESQL__PASSWORD=changeme \
  -e AUTHENTIK_BOOTSTRAP_PASSWORD=bootstraptestpassword \
  -e AUTHENTIK_BOOTSTRAP_TOKEN=bootstraptesttoken \
  cgr.dev/ORGANIZATION/authentik-fips:latest worker
```

The Authentik UI will be accessible at `http://localhost:9000`.

To view logs from the server or worker:

```bash
docker logs -f authentik-server
docker logs -f authentik-worker
```

## Getting started with Kubernetes

Authentik can be deployed to Kubernetes using [the official Helm chart](https://artifacthub.io/packages/helm/goauthentik/authentik).

### Step 1: Create a PostgreSQL instance

Startup postgres pod and expose the service inside the cluster.

```bash
kubectl run postgres-test \
  --image=cgr.dev/ORGANIZATION/postgres:latest \
  --port=5432 \
  --labels='app=postgres-test' \
  --env='POSTGRES_DB=authentik' \
  --env='POSTGRES_USER=authentik' \
  --env='POSTGRES_PASSWORD=changeme' \
  --restart=Never

kubectl expose pod postgres-test \
  --name=postgres-test \
  --port=5432 --target-port=5432 \
  --type=ClusterIP
```

Wait for Postgres pod to be ready.
```bash
kubectl wait --for=condition=ready pod \
  --selector app=postgres-test \
  --timeout=30s
```

### Step 2: Add the Authentik Helm repository

```bash
helm repo add authentik https://charts.goauthentik.io
helm repo update
```

### Step 3: Create a `values.yaml` file to override the default image:

```bash
cat <<EOF > authentik-values.yaml
global:
  image:
    repository: cgr.dev/ORGANIZATION/authentik-fips
    tag: latest

authentik:
  secret_key: "your-very-long-secret-key-at-least-50-characters-long"
  bootstrap_password: "bootstraptestpassword"
  bootstrap_token: "bootstraptesttoken"
  postgresql:
    host: "postgres-test.default.svc.cluster.local"
    name: "authentik"
    user: "authentik"
    password: "changeme"

server:
  service:
    servicePortHttp: 9000
    servicePortHttps: 9443
EOF
```

### Step 4: Install Authentik

```bash
helm install authentik authentik/authentik -f authentik-values.yaml
```

Wait for the Authentik server and worker to be ready:

```bash
kubectl rollout status deployment/authentik-server --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/component=server --timeout=30s

kubectl rollout status deployment/authentik-worker --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/component=worker --timeout=30s
```

Port-forward the authentik-server service to access the Authentik UI:
```bash
kubectl port-forward svc/authentik-server 9000:9000
```

The UI can now be accessed at `http://localhost:9000`

### Step 5: Configuring Authentik as an OAuth2/OIDC Provider

Authentik can act as an identity provider for other applications using OAuth2 and OpenID Connect. This section demonstrates how to configure Authentik to provide authentication for Grafana.

#### Overview

To integrate Grafana with Authentik OAuth, you need to:
1. Retrieve Authentik's default flow and property mapping IDs
2. Create an OAuth2 provider with client credentials
3. Create an application in Authentik that links the provider
4. Deploy Grafana with OAuth configuration pointing to Authentik

#### Prerequisites

Before configuring the OAuth2 provider, ensure you have:
- Authentik server running and accessible
- The bootstrap token configured during installation
- `curl` and `jq` installed for API calls

Set environment variables for the API calls:

> [!NOTE]
> Use the bootstrap token from your installation

```bash
export AUTHENTIK_URL="http://localhost:9000"
export TOKEN="bootstraptesttoken"
```

#### Retrieve Required Flow and Mapping IDs

First, retrieve the default flows and property mappings that Authentik uses for OAuth:

```bash
# Get authentication flow ID (handles user login)
AUTH_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-authentication-flow") | .pk')

# Get authorization flow ID (handles OAuth consent)
AUTHZ_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-provider-authorization-implicit-consent") | .pk')

# Get invalidation flow ID (handles logout)
INVAL_FLOW_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/flows/instances/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.slug=="default-provider-invalidation-flow") | .pk')

# Get property mappings for OAuth scopes
EMAIL_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-email") | .pk')

OPENID_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-openid") | .pk')

PROFILE_MAPPING=$(curl -sk "${AUTHENTIK_URL}/api/v3/propertymappings/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.managed=="goauthentik.io/providers/oauth2/scope-profile") | .pk')
```

#### Create OAuth2 Provider

Create an OAuth2 provider for Grafana with the retrieved IDs:

> [!NOTE]
> Update the `redirect_uris` URL to match your Grafana deployment URL.
> The Grafana redirect URL used in this guide is set to: 
> `http://localhost:3000/login/generic_oauth`

```bash
curl -sk -X POST "${AUTHENTIK_URL}/api/v3/providers/oauth2/" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "grafana-provider",
    "authentication_flow": "'"${AUTH_FLOW_PK}"'",
    "authorization_flow": "'"${AUTHZ_FLOW_PK}"'",
    "invalidation_flow": "'"${INVAL_FLOW_PK}"'",
    "property_mappings": [
      "'"${EMAIL_MAPPING}"'",
      "'"${OPENID_MAPPING}"'",
      "'"${PROFILE_MAPPING}"'"
    ],
    "client_type": "confidential",
    "client_id": "grafana-client-id",
    "client_secret": "grafana-client-secret",
    "access_code_validity": "minutes=1",
    "access_token_validity": "minutes=5",
    "refresh_token_validity": "days=30",
    "include_claims_in_id_token": true,
    "redirect_uris": [
      {
        "matching_mode": "strict",
        "url": "http://localhost:3000/login/generic_oauth"
      }
    ],
    "sub_mode": "hashed_user_id",
    "issuer_mode": "per_provider"
  }'
```

#### Create Application in Authentik

Retrieve the provider ID and create an application that links it:

```bash
# Get the provider ID
PROVIDER_PK=$(curl -sk "${AUTHENTIK_URL}/api/v3/providers/all/" \
  -H "Authorization: Bearer $TOKEN" | \
  jq -r '.results[] | select(.name=="grafana-provider") | .pk')

# Create the application
curl -sk -X POST "${AUTHENTIK_URL}/api/v3/core/applications/" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "grafana",
    "slug": "grafana",
    "provider": '"${PROVIDER_PK}"',
    "launch_url": "http://grafana.default.svc.cluster.local:3000",
    "open_in_new_tab": false,
    "policy_engine_mode": "any"
  }'
```

#### Deploy Grafana with OAuth Configuration

Create a Kubernetes secret for Grafana OAuth credentials:

```bash
kubectl create secret generic grafana-oauth \
  --from-literal=GF_AUTH_GENERIC_OAUTH_CLIENT_ID=grafana-client-id \
  --from-literal=GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET=grafana-client-secret
```

Create a Grafana values file with OAuth configuration:

> [!NOTE]
> Update the `root_url` to match your Grafana deployment URL.
> The Grafana `root_url` used in this guide is set to: 
> `http://localhost:3000/`
>
> Also update the `signout_redirect_url` and `auth_url` to match your Authentik deployment URL.
> The Authentik `signout_redirect_url` and `auth_url` used in this guide is set to:
> `http://localhost:9000/`

```bash
cat <<EOF > grafana-values.yaml
image:
  registry: cgr.dev/ORGANIZATION
  repository: grafana
  tag: latest

envFromSecret: grafana-oauth

service:
  port: 3000
  targetPort: 3000

grafana.ini:
  server:
    root_url: http://grafana.default.svc.cluster.local:3000
  auth:
    signout_redirect_url: http://localhost:9000/application/o/grafana/end-session/
  auth.generic_oauth:
    name: authentik
    enabled: true
    disable_login_form: true
    scopes: openid profile email
    auth_url: http://localhost:9000/application/o/authorize/
    token_url: http://authentik-server.default.svc.cluster.local:9000/application/o/token/
    api_url: http://authentik-server.default.svc.cluster.local:9000/application/o/userinfo/
    role_attribute_path: contains(groups, 'Grafana Admins') && 'Admin' || contains(groups, 'Grafana Editors') && 'Editor' || 'Viewer'
EOF
```

Install Grafana using Helm:

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana grafana/grafana -f grafana-values.yaml
```

Wait for Grafana to be ready:

```bash
kubectl rollout status deployment/grafana --timeout=30s
kubectl wait --for=condition=ready pod --selector app.kubernetes.io/name=grafana --timeout=30s
```

Port-forward the grafana service to access the Grafana UI:
```bash
kubectl port-forward svc/grafana 3000:3000
```

The UI can now be accessed at `http://localhost:3000`

#### Testing the OAuth Integration

To test the integration:

1. Access the Grafana UI at `http://localhost:3000`
2. Click "Sign in with authentik"
3. You'll be redirected to Authentik's login page
4. Log in with the bootstrap admin credentials:
   - Username: `akadmin`
   - Password: `bootstraptestpassword` (or your configured password)
5. After successful authentication, you'll be redirected back to Grafana

## Documentation and Resources
- [Authentik Documentation](https://docs.goauthentik.io/)
- [Authentik GitHub Repository](https://github.com/goauthentik/authentik)
- [Helm Chart Documentation](https://artifacthub.io/packages/helm/goauthentik/authentik)
- [Authentik Helm Chart Repository](https://github.com/goauthentik/helm)

For a complete list of configuration options, refer to the [Authentik configuration documentation](https://docs.goauthentik.io/docs/installation/configuration).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubeflow-pipelines

# kubeflow-pipelines
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubeflow-pipelines` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubeflow-pipelines/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Kubeflow Pipelines Images

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### livekit-server-fips

# livekit-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/livekit-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/livekit-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

livekit-server is an open-source media server for real-time audio, video, and data, designed for low latency and scalability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `livekit-server-fips` container image is comparable to the [livekit/livekit](https://github.com/livekit/livekit) image, with the following differences:

* Like all other Chainguard Containers, `livekit-server-fips` features a stripped down, minimal design
* It has few-to-zero CVEs

### FIPS Support
The `livekit-server-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Deploy with Helm Chart

**Create a values.yaml**

`values.yaml`
```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/livekit-server-fips
  tag: latest

livekit:
  keys:
    devkey: "secret-key"
```

**Install the LiveKit Helm chart:**
```bash
helm install livekit-server livekit/livekit-server \
  --namespace default \
  --create-namespace \
  -f values.yaml
```

**Verify the deployment:**
```bash
kubectl get pods -n default
kubectl get services -n default
```

**Access the server:**
```bash
kubectl port-forward deployment/livekit-server 7880:7880
```

**Test the connection:**
```bash
# Check if the server is responding
curl http://localhost:7880
```

## Documentation and Resources

- **[Official Documentation](https://docs.livekit.io)**
- **[GitHub Repository](https://github.com/livekit/livekit)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-csi-external-provisioner-fips

# kubernetes-csi-external-provisioner-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-csi-external-provisioner-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-csi-external-provisioner-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Sidecar container that watches Kubernetes PersistentVolumeClaim objects and triggers CreateVolume/DeleteVolume against a CSI endpoint

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kubernetes-csi-external-provisioner-fips` container image is comparable to the [official csi-provisioner image](https://gcr.io/k8s-staging-sig-storage/csi-provisioner:canary). Chainguard Containers are designed with minimalism and security in mind, and thus the `kubernetes-csi-external-provisioner` image has the following differences from the upstream image:

* Chainguard's `kubernetes-csi-external-provisioner-fips` image sets the entrypoint to `/usr/bin/csi-provisioner` whereas the upstream sets it to: `/csi-provisioner`.

### FIPS Support

The `kubernetes-csi-external-provisioner-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

To use Chainguard's `kubernetes-csi-external-provisioner-fips` image, first deploy the standard provisioner:
```
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-provisioner/v3.5.0/deploy/kubernetes/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-provisioner/v3.5.0/deploy/kubernetes/deployment.yaml
```
Then substitute the provisioner's image with ours:
```
kubectl set image deployment/csi-provisioner csi-provisioner="cgr.dev/chainguard/kubernetes-csi-external-provisioner-fips:latest"
```

## Documentation and Resources

* [Official Documentation](https://github.com/kubernetes-csi/external-provisioner/blob/master/README.md#usage)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### it-tools

# it-tools
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/it-tools` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/it-tools/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

`it-tools` is a collection of useful tools for developer and people working in IT.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard’s `it-tools` image is a is a drop-in replacement for the upstream [CorentinTh/it-tools](https://hub.docker.com/r/corentinth/it-tools) container image.It provides equivalent functionality while offering a smaller footprint and fewer dependencies, reducing the attack surface. It runs as a non-root user by default and adheres to Chainguard's security-focused best practices.

## Getting Started

You can deploy the `it-tools` image using Docker with the following command:

```bash
docker run -d --name it-tools \
        --restart unless-stopped \
        -p 8080:80 cgr.dev/ORGANIZATION/it-tools:latest
```

Once the container is running, the suite of tools should be now be accessible locally at http://localhost:8080

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

## Documentation and Resources
For more details about IT Tools, visit the project’s GitHub repository: [CorentinTh/it-tools](https://github.com/CorentinTh/it-tools)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### graalvm

# graalvm
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/graalvm` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/graalvm/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

GraalVM is an advanced JDK with ahead-of-time Native Image compilation

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is a production-ready distribution of [GraalVM](https://www.graalvm.org/). It is part of the Chainguard Images collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production.

### Tagging

Tags align with the version of the JDK provided on the image. For example, to pull GraalVM with JDK 24, you can run this command:

```sh
docker pull cgr.dev/ORGANIZATION/graalvm:24
```

There are additional tags covering other runtimes and variants documented below.

#### jmods

By default, Chainguard provides images that exclude jmods, significantly decreasing the overall size of the image. If your workflow requires jmods, you need only append `-jmods` to the image tag.

For example:

```sh
docker pull cgr.dev/ORGANIZATION/graalvm:<JDK VERSION>-jmods
```

### nodejs

Chainguard also provides tags for images that include the Node.js runtime in addition to GraalVM. These images leverage GraalJS:

```sh
docker pull cgr.dev/ORGANIZATION/graalvm:<JDK VERSION>-nodejs
```

### dev

Need a package that's critical to your workflow? Chainguard's `-dev` tags include additional utilities that are helpful for extending images:

```sh
docker pull cgr.dev/ORGANIZATION/graalvm:<JDK VERSION>-dev
```

## Getting Started

To test the GraalVM image, start by pulling the image:

```sh
docker pull cgr.dev/ORGANIZATION/graalvm:latest
```

Replace `ORGANIZATION` with your organization's name.

Next, run a container using the image you just downloaded:

```sh
docker run -it --rm cgr.dev/ORGANIZATION/graalvm:latest java -version
```

This command will start a container and display the Java version to verify that the image is working correctly:

```sh
openjdk version "23.0.2" 2025-01-21
OpenJDK Runtime Environment GraalVM CE 23.0.2.1 (build 23.0.2+-cgr-r1)
OpenJDK 64-Bit Server VM GraalVM CE 23.0.2.1 (build 23.0.2+-cgr-r1, mixed mode, sharing)
```

Create a simple Java application, for example, `HelloWorld.java`:

```java
    public class HelloWorld {
         public static void main(String[] args) {
              System.out.println("Hello, World!");
         }
    }
```

Then compile and run the application inside the container:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/graalvm:latest javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/graalvm:latest java HelloWorld
```

You should see the output `Hello, World!`, indicating that the image can compile and run Java applications.

Let's take this a step further and create a Native Image:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/graalvm:latest native-image HelloWorld -H:Name=HelloWorld
```

You can now run the image like any other executable:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/graalvm:latest native-image ./HelloWorld
```

You will once again see the output "Hello, World!", displaying that the image can compile and run Native Images!

## Documentation and Resources

- [GraalVM documentation](https://www.graalvm.org/latest/docs/)
- [GraalVM guides](https://www.graalvm.org/latest/guides/)
- [GraalVM community](https://www.graalvm.org/community/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ceph-csi-operator-fips

# ceph-csi-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ceph-csi-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ceph-csi-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Operator for Ceph CSI driver management in Kubernetes (FIPS)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Ceph-csi-operator-fips Image is comparable to the official Image from Docker Hub. However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting started

### Kubernetes Installation
The docs recommends installing the ceph operator by installing their [all-in-one manifest file](https://github.com/ceph/ceph-csi-operator/blob/main/docs/kubernetes-installation.md#2-install-the-ceph-csi-operator).
```
kubectl create -f deploy/all-in-one/install.yaml
```
Remember to change the upstream image to chainguard image in the manifest before installing. A command like this could help:
```
sed -i "s|quay.io/cephcsi/ceph-csi-operator:.*|cgr.dev/ORGANIZATION/REPO_NAME:latest|g" deploy/all-in-one/install.yaml
```

Once deployed, you could create Ceph-Csi drivers, CephConnection, ClientProfile etc. and verify installation.

### FIPS Support

The `ceph-csi-operator-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. 

For more on FIPS support in Chainguard Containers, consult the guide on [FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Additional Resources
- [Ceph CSI Operator GitHub](https://github.com/ceph/ceph-csi-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### metrics-agent-fips

# metrics-agent-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/metrics-agent-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/metrics-agent-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

metrics-agent collects Kubernetes allocation and utilization data

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `metrics-agent-fips` container image is designed to be a drop-in replacement for the upstream [metrics-agent-fips image](https://github.com/cloudability/metrics-agent).

### FIPS Support

The `metrics-agent-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  name: cgr.dev/ORGANIZATION/metrics-agent-fips
  tag: latest
clusterName: "default"
apiKey: "fake_key"
EOF
```

Add the Helm repository and install:

```shell
helm repo add metrics-agent https://cloudability.github.io/metrics-agent
helm repo update
helm install metrics-agent metrics-agent/metrics-agent -f values.yaml
```

## Documentation and Resources
- [metrics-agenet](https://github.com/cloudability/metrics-agent)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### povray-fips

# images/povray-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/povray-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/povray-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

POV-Ray is a ray-tracing program that generates images from text-based scene descriptions, with FIPS 140-3 compliant cryptographic modules.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `povray-fips` image provides a complete implementation of POV-Ray with FIPS 140-3 compliant cryptographic modules. Notable characteristics:

* Contains POV-Ray with all standard include files and libraries
* Runs as a non-root user by default
* Does not include a shell or package manager in the production variant
* Includes FIPS 140-3 compliant OpenSSL configuration for cryptographic operations

### FIPS Support

The `REPO_NAME` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

POV-Ray renders 3D scenes described in text files with a `.pov` extension. The basic workflow involves creating a scene file and using POV-Ray to render it to an image.

To render a simple scene, first create a scene file:

```sh
cat > simple-scene.pov <<EOF
#version MAJOR.MINOR;

global_settings { assumed_gamma 1.0 }

camera {
  location <0, 1, -5>
  look_at <0, 0, 0>
  angle 35
}

light_source { <5, 10, -5> color rgb <1, 1, 1> }

sphere {
  <0, 0, 0>, 1
  pigment { color rgb <1, 0, 0> }
  finish { phong 0.9 }
}

plane {
  y, -1
  pigment { checker color rgb <0.8, 0.8, 0.8>, color rgb <0.2, 0.2, 0.2> }
}
EOF
```

Render the scene to a PNG image:

```sh
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/simple-scene.pov +O/scenes/output.png +W640 +H480
```

This command mounts the current directory as `/scenes` in the container and renders the scene file to `output.png` with a resolution of 640x480 pixels.

### Common Command Options

POV-Ray accepts many command-line options for controlling the rendering process:

```sh
# Render with anti-aliasing for smoother edges
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.png +W800 +H600 +A

# Render with specific quality level (0-11, higher = better)
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.png +W640 +H480 +Q9

# Render to different formats
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/scene.pov +O/scenes/output.tga +FT +W640 +H480
```

### Working with Include Files

POV-Ray scenes often use include files for reusable components. The image includes standard POV-Ray libraries:

```sh
cat > textured-scene.pov <<EOF
#version MAJOR.MINOR;
#include "colors.inc"
#include "stones.inc"

global_settings { assumed_gamma 1.0 }

camera {
  location <0, 2, -5>
  look_at <0, 0, 0>
  angle 35
}

light_source { <5, 10, -5> color White }

sphere {
  <0, 0, 0>, 1
  texture { T_Stone25 }
}
EOF
```

Render the scene that uses standard textures:

```sh
docker run --rm -v $(pwd):/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/textured-scene.pov +O/scenes/textured.png +W640 +H480 +A
```

## Configuration

### FIPS Compliance

This image includes FIPS 140-3 compliant cryptographic modules. The FIPS configuration is automatically enabled and does not require additional setup for standard POV-Ray rendering operations.

### Volume Mounts

Mount your scene files directory to `/scenes` to make them accessible to POV-Ray:

```sh
docker run --rm -v /path/to/your/scenes:/scenes cgr.dev/ORGANIZATION/REPO_NAME:latest \
  +I/scenes/myscene.pov +O/scenes/rendered.png
```

## Documentation and Resources

* [POV-Ray Official Documentation](https://www.povray.org/documentation/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-cli

# step-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[step-cli](https://smallstep.com/docs/step-cli) is an easy-to-use CLI tool for building, operating, and automating Public Key Infrastructure (PKI) systems and workflows

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### os-shell-iamguarded-fips

# os-shell-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/os-shell-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/os-shell-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OS Shell + Utility is a general-purpose minimal image, used by Iamguarded Helm Charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `os-shell-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

OS-Shell IAMGuarded is a generic image providing shell and various tools, used to perform basic operations in Helm Charts.

## Helm Chart Installation

OS-Shell does not come with its own Helm Chart, but rather is used as part of other charts, for things like volume permissions.

Many IAMGuarded Helm Charts use the image for applying permissions and performing other common tasks.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for many IAMGuarded charts that enables volume permission operations and pins the image to specific digest:

```yaml
# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opa

# opa
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opa` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opa/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open Policy Agent (OPA) is an open source, general-purpose policy engine..

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See https://github.com/open-policy-agent/opa for more documentation.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-metadata-injection-fips

# k8s-metadata-injection-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-metadata-injection-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-metadata-injection-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes metadata injection for New Relic APM to make a linkage between APM and Infrastructure data. This is the FIPS-compliant variant of the image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is a Helm chart available to deploy this image in a Kubernetes cluster. The Helm chart is available in their official repository at [charts/nri-metadata-injection](https://github.com/newrelic/k8s-metadata-injection/tree/main/charts/nri-metadata-injection).

```bash
helm repo add nri-metadata-injection https://newrelic.github.io/k8s-metadata-injection
helm upgrade --install nri-metadata-injection/nri-metadata-injection \
  --set global.cluster=YOUR_CLUSTER_NAME \
  --set image.registry=cgr.dev \
  --set image.repository=ORGANIZATION/k8s-metadata-injection-fips \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-collector-fips

# opentelemetry-collector-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-collector-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-collector-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS image with [opentelemetry-collector](https://github.com/open-telemetry/opentelemetry-collector).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using this image

Chainguard cgr.dev/chainguard/opentelemetry-collector-fips is a FIPS-enabled drop in replacement for the upstream image, tested using the community [helm chart](https://opentelemetry.io/docs/kubernetes/helm/collector/).

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set mode=<daemonset|deployment|statefulset> \
   --set image.repository=cgr.dev/chainguard/opentelemetry-collector-fips \
   --set image.tag=latest
```

To use custom configuration it is easier to use a values.yaml file:

```yaml
mode: daemonset
configMap:
  create: false
image:
  tag: latest
  repository: cgr.dev/chainguard/opentelemetry-collector-fips
command:
  extraArgs:
    - "--config=/conf/custom-config.yaml"
extraVolumeMounts:
  - name: "custom-vm"
    mountPath: "/conf"
extraVolumes:
  - name: "custom-vm"
    configMap:
      name: "custom"
```

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install open-telemetry opentelemetry/opentelemetry-collector --namespace open-telemetry-custom-config -f values.yaml

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### os-shell-iamguarded

# os-shell-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/os-shell-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/os-shell-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OS Shell + Utility is a general-purpose minimal image, used by Iamguarded Helm Charts.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

OS-Shell IAMGuarded is a generic image providing shell and various tools, used to perform basic operations in Helm Charts.

## Helm Chart Installation

OS-Shell does not come with its own Helm Chart, but rather is used as part of other charts, for things like volume permissions.

Many IAMGuarded Helm Charts use the image for applying permissions and performing other common tasks.

It is not needed to specify the image when using Helm Charts with Chainguard's registry.

Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for many IAMGuarded charts that enables volume permission operations and pins the image to specific digest:

```yaml
# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### istio-fips

# istio-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/istio-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/istio-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Istio FIPS Images

Istio is an open-source service mesh platform that provides a uniform way to secure, connect, and monitor microservices. Built on the high-performance Envoy proxy, Istio manages traffic flow between services, enforces access policies, and gathers telemetry data without requiring changes to application code. The service mesh architecture enables organizations to manage complex distributed systems with enhanced security, observability, and traffic management capabilities.

Chainguard offers several Istio FIPS images that provide the core components needed for a complete service mesh deployment with FIPS 140-2 compliance:

## istio-pilot-fips

Istio Pilot serves as the core control plane component responsible for service discovery and configuration distribution throughout the mesh. This component performs several critical functions:

- **Service Discovery**: Automatically discovers services running in the cluster and maintains an up-to-date service registry
- **Configuration Management**: Distributes traffic management rules, security policies, and routing configurations to all Envoy proxies
- **Certificate Management**: Handles workload identity certificates and root certificate distribution for mutual TLS (mTLS)
- **Traffic Routing**: Implements advanced traffic routing capabilities including canary deployments, circuit breakers, and retry policies

## istio-proxy-fips

The Istio proxy is built on the Envoy proxy and acts as a sidecar container deployed alongside each application workload. This component provides the data plane functionality:

- **Traffic Interception**: Transparently intercepts all inbound and outbound traffic for the associated workload
- **Security Enforcement**: Implements mutual TLS authentication, authorization policies, and encrypted communication between services
- **Observability**: Collects detailed metrics, logs, and distributed tracing data for all service communications

## istio-install-cni-fips

The Istio CNI (Container Network Interface) plugin eliminates the need for elevated privileges (NET_ADMIN capability) during sidecar injection:

- **Secure Network Setup**: Configures iptables rules and network interfaces without requiring privileged init containers
- **Traffic Redirection**: Establishes traffic redirection rules to route application traffic through the Envoy proxy

### FIPS Support

The `istio-fips` Chainguard Containers ship with FIPS-hardened cryptographic modules and libraries to meet federal compliance requirements. These images include validated redistributions of OpenSSL's FIPS provider module and use FIPS-approved algorithms for all cryptographic operations. The FIPS-enabled variants ensure that mutual TLS (mTLS) communication, certificate management, traffic encryption, and security policy enforcement within Istio service mesh components comply with FIPS 140-2 standards.

For more information on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Installation with Helm

These images can be used by overriding the default image values in the official Istio Helm charts.

First, add the Istio Helm repository:

```bash
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update
```

Then install Istio using a single `helm install` command. Below is a basic example installing the Istio base, control plane, and CNI plugin.

```bash
helm install istio-base istio/base -n istio-system --create-namespace

helm install istiod istio/istiod -n istio-system \
  --set global.proxy.image=cgr.dev/ORGANIZATION/istio-proxy-fips \
  --set pilot.image=cgr.dev/ORGANIZATION/istio-pilot-fips

helm install istio-cni istio/cni -n istio-system \
  --set cni.enabled=true \
  --set cni.image=cgr.dev/ORGANIZATION/istio-install-cni-fips \
  --set cni.cniConfDir="/var/lib/rancher/k3s/agent/etc/cni/net.d" \
  --set cni.cniBinDir="/opt/cni/bin"
```

## Installation with Helm Using `values.yaml`

If you prefer to keep your customizations in a file instead of long `--set` strings, create a small **`values.yaml` for each chart** you install.

> [!IMPORTANT]
> **Why one file per chart?**  
> The Istio Helm repository publishes *separate* charts (`base`, `istiod`, `cni`).  
> Each chart has its own values schema, so you pass the file that matches the chart you’re installing.

---

### `istiod-values.yaml`

```yaml
# istiod-values.yaml
global:
  proxy:
    image: cgr.dev/ORGANIZATION/istio-proxy-fips     # Envoy + iptables
pilot:
  image: cgr.dev/ORGANIZATION/istio-pilot-fips       # Control-plane
```

Install:

```bash
helm install istiod istio/istiod \
  -n istio-system -f istiod-values.yaml
```

---

### `istio-cni-values.yaml`

```yaml
# istio-cni-values.yaml
cni:
  enabled: true
  image: cgr.dev/ORGANIZATION/istio-install-cni-fips
  cniConfDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
  cniBinDir: /opt/cni/bin
```
#### GKE Standard Mode Installation

If installing into a GKE Standard cluster running Container Optimized Operating System you will need to use the following settings in order to ensure the `cni` configs and binaries are placed in the correct locations on the Nodes.

To install Istio outside of the `kube-system` namespace for ambient mode you will need to apply the following quota resource. This is detailed in the istio documentation [here](https://istio.io/latest/docs/ambient/install/platform-prerequisites/#google-kubernetes-engine-gke).

##### `quota.yaml`

```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: gcp-critical-pods
  namespace: istio-system
spec:
  hard:
    pods: 1000
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values:
      - system-node-critical
```

Install:

```bash
kubectl apply \
  -n istio-system -f quota.yaml
```

##### `istio-cni-gke-values.yaml`

```yaml
cni:
  enabled: true
  image: cgr.dev/ORGANIZATION/istio-install-cni-fips
  cniConfDir: /etc/cni/net.d
  cniBinDir: /home/kubernetes/bin
```

Install:

```bash
helm install istio-cni istio/cni \
  -n istio-system -f istio-cni-gke-values.yaml
```

---

## Documentation and Resources

* [Official Istio documentation](https://istio.io/latest/)
* [Installation‑options reference](https://istio.io/latest/docs/setup/install/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubectl-iamguarded-fips

# kubectl-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubectl-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubectl-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with kubectl binary.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `kubectl-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Kubectl IAMGuarded is a container image that provides the kubectl command-line tool for interacting with Kubernetes clusters. This image is specifically tailored for use with IAMGuarded Helm Charts, and tools needed for Kubernetes operations.

## Helm Chart Installation

It is not needed to specify the image when using Helm Charts with Chainguard's registry.
Setting the image registry, repository and tag / digest may be needed when using mirroring strategies.

Example `values.yaml` for IAMGuarded charts that use kubectl for operations:

```yaml
# Kubectl image for Kubernetes operations
kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sigstore-scaffolding-fips

# sigstore-scaffolding-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sigstore-scaffolding-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sigstore-scaffolding-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### glibc-openssl-fips-mip

# glibc-openssl-fips-mip
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/glibc-openssl-fips-mip` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/glibc-openssl-fips-mip/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains Chainguard FIPS provider for OpenSSL. This image contains Validated, Module in Process and Implementation under Test modules. The dev tags also contain additional debug tools and compilers suitable for testing by approved security laboratories to achieve ACVP testing, CAVP testing, CMVP submission, Common Criteria testing. This image maybe used in FedRAMP deployments, assuming suitable documentation is provided as per [FedRAMP Policy for Cryptographic Module Selection and Use](https://www.fedramp.gov/rev5/fips/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### temporal-server-fips

# temporal-server-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/temporal-server-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/temporal-server-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ollama-fips

# ollama-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ollama-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ollama-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Ollama image is meant to serve as a drop-in replacement for the [official Ollama image](https://hub.docker.com/r/ollama/ollama) from Docker Hub. There are, however, a number of differences between the two images that one should be aware of before migrating to the Chainguard Ollama image:

* The Chainguard Ollama image does not run as the root user and contains only the minimum packages it needs to operate.
* This image also does not currently have support for ROCM or any other ollama version that is not the [current latest release](https://github.com/ollama/ollama/releases)

### FIPS Support
The `ollama-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it -p 11434:11434 cgr.dev/ORGANIZATION/ollama-fips:latest
```

Then you can interact with it via the [Ollama CLI](https://github.com/ollama/ollama?tab=readme-ov-file#cli-reference) client or by [calling the REST API](https://github.com/ollama/ollama?tab=readme-ov-file#rest-api):
```shell
ollama run gemma3:1b
```
```
>>> Hello, world!
Hello there! It's good to be chatting with you. 😊

How can I help you today?
>>>
```

```shell
curl http://$OLLAMA_HOST/api/generate -d '{
  "model": "gemma3:1b",
  "prompt":"Why is the sky blue?"
}'
```
```
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.090887Z","response":"The","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.098279Z","response":" sky","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.105558Z","response":" is","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.113124Z","response":" blue","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.120545Z","response":" due","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.131319Z","response":" to","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.139226Z","response":" a","done":false}
# ...
```

### Helm Chart

Alternatively, an [unofficial Helm chart for Ollama](https://github.com/otwld/ollama-helm) is actively maintained.
To deploy Ollama with Helm, add the repository:

```bash
helm repo add ollama-helm https://otwld.github.io/ollama-helm/
helm repo update
```

Create a values manifest:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/ollama-fips
  tag: latest
```

Then install the chart:
```shell
helm install ollama ollama-helm/ollama --namespace ollama --create-namespace --values ./values.yaml
```

Optionally port forward the API:

```bash
kubectl port-forward deployment/ollama --namespace ollama 11434
```

Then use the CLI as described on the previous section:

```shell
ollama run gemma3:1b
```

## Resources and Documentation

- [Ollama Documentation](https://github.com/ollama/ollama/tree/main/docs)
- [Ollama API reference](https://github.com/ollama/ollama/blob/main/docs/api.md)
- [Ollama Troubleshooting](https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md)
- [Unofficial Ollama Helm chart](https://github.com/otwld/ollama-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### multus-cni-fips

# multus-cni-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/multus-cni-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/multus-cni-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A CNI meta-plugin for multi-homed pods in Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image provides a secure, minimal environment for running the [Multus CNI plugin](https://github.com/k8snetworkplumbingwg/multus-cni), a CNI meta-plugin that enables attaching multiple network interfaces to pods. It is functionally equivalent to the upstream image, and switching to the Chainguard image should not require any changes to your existing Kubernetes setup.

## Getting Started
You can deploy this image using the [Multus CNI Helm chart](https://artifacthub.io/packages/helm/startechnica/multus). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/multus-cni-fips
  pullPolicy: IfNotPresent
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the Multus CNI using Helm:

```shell
helm repo add startechnica https://startechnica.github.io/apps
helm repo update
helm install multus-cni startechnica/multus-cni --namespace multus-cni --create-namespace -f values.yaml
```

The `multus-cni` Helm chart defaults to `amd64`. If deploying `arm64` images, add the following:

```
    --set nodeSelector."kubernetes\.io/arch"=arm64
```

### Verifying the Helm Installation
Once you've installed the `multus-cni` Helm chart, you can verify the deployment using the following commands:

```shell
kubectl get daemonset -n multus-cni
```
```
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                     AGE
multus-cni-node   3         3         3       3            3           kubernetes.io/arch=amd64,kubernetes.io/os=linux   4m59s

kubectl get pod -n multus-cni 
NAME                    READY   STATUS    RESTARTS      AGE
multus-cni-node-5bzjg   1/1     Running   2 (24s ago)   4m40s
multus-cni-node-8hvcf   1/1     Running   2 (24s ago)   4m40s
multus-cni-node-vrkls   1/1     Running   2 (24s ago)   4m40s
```

To verify functionality, deploy a pod that uses a custom `NetworkAttachmentDefinition`:

```shell
kubectl apply -f - <<EOF
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf
spec:
  config: '{
    "cniVersion": "0.3.0",
    "type": "macvlan",
    "master": "eth0",
    "mode": "bridge",
    "ipam": {
      "type": "host-local",
      "subnet": "10.42.0.0/24",
      "rangeStart": "10.42.0.20",
      "rangeEnd": "10.42.0.50",
      "gateway": "10.42.0.1"
    }
  }'
EOF
```

Then deploy a pod referencing that network:

```shell
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: multus-test-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: test
    image: busybox
    command: ["sh", "-c", "ip a; sleep 3600"]
EOF
```

Use `kubectl exec` to verify multiple interfaces are attached and IPs are assigned.

```shell
kubectl exec multus-test-pod -- ip a
```
This will return output like the following:
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue qlen 1000
    link/ether ea:80:a6:e4:0f:d7 brd ff:ff:ff:ff:ff:ff
    inet 10.42.0.4/24 brd 10.42.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::e880:a6ff:fee4:fd7/64 scope link
       valid_lft forever preferred_lft forever
```

## Documentation and Resources:
- [Official Mutlus CNI documentation](https://github.com/k8snetworkplumbingwg/multus-cni)
- [Multus CNI Github Repository](https://github.com/k8snetworkplumbingwg/multus-cni)
- [Multus CNI Helm Chart](https://artifacthub.io/packages/helm/startechnica/multus)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-privateca-issuer

# aws-privateca-issuer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-privateca-issuer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-privateca-issuer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

AWS Private CA is an AWS service that can setup and manage private CAs, as well as issue private certificates. `cert-manager` is a Kubernetes add-on to automate the management and issuance of TLS certificates from various issuing sources. It will ensure certificates are valid, updated periodically and attempt to renew certificates at an appropriate time before expiry. This project acts as an addon (see https://cert-manager.io/docs/configuration/external/) to cert-manager that signs off certificate requests using AWS Private CA.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

AWS Private CA is an AWS service that can setup and manage private CAs, as well as issue private certificates.
`cert-manager` is a Kubernetes add-on to automate the management and issuance of TLS certificates from various issuing sources. It will ensure certificates are valid, updated periodically and attempt to renew certificates at an appropriate time before expiry.
This project acts as an addon (see https://cert-manager.io/docs/configuration/external/) to cert-manager that signs off certificate requests using AWS Private CA.

## Prerequisites

* A Kubernetes cluster preferably eks.
* Helm installed.
* AWS CLI configured with access to your AWS account.
* An AWS Private CA created and activated.
* Installing cert-manager

## Installation
For installation instructions, visit the [Amazon VPC CNI Install Guide](https://github.com/aws/amazon-vpc-cni-k8s?tab=readme-ov-file#setup).

## Installation using Helm chart

### Install cert-manager first
```shell
helm repo add jetstack https://charts.jetstack.io
helm repo update

helm install cert-manager jetstack/cert-manager \
     --namespace cert-manager \
     --create-namespace \
     --set installCRDs=true
```

### Install AWS PCA Issuer with Chainguard image

```shell
helm repo add awspca https://cert-manager.github.io/aws-privateca-issuer
helm install awspca/aws-privateca-issuer --generate-name \
--set image.repository=cgr.dev/chainguard/aws-privateca-issuer \
--set image.tag=latest
```

### Create IAM Policy and Role:

Ensure your EKS worker nodes or Kubernetes environment have the necessary IAM policies attached for accessing AWS PCA. Policies required typically include:

* `acm-pca:IssueCertificate`
* `acm-pca:GetCertificate`
* `acm-pca:DescribeCertificateAuthority`

A minimal policy to use the issuer with an authority would look like follows:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "awspcaissuer",
      "Action": [
        "acm-pca:DescribeCertificateAuthority",
        "acm-pca:GetCertificate",
        "acm-pca:IssueCertificate"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:acm-pca:<region>:<account_id>:certificate-authority/<resource_id>"
    }
  ]
}
```

### Create an `AWSPCACIssuer` to integrate with AWS PCA:

```yaml
apiVersion: awspca.cert-manager.io/v1beta1
kind: AWSPCAIssuer
metadata:
  name: demo-awspcs-issuer
spec:
  arn: "arn:aws:acm-pca:<region>:<account_id>:certificate-authority/<CA_ID>"
  region: "<aws-region>"
```

Then, `kubectl apply -f AWSPCAIssuer.yaml`

### Verify AWSPCAIssuer installed correctly:
   
Do `kubectl describe AWSPCAIssuer`

Check the Events section and you must see the message Issuer verified if everything goes correct:

 ```bash
 Normal  Verified  46s (x2 over 46s)  awspcaissuer-controller  Issuer verified
 ```

### Create Certificate 

Create CRD Certificate with name rsa-cert-2048 for dns name rsa-2048.example.com >> Certificate.yaml For th formats other than 2048 check the examples

```yaml
---
kind: Certificate
apiVersion: cert-manager.io/v1
metadata:
  name: rsa-cert-2048
spec:
  commonName: www.rsa-2048.example.com
  dnsNames:
    - www.rsa-2048.example.com
    - rsa-2048.example.com
  duration: 2160h0m0s
  issuerRef:
    group: awspca.cert-manager.io
    kind: AWSPCAIssuer
    name: demo-awspcs-issuer
  renewBefore: 360h0m0s
  secretName: rsa-example-cert-2048
  usages:
    - server auth
    - client auth
  privateKey:
    algorithm: "RSA"
    size: 2048
---
```

Then Apply the yaml file
```bash
kubectl apply -f Certificate.yaml
```

### Verify Certificate is installed correctly

```bash
kubectl  get Certificates
```

It should output Ready as True as shown below
```bash
  NAME            READY   SECRET                  AGE
  rsa-cert-2048   True    rsa-example-cert-2048   31s
```

Please use kubectl get events for debugging.

```bash
kubectl get events  
Sample Output for Successful Certificate Request
  5s          Normal   cert-manager.io   certificaterequest/rsa-cert-2048.io-zqftp   Certificate request has been approved by cert-manager.io
  2s          Normal   Issued            certificaterequest/rsa-cert-2048.io-zqftp   certificate issued
  5s          Normal   Issuing           certificate/rsa-cert-2048                Issuing certificate as Secret does not exist
  5s          Normal   Generated         certificate/rsa-cert-2048               Stored new private key in temporary Secret resource "rsa-cert-2048-k7zxv"
  5s          Normal   Requested         certificate/rsa-cert-2048                Created new CertificateRequest resource "rsa-cert-2048-zqftp"
  2s          Normal   Issuing           certificate/rsa-cert-2048                The certificate has been successfully issued
  8m22s       Normal   Verified          awspcaissuer/rsa-cert-2048               Issuer verified
  85s         Normal   Verified          awspcaissuer/rsa-cert-2048               Issuer verified
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-volume-provisioner

# local-volume-provisioner
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-volume-provisioner` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-volume-provisioner/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Static provisioner of local volumes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `local-volume-provisioner` Chainguard Image is comparable to the [upstream `local-volume-provisioner` image](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) maintained by the Kubernetes SIG Storage community, with the following key differences:

### Non-root Execution

**Difference:** This Chainguard Image runs as a non-root user (UID 65532) instead of root (UID 0).

**Why this change exists:** Running containers as non-root is a security best practice that reduces the attack surface by limiting the privileges available to a compromised container. This aligns with the principle of least privilege and helps meet compliance requirements for secure container deployments.

**Benefits:**
- Reduced security risk if the container is compromised
- Better alignment with Pod Security Standards and security policies
- Compliance with organizational security requirements that prohibit root containers

> [!IMPORTANT]
> **Breaking change:** If you are migrating from an upstream image that runs as root, you may need to adjust your deployment. The non-root user requires explicit permissions to access host paths and perform volume management operations.

**Required adjustments:**
- Host paths mounted into the container must have appropriate permissions (readable/writable by UID 65532)
- Some file system operations may require init containers with elevated privileges to prepare directories
- Security contexts and volume mount options may need configuration to grant necessary permissions

If you encounter permission errors, review your volume mounts, security contexts, and host path permissions to ensure compatibility with non-root execution.

## Prerequisites

Before using this image, you will need:

- A Kubernetes cluster (version 1.23 or later recommended)
- `kubectl` configured to access your cluster
- Host paths on nodes designated for local volume storage
- Appropriate permissions to create StorageClasses and DaemonSets

For local testing, this guide uses [k3d](https://k3d.io/) to create a lightweight Kubernetes cluster.

For detailed information about the local volume provisioner, refer to the [upstream documentation](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner).

## Getting Started

To be able to test the local volume provisioner, you need to have a Kubernetes cluster running. You can use [k3d](https://k3d.io//) to create a local cluster.

### Create a local cluster

```bash

k3d create cluster
```

### Deploy the local volume provisioner

```bash
# Create the necessary StorageClass
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/default_example_storageclass.yaml

# Create the local volume provisioner
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/sig-storage-local-static-provisioner/master/deployment/kubernetes/example/default_example_provisioner_generated.yaml

# Change the provisioner image to the Chainguard image
kubectl set image daemonset/local-volume-provisioner provisioner="cgr.dev/ORGANIZATION/local-volume-provisioner:latest"
```

Please ensure that the local volume provisioner is running before moving to the next step:

```bash
kubectl rollout status daemonset/local-volume-provisioner --timeout=120s
```

So, if everything is running, you should shell/exec into the nodes and do the following:

```bash
# Get server and worker node names from k3d, filtering by role
node_names=$(k3d node list -o json | jq -r '.[] | select(.role == "server" or .role == "agent") | .name')

# Loop over each node name and execute the commands
for node in $node_names; do
    echo "Configuring node: $node"

    # Create directory
    docker exec $node mkdir -p /mnt/fast-disks/vol1

    # Mount tmpfs
    docker exec $node mount -t tmpfs vol1 /mnt/fast-disks/vol1

    echo "Configuration complete for node: $node"
done
```

Once you have the local disks mounted, you should see the PVs created:

```bash
kubectl get pv
```

That's it! You have the `local-volume-provisioner` running and managing the local disks on your cluster.

## Configuration

The `local-volume-provisioner` is configured through a ConfigMap that defines discovery directories and storage classes. Here's an example of configuring the provisioner to use a specific directory pattern with proper permissions for non-root execution:

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-provisioner-config
  namespace: default
data:
  storageClassMap: |
    fast-disks:
      hostDir: /mnt/fast-disks
      mountDir: /mnt/fast-disks
      blockCleanerCommand:
        - "/scripts/shred.sh"
        - "2"
      volumeMode: Filesystem
      fsType: ext4
```

**Key configuration considerations for non-root execution:**

When using this Chainguard Image, ensure that the `hostDir` paths have appropriate permissions. You may need to use an init container to prepare directories with the correct ownership:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: local-volume-provisioner
spec:
  template:
    spec:
      initContainers:
      - name: prepare-dirs
        image: cgr.dev/ORGANIZATION/busybox:latest
        command:
        - sh
        - -c
        - |
          chown -R 65532:65532 /mnt/fast-disks
          chmod -R 755 /mnt/fast-disks
        volumeMounts:
        - name: local-disks
          mountPath: /mnt/fast-disks
        securityContext:
          runAsUser: 0
          privileged: true
      containers:
      - name: provisioner
        image: cgr.dev/ORGANIZATION/local-volume-provisioner:latest
        securityContext:
          runAsUser: 65532
          runAsNonRoot: true
        # ... rest of configuration
```

This approach uses a privileged init container to set up directory permissions once, allowing the main provisioner container to run securely as non-root. This pattern provides the security benefits of non-root execution while handling the necessary privileged operations during initialization.

For complete configuration options, refer to the [upstream configuration documentation](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/blob/master/docs/provisioner.md).

## Documentation and Resources

- [Kubernetes Local Persistent Volumes](https://kubernetes.io/docs/concepts/storage/volumes/#local) - Official Kubernetes documentation on local volumes
- [Local Volume Provisioner GitHub Repository](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) - Upstream project documentation
- [Chainguard Academy](https://edu.chainguard.dev/) - Learn more about Chainguard Images and secure container practices
- [Working with Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/) - General guidance on using Chainguard Images

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grpc-health-probe

# grpc-health-probe
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grpc-health-probe` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grpc-health-probe/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A tool to perform health-checks for gRPC applications in Kubernetes and elsewhere

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the official [grpc-health-probe](https://github.com/grpc-ecosystem/grpc-health-probe/pkgs/container/grpc-health-probe) image. Switching to Chainguard image should not require any changes to your existing setup

## Getting Started

### Docker
We can start a gRPC-server like openfga and then check the health of the server using the Chainguard grpc-health-probe image:
```bash
docker network create grpc-health-probe-test
docker run --rm -d --net grpc-health-probe-test --name grpc-server cgr.dev/ORGANIZATION/openfga:latest run
docker run --rm --net grpc-health-probe-test cgr.dev/ORGANIZATION/grpc-health-probe -addr grpc-server:8081
```

## Documentation and Resources
for more information, please refer to [the official documentation for grpc-health-probe](https://github.com/grpc-ecosystem/grpc-health-probe/blob/master/README.md).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### secretgen-controller-fips

# images/secretgen-controller-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/images/secretgen-controller-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/images/secretgen-controller-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

secretgen-controller provides CRDs to specify what secrets need to be on Kubernetes cluster (to be generated or not)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `secretgen-controller-fips` container image is compatible with the upstream [carvel-dev/secretgen-controller](https://github.com/carvel-dev/secretgen-controller), with the following differences:

* Built on a minimal, distroless base for enhanced security
* Uses FIPS 140-2 validated cryptographic modules for compliance
* Regularly updated with the latest security patches
* Significantly reduced attack surface with minimal dependencies

**Note:** This FIPS variant is suitable for environments requiring FIPS 140-2 compliance, such as government and regulated industries.

## Getting Started

### Install with kubectl

```bash
kubectl apply -f https://github.com/carvel-dev/secretgen-controller/releases/latest/download/release.yml
```

Then patch the deployment to use the Chainguard FIPS image:

```bash
kubectl patch deployment secretgen-controller \
  -n secretgen-controller \
  --type='json' \
  -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "cgr.dev/ORGANIZATION/secretgen-controller-fips:latest"}]'
```

### Generate a Password

Create a `Password` resource to generate a random password:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: Password
metadata:
  name: my-password
  namespace: default
spec:
  length: 40
  secretTemplate:
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
```

Apply the resource:

```bash
kubectl apply -f password.yaml
```

View the generated secret:

```bash
kubectl get secret my-password -o jsonpath='{.data.password}' | base64 -d
```

### Generate an RSA Key

Create an `RSAKey` resource to generate an RSA private/public key pair:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: RSAKey
metadata:
  name: my-rsa-key
  namespace: default
spec:
  secretTemplate:
    type: Opaque
```

Apply and view the generated keys:

```bash
kubectl apply -f rsa-key.yaml
kubectl get secret my-rsa-key -o jsonpath='{.data.privateKey}' | base64 -d
kubectl get secret my-rsa-key -o jsonpath='{.data.publicKey}' | base64 -d
```

### Generate an SSH Key

Create an `SSHKey` resource to generate an SSH key pair:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: SSHKey
metadata:
  name: my-ssh-key
  namespace: default
spec:
  secretTemplate:
    type: Opaque
```

Apply and view the generated keys:

```bash
kubectl apply -f ssh-key.yaml
kubectl get secret my-ssh-key -o jsonpath='{.data.ssh-privatekey}' | base64 -d
kubectl get secret my-ssh-key -o jsonpath='{.data.ssh-publickey}' | base64 -d
```

### Generate a Certificate

Create a `Certificate` resource to generate a self-signed certificate:

```yaml
apiVersion: secretgen.k14s.io/v1alpha1
kind: Certificate
metadata:
  name: my-certificate
  namespace: default
spec:
  commonName: example.com
  alternativeNames:
    - "*.example.com"
  secretTemplate:
    type: kubernetes.io/tls
```

Apply and view the generated certificate:

```bash
kubectl apply -f certificate.yaml
kubectl get secret my-certificate -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
```

## Documentation and Resources

- **[Official Documentation](https://github.com/carvel-dev/secretgen-controller/tree/develop/docs)**
- **[GitHub Repository](https://github.com/carvel-dev/secretgen-controller)**
- **[Installation Guide](https://github.com/carvel-dev/secretgen-controller/blob/develop/docs/install.md)**
- **[Walkthrough Examples](https://github.com/carvel-dev/secretgen-controller/blob/develop/docs/walkthrough.md)**
- **[Carvel Project](https://carvel.dev/)**

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-postgres-exporter-fips

# prometheus-postgres-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-postgres-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-postgres-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-messaging-topology-operator-fips

# rabbitmq-messaging-topology-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-messaging-topology-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-messaging-topology-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Installation
For detailed instructions on how to install the operator, please refer to the [upstream documentation](https://www.rabbitmq.com/kubernetes/operator/install-topology-operator).

Should cert-manager be required as a pre-requisite, there are [instructions here](https://images.chainguard.dev/directory/image/cert-manager-controller/overview) for deploying with Chainguard images.

The [upstream documentation](https://www.rabbitmq.com/kubernetes/operator/install-topology-operator), provides a manifest based deployment for the operator:

```
https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml
```

To use the manifest, you'll need to create a modified version, overriding the
'image' property to use the Chainguard image. For example, updating the
following:

```bash
# Before
image: rabbitmqoperator/messaging-topology-operator:1.16.0

# After
image: cgr.dev/ORGANIZATION/rabbitmq-messaging-topology-operator-fips:latest
```

Deploy the updated manifest:

```bash
kubectl apply -f local/path/to/modified/messaging-topology-operator-with-certmanager.yaml
```

Alternatively, if you want to dynamically update the manifest configuration,
consider using [kustomize](https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization).

For example:

```bash
LATEST=$(curl -s "https://api.github.com/repos/rabbitmq/messaging-topology-operator/releases/latest" | jq -r '.tag_name')

cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - "https://github.com/rabbitmq/messaging-topology-operator/releases/download/${LATEST}/messaging-topology-operator.yaml"
patches:
  - patch: |
      - op: replace
        path: /spec/template/spec/containers/0/image
        value: cgr.dev/chainguard/rabbitmq-messaging-topology-operator-fips:latest
    target:
      version: v1
      kind: Deployment
      name:  messaging-topology-operator
      namespace: rabbitmq-system
EOF

kubectl apply -f .
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-efs-csi-driver-fips

# aws-efs-csi-driver-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-efs-csi-driver-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-efs-csi-driver-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's AWS Elastic File System (EFS) Container Storage Interface (CSI) driver image is comparable to the [amazon/aws-efs-csi-driver image](https://hub.docker.com/r/amazon/aws-efs-csi-driver) on Docker Hub. As with many of Chainguard's other container images, the AWS EFS CSI driver image contains only the minimum number of dependencies it needs to function. This means it doesn't include things like a shell or package manager.

### FIPS support

The aws-efs-csi-driver-fips Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult our guide on [FIPS-enabled Chainguard Images](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/) on Chainguard Academy

## Getting Started

The EFS CSI driver requires IAM permissions to interact with your filesystem. This includes an IAM role and policies, as well as a service account and annotation to assume the role.

Refer to the AWS documentations resources on [creating an IAM role](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html#efs-create-iam-resources) for more information.

### Install with Helm

For complete instructions on installing this image with Helm, please refer to the [Helm chart documentation](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md#installation).

The following is an example of how to use the Helm chart, using the Chainguard image. This example enables the `useFips` argument, which will instruct the EFS CSI driver to use the FIPS service endpoint for AWS EFS.

Start by adding a `values.yaml` file to configure the Helm chart:

```
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/aws-efs-csi-driver-fips
  tag: latest
  digest: null
controller:
  serviceAccount:
  create: false
  name: efs-csi-controller-sa
useFips: true
EOF
```

Be sure to update the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Add the Helm repository:

```shell
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
```

Then Install the chart:

```shell
helm upgrade --install aws-efs-csi-driver --namespace kube-system aws-efs-csi-driver/aws-efs-csi-driver -f values.yaml
```

### Install as an EKS add-on

Amazon's Elastic Kubernetes Service (EKS) allows you to install the efs-csi-driver as an EKS add-on. For complete instructions on how you can do this, refer to the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html).

If you've chosen this installation method, there are two caveats to be aware of: 

1. You cannot specify a custom image while installing as an EKS add-on
2. You cannot specify the `useFips` argument to force the EFS CSI to use FIPS endpoints

You'll need to patch the `efs-csi-controller` deployment to use the Chainguard image, and this is a step you'll need to repeat each time that you re-deploy or upgrade the version using EKS add-ons.

Additionally, you'll need to patch the DaemonSets to set `AWS_USE_FIPS_ENDPOINT=true`. 

## Documentation and Resources

For more information, please refer to the [upstream documentation](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-agents-operator-fips

# k8s-agents-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-agents-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-agents-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

k8s-agents-operator auto-instruments containerized workloads in Kubernetes with New Relic agents.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to 'docker.io/newrelic/k8s-agents-operator:latest' and is FIPS-compatible. Switching to the Chainguard image should not require any changes to your existing deployment configuration.

## Getting Started

The `k8s-agent-operator` automatically instruments containerized workloads in Kubernetes with New Relic agents. It supports auto-instrumentation for various language runtimes including Java, Node.js, Python, and .NET.

### Prerequisites

- A Kubernetes cluster with version 1.20+
- Cert-manager installed in your cluster (for webhook functionality)
- New Relic account and license key

### Basic Deployment

Deploy the operator using the official Helm chart with the Chainguard image:

```sh
cat > values.yaml <<EOF
    licenseKey = ""your-license-key-here""
    controllerManager = {
      manager = {
        image = {
          repository = cgr.dev/ORGANIZATION/k8s-agent-operator-fips
          version = latest
        }
EOF
```

Install using Helm:

```sh
helm repo add newrelic https://helm-charts.newrelic.com
helm repo update
helm install newrelic-k8s-agents-operator newrelic/newrelic-k8s-agents-operator \
  -f values.yaml \
  -n newrelic-system \
  --create-namespace
```

### Creating an Instrumentation Resource

Create an Instrumentation resource to define how applications should be instrumented:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: newrelic.com/v1alpha2
kind: Instrumentation
metadata:
  name: selective-java-instrumentation
spec:
  agent:
    image: newrelic/newrelic-java-init:latest
    language: java
  podLabelSelector:
    matchLabels:
      instrument: "java"
  namespaceLabelSelector:
    matchLabels:
      instrumentation: "enabled"
EOF

kubectl apply -f instrumentation.yaml
```

### Auto-Instrumentation via Annotations

Annotate your workloads to enable auto-instrumentation:

```sh
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: fully-matched-pod
  namespace: k8s-agents-operator-test
  labels:
    instrument: "java"
    app: java-app
spec:
  containers:
  - name: app
    image: busybox:1.35
    command: ["sleep", "3600"]
EOF
```

### Configuration

The operator supports various configuration options through environment variables:

- `NEW_RELIC_LICENSE_KEY`: Your New Relic license key (required)
- `WEBHOOK_PORT`: Port for the admission webhook (default: 9443)
- `METRICS_BIND_ADDRESS`: Address for metrics server (default: :8080)
- `HEALTH_PROBE_BIND_ADDRESS`: Address for health probes (default: :8081)

### FIPS support
The k8s-agents-operator-fips Chainguard Image ships a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the guide on [FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/features/fips/fips-images/).

## Documentation and Resources

- [K8s Agents Operator GitHub Repository](https://github.com/newrelic/k8s-agents-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### busybox

# busybox
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/busybox` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/busybox/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image with only busybox and libc (available in both musl and glibc variants). Suitable for running any binaries that only have a dependency on glibc/musl.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Upcoming Changes

On July 15, 2024 the `busybox:latest` image will move from a Alpine base to a Wolfi base,
in-line with all other images in our registry. We do not expect this to cause breakages, but
encourage all users to test and verify the new version.

You can test today by migrating to the `cgr.dev/chainguard/busybox:latest-glibc` image. From July 15, the `:latest` and `:latest-glibc` will point to the same image.

Full details are in [this blog post](https://www.chainguard.dev/unchained/changes-to-static-git-and-busybox-developer-images).

## Usage

Chainguard offers two different variations of the `busybox` Image. Both contain the BusyBox software but are built against different variants of `libc`:

- `latest`, meant for variants based on `musl`
- `latest-glibc`, meant for variants based on `glibc`

You can ensure that either of these Images are working correctly by testing that they can run commands and return output. The following commands will both return `hello world!` in your terminal:

`musl`:
```shell
docker run -it cgr.dev/chainguard/busybox:latest echo hello world!
```

`glibc`:
```shell
docker run -it cgr.dev/chainguard/busybox:latest-glibc echo hello world!
```

Also, note that you can open an interactive shell on either version of the Image with command like the following:

```shell
docker run -it cgr.dev/chainguard/busybox:latest sh
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-hop

# apache-hop
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-hop` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-hop/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Data orchestration and engineering platform for managing ETL/ELT workflows.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Apache Hop is a data orchestration and engineering platform designed to facilitate all aspects of data and metadata orchestration.

## Usage

### Running with Docker

You can test this image locally with `docker`:

```bash
docker run -d \
  -p 8081:8081 \
  -e HOP_SERVER_USER=admin \
  -e HOP_SERVER_PASS=admin \
  cgr.dev/ORGANIZATION/apache-hop:latest
```

### Deployment on Kubernetes with Helm

A helm chart installation method is officially supported by Apache Hop. To deploy Chainguard's Apache Hop image, add the repository:

```bash
helm repo add hop https://hop.apache.org/
helm repo update
```

Create values file to use Chainguard image

```yaml
cat <<EOF > values.yaml
server:
  image:
    name: cgr.dev/ORGANIZATION/apache-hop
    tag: latest
EOF
```

Then install the chart:

```bash
helm install apache-hop hop/hop -f values.yaml
```

## Resources and Documentation

- [Apache Hop documentation](https://hop.apache.org/manual/latest/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ollama

# ollama
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ollama` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ollama/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's Ollama image is meant to serve as a drop-in replacement for the [official Ollama image](https://hub.docker.com/r/ollama/ollama) from Docker Hub. There are, however, a number of differences between the two images that one should be aware of before migrating to the Chainguard Ollama image:

* The Chainguard Ollama image does not run as the root user and contains only the minimum packages it needs to operate.
* This image also does not currently have support for ROCM or any other ollama version that is not the [current latest release](https://github.com/ollama/ollama/releases)

## Getting started

The quickest way of getting started with this image is by using `docker`:
```shell
docker run --rm -it -p 11434:11434 cgr.dev/ORGANIZATION/ollama:latest
```

Then you can interact with it via the [Ollama CLI](https://github.com/ollama/ollama?tab=readme-ov-file#cli-reference) client or by [calling the REST API](https://github.com/ollama/ollama?tab=readme-ov-file#rest-api):
```shell
ollama run gemma3:1b
```
```
>>> Hello, world!
Hello there! It's good to be chatting with you. 😊

How can I help you today?
>>>
```
```shell
$ curl http://$OLLAMA_HOST/api/generate -d '{
  "model": "gemma3:1b",
  "prompt":"Why is the sky blue?"
}'
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.090887Z","response":"The","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.098279Z","response":" sky","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.105558Z","response":" is","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.113124Z","response":" blue","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.120545Z","response":" due","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.131319Z","response":" to","done":false}
{"model":"gemma3:1b","created_at":"2025-05-22T19:31:45.139226Z","response":" a","done":false}
# ...
```

### Helm Chart

Alternatively, an [unofficial Helm chart for Ollama](https://github.com/otwld/ollama-helm) is actively maintained.
To deploy Ollama with Helm, add the repository:

```bash
helm repo add ollama-helm https://otwld.github.io/ollama-helm/
helm repo update
```

Create a values manifest:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/ollama
  tag: latest
```

Then install the chart:
```shell
helm install ollama ollama-helm/ollama --namespace ollama --create-namespace --values ./values.yaml
```

Optionally port forward the API:

```bash
kubectl port-forward deployment/ollama --namespace ollama 11434
```

Then use the CLI as described on the previous section:

```shell
ollama run gemma3:1b
```

## Resources and Documentation

- [Ollama Documentation](https://github.com/ollama/ollama/tree/main/docs)
- [Ollama API reference](https://github.com/ollama/ollama/blob/main/docs/api.md)
- [Ollama Troubleshooting](https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md)
- [Unofficial Ollama Helm chart](https://github.com/otwld/ollama-helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-iamguarded-fips

# rabbitmq-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[RabbitMQ](https://github.com/rabbitmq/rabbitmq-server) RabbitMQ is a message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `rabbitmq-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

RabbitMQ IAMGuarded is a security-enhanced variant of RabbitMQ designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard RabbitMQ deployments.

## Helm Chart Installation

The RabbitMQ IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Providing FIPS image(s) to chart

In order to provide FIPS image(s), they have to be explicitly provided as values to chart - such as:

```yaml
# Main RabbitMQ image
image:
  repository: ORGANIZATION/rabbitmq-iamguarded-fips

# OS Shell image for volume permissions
volumePermissions:
  image:
    repository: ORGANIZATION/os-shell-iamguarded-fips
```

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ image
image:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/rabbitmq:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ IAMGuarded installation using standard RabbitMQ verification methods. The deployment functions as a standard RabbitMQ instance, so all typical RabbitMQ validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### oauth2-proxy-fips

# oauth2-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/oauth2-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/oauth2-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/) is a reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

 The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's oauth2-proxy image maintains functional parity with [the upstream image](https://quay.io/oauth2-proxy/oauth2-proxy:latest).

## Getting Started

This section provides a brief overview of how you can use Chainguard's `oauth2-proxy-fips` Image to set up a proxy that can intercept a call to a specified endpoint. A complete end-to-end test would require a GitHub account (or an account with another OIDC Auth provider), a trusted domain, and an OAuth application; this example will be useful to test that the image works but it will not be able to verify authentication or properly redirect users.

Run the following command.

```shell
docker run --detach --name oidc-test -p 8080:8080 cgr.dev/ORGANIZATION/oauth2-proxy-fips:latest \
  --cookie-secure=false \
  --cookie-secret=RYC2VBUYWQ6aenOkoN6jELQsrjtmwb23a7NdtrLI0ao= \
  --upstream=file:///dev/null \
  --http-address=0.0.0.0:8080 \
  --redirect-url=http://localhost:8080/oauth2/callback \
  --client-id=sample-id \
  --client-secret=sample-secret \
  --email-domain="*" \
  --provider=github \
  --scope=user:email
```

also you can run the oauth2-proxy in Kubernetes environment with Helm chart, you can refer to the following documentation to get more detail on this, [here](https://github.com/oauth2-proxy/manifests/tree/main/helm/oauth2-proxy), but you can use the following values.yaml to install the oauth2-proxy in your Kubernetes cluster.

```sh
cat <<EOF > values.yaml
image:
  repository: cgr.dev/ORGANIZATION/oauth2-proxy-fips
  tag: latest

config:
  clientID: "dummy-id"
  clientSecret: "dummy-secrets"
  cookieSecret: "RYC2VBUYWQ6aenOkoN6jELQsrjtmwb23a7NdtrLI0ao="
EOF
```

```shell
helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests
helm install oauth2-proxy oauth2-proxy/oauth2-proxy -f values.yaml
```

## Documentation and Resources

Please refer to the official [Getting Started](https://oauth2-proxy.github.io/oauth2-proxy/) guide for more information. You may also find these resources to be useful:

 - [oauth2-proxy Github Repository](https://github.com/oauth2-proxy/oauth2-proxy)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-sql

# crossplane-sql
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-sql` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-sql/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Crossplane provider for SQL.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

These images provide Crossplane providers for SQL.

| Upstream Image | Chainguard Image |
| -------------- | ---------------- |
| `xpkg.upbound.io/upbound/provider-sql` | `cgr.dev/chainguard/crossplane-sql` |

```yaml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-sql
spec:
  package: cgr.dev/chainguard/crossplane-sql:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mysql-iamguarded

# mysql-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mysql-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mysql-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

MySQL is a widely used open-source relational database management system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

MySQL IAMGuarded is a security-enhanced variant of MySQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard MySQL deployments.

## Helm Chart Installation

The MySQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MySQL image
image:
  registry: myregistry.example.com
  repository: mirrored/mysql-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mysqld-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mysql:13.0.0
   Digest: sha256:61485fe902828b2859684d8d99df394878131eb6590f738bfa7f6f1f43eb8174
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MySQL IAMGuarded installation using standard MySQL verification methods. The deployment functions as a standard MySQL instance, so all typical MySQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MySQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MySQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cerbos-fips

# cerbos-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cerbos-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cerbos-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cerbos is the open core, language-agnostic, scalable authorization solution that makes user permissions and authorization simple to implement and manage by writing context-aware access control policies for your application resources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cerbos-fips` image is a drop-in replacement for the upstream [cerbos/cerbos](https://ghcr.io/cerbos/cerbos) container image. It is fully compatible with the official [cerbos Helm charts](https://github.com/cerbos/helm-charts/) and supports all core functionality of the `cerbos` application. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

### Kubernetes Helm Chart Deployment
You can deploy this image using the [official cerbos Helm charts](https://github.com/cerbos/helm-charts/). Be sure to override the image to use the `cerbos-fips` Chainguard Image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cerbos-fips
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `cerbos` Helm chart, as shown in the following shell example.

```shell
helm repo add cerbos oci://ghcr.io/cerbos/helm-charts/cerbos
helm repo update
HELM_EXPERIMENTAL_OCI=1 helm install cerbos oci://ghcr.io/cerbos/helm-charts/cerbos -f values.yaml --wait
```

You can verify that the Cerbos Helm chart deployed successfully with `kubectl`, as shown in the following command. This will show you the Cerbos pod running from the chart's deployment.

```shell
kubectl get pods | grep cerbos
```

### Docker Container Deployment

To deploy Cerbos using Docker, you can do so using the `docker run` command. By default, Cerbos listens on port 3592 for HTTP requests, and port 3593 for gRPC requests, requiring that these ports be exposed. Execute the following command in your terminal to deploy Cerbos with its default configuration. Please note that the `-d` flag is included to run the container in a detached state, as otherwise Cerbos logs would occupy the terminal. 

```shell
docker run -d -p 3592:3592 -p 3593:3593 --name "cerbos-fips" cgr.dev/ORGANIZATION/cerbos-fips
```

When you are finished with this container, you can remove it with the `docker rm` command, as follows:

```shell
docker rm cerbos-fips
```

To apply custom policies and configurations to Cerbos, the `/policies` and `/config` directories are mounted volumes at runtime. To demonstrate this, begin by using the following commands to create these directories and navigate to them.

```shell
mkdir -p ~/chainguard_cerbos_demo/policies
mkdir -p ~/chainguard_cerbos_demo/config
cd ~/chainguard_cerbos_demo
```

Then, copy the following YAML data into a new file, `policies/derived_roles_common.yaml`:

```shell
cat > policies/derived_roles_common.yaml << 'EOF'
---
apiVersion: "api.cerbos.dev/v1"
derivedRoles:
  name: common_roles
  definitions:
    - name: owner
      parentRoles: ["user"]
      condition:
        match:
          expr: request.resource.attr.owner == request.principal.id
EOF
```

Repeat this process for the configuration of `policies/resource_album.yaml`:

```shell
cat > policies/resource_album.yaml << 'EOF'
---
apiVersion: api.cerbos.dev/v1
resourcePolicy:
  version: "default"
  importDerivedRoles:
    - common_roles
  resource: "album:object"
  rules:
    - actions: ['*']
      effect: EFFECT_ALLOW
      derivedRoles:
        - owner

    - actions: ['view:public']
      effect: EFFECT_ALLOW
      roles:
        - user
      condition:
        match:
          expr: request.resource.attr.public == true
EOF
```

To apply a custom Cerbos configuration, we repeat the process once more for the `config/conf.yaml` file. Note that this configuration establishes a username `linky` and password `LinkyAdmin`, which is utilized for demonstrative purposes only, and should be changed in production use.

```shell
cat > config/conf.yaml << 'EOF'
---
server:
  httpListenAddr: ":3592"
  grpcListenAddr: ":3593"
  adminAPI:
    adminCredentials:
      passwordHash: JDJ5JDEwJGcuRHZ4MFR5a0FQUEZOU1pPMTdkbS5RV242MFY2Um9HYVR0eUpLMzdEQzZxU3g2Wi5SM3kuCgo= # echo "LinkyAdmin" | htpasswd -niBC 10 cerbos | cut -d ':' -f 2 | base64
      username: linky
    enabled: true

storage:
  driver: "disk"
  disk:
    directory: "/policies"
    watchForChanges: true

audit:
  enabled: true # Set to false to completely disable audit logging.
  accessLogsEnabled: true # Log API access attempts
  decisionLogsEnabled: true # Log policy decisions
  backend: local # Audit backend to use.
  local: # Configuration for the local audit backend
    storagePath: /auditlogs # Path to store the data
    retentionPeriod: 168h # Records older than this will be automatically deleted
EOF
```

With all configurations and policies in place, we are ready to deploy our container using the following `docker run` command:

```shell
docker run -d -p 3592:3592 -p 3593:3593 -v $(pwd)/policies:/policies -v $(pwd)/config:/config --name "cerbos" cgr.dev/ORGANIZATION/cerbos-fips server --config=/config/conf.yaml
```

The Cerbos container will now be running with our custom configuration settings. We can test this deployment by sending a simple request to the Cerbos server, using `cURL` as follows.

```shell
curl --silent -H "Content-Type: application/json" \
    --data-binary @- \
    "http://localhost:3592/api/check/resources?pretty" << 'EOF'
{
  "requestId": "quickstart",
  "principal": {
    "id": "linky",
    "roles": [
      "user"
    ],
    "attr": {
      "beta_tester": true
    }
  },
  "resources": [
    {
      "actions": [
        "view:public",
        "comment"
      ],
      "resource": {
        "kind": "album:object",
        "id": "LINKY001",
        "attr": {
          "owner": "linky",
          "public": false,
          "flagged": false
        }
      }
    },
    {
      "actions": [
        "view:public",
        "comment"
      ],
      "resource": {
        "kind": "album:object",
        "id": "WOLFI002",
        "attr": {
          "owner": "wolfi",
          "public": true,
          "flagged": false
        }
      }
    }
  ]
}
EOF
```

You should receive the following in response, reflecting the successful application of the configured Cerbos policies:

```json
{
  "requestId": "quickstart",
  "results": [
    {
      "resource": {
        "id": "LINKY001",
        "kind": "album:object"
      },
      "actions": {
        "comment": "EFFECT_ALLOW",
        "view:public": "EFFECT_ALLOW"
      }
    },
    {
      "resource": {
        "id": "WOLFI002",
        "kind": "album:object"
      },
      "actions": {
        "comment": "EFFECT_DENY",
        "view:public": "EFFECT_ALLOW"
      }
    }
  ]
}
```

We can also verify that the Admin API service was configured correctly with the use of the `cerbosctl-fips` Chainguard Image. First, pull this image from the Chainguard registry using the following command.

```shell
docker pull cgr.dev/ORGANIZATION/cerbosctl-fips
```

With the image pulled locally, execute the following command in your terminal to use `cerbosctl` to query the `cerbos` Chainguard Image's Admin API for its `resource_policies`.

```shell
docker run --rm --network host cgr.dev/ORGANIZATION/cerbosctl-fips get resource_policies --plaintext --username linky --password LinkyAdmin
```

The response from the Admin API should be similar to the following output.

```shell
POLICY ID               NAME            VERSION SCOPE
resource_album.yaml     album:object    default
```

The same can be repeated for a query for Cerbos' `derived_roles`:

```shell
docker run --rm --network host cgr.dev/ORGANIZATION/cerbosctl-fips get derived_roles --plaintext --username linky --password LinkyAdmin
```

The expected output for this request is shown in the following snippet.

```shell
POLICY ID                    NAME
derived_roles_common.yaml    common_roles
```

To clean up your system after completing this demonstration, be sure to run the following commands.
```shell
rm -r ~/chainguard_cerbos_demo && docker rm "cerbos"
```

## Documentation
- [Cerbos GitHub Repository](https://github.com/cerbos/cerbos)
- [Cerbos Helm Charts](https://github.com/cerbos/helm-charts/)
- [Cerbos Documentation](https://docs.cerbos.dev/cerbos-hub/getting-started.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5774

# request-5774
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5774` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5774/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Apache Zookeeper 3.9.3 (Latest official release). ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [zookeeper](https://hub.docker.com/_/zookeeper) image. Switching to Chainguard's `zookeeper` image should not require any changes to your existing setup, however, this image runs as `nonroot` user (set as `zookeeper`) by default to add an extra layer of security for production environments. Since it is a non-root container, any mounted files or directories should have the proper permissions for the UID 1000 (which is the UID for zookeeper)

## Getting Started
### Docker

Start a Zookeeper server instance:
```shell
docker run --name some-zookeeper -d cgr.dev/ORGANIZATION/request-5774:latest
```

## Documentation and Resources
For more information, please refer to [the official documentation for zookeeper project](https://zookeeper.apache.org/doc/current/index.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5663

# request-5663
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5663` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5663/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pdns-auth

# pdns-auth
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pdns-auth` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pdns-auth/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PowerDNS Authoritative Server - High-performance DNS server with flexible backend support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `pdns-auth` image is comparable to the [PowerDNS Authoritative Server Docker image](https://hub.docker.com/r/powerdns/pdns-auth-master). Like all Chainguard images, this container image is minimal and does not include unnecessary components such as a shell or package manager in the production variant, while maintaining full compatibility with PowerDNS functionality.

## Getting Started

PowerDNS Authoritative Server is a high-performance DNS server with support for multiple backends, DNSSEC, and a comprehensive API for management and monitoring.

### Docker

Run PowerDNS Authoritative Server with a basic configuration using Docker:

```sh
docker run --rm \
  -p 5353:53 \
  -v $(pwd)/pdns.conf:/etc/pdns.conf:ro \
  -v $(pwd)/named.conf:/etc/pdns/named.conf:ro \
  -v $(pwd)/example.com.zone:/etc/pdns/zones/example.com.zone \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

This example assumes you have a `pdns.conf` file in your current directory. See the Kubernetes section below for an example of `pdns.conf`.

**Note**: The `--sysctl net.ipv4.ip_unprivileged_port_start=0` parameter allows binding to privileged ports (ports < 1024, such as port 53) as a non-root user. This is safer than using `--cap-add=NET_BIND_SERVICE` and is a [safe sysctl option](https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/). Alternatively, configure PowerDNS to use a non-privileged port (e.g., 5353) which requires no special permissions.

### Kubernetes

Deploy PowerDNS Authoritative Server in Kubernetes with ConfigMaps for configuration and zone files:

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: pdns-config
data:
  pdns.conf: |
    launch=bind
    bind-config=/etc/pdns/named.conf

    local-address=0.0.0.0
    local-port=53

    socket-dir=/tmp

    api=yes
    api-key=your-secure-api-key
    webserver=yes
    webserver-address=0.0.0.0
    webserver-port=8081

    log-dns-queries=yes
    loglevel=5
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: pdns-zones
data:
  named.conf: |
    zone "example.com" {
      type master;
      file "/etc/pdns/zones/example.com.zone";
    };
  example.com.zone: |
    $TTL 3600
    $ORIGIN example.com.
    @       IN      SOA     ns1.example.com. admin.example.com. (
                            2024010101      ; Serial
                            3600            ; Refresh
                            1800            ; Retry
                            604800          ; Expire
                            86400 )         ; Minimum TTL
    @       IN      NS      ns1.example.com.
    ns1     IN      A       192.168.1.10
    www     IN      A       192.168.1.20
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pdns-auth
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pdns-auth
  template:
    metadata:
      labels:
        app: pdns-auth
    spec:
      securityContext:
        sysctls:
        - name: "net.ipv4.ip_unprivileged_port_start"
          value: "0"
      containers:
      - name: pdns-auth
        image: cgr.dev/ORGANIZATION/REPO_NAME:latest
        ports:
        - name: dns-udp
          containerPort: 53
          protocol: UDP
        - name: dns-tcp
          containerPort: 53
          protocol: TCP
        - name: api
          containerPort: 8081
          protocol: TCP
        volumeMounts:
        - name: config
          mountPath: /etc/pdns.conf
          subPath: pdns.conf
        - name: zones
          mountPath: /etc/pdns/named.conf
          subPath: named.conf
        - name: zones
          mountPath: /etc/pdns/zones/example.com.zone
          subPath: example.com.zone
        livenessProbe:
          httpGet:
            path: /api/v1/servers/localhost
            port: 8081
            httpHeaders:
            - name: X-API-Key
              value: your-secure-api-key
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/v1/servers/localhost
            port: 8081
            httpHeaders:
            - name: X-API-Key
              value: your-secure-api-key
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: pdns-config
      - name: zones
        configMap:
          name: pdns-zones
```

Apply the configuration:

```sh
kubectl apply -f pdns-deployment.yaml
```

Verify the deployment is running:

```sh
kubectl get pods -l app=pdns-auth
```

Test DNS queries:

```sh
kubectl exec -it <pod-name> -- pdnsutil list-zones
```

### Other Backend Options

PowerDNS supports various backends including:

* **PostgreSQL**: High-performance SQL backend
* **MySQL/MariaDB**: Popular SQL backend option
* **SQLite**: Lightweight embedded database
* **LDAP**: Directory service integration
* **GeoIP**: Geographic load balancing

Consult the [PowerDNS documentation](https://doc.powerdns.com/authoritative/) for backend-specific configuration.

## Documentation and Resources

* [PowerDNS Authoritative Server Documentation](https://doc.powerdns.com/authoritative/)
* [PowerDNS API Reference](https://doc.powerdns.com/authoritative/http-api/index.html)
* [Getting Started with PowerDNS](https://doc.powerdns.com/authoritative/index.html#getting-started)
* [Backend Configuration Guide](https://doc.powerdns.com/authoritative/backends/index.html)
* [Chainguard Images Overview](https://edu.chainguard.dev/chainguard/chainguard-images/overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### envoy-ratelimit-fips

# envoy-ratelimit-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/envoy-ratelimit-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/envoy-ratelimit-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### arangodb-fips

# arangodb-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/arangodb-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/arangodb-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `arangodb-fips` image is comparable to the [official ArangoDB image](https://hub.docker.com/_/arangodb). Note that the Chainguard arangodb image does **NOT** run as root, but rather as the arangodb user.

ArangoDB Pods are using readonly root filesystem, so the containers cannot write the logs to the default location `/var/log/arangodb3`. Instead, the logs should be written to the stderr for best practice. ArangoDB uses `/data` as the default data directory, which is mounted as a persistent volume. You may need to pass the following flags to the `ArangoDeployment` manifest:

* `--log.file=-`
* `--temp.path=/data/tmp`
* `--javascript.app-path=/data/apps`

### FIPS support

Chainguard's `arangodb-fips` image ships with a validated redistribution of the OpenSSL FIPS provider module. For more on FIPS support in Chainguard container images, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Docker Usage

To run ArangoDB FIPS using Docker:

```shell
docker run -d --rm --name arangodb-fips -e ARANGO_ROOT_PASSWORD=password -p 8529:8529 cgr.dev/ORGANIZATION/arangodb-fips:latest
```

Wait for the container to be ready:

```shell
# Check if ArangoDB is available
curl -fsSL http://localhost:8529/_admin/server/availability -u root:password
```

Test basic functionality:

```shell
# Check version
curl -fsSL http://localhost:8529/_api/version -u root:password

# List databases
curl -fsSL http://localhost:8529/_api/database -u root:password

# View statistics
curl -fsSL http://localhost:8529/_admin/statistics -u root:password
```

### Kubernetes Deployment

You can use Helm to deploy the `arangodb-fips` container image using the [ArangoDB Kubernetes Operator](https://github.com/arangodb/kube-arangodb) and start a minimal ArangoDB cluster.

Start by installing the operator:

```shell
helm repo add arangodb https://arangodb.github.io/kube-arangodb
helm repo update

helm install arangodb arangodb/kube-arangodb \
  --version my-version
```

Then deploy a cluster with Chainguard's `arangodb-fips` container image:

```shell
curl -O https://raw.githubusercontent.com/arangodb/kube-arangodb/master/examples/simple-cluster.yaml
```

Then apply it:

```
kubectl apply -f simple-cluster.yaml
```

Replace the default image with the Chainguard version

```
kubectl patch arangodeployment example-simple-cluster --type='merge' -p '{"spec": {"image": "cgr.dev/ORGANIZATION/arangodb-fips:latest"}}'
```

To test that the container is working correctly, create a collection:

```shell
curl -k -u root: -X POST --header "Content-Type: application/json" \
  --data '{"name":"testcol"}' \
  https://127.0.0.1:8529/_api/collection
```

Then use `curl` to view the collection:

```shell
curl -k -u root: https://127.0.0.1:8529/_api/collection
```

## Documentation and Resources

- [Using the ArangoDB Kubernetes Operator](https://arangodb.github.io/kube-arangodb/docs/using-the-operator.html)
- [kube-arangodb GitHub Repository](https://github.com/arangodb/kube-arangodb)
- [Helm Chart Documentation](https://arangodb.github.io/kube-arangodb/docs/helm.html)
- [API Reference for ArangoDeployment V1](https://arangodb.github.io/kube-arangodb/docs/api/ArangoDeployment.V1.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### hubble-export-stdout-fips

# hubble-export-stdout-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/hubble-export-stdout-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/hubble-export-stdout-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant hubble-export-stdout exports Hubble data to stdout.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `hubble-export-stdout-fips` image is compatible with the [quay.io/cilium/hubble-export-stdout](https://quay.io/repository/cilium/hubble-export-stdout) image with the following charecteristics:
* Minimal, distroless design with only the essential runtime dependencies
* Built on Chainguard's secure base images with minimal CVEs
* Compatible with Cilium's Hubble observability framework

The image runs as root similar to the upstream image to ensure its capable of reading logs written with varying permissions.

## Prerequisites

To use `hubble-export-stdout-fips`, you need:

* A Kubernetes cluster with [Cilium](https://cilium.io/) installed
* Hubble observability enabled in your Cilium configuration  

For detailed setup instructions, refer to the [Cilium Hubble documentation](https://docs.cilium.io/en/stable/observability/hubble/).

## Getting Started

### Kubernetes Deployment with Tetragon Helm Chart

A common deployment method is as a sidecar container in Tetragon pods using the official Helm chart:

```bash
# Add the Cilium Helm repository
helm repo add cilium https://helm.cilium.io
helm repo update

# Install Tetragon with stdout export enabled
helm install tetragon cilium/tetragon \
  --set export.stdout.enabled=true \
  --set export.stdout.image.repository=cgr.dev/ORGANIZATION/hubble-export-stdout \
  --set export.stdout.image.tag=latest
```

This configuration adds an `export-stdout` sidecar container to each Tetragon DaemonSet pod that reads security events from Tetragon's log file and streams them to stdout for Kubernetes log collection.

### Basic Docker Usage

For testing purposes, you can run the container directly:

```bash
# Run with file tailing
docker run --rm -v /path/to/events:/data:ro \
  cgr.dev/ORGANIZATION/hubble-export-stdout:latest \
  tail -f /data/sample-events.json
```

## Documentation and Resources

* [Cilium Hubble Documentation](https://docs.cilium.io/en/stable/observability/hubble/)
* [hubble-export-stdout GitHub Repository](https://github.com/cilium/hubble-export-stdout)
* [Hubble Export Configuration](https://docs.cilium.io/en/stable/observability/hubble/configuration/export/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ratify-fips

# ratify-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ratify-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ratify-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Artifact Ratification Framework (CNCF Sandbox)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `ratify` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream Ratify image](https://ghcr.io/ratify-project/ratify) while maintaining minimal dependencies and enhanced security.

But there are some differences between the upstream and Chainguard's `ratify` container image:
- The Chainguard image stores the configuration file at `/opt/ratify/config.json` instead of `/.ratify/config.json`.
- The plugins in the Chainguard image reside at `/opt/ratify/plugins` instead of `/.ratify/plugins`.

## Getting Started

In order to deploy Ratify in your Kubernetes cluster, first things first, you need to install the [Gatekeeper](https://github.com/open-policy-agent/gatekeeper) admission controller. You can follow the [Gatekeeper installation guide](https://open-policy-agent.github.io/gatekeeper/website/docs/install).

To deploy Gatekeeper, first, you need to add the Gatekeeper Helm repository:

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
```

You can use [Chainguard image for Gatekeeper](https://images.chainguard.dev/directory/image/gatekeeper/versions) by setting the `image.repository` and `image.release` values in a `values.yaml` file:

```shell
cat > values-gatekeeper.yaml << EOF
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper
  release: latest
EOF
```

Then, you can install Gatekeeper using the following command:

```shell
helm install gatekeeper/gatekeeper  \
    --name-template=gatekeeper \
    --namespace gatekeeper-system --create-namespace \
    --set enableExternalData=true \
    --set validatingWebhookTimeoutSeconds=5 \
    --set mutatingWebhookTimeoutSeconds=2 \
    --set externaldataProviderResponseCacheTTL=10s \
    -f values-gateekeper.yaml
```

Once Gatekeeper is installed, you can deploy the Ratify admission controller. You can use the [Ratify Helm chart](https://artifacthub.io/packages/helm/ratify/ratify) to deploy Ratify in your cluster. First, add the Ratify Helm repository:

```shell
helm repo add ratify https://notaryproject.github.io/ratify
```

You can use the Chainguard image for Ratify by setting the `image.repository` and `image.tag` values in a `values.yaml` file:

```shell
cat > values.yaml << EOF
image:
  repository: cgr.dev/ORGANIZATION/ratify-fips
  crdRepository: cgr.dev/ORGANIZATION/ratify-crds-fips
  tag: latest
EOF
```

Then install the webhook using the `values.yaml` file:

> **NOTE**: Do not forget to use the `--set-file` flag to provide the `notation.crt` file, which is required for the Ratify webhook to function properly.

```shell
  helm install ratify ratify/ratify \
    --namespace gatekeeper-system \
    --set-file notationCerts[0]="./notation.crt" \
    --set featureFlags.RATIFY_CERT_ROTATION=true \
    --set policy.useRego=true \
    -f values.yaml
```

Then you can follow up the [Ratify documentation](https://ratify.dev/docs/quickstarts/quickstart-manual#step-3-see-ratify-in-action) to configure Ratify constraints to enforce policies on your Kubernetes cluster.

### FIPS Support
The `ratify-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Documentation and Resources

* [Ratify Documentation](https://ratify.dev)
* [Quickstart Guide](https://ratify.dev/docs/quick-start)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jetty

# jetty
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jetty` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jetty/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Eclipse Jetty is a lightweight, highly scalable, Java-based web server and Servlet engine

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Jetty image is designed to be a drop-in replacement for the official Jetty images with one key difference in directory ownership: `$JETTY_HOME` (located at `/usr/local/jetty`) is owned by `root` instead of the `jetty` user. This follows Jetty's best practices, as `$JETTY_HOME` contains the binary installation and [should not be modified during runtime](https://jetty.org/docs/jetty/12.1/operations-guide/arch/index.html#jetty-base).

## Getting Started

### Running the Default Jetty Server

To run the default Jetty server:

```bash
docker run -d -p 8080:8080 cgr.dev/ORGANIZATION/jetty:latest
```

To view the configuration of the Jetty server:

```bash
docker run cgr.dev/ORGANIZATION/jetty:latest --list-config
```

### Web Application Deployment

By default, Jetty comes with the following modules enabled: `http`, `server`, `resources`, and `ext`. To deploy web applications, you need to enable additional [deployment modules](https://jetty.org/docs/jetty/12.1/operations-guide/deploy/index.html), such as `static-deploy`, `core-deploy`, or `ee{8,9,10,11}-deploy`, depending on your environment.

The recommended approach is to **extend the base Jetty image**, enable the modules you need, place your applications under `$JETTY_BASE/webapps` (by default, `$JETTY_BASE` is `/var/lib/jetty`), and adjust configuration via `.ini` files in `$JETTY_BASE/start.d`.

For example, to deploy Jetty's demo webapp, you can create a Jetty image by extending the base image and enabling the `demos` module.

```bash
mkdir -p /tmp/jetty-demo-image

cat > /tmp/jetty-demo-image/Dockerfile << EOF
FROM cgr.dev/ORGANIZATION/jetty:latest

# Enable the EE 11 deployment and demo applications
RUN java -jar "$JETTY_HOME/start.jar" --add-modules=demos
EOF

docker build -t jetty-demo-image /tmp/jetty-demo-image
```

Run the demo image:

```bash
docker run -d -p 8080:8080 jetty-demo-image
```

Verify that the server is running and serving the demo application:

```bash
curl localhost:8080
```

## Documentation and Resources

- [Jetty Official Website](https://jetty.org/)
- [Jetty GitHub Repository](https://github.com/jetty/jetty.project)
- [Official Jetty Docker Image](https://hub.docker.com/_/jetty)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kots

# kots
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kots` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kots/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5754-fips

# request-5754
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-5754` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-5754/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

CLI for Databricks

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

# Compatibility Notes

Chainguard's `databricks-cli-fips` image is comparable to the [upstream Databricks CLI image](https://github.com/databricks/cli/pkgs/container/cli) on GHCR.

# FIPS Support

The `databricks-cli-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

# Getting Started

Using the Databricks CLI is as easy as running Chainguard's image with Docker:

```bash
docker run cgr.dev/ORGANIZATION/databricks-cli-fips:latest
```

This will print a number of subcommands you can pass to the CLI:

```
Databricks CLI

Usage:
  databricks [command]

Databricks Workspace
  fs                                     Filesystem related commands
  git-credentials                        Registers personal access token for Databricks to do operations on behalf of the user.
  repos                                  The Repos API allows users to manage their git repos.
  secrets                                The Secrets API allows you to manage secrets, secret scopes, and access permissions.
  workspace                              The Workspace API allows you to list, import, export, and delete notebooks and folders.
...
```

Please see the CLI's documentation for usage.

# Documentation and Resources

- [Databricks CLI documentation](https://docs.databricks.com/aws/en/dev-tools/cli)
- [Databricks CLI GitHub repository](https://github.com/databricks/cli)
- [Create a Databricks workspace](https://docs.databricks.com/aws/en/admin/workspace)
- [Getting started with Databricks on AWS](https://www.databricks.com/product/aws)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### glibc-openssl

# glibc-openssl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/glibc-openssl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/glibc-openssl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The GNU C Library (glibc) is a C standard library implementation maintained by the GNU Project. This container image also contains OpenSSL, a software library for applications providing secure communications over a network.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is generally meant to be used only as a base image. It does, however, contain the `openssl` program which you can run.

You must bring your own artifacts to use this image, such as with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

## Getting Started

To illustrate how you can use Chainguard's `glibc-openssl` container image, start by creating the following Go program:

```shell
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```

This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require glibc.

Next, create a Dockerfile that uses the `glibc-openssl` container image as a base image:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/ORGANIZATION/glibc-openssl
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Note that this example Dockerfile uses the public Chainguard `go` image and a private `glibc-openssl` image. You will need to change `ORGANIZATION` to reflect your organization's private repository within the Chainguard registry.

Using this Dockerfile, build an image:

```shell
docker build -t glibc-openssl .
```

Then run the newly-built image:

```shell
docker run --rm glibc-openssl
```

This will return the following output, indicating the program was run successfully and the glibc base image worked as expected:

```
Hello, world!
```

### Testing OpenSSL 

As mentioned previously, the `glibc-openssl` image comes with OpenSSL. To test this out, first create a sample file:

```shell
echo "sample text" > sample.txt
```

Then mount this file to the `glibc-openssl` container and use the `sha512` digest function to output the digest of the sample file:

```shell
docker run -v $(pwd):/tmp cgr.dev/chainguard-private/glibc-openssl openssl sha512 /tmp/sample.txt
```
```
SHA2-512(stdin)= cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)
* [OpenSSL Documentation](https://docs.openssl.org/master/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opensearch-k8s-operator-fips

# opensearch-k8s-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opensearch-k8s-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opensearch-k8s-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The FIPS-complaint OpenSearch Kubernetes Operator is used for automating the deployment, provisioning, management, and orchestration of OpenSearch clusters and OpenSearch dashboards.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `opensearch-k8s-operator-fips` Chainguard image is meant to serve as a drop-in replacement for the [Opensearch Operator image on Docker Hub](https://hub.docker.com/r/opensearchproject/opensearch-operator). Like most Chainguard images, this image is minimal, has few-to-zero CVEs and does not run as the root user.

### FIPS Support
The `opensearch-k8s-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
`opensearch-k8s-operator-fips` Chainguard image is a FIPS-complaint Kubernetes operator, which can be deployed using helm.

To use our minimal, wolfi-based image with the Helm chart you'll need to override the image used by the official helm chart and specify the chainguard image as per below example:

1. Add opensearch operator Helm chart repo
```shell
helm repo add opensearch-operator https://opensearch-project.github.io/opensearch-k8s-operator
helm repo update
```

2. Create your values-fips.yaml file
```shell
cat <<EOF > /tmp/values-fips.yaml
image:
  repository: cgr.dev/ORGANIZATION/opensearch-k8s-operator-fips
  tag: latest
EOF
```

3. Install the `opensearch-k8s-operator` Chart using Helm
```shell
helm install opensearch-operator opensearch-operator/opensearch-operator -f /tmp/values-fips.yaml
```

## Documentation and Resources
- [Opensearch Operator docs - Helm install quickstart](https://opensearch-project.github.io/opensearch-k8s-operator/docs/userguide/main.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kaniko-warmer-fips

# kaniko-warmer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kaniko-warmer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kaniko-warmer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Build Container Images In Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Usage

To use the warmer image, you can run it as a standalone pod with a volume mount to populate the cache. The following example demonstrates how to do this:

```bash
cat <<EOX | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: basecache-pvc
spec:
  resources:
    requests:
      storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
---
apiVersion: v1
kind: Pod
metadata:
  name: kaniko-warmer
spec:
  containers:
  - name: kaniko-warmer
    image: cgr.dev/ORGANIZATION/kaniko-warmer-fips:latest
    args: ["--cache-dir=/cache",
           "--image=alpine"] # The image to pull to populate the cache
    volumeMounts:
      - name: basecache
        mountPath: /cache
  restartPolicy: Never
  volumes:
    - name: basecache
      persistentVolumeClaim:
        claimName: basecache-pvc
EOX
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgbouncer-iamguarded-fips

# pgbouncer-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgbouncer-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgbouncer-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the CLI for the [pgbouncer](https://www.pgbouncer.org/) connection pooler for PostgreSQL with IAMGuarded support.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

PgBouncer IAMGuarded is a security-enhanced variant of PgBouncer, an open-source middleware that operates between PostgreSQL servers and clients, providing features such as load balancing.

## FIPS Support

The `pgbouncer-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Installation and usage

PgBouncer does not come with its own Helm Chart and is meant to be used standalone.

Such as:

```
$ docker container run -d \
  -e POSTGRESQL_HOST=postgresql-hostname \
  -e POSTGRESQL_USERNAME=... \
  -e POSTGRESQL_PASSWORD=... \
  cgr.dev/ORGANIZATION/pgbouncer-iamguarded-fips::latest
```

Where `POSTGRESQL_HOST`, `POSTGRESQL_USERNAME` and `POSTGRESQL_PASSWORD` should be provided and be a valid host, user and password to connect to PostgreSQL that PgBouncer should be a proxy for.

## Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### open-webui

# open-webui
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/open-webui` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/open-webui/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open WebUI is an extensible, feature-rich, and user-friendly self-hosted AI platform designed to operate entirely offline. It supports various LLM runners like Ollama and OpenAI-compatible APIs, with built-in inference engine for RAG, making it a powerful AI deployment solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [open-webui/open-webui](https://github.com/open-webui/open-webui) image available from GitHub Container Registry. Switching to the Chainguard image should not require any changes to your existing setup.

**Important**: In Chainguard `open-webui` the `FROM_INIT_PY` environment variable is set to "true". This is because the build process uses a Python virtual environment, and without this flag, the frontend build directory defaults to an incorrect path instead of the expected location.
For more details, see the [relevant code in open-webui.](https://github.com/open-webui/open-webui/blob/a7271532f8a38da46785afcaa7e65f9a45e7d753/backend/open_webui/env.py#L240)

## Getting Started

### Docker

You can run Open WebUI with Docker using the following command:

```bash
docker run -d \
  --name open-webui \
  -p 3000:8080 \
  -v open-webui-data:/app/backend/data \
  cgr.dev/ORGANIZATION/open-webui:latest
```

### Docker Compose

Create a `docker-compose.yml` file with the following content:

```yaml
version: '3'

services:
  open-webui:
    image: cgr.dev/ORGANIZATION/open-webui:latest
    container_name: open-webui
    ports:
      - 3000:8080
    volumes:
      - open-webui-data:/app/backend/data
    restart: unless-stopped

volumes:
  open-webui-data:
```

Run the container with:

```bash
docker-compose up -d
```

### Helm/Kubernetes

Open WebUI provides official Helm charts for Kubernetes deployment. You can deploy Open WebUI with the Chainguard image using these steps:

1. Add the Open WebUI Helm repository:

    ```bash
    helm repo add open-webui https://helm.openwebui.com/
    helm repo update
    ```

2. Create a `values.yaml` file to configure the deployment with the Chainguard image:

    ```yaml
    image:
    repository: cgr.dev/ORGANIZATION/open-webui
    tag: latest
    pullPolicy: IfNotPresent

    # Configure persistence if needed
    persistence:
    enabled: true
    size: 2Gi
    ```

3. Install the Open WebUI Helm chart:

    ```bash
    helm upgrade --install open-webui open-webui/open-webui \
    --namespace open-webui --create-namespace \
    --values values.yaml
    ```

4. Access Open WebUI:

    ```bash
    # Port forward to access the UI
    kubectl port-forward -n open-webui svc/open-webui 3000:80
    ```

Open WebUI will be available at http://localhost:3000

### Configuration

Open WebUI will be available at http://localhost:3000 after startup. Follow the web interface instructions to connect to your LLM provider (Ollama, OpenAI API, etc.).

## Documentation and Resources

* [Official Open WebUI repository](https://github.com/open-webui/open-webui)
* [Open WebUI Documentation](https://docs.openwebui.com/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm-fips

# helm-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Kubernetes Package Manager

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `helm-fips` container image is a FIPS-enabled variant of Helm that functions identically to both the upstream [Helm](https://github.com/helm/helm) and the non-FIPS [Chainguard helm image](https://images.chainguard.dev/directory/image/helm). It provides the same Kubernetes package management functionality with FIPS-compliant cryptographic modules.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can use the FIPS Helm image for standard Kubernetes package management tasks. 

To show the Helm version:

```shell
docker run --rm cgr.dev/ORGANIZATION/helm-fips version --short
```

To display Helm's `help` text:

```shell
docker run --rm cgr.dev/ORGANIZATION/helm-fips help
```

Search for charts:

```shell
docker run --rm cgr.dev/ORGANIZATION/helm-fips search hub nginx
```

## Documentation and Resources

- [Helm Documentation](https://helm.sh/docs/)
- [FIPS-enabled Chainguard Containers Guide](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tigera-operator-fips

# tigera-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tigera-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tigera-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `tigera-operator-fips` image is designed to be a drop-in replacement for the [Tigera operator image](https://quay.io/repository/tigera/operator).

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Deploy the Tigera operator using the official Helm chart:

```yaml
cat > values.yaml <<EOF
tigeraOperator:
  registry: cgr.dev
  image: ORGANIZATION/tigera-operator-fips
  version: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add projectcalico https://docs.tigera.io/calico/charts
helm repo update
helm install calico projectcalico/tigera-operator \
    --namespace tigera-operator \
    --create-namespace \
    -f values.yaml
```

Verify the installation:

```shell
kubectl wait --namespace tigera-operator --for=condition=ready pod --selector name=tigera-operator --timeout=120s
```

## Documentation and Resources

- [Tigera Operator Documentation](https://github.com/tigera/operator)
- [Calico Installation Guide](https://docs.tigera.io/calico/latest/getting-started/kubernetes/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-apisix

# apache-apisix
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-apisix` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-apisix/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache APISIX is a dynamic, real-time, high-performance API Gateway.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard APISIX image is designed to be a drop-in replacement for the upstream [apache/apisix image](https://hub.docker.com/r/apache/apisix). Like most Chainguard images, this container image is minimal and does not include unnecessary components such as a package manager, while maintaining full compatibility.

## Getting Started

The APISIX image can be deployed to Kubernetes via Helm, or with Docker. In the examples below, be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Installation with Helm

When deploying on Kubernetes with Helm, you pull and install the official APISIX chart from the API7 repository:

```
helm repo add apisix https://charts.apiseven.com
helm repo update
```

The chart's values.yaml contains an image section where you can specify which container to deploy:

```
image:
  repository: cgr.dev/ORGANIZATION/apache-apisix
  pullPolicy: IfNotPresent  
  # Overrides the image tag; defaults to the chart's appVersion
  tag: latest
```

To deploy the Chainguard image, use helm install with the above values.yaml:

```
helm upgrade --install apisix apisix/apisix \
  --namespace apisix \
  --values values.yaml
```

### Running with Docker

To run APISIX using Docker, you can use the following command:

```shell
docker run -d --name apisix \
  --network apisix \
  -p 9080:9080 -p 9443:9443 \
  -v $(pwd)/example/apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml \
  -v $(pwd)/example/apisix_log:/usr/local/apisix/logs \
  cgr.dev/ORGANIZATION/apache-apisix:latest

```

See the following below resources for further usage details.

## Resources
- [Getting Started](https://apisix.apache.org/docs/apisix/getting-started/README/)
- [APISIX Installation Guide](https://apisix.apache.org/docs/apisix/installation-guide/)
- [apache/apisix on Dockerhub](https://hub.docker.com/r/apache/apisix)
- [APISIX Helm Chart](https://github.com/apache/apisix-helm-chart)
- [APISIX Github Repository](https://github.com/apache/apisix)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tigera-operator

# tigera-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tigera-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tigera-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Project Calico Tigera Operator Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
helm repo add projectcalico https://projectcalico.docs.tigera.io/charts
helm repo update

helm install calico projectcalico/tigera-operator \
    --namespace tigera-operator \
    --create-namespace \
    --set autoDiscovery.clusterName=foo \
    --set tigeraOperator.registry=cgr.dev \
    --set tigeraOperator.image=chainguard/tigera-operator \
    --set tigeraOperator.version=latest

kubectl wait --namespace tigera-operator --for=condition=ready pod --selector name=tigera-operator --timeout=120s
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sonarqube

# sonarqube
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sonarqube` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sonarqube/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Trying out SonarQube locally

To try out SonarQube locally, you can run it in a Docker container:

```shell
docker run --rm -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 cgr.dev/ORGANIZATION/sonarqube:latest
```

Then access it from your browser via https://localhost:9000.

## Installing with the SonarQube Helm chart

Instructions to deploy SonarQube as a Helm chart can be found on https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/deploy-on-kubernetes/sonarqube/

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vela-cli

# vela-cli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vela-cli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vela-cli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Reference implementation for Kubevela's vela CLI tool.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-mysqld-exporter-iamguarded

# prometheus-mysqld-exporter-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-mysqld-exporter-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-mysqld-exporter-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for MySQL server metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus exporter for MySQL server metrics IAMGuarded is a security-enhanced variant of Prometheus exporter for MySQL designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes an exporter for Prometheus metrics and provides additional security benefits over standard Prometheus exporter for MySQL deployments.

## Helm Chart Installation

The MySQL IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main MySQL image
image:
  registry: myregistry.example.com
  repository: mirrored/mysql-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# MySQL Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-mysqld-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install mysql oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/mysql
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/mysql:13.0.0
   Digest: sha256:61485fe902828b2859684d8d99df394878131eb6590f738bfa7f6f1f43eb8174
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your MySQL IAMGuarded installation using standard MySQL verification methods. The deployment functions as a standard MySQL instance, so all typical MySQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The MySQL IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both MySQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4952

# request-4952
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4952` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4952/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Container image for running the AWX Kubernetes operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gpu-operator

# gpu-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gpu-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gpu-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The NVIDIA GPU Operator bootstraps, configures, and manages GPUs in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `gpu-operator` Container is comparable to the [gpu-operator image maintained by NVIDIA](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/gpu-operator). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting started
You can install this image with Helm. First, create a [values file](https://helm.sh/docs/chart_template_guide/values_files/):
```yaml
operator:
    repository: cgr.dev/ORGANIZATION
    image: gpu-operator
    version: latest
```

Then use this file to install the `gpu-operator` container image:

```bash
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm upgrade --install gpu-operator \
    nvidia/gpu-operator \
    -f values.yaml
```

> [!WARNING]
> You'll want to make sure the `gpu-operator` chart is up-to-date and use the latest operator tag that's within the compatibility matrix. Additionally, you need GPU nodes to run the operator as it will schedule Deployments and DaemonSets on nodes with GPUs.

## Documentation and Resources
- [Upstream Documentation](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/index.html)
- [GPU Operator helm chart](https://github.com/NVIDIA/gpu-operator/tree/main/deployments/gpu-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### dapr-fips

# dapr-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/dapr-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/dapr-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Dapr is a portable, event-driven, runtime for building distributed applications across cloud and edge.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard dapr images are compatible with dapr project images. Switching to Chainguard image should not require any changes to your existing setup.

### FIPS Support

The dapr-fips Chainguard Image Group ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started
We can use helm charts for testing dapr images. We can create a values.yaml that'll override upstream images with Chainguard images.

```yaml
global:
  imagePullPolicy: IfNotPresent

dapr_operator:
  image:
    name: cgr.dev/ORGANIZATION/dapr-operator-fips

dapr_placement:
  image:
    name: cgr.dev/ORGANIZATION/dapr-placement-fips

dapr_scheduler:
  image:
    name: cgr.dev/ORGANIZATION/dapr-scheduler-fips

dapr_sentry:
  image:
    name: cgr.dev/ORGANIZATION/dapr-sentry-fips

dapr_sidecar_injector:
  injectorImage:
    name: cgr.dev/ORGANIZATION/darp-injector-fips
  image:
    name: cgr.dev/ORGANIZATION/daprd-fips
```
After that we can do the following to install the chart in our cluster.
```bash
helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update
helm install dapr dapr/dapr --namespace dapr-system --wait -f values.yaml
```

## Documentation & Resources
Please refer to the upstream [documentation](https://docs.dapr.io/) for a [getting started](https://docs.dapr.io/getting-started/) guide.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### etcd

# etcd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/etcd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/etcd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[etcd](https://etcd.io/) Distributed reliable key-value store for the most critical data of a distributed system

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using etcd

The default listening ports in etcd are 2379 and 2380.
To run a container listening on these ports, try:

```sh
docker run -p 2379:2379 -p 2380:2380 --rm cgr.dev/chainguard/etcd
{"level":"info","ts":"2022-12-27T15:56:52.651Z","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd"]}
{"level":"warn","ts":"2022-12-27T15:56:52.651Z","caller":"etcdmain/etcd.go:105","msg":"'data-dir' was empty; using default","data-dir":"default.etcd"}
{"level":"info","ts":"2022-12-27T15:56:52.651Z","caller":"embed/etcd.go:124","msg":"configuring peer listeners","listen-peer-urls":["http://localhost:2380"]}
{"level":"info","ts":"2022-12-27T15:56:52.652Z","caller":"embed/etcd.go:132","msg":"configuring client listeners","listen-client-urls":["http://localhost:2379"]}
{"level":"info","ts":"2022-12-27T15:56:52.652Z","caller":"embed/etcd.go:306","msg":"starting an etcd server","etcd-version":"3.5.6","git-sha":"0a7cb3c","go-version":"go1.19.4","go-os":"linux","go-arch":"arm64","max-cpu-set":8,"max-cpu-available":8,"member-initialized":false,"name":"default","data-dir":"default.etcd","wal-dir":"","wal-dir-dedicated":"","member-dir":"default.etcd/member","force-new-cluster":false,"heartbeat-interval":"100ms","election-timeout":"1s","initial-election-tick-advance":true,"snapshot-count":100000,"max-wals":5,"max-snapshots":5,"snapshot-catchup-entries":5000,"initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"],"listen-client-urls":["http://localhost:2379"],"listen-metrics-urls":[],"cors":["*"],"host-whitelist":["*"],"initial-cluster":"default=http://localhost:2380","initial-cluster-state":"new","initial-cluster-token":"etcd-cluster","quota-backend-bytes":2147483648,"max-request-bytes":1572864,"max-concurrent-streams":4294967295,"pre-vote":true,"initial-corrupt-check":false,"corrupt-check-time-interval":"0s","compact-check-time-enabled":false,"compact-check-time-interval":"1m0s","auto-compaction-mode":"periodic","auto-compaction-retention":"0s","auto-compaction-interval":"0s","discovery-url":"","discovery-proxy":"","downgrade-check-interval":"5s"}
{"level":"info","ts":"2022-12-27T15:56:52.657Z","caller":"etcdserver/backend.go:81","msg":"opened backend db","path":"default.etcd/member/snap/db","took":"4.238167ms"}
{"level":"info","ts":"2022-12-27T15:56:52.664Z","caller":"etcdserver/raft.go:494","msg":"starting local member","local-member-id":"8e9e05c52164694d","cluster-id":"cdf818194e3a8c32"}
{"level":"info","ts":"2022-12-27T15:56:52.664Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d switched to configuration voters=()"}
{"level":"info","ts":"2022-12-27T15:56:52.664Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became follower at term 0"}
{"level":"info","ts":"2022-12-27T15:56:52.664Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]"}
{"level":"info","ts":"2022-12-27T15:56:52.664Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became follower at term 1"}
{"level":"info","ts":"2022-12-27T15:56:52.665Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d switched to configuration voters=(10276657743932975437)"}
{"level":"warn","ts":"2022-12-27T15:56:52.674Z","caller":"auth/store.go:1234","msg":"simple token is not cryptographically signed"}
{"level":"info","ts":"2022-12-27T15:56:52.680Z","caller":"mvcc/kvstore.go:393","msg":"kvstore restored","current-rev":1}
{"level":"info","ts":"2022-12-27T15:56:52.681Z","caller":"etcdserver/quota.go:94","msg":"enabled backend quota with default value","quota-name":"v3-applier","quota-size-bytes":2147483648,"quota-size":"2.1 GB"}
{"level":"info","ts":"2022-12-27T15:56:52.686Z","caller":"etcdserver/server.go:854","msg":"starting etcd server","local-member-id":"8e9e05c52164694d","local-server-version":"3.5.6","cluster-version":"to_be_decided"}
{"level":"info","ts":"2022-12-27T15:56:52.688Z","caller":"etcdserver/server.go:738","msg":"started as single-node; fast-forwarding election ticks","local-member-id":"8e9e05c52164694d","forward-ticks":9,"forward-duration":"900ms","election-ticks":10,"election-timeout":"1s"}
{"level":"info","ts":"2022-12-27T15:56:52.688Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"default.etcd/member/snap","suffix":"snap.db","max":5,"interval":"30s"}
{"level":"info","ts":"2022-12-27T15:56:52.688Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"default.etcd/member/snap","suffix":"snap","max":5,"interval":"30s"}
{"level":"info","ts":"2022-12-27T15:56:52.688Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"default.etcd/member/wal","suffix":"wal","max":5,"interval":"30s"}
{"level":"info","ts":"2022-12-27T15:56:52.694Z","caller":"embed/etcd.go:275","msg":"now serving peer/client/metrics","local-member-id":"8e9e05c52164694d","initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"],"listen-client-urls":["http://localhost:2379"],"listen-metrics-urls":[]}
{"level":"info","ts":"2022-12-27T15:56:52.694Z","caller":"embed/etcd.go:586","msg":"serving peer traffic","address":"127.0.0.1:2380"}
{"level":"info","ts":"2022-12-27T15:56:52.696Z","caller":"embed/etcd.go:558","msg":"cmux::serve","address":"127.0.0.1:2380"}
```

## Users and Directories

By default this image runs as a non-root user named `etcd` with a uid of 65532.
The default data directory for this image is `/var/lib/etcd`, and that directory is write-able by the `etcd` user.

If you change the user, UID, or data directory, you'll need to ensure the user running the etcd process has permissions to that
directory.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2-iamguarded

# pgpool2-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

open-source middleware that operates between PostgreSQL servers and clients, providing features such as connection pooling, load balancing, and replication to enhance database performance and availability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Pgpool-II IAMGuarded is a security-enhanced variant of Pgpool-II, an open-source middleware that operates between PostgreSQL servers and clients, providing features such as connection pooling, load balancing, and replication to enhance database performance and availability. This image is meant to be used as part of PostgreSQL HA Helm chart.

## Helm Chart Installation

The PostgreSQL HA Helm Chart provides solution using the PostgreSQL replication manager and includes Pgpool-II:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# PostgreSQL with replication manager image
postgresql:
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-repmgr-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Pgpool-II image
pgpool:
  image:
    registry: myregistry.example.com
    repository: mirrored/pgpool2-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql-ha:16.0.3
   Digest: sha256:b8ec9be981d894c6fdbe37b9b43a5293feb22b30c97b8b9c58c7af96facb0397
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL HA IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### polaris-fips

# polaris-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/polaris-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/polaris-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

FIPS-compliant version of Polaris. Polaris is an open source policy engine for Kubernetes that validates and remediates resource configuration.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Polaris FIPS image is meant to serve as a drop-in replacement for [the official Polaris image from Quay.io](https://quay.io/repository/fairwinds/polaris). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user. This variant is FIPS-compliant for environments requiring FIPS 140-2 compliance.

## Getting started

For those with access, this container image is available on `cgr.dev`:

Run the `polaris-fips` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/polaris-fips:latest polaris audit
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [Polaris Documentation](https://polaris.docs.fairwinds.com/)
* [Polaris GitHub Repository](https://github.com/FairwindsOps/polaris)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s_gateway-fips

# k8s_gateway-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s_gateway-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s_gateway-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A CoreDNS plugin to resolve all types of external Kubernetes resources

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `k8s_gateway` container is a lean, Wolfi-based container image. It is functionally equivalent to the [upstream k8s_gateway image](https://github.com/k8s-gateway/k8s_gateway/pkgs/container/k8s_gateway/461346086?tag=latest) while maintaining minimal dependencies and enhanced security.

### FIPS Support
The `k8s_gateway-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

You can deploy `k8s_gateway` using a Helm chart that installs the necessary Kubernetes resources:

First, add the k8s_gateway Helm repository:

```shell
helm repo add k8s_gateway https://k8s-gateway.github.io/k8s_gateway/
```

Next, create a `values.yaml` file so you can install Chainguard's `k8s_gateway` container image:

```shell
cat > values.yaml << EOF
image:
  registry: cgr.dev
  repository: ORGANIZATION/k8s_gateway-fips
  tag: latest
EOF
```

Then install the k8s_gateway using the `values.yaml` file:

```shell
helm install exdns k8s_gateway/k8s-gateway \
    --namespace default \
    -f values.yaml
```

## Documentation and Resources

* [k8s_gateway GitHub Project](https://github.com/k8s-gateway/k8s_gateway/)
* [k8s_gateway Documentation](https://coredns.io/explugins/k8s_gateway/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vt

# vt
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vt` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vt/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the Virus Total CLI - `vt-cli`.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image contains the `vt-cli` tool.
Note that you will need an api key for most operations.
This can be configured with `vt init`, with the `--apikey` flag, or with the `VTCLI_APIKEY` environment variable.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nova

# nova
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nova` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nova/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Nova is a cli tool to find outdated or deprecated Helm charts running in your Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Nova image is meant to serve as a drop-in replacement for [the official Nova image from Quay.io](https://quay.io/repository/fairwinds/nova). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting started
For those with access, this container image is available on `cgr.dev`:

Run the `nova` container with the following command:

```bash
docker run --rm cgr.dev/ORGANIZATION/nova:latest nova find
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### Documentation and Resources

* [Nova Documentation](https://nova.docs.fairwinds.com/)
* [Nova GitHub Repository](https://github.com/FairwindsOps/nova)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-node-exporter-iamguarded-fips

# prometheus-node-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-node-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-node-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Prometheus exporter for hardware and OS metrics exposed by LINUX kernels

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Prometheus Node Exporter IAMGuarded is a security-enhanced variant of Node Exporter designed to be deployed using its companion Node Exporter IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Node Exporter deployments.

## Helm Chart Installation

The Node Exporter IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install node-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Node Exporter image
image:
  registry: myregistry.example.com
  repository: mirrored/prometheus-node-exporter-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install node-exporter oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/node-exporter
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/node-exporter:4.5.11
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Node Exporter IAMGuarded installation using standard Node Exporter verification methods. The deployment functions as a standard Node Exporter instance, so all typical Node Exporter validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Kube-Prometheus Helm Chart Usage

This image is also compatible with the Kube-Prometheus IAMGuarded Helm chart, which provides a complete Prometheus monitoring stack including Prometheus server, Alertmanager, Prometheus Operator, Node Exporter, Kube State Metrics, and Blackbox Exporter.

### Installation

```bash
helm install kube-prometheus oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kube-prometheus \
  --set "global.org=$ORGANIZATION"
```

### Node Exporter Configuration

When using the Kube-Prometheus chart, you can override the Node Exporter image under the `node-exporter` section in your `values.yaml`:

```yaml
"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest for production
```

### Image Override in Complete Kube-Prometheus Configuration

```yaml
global:
  org: $ORGANIZATION

prometheus:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-iamguarded-fips
    digest: sha256:...

alertmanager:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-alertmanager-iamguarded-fips
    digest: sha256:...

operator:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-operator-iamguarded-fips
    digest: sha256:...

"node-exporter":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-node-exporter-iamguarded-fips
    digest: sha256:...

"kube-state-metrics":
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/kube-state-metrics-iamguarded-fips
    digest: sha256:...

blackboxExporter:
  image:
    registry: cgr.dev
    repository: $ORGANIZATION/prometheus-blackbox-exporter-iamguarded-fips
    digest: sha256:...
```

### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8s-metadata-injection

# k8s-metadata-injection
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8s-metadata-injection` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8s-metadata-injection/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes metadata injection for New Relic APM to make a linkage between APM and Infrastructure data.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is a Helm chart available to deploy this image in a Kubernetes cluster. The Helm chart is available in their official repository at [charts/nri-metadata-injection](https://github.com/newrelic/k8s-metadata-injection/tree/main/charts/nri-metadata-injection).

```bash
helm repo add nri-metadata-injection https://newrelic.github.io/k8s-metadata-injection
helm upgrade --install nri-metadata-injection/nri-metadata-injection \
  --set global.cluster=YOUR_CLUSTER_NAME \
  --set image.registry=cgr.dev \
  --set image.repository=ORGANIZATION/k8s-metadata-injection \
  --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### localstack

# localstack
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/localstack` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/localstack/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [LocalStack image on Docker Hub](https://hub.docker.com/r/localstack/localstack). Switching to Chainguard's image should not require any changes to your existing setup.

## Getting Started

### Docker
To get started with Chainguard's LocalStack image, you can run the image using Docker:
```bash
docker run --rm -d -p 4566:4566 -p 4510-4559:4510-4559 -v /var/run/docker.sock:/var/run/docker.sock cgr.dev/ORGANIZATION/localstack
```

> [!NOTE]
> Mounting the host's Docker socket is required for services like Lambda.

### Helm
To install Chainguard's LocalStack image on your Kubernetes cluster, you can use the [LocalStack Helm chart](https://github.com/localstack/helm-charts).

You can override the image by setting the `image.repository` and `image.tag` values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/localstack
  tag: latest
```

You can then run the following command to install LocalStack on your cluster:

```shell
helm repo add localstack-repo https://helm.localstack.cloud
helm install localstack localstack-repo/localstack -f values.yaml
```
## Documentation and Resources
Please refer to the upstream documentation for a [quickstart](https://docs.localstack.cloud/getting-started/quickstart/) as well as an [overview of LocalStack Docker images and their purpose](https://docs.localstack.cloud/references/docker-images/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-sentinel-iamguarded

# valkey-sentinel-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-sentinel-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-sentinel-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey is an open source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Valkey Sentinel IAMGuarded is a security-enhanced variant of Valkey designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Valkey Sentinel deployments.

## Helm Chart Installation

The Valkey IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/valkey-iamguarded
  digest: sha256:... # Use specific digest instead of tag

sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/valkey-sentinel-iamguarded
    digest: sha256:... # Use specific digest instead of tag

volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/valkey:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Valkey IAMGuarded installation using standard Valkey verification methods. The deployment functions as a standard Valkey instance, so all typical Valkey validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Valkey IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Valkey and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### azuredisk-csi

# azuredisk-csi
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/azuredisk-csi` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/azuredisk-csi/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Azure Disk CSI driver enables the provisioning and management of Azure Disks through Kubernetes

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Example Usage with Chainguard Image

This guide outlines steps to test volume provisioning with the Azure Disk CSI driver. The Azure Disk CSI driver enables the provisioning and management of Azure Disks through Kubernetes.

### Prerequisites

To test the Azure Disk CSI driver, you need:

- Azure CLI
- Access to an Azure account
- An AKS cluster
- Proper IAM roles and policies configured for Azure Disk CSI driver, with permissions to create and attach disks to the AKS nodes.

### Install the Azure Disk CSI Driver

The Azure Disk CSI driver can be installed via Helm. Ensure you have the Helm repo added:

```shell
helm repo add azuredisk-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/charts
helm repo update
```

Then, install the driver with the following command, ensuring appropriate values are set in the configuration file:

```shell
helm install azuredisk-csi-driver azuredisk-csi-driver/azuredisk-csi-driver \
--namespace kube-system \
--set image.azuredisk.repository=cgr.dev/chainguard/azuredisk-csi \
--set image.azuredisk.tag=latest \
--set image.azuredisk.pullPolicy=IfNotPresent \
--set serviceAccount.node=new-csi-azuredisk-node-sa \
--set serviceAccount.create=true \
--set rbac.name=new-csi-azuredisk \
--set controller.hostNetwork=false \
--set controller.replicas=1 \
--set linux.hostNetwork=false \
--set linux.dsName=new-csi-azuredisk-node \
--set windows.dsName=new-csi-azuredisk-node-win
```

If you face any issues with the above helm install, you might have to annotate the below

Annotate and label the CSI driver for Helm management:

```shell
kubectl annotate csidriver disk.csi.azure.com \
  meta.helm.sh/release-name=azuredisk-csi-driver \
  meta.helm.sh/release-namespace=kube-system

kubectl label csidriver disk.csi.azure.com \
  app.kubernetes.io/managed-by=Helm
```

Check that the CSI driver controller and node pods are running:

```shell
kubectl get pods -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver"
```

### Step 1: Create a StorageClass for Azure Disk

Create a StorageClass to provision disks using the Azure Disk CSI driver. This StorageClass should specify `disk.csi.azure.com` as the provisioner.

```yml
kubectl apply -f -<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azure-disk
provisioner: disk.csi.azure.com
volumeBindingMode: WaitForFirstConsumer
EOF
```

### Step 2: Create a PersistentVolumeClaim (PVC)

Request a PersistentVolumeClaim using the Azure Disk StorageClass created in Step 1.

```yml
kubectl apply -f -<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-disk-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: azure-disk
  resources:
    requests:
      storage: 5Gi
EOF
```

### Step 3: Create a Pod to Use the PVC

Create a Pod that uses the PVC to test the volume's functionality. This Pod will write a test file to the mounted volume.

```yml
kubectl apply -f -<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: azure-disk-test-pod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "echo 'Hello from Azure Disk!' > /mnt/azure/hello.txt && sleep 3600"]
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: azure
  volumes:
  - name: azure
    persistentVolumeClaim:
      claimName: azure-disk-pvc
EOF
```

Verify that the Pod is created and enters the Running state:

```shell
kubectl get pod azure-disk-test-pod
```

Verify the PVC has been created and is bound to a PersistentVolume (PV):

```shell
kubectl get pvc azure-disk-pvc
```

Example output:

```
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
azure-disk-pvc   Bound    pvc-1234abcd-56ef-78gh-ijkl-mnopqrstuvwx   5Gi        RWO            azure-disk     10s
```

### Step 4: Verify Data Written to the Disk

Check that the data written by the Pod to the Azure Disk is successfully stored.

```shell
kubectl exec azure-disk-test-pod -- cat /mnt/azure/hello.txt
```

Expected output:

```
Hello from Azure Disk!
```

### Step 5: Check Logs of the Azure Disk CSI Driver

Check the logs of the Azure Disk CSI driver's controller and node pods to ensure that there are no errors during the volume provision and attachment process.

#### Controller Logs

```shell
kubectl logs -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver" -c csi-provisioner
```

#### Node Logs

```shell
kubectl logs -n kube-system -l "app.kubernetes.io/name=azuredisk-csi-driver" -c azuredisk
```

### Step 6: Clean Up

Once testing is complete, clean up the resources created:

```shell
kubectl delete pod azure-disk-test-pod
kubectl delete pvc azure-disk-pvc
kubectl delete storageclass azure-disk
```

If you installed the Azure Disk CSI driver with Helm and want to remove it:

```shell
helm uninstall azuredisk-csi-driver -n kube-system
```

---

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-logging-operator-node-exporter-fips

# kube-logging-operator-node-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-logging-operator-node-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-logging-operator-node-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Custom runner based Prometheus node exporter for kube-logging logging-operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS Support
The `kube-logging-operator-node-exporter-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

### Compatibility

This image is compatible with the `ghcr.io/kube-logging/logging-operator/node-exporter` image and can be used as a drop-in replacement in existing logging-operator deployments.

## Usage

This image contains a custom runner-based Prometheus node exporter that is specifically designed for use with the [kube-logging logging-operator](https://github.com/kube-logging/logging-operator). The logging-operator is a Kubernetes operator that simplifies log collection, processing, and forwarding in Kubernetes clusters using Fluent Bit, Fluentd, and other logging components.

### Integration with Logging Operator

The kube-logging-operator-node-exporter-fips is typically deployed as part of the logging-operator's monitoring stack to provide node-level metrics for logging infrastructure monitoring. It extends the standard Prometheus node exporter functionality with custom metrics and configurations tailored for logging workloads.

### Deployment

This image is designed to be deployed as a DaemonSet in Kubernetes clusters where the logging-operator is running. It should be used in conjunction with:

- The kube-logging logging-operator
- Prometheus for metrics collection
- Grafana or similar tools for metrics visualization

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### fluentd-kubernetes-daemonset-fips

# fluentd-kubernetes-daemonset-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/fluentd-kubernetes-daemonset-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/fluentd-kubernetes-daemonset-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wolfi-based images that provide Fluentd DaemonSets for Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Currently, Chainguard only provides an image for the Kinesis DaemonSet. Images for other DaemonSets are not currently provided, but may be requested.

The Chainguard Fluentd Kubernetes DaemonSet Images are comparable to the [official Fluentd Kubernetes DaemonSet Images from Docker Hub](https://hub.docker.com/r/fluent/fluentd-kubernetes-daemonset). However, the Chainguard images contain only the minimum set of tools and dependencies needed to function; for example, they do not include a package manager. Unlike many other Chainguard images, though, these images include a shell.

## Getting Started

### Kinesis DaemonSet

Create a new Kinesis stream in the AWS Management Console or using the AWS CLI by following the [AWS documentation](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html).

#### Deployment

```shell
cat > values.yaml <<EOF
variant: kinesis

image:
  repository: "cgr.dev/ORGANIZATION/fluentd-kubernetes-daemonset-fips"
  pullPolicy: "Always"
  tag: "latest"

env:
  - name: K8S_NODE_NAME
    valueFrom:
      fieldRef:
        fieldPath: spec.nodeName
  - name: AWS_REGION
    value: "<AWS_REGION>"
  - name: AWS_ACCESS_KEY_ID
    value: "<AWS_ACCESS_KEY_ID>"
  - name: AWS_SECRET_ACCESS_KEY
    value: "<AWS_SECRET_ACCESS_KEY>"
  - name: AWS_PROFILE
    value: "<AWS_PROFILE>"
  - name: AWS_SESSION_TOKEN
    value: "<AWS_SESSION>"

fileConfigs:
  00_system.conf: |
    <system>
      log_level debug
    </system>
  04_outputs.conf: |
    <label @OUTPUT>
      <match **>
        @type kinesis_streams
        @id out_kinesis_streams
        endpoint https://<ENDPOINT>
        region <REGION>
        stream_name <STREAM_NAME>
    </label>
EOF
```

> [!NOTE]
> Replace the placeholder values with your AWS credentials and the Kinesis stream details, including the [endpoint](https://docs.aws.amazon.com/general/latest/gr/ak.html), region, and stream name.

Deploy the [Fluentd Helm Chart](https://github.com/fluent/helm-charts/tree/main/charts/fluentd) with the provided `values.yaml` file:

```shell
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm install fluentd fluent/fluentd -f values.yaml
```

After a while, you should be see the `[DEBUG]` log in the `fluentd` Pods, indicating that the logs are being sent to the Kinesis stream:

```shell
$ kubectl logs daemonsets/fluentd

...
[debug]: #0 [out_kinesis_streams] fluentd-kubernetes-daemonset-test: Write chunk 62a9515075decf841a1cb6f2a29d21ef /  67 records /   40 KB
[debug]: #0 [out_kinesis_streams] fluentd-kubernetes-daemonset-test: Finish writing chunk
...
```

Finally, check the Kinesis records using the AWS Management Console or the AWS CLI:

```shell
aws --endpoint-url=https://<ENDPOINT> kinesis get-records \
  --shard-iterator "$(
    aws --endpoint-url=https://<ENDPOINT> \
      kinesis get-shard-iterator \
      --shard-iterator-type TRIM_HORIZON \
      --shard-id shardId-000000000000 \
      --stream-name <STREAM_NAME> \
      --query 'ShardIterator' \
      --output text
  )"
```

## Documentation and Resources
Refer to the official documentation on the Fluentd DaemonSets for Kubernetes for further guidance on setup and configuration.

- [Fluentd + Kubernetes documentation](https://docs.fluentd.org/container-deployment/kubernetes)
- [Fluentd Stream Processing with Kinesis](https://docs.fluentd.org/how-to-guides/kinesis-stream)

## Image Tagging

This image supports multiple Ruby versions and produces image tags in the following format:

```shell
cgr.dev/ORGANIZATION/fluentd-kubernetes-daemonset:<fluentd-version>-<component>-rb<ruby-version>
```

At present, this image only supports `kinesis` component with Ruby starting from version 3.1.x to 3.4.x.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### task-fips

# task-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/task-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/task-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Task is a task runner and build tool that aims to be simpler and easier to use than GNU Make.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
There is no official upstream container image for Task. This is a Chainguard image containing the Task binary with the entrypoint set to `/usr/bin/task`. This is the FIPS-enabled variant built with FIPS-compliant cryptographic libraries.

## Getting Started
Task is a task runner and build tool that uses YAML to define tasks and their dependencies.

Create a `Taskfile.yml`:

```yaml
version: '3'

tasks:
  hello:
    cmds:
      - echo "Hello, World!"

  greet:
    cmds:
      - echo "Welcome to Task!"

  build:
    deps: [hello]
    cmds:
      - echo "Building project..."
      - echo "Build complete!"
```

Run a task:
```bash
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task-fips hello
```

List available tasks:
```bash
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task-fips --list
```

## Volume Mounts

This image is configured with `/work` as the default working directory. The `/work` directory is pre-created with appropriate permissions (owned by the `nonroot` user, uid/gid 65532).

Mount your project directory containing the `Taskfile.yml` to `/work`:

```bash
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/work" cgr.dev/ORGANIZATION/task-fips <task-name>
```

## Documentation and Resources
- [Task Documentation](https://taskfile.dev/)
- [Task GitHub Repository](https://github.com/go-task/task)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-webhook-pdns-fips

# cert-manager-webhook-pdns-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-webhook-pdns-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-webhook-pdns-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### go-openssl

# go-openssl
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/go-openssl` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/go-openssl/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Golang toolchain with golang-fips/go patchset.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

This image can be used to produce GO binaries which use OpenSSL for cryptography.

For usage instructions, please see [upstream documentation](https://github.com/golang-fips/go/blob/main/README.md).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-logcli

# grafana-logcli
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-logcli` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-logcli/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with `logcli` binary for querying and tailing logs from Grafana Loki.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `grafana-logcli` container image is comparable to the [grafana/logcli](https://hub.docker.com/r/grafana/logcli) image.

This image is aligned with the [Loki version streams](https://grafana.com/docs/loki/latest/), ensuring compatibility with corresponding Loki server versions.

## Setting Up Loki

Choose either Docker or Kubernetes deployment based on your environment:

### Docker Deployment

For local testing or development, you can run Loki using Docker:

**Step 1: Create a Loki configuration file**

```yaml
cat <<EOF > loki-config.yaml
auth_enabled: false

limits_config:
  allow_structured_metadata: true
  volume_enabled: true

server:
  http_listen_port: 3100

common:
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory
  replication_factor: 1
  path_prefix: /tmp/loki

schema_config:
  configs:
  - from: 2020-05-15
    store: tsdb
    object_store: filesystem
    schema: v13
    index:
      prefix: index_
      period: 24h

storage_config:
  tsdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/index_cache
  filesystem:
    directory: /tmp/loki/chunks

pattern_ingester:
  enabled: true

ingester:
  max_chunk_age: 5m
EOF
```

**Step 2: Run Loki container**

```bash
docker run -d \
  --name loki \
  -p 3100:3100 \
  -v $(pwd)/loki-config.yaml:/etc/loki/loki-config.yaml \
  cgr.dev/ORGANIZATION/loki:latest \
  -config.file=/etc/loki/local-config.yaml
```

**Step 3: Verify Loki is running**

```bash
curl http://localhost:3100/ready
```

You should receive a `ready` response.

**Step 4: Push test logs to Loki**

Send some test logs to verify Loki can receive and store data:

```bash
LOKI_URL="http://localhost:3100"
TIMESTAMP=$(printf '%s000000000' $(date +%s))
TEST_LOG="Test log from Docker deployment"

curl -X POST "${LOKI_URL}/loki/api/v1/push" \
  -H "Content-Type: application/json" \
  -H "X-Scope-OrgID: test" \
  -d "{
    \"streams\": [{
      \"stream\": {
        \"job\": \"test\",
        \"env\": \"docker-test\",
        \"test_id\": \"chainguard-test\"
      },
      \"values\": [[\"${TIMESTAMP}\", \"${TEST_LOG}\"]]
    }]
  }"
```

#### Kubernetes Deployment

For Kubernetes deployments, use the official Loki Helm chart:

**Step 1: Add the Grafana Helm repository**

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
```

**Step 2: Create a values file**

```yaml
cat <<EOF > loki-values.yaml
deploymentMode: SingleBinary

loki:
  image:
    registry: cgr.dev/ORGANIZATION
    repository: loki
    tag: latest

  auth_enabled: false
  commonConfig:
    ring:
      instance_addr: 127.0.0.1
      kvstore:
        store: inmemory
    replication_factor: 1
    path_prefix: "/tmp/loki"
  storage:
    type: filesystem
    bucketNames:
      chunks: loki-chunks
      ruler: loki-ruler
      admin: loki-admin
  schemaConfig:
    configs:
    - from: '2024-01-01'
      store: tsdb
      index:
        prefix: loki_index_
        period: 24h
      object_store: filesystem
      schema: v13
  storage_config:
    filesystem:
      directory: "/tmp/loki/chunks"

singleBinary:
  replicas: 1

read:
  replicas: 0

backend:
  replicas: 0

write:
  replicas: 0

chunksCache:
  enabled: false

resultsCache:
  enabled: false
EOF
```

**Step 3: Install Loki**

Using default configuration:
```bash
helm install loki grafana/loki --namespace default -f loki-values.yaml
```

**Step 4: Verify the deployment**

```bash
kubectl wait --for=condition=ready pod --selector=app.kubernetes.io/component=single-binary -n default --timeout=60s
```

**Step 5: Push test logs to Loki**

Send some test logs to verify Loki can receive and store data:

```bash
# Port-forward to access Loki from your local machine
kubectl port-forward svc/loki 3100:3100 &

# Push test logs
LOKI_URL="http://localhost:3100"
TIMESTAMP=$(printf '%s000000000' $(date +%s))
TEST_LOG="Test log from k8s deployment"

curl -X POST "${LOKI_URL}/loki/api/v1/push" \
  -H "Content-Type: application/json" \
  -H "X-Scope-OrgID: test" \
  -d "{
    \"streams\": [{
      \"stream\": {
        \"job\": \"test\",
        \"env\": \"k8s-test\",
        \"test_id\": \"chainguard-test\"
      },
      \"values\": [[\"${TIMESTAMP}\", \"${TEST_LOG}\"]]
    }]
  }"
```

## Usage

Once you have Loki running, you can use LogCLI to query logs.

### Basic Docker Usage

You can use LogCLI directly with Docker by passing the Loki server address via environment variables:

**List available labels**
```bash
docker run --rm \
  -e LOKI_ADDR=http://host.docker.internal:3100 \
  cgr.dev/ORGANIZATION/grafana-logcli:latest \
  labels
```

**Querying a local Loki instance**
```bash
docker run --rm \
  -e LOKI_ADDR=http://host.docker.internal:3100 \
  cgr.dev/ORGANIZATION/grafana-logcli:latest \
  query '{job="test"}'
```

### Kubernetes Usage

**List available labels**
```bash
kubectl run logcli-labels \
  --image=cgr.dev/ORGANIZATION/grafana-logcli:latest \
  --restart=Never \
  --rm -it \
  --env="LOKI_ADDR=http://loki.default.svc.cluster.local:3100" \
  -- labels
```

**Querying a local Loki instance**
```bash
kubectl run logcli-query \
  --image=cgr.dev/ORGANIZATION/grafana-logcli:latest \
  --restart=Never \
  --rm -it \
  --env="LOKI_ADDR=http://loki.default.svc.cluster.local:3100" \
  -- query '{job="test"}'
```

## Documentation and Resources

- [LogCLI Documentation](https://grafana.com/docs/loki/latest/query/logcli/)
- [LogCLI Getting Started Guide](https://grafana.com/docs/loki/latest/query/logcli/getting-started/)
- [Loki Installation Guide](https://grafana.com/docs/loki/latest/setup/install/helm/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kuma

# kuma
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kuma` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kuma/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The universal Envoy service mesh for distributed service connectivity

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy Kuma

To deploy Kuma with Chainguard's images, add the Helm repo:

```bash
helm repo add kuma https://kumahq.github.io/charts
```

Update Helm chart info from your repositories:

```bash
helm repo update
```

Create a namespace for Kuma:

```bash
kubectl create ns kuma-system
```

Finally, install the chart:

```bash
helm install kuma kuma/kuma \
  --namespace kuma-system \
  --set global.image.registry=cgr.dev/chainguard-private \
  --set global.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-nats-exporter

# prometheus-nats-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-nats-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-nats-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus NATS Exporter image for exporting NATS metrics to Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `REPO_NAME` container image is comparable to the [natsio/prometheus-nats-exporter](https://hub.docker.com/r/natsio/prometheus-nats-exporter) image on Docker Hub, with the following differences:

* Like all other Chainguard Containers, `REPO_NAME` features a stripped-down, minimal design
* It has few-to-zero CVEs
* It does not run as the root user (runs as UID 65532)
* It does not include a shell or package manager in the production image (use the `-dev` variant for debugging)

### Supported NATS Versions

The exporter is compatible with NATS Server 2.x and works with:
* NATS Server monitoring endpoints (`/varz`, `/connz`, `/routez`, `/subsz`)
* NATS Streaming Server monitoring endpoints
* JetStream metrics (NATS Server 2.2+)

### Prometheus Integration

The exporter exposes metrics on port 7777 (default) and is compatible with:
* Prometheus 2.x and later
* Standard Prometheus scrape configurations
* Kubernetes ServiceMonitor resources (for Prometheus Operator)

## Getting Started

The `REPO_NAME` can be run as a standalone container or deployed to Kubernetes. It connects to a NATS server's monitoring endpoint and exposes Prometheus metrics on port 7777.

### Running with Docker

To run the exporter with a local NATS server:

```bash
docker run -d \
  --name nats-exporter \
  -p 7777:7777 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest \
  -varz http://nats-server:8222
```

Once running, you can verify the exporter is working by checking the metrics endpoint:

```bash
curl http://localhost:7777/metrics
```
```
# HELP gnatsd_varz_connections Current number of client connections
# TYPE gnatsd_varz_connections gauge
gnatsd_varz_connections 0
# HELP gnatsd_varz_in_msgs Number of messages received
# TYPE gnatsd_varz_in_msgs counter
gnatsd_varz_in_msgs 0
...
```

### Deploying to Kubernetes with Helm

The recommended way to deploy `REPO_NAME` to Kubernetes is using the official Helm chart. First, create a values file:

```bash
cat > nats-exporter-values.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

natsUrl: http://nats:8222

serviceMonitor:
  enabled: true
  interval: 30s
EOF
```

Then install the chart:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install nats-exporter prometheus-community/prometheus-nats-exporter \
  -f nats-exporter-values.yaml
```

Verify the deployment:

```bash
kubectl get pods -l app.kubernetes.io/name=prometheus-nats-exporter
```
```
NAME                                     READY   STATUS    RESTARTS   AGE
nats-exporter-prometheus-nats-exporter   1/1     Running   0          30s
```

### Monitoring Multiple NATS Endpoints

The exporter can monitor multiple NATS server endpoints simultaneously. Create a values file with multiple endpoints:

```bash
cat > nats-exporter-multi.yaml <<EOF
image:
  repository: cgr.dev/ORGANIZATION/REPO_NAME
  tag: latest

config:
  varz: http://nats-1:8222,http://nats-2:8222,http://nats-3:8222
  connz: true
  routez: true
  subz: true
EOF
```

## Configuration

The `REPO_NAME` supports various configuration options to customize metric collection:

### Command-Line Flags

The most commonly used flags are:

- `-varz <url>` - Monitor NATS server variables endpoint (comma-separated list for multiple servers)
- `-channelz <url>` - Monitor NATS Streaming channel metrics
- `-connz <url>` - Monitor connection metrics
- `-routez <url>` - Monitor route metrics
- `-subz <url>` - Monitor subscription metrics
- `-http_port <port>` - HTTP server port for metrics (default: 7777)

### Environment Variables

Configuration can also be provided via environment variables when running in containers:

```bash
docker run -d \
  -p 7777:7777 \
  -e VARZ_URL=http://nats-server:8222 \
  -e CONNZ_URL=http://nats-server:8222 \
  cgr.dev/ORGANIZATION/REPO_NAME:latest
```

### Prometheus Scrape Configuration

To configure Prometheus to scrape the exporter, add the following to your `prometheus.yml`:

```yaml
scrape_configs:
  - job_name: 'nats'
    static_configs:
      - targets: ['nats-exporter:7777']
```

When using the Prometheus Operator with the Helm chart, enable the ServiceMonitor in your values file:

```yaml
serviceMonitor:
  enabled: true
  interval: 30s
  scrapeTimeout: 10s
  labels:
    release: prometheus
```

This configuration instructs Prometheus to scrape NATS metrics every 30 seconds with a 10-second timeout.

## Documentation and Resources

For more information about working with the `REPO_NAME` image:

- [prometheus-nats-exporter GitHub Repository](https://github.com/nats-io/prometheus-nats-exporter) - Official documentation and source code
- [NATS Server Monitoring Documentation](https://docs.nats.io/running-a-nats-service/nats_admin/monitoring) - Details on NATS monitoring endpoints
- [Prometheus Documentation](https://prometheus.io/docs/introduction/overview/) - General Prometheus concepts and configuration
- [Chainguard Academy](https://edu.chainguard.dev/) - Learn more about working with Chainguard Images

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-3806

# request-3806
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-3806` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-3806/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-web

# kubernetes-dashboard-web
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-web` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-web/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Module containing web application written in Angular and Go server with some web-related logic.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-web` component is responsible for the front-end user interface and contains both the Angular-based web application and a Go server that handles web-specific logic like settings management. This component serves as the main point of interaction, displaying data retrieved from the Kubernetes API via the API module.

## Usage
To deploy the `kubernetes-dashboard-web` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set web.image.repository = cgr.dev/chainguard/kubernetes-dashboard-web \
--set web.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components, refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### oauth2-proxy-iamguarded-fips

# oauth2-proxy-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/oauth2-proxy-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/oauth2-proxy-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/) is a reverse proxy that provides authentication with Google, Azure, OpenID Connect and many more identity providers.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `oauth2-proxy-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

OAuth2-Proxy IAMGuarded is a security-enhanced variant of Oauth2-Proxy designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Oauth2-Proxy deployments.

## Helm Chart Installation

The Oauth2-Proxy IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install oauth2-proxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Oauth2-Proxy image
image:
  registry: myregistry.example.com
  repository: mirrored/oauth2-proxy-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install oauth2-proxy oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/oauth2-proxy
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/oauth2-proxy:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Oauth2-Proxy IAMGuarded installation using standard Oauth2-Proxy verification methods. The deployment functions as a standard Oauth2-Proxy instance, so all typical Oauth2-Proxy validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Oauth2-Proxy IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Oauth2-Proxy and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k8ssandra-client

# k8ssandra-client
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k8ssandra-client` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k8ssandra-client/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A kubectl plugin to simplify usage of k8ssandra

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The k8ssandra-client is a kubectl plugin that simplifies the usage of k8ssandra clusters. It provides a set of commands to interact with the k8ssandra clusters.

You could run it as a Kubernetes pod with the following command to stop the dc1 Cassandra datacenter:

```bash
kubectl run -n k8ssandra-operator stop-pod --image=cgr.dev/chainguard-private/kubectl-k8ssandra --restart=Never -- stop dc1
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-alloy-operator

# grafana-alloy-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-alloy-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-alloy-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Alloy Operator is a Kubernetes Operator that manages the lifecycle of Grafana Alloy instances

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `grafana-alloy-operator` container image is designed to be a drop-in replacement for the upstream [grafana-alloy-operator image](https://ghcr.io/grafana/alloy-operator:latest).

**Note:** The 'Grafana Alloy Operator Helm chart' and 'Grafana Alloy Operator image' use different versioning schemes upstream. For example, the Helm chart may be versioned as `v0.3.10`, while that version of the chart uses a Grafana Operator image tagged as `v1.3.0`. The Chainguard image follows the versioning associated with the upstream Grafana Operator image.

For more information, see:
[https://github.com/grafana/alloy-operator/issues/82](https://github.com/grafana/alloy-operator/issues/82)

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  registry: cgr.dev
  repository: ORGANIZATION/grafana-alloy-operator
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install grafana-alloy-operator grafana/alloy-operator \
  --namespace alloy-system \
  --create-namespace -f values.yaml
```

### Deploy an Alloy Instance

After installing the operator, you can deploy an Alloy instance:

```yaml
apiVersion: collectors.grafana.com/v1alpha1
kind: Alloy
metadata:
  name: alloy-example
  namespace: default
spec:
  image:
    registry: cgr.dev
    repository: ORGANIZATION/grafana-alloy
    tag: latest
  alloy:
    configMap:
      content: |-
        prometheus.exporter.self "default" {}
```

## Documentation and Resources

- [Grafana Alloy Operator Documentation](https://github.com/grafana/alloy-operator#alloy-operator)
- [Grafana Alloy Documentation](https://grafana.com/docs/alloy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kibana

# kibana
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kibana` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kibana/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Your window into the Elastic Stack.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

For details on how to run Kibana, refer to the Elastic documentation on [Installing Kibana with Docker](https://www.elastic.co/guide/en/kibana/master/docker.html).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dns-node-cache

# kubernetes-dns-node-cache
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dns-node-cache` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dns-node-cache/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image that acts as a drop-in replacement for the [NodeLocal DNSCache](https://github.com/kubernetes/dns) image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is a drop-in replacement for the [kubernetes-dns-node-cache](https://github.com/kubernetes/dns) image commonly used in Kubernetes clusters for DNS caching at the node level. It is functionally equivalent to the upstream image, and switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
You can deploy this image using the [nodelocal dns cache Helm chart](https://github.com/deliveryhero/helm-charts/tree/master/stable/node-local-dns). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/kubernetes-dns-node-cache
  tag: "latest"
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the node-local-dns helm chart
```shell
helm repo add deliveryhero https://charts.deliveryhero.io/
helm repo update
helm install node-local-dns deliveryhero/node-local-dns -f values.yaml --wait
```

## Documentation and Resources:
- [Official NodeLocal DNSCache documentation](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)
- [NodeLocal DNSCache Github Repository](https://github.com/kubernetes/dns)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-load-balancer-controller

# aws-load-balancer-controller
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-load-balancer-controller` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-load-balancer-controller/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Image for Kubernetes controller for Elastic Load Balancers

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image is a drop-in replacement for the upstream image.
You can run it using the helm chart with:

```shell
$ helm repo add eks https://aws.github.io/eks-charts
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    --set image.repository=cgr.dev/chainguard/aws-load-balancer-controller \
    --set image.tag=latest
    <other configuration parameters here>
```

Note that the `aws-load-balancer-controller` does need cloud provider configuration to work correctly, so it won't run locally.
See the [configuration](https://github.com/aws/eks-charts/tree/master/stable/aws-load-balancer-controller) docs for more examples.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### helm-operator-fips

# helm-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/helm-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/helm-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

open source toolkit to manage Kubernetes native applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `helm-operator-fips` container image contains a Kubernetes operator built with operator-sdk v1.40.0 for managing Helm releases. This container image is based on the [operator-framework](https://github.com/operator-framework). This container imuage uses a helm-operator implementation based on the operator-sdk framework, not the legacy FluxCD Helm Operator.

### FIPS Support

This Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Create a `watches.yaml` file that defines which custom resources the operator should watch:

```yaml
cat > watches.yaml <<EOF
---
- group: example.com
  version: v1
  kind: MyApp
  chart: helm-charts/myapp
EOF
```

Create a deployment manifest:

```yaml
cat > helm-operator-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helm-operator-fips
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helm-operator-fips
  template:
    metadata:
      labels:
        app: helm-operator-fips
    spec:
      containers:
      - name: helm-operator
        image: cgr.dev/ORGANIZATION/helm-operator-fips:latest
        command:
        - /usr/bin/helm-operator
        args:
        - run
        - --watches-file=/opt/watches.yaml
        volumeMounts:
        - name: watches
          mountPath: /opt/watches.yaml
          subPath: watches.yaml
      volumes:
      - name: watches
        configMap:
          name: helm-operator-watches
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: helm-operator-watches
  namespace: default
data:
  watches.yaml: |
    ---
    - group: example.com
      version: v1
      kind: MyApp
      chart: helm-charts/myapp
EOF
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry. Additionally, for information on creating secrets and deploying on Kubernetes, you can review our guide on [Authenticating to the Chainguard Registry](https://edu.chainguard.dev/chainguard/chainguard-registry/authenticating/#authenticating-with-kubernetes).

Deploy the operator:

```shell
kubectl apply -f helm-operator-deployment.yaml
```

## Documentation and Resources

- [Operator SDK Documentation](https://sdk.operatorframework.io/)
- [Helm Documentation](https://helm.sh/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kube-logging-operator-fluentd

# kube-logging-operator-fluentd
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kube-logging-operator-fluentd` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kube-logging-operator-fluentd/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes Logging Operator Fluentd Image

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Use It!

This image comes with no preinstalled plugins. It does contain the `fluent-gem` command so any necessary plugins can
be installed, keeping the image as minimal as possible.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### akhq

# akhq
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/akhq` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/akhq/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kafka GUI for Apache Kafka to manage topics, topics data, consumers group, schema registry

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using akhq

AKHQ provides two upstream methods for installing: Helm or Docker.

The Chainguard Containers for AKHQ are designed to be a drop in replacement for either method. To use them, simply replace the appropriate `image:` path with the Chainguard specific AKHQ image. Below is an example values file for doing this with helm:

```yaml
image:
  repository: "cgr.dev/chainguard/akhq"
  tag: "latest"
```

Using the above values, the helm commands become, to install Argo Workflows:

```bash
helm repo add akhq https://akhq.io/

helm install akhq akhq/akhq \
	--namespace akhq \
	--create-namespace \
  --set image.repository="cgr.dev/chainguard/akhq"
  --set image.tag="latest"
```

Using Docker:

```bash
docker run -d \
    -p 8080:8080 \
    -v /tmp/application.yml:/usr/share/java/akhq/application.yml \
    cgr.dev/chainguard/akhq:latest
```

> NOTE: Setting the tag to "latest" is not recommended, and only shown for illustrative purposes.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chrony_exporter

# chrony_exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chrony_exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chrony_exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for Chrony Exporter - a Prometheus exporter for Chrony NTP metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is designed to provide a secure and minimal environment for running Chrony Exporter. The image is built on Wolfi, providing regular security updates and a minimal attack surface. Chainguard's chrony_exporter image maintains functional parity with the [upstream image](https://quay.io/repository/superq/chrony-exporter).

The exporter listens on port `9123` by default and exposes metrics at the `/metrics` endpoint.

## Getting Started

### Docker

To run the Chrony Exporter with Docker, connecting via Unix socket:

```shell
docker run -d \
  --name chrony_exporter \
  -p 9123:9123 \
  -v /var/run/chrony:/var/run/chrony:ro \
  cgr.dev/ORGANIZATION/chrony_exporter:latest \
  --chrony.address=unix:///var/run/chrony/chronyd.sock
```

Alternatively, connect via UDP (port 323):

```shell
docker run -d \
  --name chrony_exporter \
  -p 9123:9123 \
  cgr.dev/ORGANIZATION/chrony_exporter:latest \
  --chrony.address=host.docker.internal:323
```

To verify the exporter is running, check the metrics endpoint:

```shell
curl http://localhost:9123/metrics
```

### Kubernetes

The chrony_exporter is typically deployed as a sidecar container alongside Chrony in a DaemonSet to monitor NTP synchronization on each node. The exporter can connect to Chrony via Unix socket or UDP (port 323).

Example DaemonSet deployment with Chrony exporter as a sidecar using UDP connection:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: chrony-exporter
  labels:
    app: chrony-exporter
spec:
  selector:
    matchLabels:
      app: chrony-exporter
  template:
    metadata:
      labels:
        app: chrony-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9123"
        prometheus.io/path: "/metrics"
    spec:
      containers:
      - name: chrony
        image: cturra/ntp:latest
        securityContext:
          capabilities:
            add:
            - SYS_TIME
        env:
        - name: NTP_SERVERS
          value: "time.google.com"
        - name: ENABLE_SYSCLK
          value: "false"
      - name: chrony-exporter
        image: cgr.dev/ORGANIZATION/chrony_exporter:latest
        args:
        - "--chrony.address=127.0.0.1:323"
        ports:
        - containerPort: 9123
          name: metrics
          protocol: TCP
        resources:
          requests:
            cpu: 10m
            memory: 16Mi
          limits:
            cpu: 100m
            memory: 64Mi
---
apiVersion: v1
kind: Service
metadata:
  name: chrony-exporter
  labels:
    app: chrony-exporter
spec:
  selector:
    app: chrony-exporter
  ports:
  - port: 9123
    targetPort: 9123
    name: metrics
```

The exporter connects to Chrony via UDP on port 323 using localhost (both containers share the same network namespace in a pod).

### Command Line Options

Common command line options:

- `--chrony.address`: Address of the Chrony daemon. Supports Unix socket (`unix:///var/run/chrony/chronyd.sock`) or UDP (`localhost:323`)
- `--collector.sources`: Enable sources collector
- `--web.listen-address`: Address to listen on for web interface and telemetry (default: `:9123`)
- `--web.telemetry-path`: Path under which to expose metrics (default: `/metrics`)

## Documentation and Resources

- [Chrony Exporter GitHub](https://github.com/SuperQ/chrony_exporter)
- [Chrony NTP Documentation](https://chrony-project.org/documentation.html)
- [Prometheus Documentation](https://prometheus.io/docs/introduction/overview/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rancher-shell-fips

# rancher-shell-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rancher-shell-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rancher-shell-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS compliant kubectl and helm installer image for Rancher

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is comparable to the [rancher/shell](https://hub.docker.com/r/rancher/shell) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
### Docker
You can run the following command to use Chainguard's Rancher image:
```shell
docker run --rm  -it \
  cgr.dev/ORGANIZATION/rancher-shell:latest
```

### Kubernetes
For complete instructions on installing this image with Helm, please refer to the [Helm Chart documentation](https://ranchermanager.docs.rancher.com/getting-started/installation-and-upgrade/install-upgrade-on-a-kubernetes-cluster). As a prerequisite, you may need to install `cert-manager` in your cluster.

The following is an example of how to use the Helm chart, using the Chainguard image.

Start by adding a `values.yaml` file to configure the Helm chart:
```yaml
cat <<EOF > values.yaml
image:
  rancherImage: cgr.dev/ORGANIZATION/rancher
  rancherImageTag: latest
  rancherImagePullPolicy: Always
postDelete:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/rancher-shell
    tag: latest
hostname: rancher.my.org
bootstrapPassword: admin
replicas: 1
debug: true
EOF
```

Add the Helm repository:
```shell
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
```

Then Install the chart:
```shell
helm install rancher rancher \
  --namespace cattle-system \
  --create-namespace \
  --values values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-5592

# zulu-jre
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zulu-jre` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zulu-jre/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest-cpu
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Azul Zulu Builds of OpenJDK (Zulu) are open source, TCK-tested and certified builds of OpenJDK. Zulu is available for a wide range of hardware platforms and operating systems. These builds are a drop-in replacement for any other OpenJDK distribution.

Zulu is a component of Azul Platform Core, that is designed for enterprise, distribution (ISV), and embedded (OEM) use cases, and provides tight security and the cost efficiencies you need to run today’s business–critical, Java-based services.

This section shows how to use Azul Zulu with Chainguard containers, regularly-updated, secure-by-default container images.

Chainguard's obligation to provide the Chainguard Container known as zulu-jdk or zulu-jre ("Azul Container") is conditioned on Customer maintaining an active license and support agreement with Azul Systems, Inc. for Azul Platform Core ("Azul Subscription") for the duration of any applicable order. In the event Customer's Azul Subscription is terminated for any reason during the order subscription term, Chainguard may immediately terminate access to the Azul Container without penalty or refund.

## Compatibility Notes

The `zulu-jdk` is based on Azul Zulu Builds of OpenJDK (Zulu). These are certified OpenJDK builds provided by [Azul Platform Core](https://www.azul.com/products/core/). Zulu brings tight security and the cost efficiencies you need to run today's business–critical, Java-based services.

The `zulu-jdk` image is part of the Chainguard Images collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production.

## Image variants

This `zulu-jdk` image comes in two tag variants, `cpu` and `psu`. Each corresponds to the latest Zulu 21 JDK updates provided by Azul. Critical Patch Update (CPU) contains critical security-only changes. The Patched Set Update (PSU) encompasses all changes, including security and non-security bug/feature updates.

See Azul's [CPU, PSU and SLA. Making Sense of TLAs for Java Updates](https://www.azul.com/blog/cpu-psu-and-sla-making-sense-of-tlas-for-java-updates/) page for more information about the variants.

## Getting Started

To test the `zulu-jdk` image, start by pulling the image:

```bash
docker pull cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu
```

Replace `ORGANIZATION` with your organization's name.

Next, run a container using the image you just downloaded:

```bash
docker run -it --rm cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Create a simple Java application, for example, `HelloWorld.java`:

```java
public class HelloWorld {
     public static void main(String[] args) {
          System.out.println("Hello world");
     }
}
```

Then compile and run the application inside the container:

```bash
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu java HelloWorld
```

You should see the output `Hello world`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-otel

# nginx-otel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-otel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-otel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Wolfi-based nginx HTTP server with OpenTelemetry observability integration for distributed tracing

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `nginx-otel` container image extends the standard nginx functionality with OpenTelemetry instrumentation for distributed tracing. It maintains all the compatibility features of the standard nginx Chainguard Container.

### Users

Like the standard nginx Chainguard Container, this image runs as a non-root `nonroot` user (UID/GID 65532) and does not require privilege escalation.

### Default port

The default port for the `nginx-otel` Chainguard Container is `8080`, rather than `80`.

### IPv6 Support

By default, the container only listens on IPv4. You can add IPv6 support by mounting a configuration file with IPv6 listeners:

```nginx
server {
    listen       8080;
    listen  [::]:8080;
    ...
}
```

### OpenTelemetry Integration

This image includes the nginx OpenTelemetry module (`ngx_otel_module`) which enables distributed tracing. The module is available as an opt-in configuration and supports:

- OTLP (OpenTelemetry Protocol) trace export
- Configurable service names and endpoints
- Per-location tracing controls
- Integration with observability platforms like Jaeger, Zipkin, and others

### Available nginx Modules

This image includes all nginx modules from the upstream `nginx:otel` image for feature parity:

- **Core modules**: HTTP
- **Additional modules**: GeoIP, Image Filter, XSLT Filter, JavaScript (njs)
- **OpenTelemetry module**: Distributed tracing and observability

### Variants

Two variants are available following nginx's release strategy:

- **stable**: Based on nginx stable releases (even version numbers)
- **mainline**: Based on nginx mainline releases (odd version numbers) - tagged as `latest`

### User Directive Warning

Starting the container gives the following warning:

```shell
 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
```

This warning indicates the container is already running as the `nonroot` user, so the directive has no effect. The directive is included for compatibility with configurations that may run the container as root.

### Entrypoint

The entrypoint for the `nginx-otel` Chainguard Container is `/docker-entrypoint.sh`. Commands run as part of `docker run` will be passed as arguments to nginx.

## Getting Started

The `nginx-otel` Chainguard Container provides nginx with OpenTelemetry capabilities for observability. To try out the basic image:

```shell
docker run -p 8080:8080 cgr.dev/ORGANIZATION/nginx-otel:latest
```

After starting the container, navigate to `localhost:8080` in your web browser to see the default nginx welcome page.

## OpenTelemetry Configuration

To enable OpenTelemetry tracing, you need to include the module and configure the tracing endpoint. Here's a basic example:

```nginx
# Include the OpenTelemetry module (opt-in)
include /etc/nginx/modules/10_otel.conf;

events {
    worker_connections 1024;
}

http {
    # Configure OpenTelemetry
    otel_exporter { endpoint jaeger:4317; }
    otel_trace on;
    otel_service_name nginx-test;

    server {
        listen 8080;
        location / { return 200 'OpenTelemetry enabled nginx response'; }
        location /health { return 200 'OK'; }
    }
}
```

## Example with Jaeger

Here's a complete example running nginx-otel with Jaeger for trace collection:

First, start Jaeger:

```shell
docker run -d --name jaeger \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 16686:16686 \
  cgr.dev/ORGANIZATION/jaeger-all-in-one:latest
```

Create an nginx configuration file:

```shell
mkdir -p nginx-conf
cat > nginx-conf/nginx.conf <<EOF
include /etc/nginx/modules/10_otel.conf;

worker_processes  auto;

error_log  /var/log/nginx/error.log notice;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    otel_exporter { endpoint jaeger:4317; }
    otel_trace on;
    otel_service_name nginx-test;
    server {
        listen 8080;
        location / { return 200 'OpenTelemetry enabled nginx response'; }
        location /health { return 200 'OK'; }
    }
}

EOF
```

Run nginx-otel with the test configuration:

```shell
docker run -p 8080:8080 \
  --link jaeger\
  -v $(pwd)/nginx-conf/nginx.conf:/etc/nginx/nginx.conf \
  cgr.dev/ORGANIZATION/nginx-otel:latest
```

Generate some traffic:

```shell
curl -sf localhost:8080

OpenTelemetry enabled nginx response
```

Check that your `nginx-test` service has been registered with Jaeger at `http://localhost:16686/api/services`

View traces at `http://localhost:16686/api/traces/service=nginx-test`

## Run in a read-only File System

Like the standard nginx container, you can run nginx-otel with a read-only filesystem:

```shell
docker run \
 --read-only \
 --tmpfs /var/lib/nginx/tmp/ --tmpfs /var/run/ \
 --cap-drop=ALL \
 -p 8080:8080 \
 cgr.dev/ORGANIZATION/nginx-otel:latest
```

## Documentation and Resources

* [Official nginx Documentation](https://nginx.org/en/docs/)
* [nginx OpenTelemetry Module](https://github.com/nginxinc/nginx-otel)
* [OpenTelemetry Documentation](https://opentelemetry.io/docs/)
* [Jaeger Documentation](https://www.jaegertracing.io/docs/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### configurable-http-proxy-fips

# configurable-http-proxy-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/configurable-http-proxy-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/configurable-http-proxy-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

See the [official usage documentation](https://github.com/jupyterhub/configurable-http-proxy?tab=readme-ov-file#usage) on GitHub.

Run:

```sh
docker run --rm cgr.dev/chainguard-private/configurable-http-proxy-fips:latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### configmap-reload-fips

# configmap-reload-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/configmap-reload-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/configmap-reload-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on prometheus-operator, refer to the
[official documentation](https://prometheus-operator.dev).
The GitHub repository can also be [found here](https://github.com/prometheus-operator/prometheus-operator).

### Helm
To deploy via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2059)

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-config-reloader prometheus-community/kube-prometheus-stack \
 --set prometheusOperator.prometheusConfigReloader.image.registry=cgr.dev \
 --set prometheusOperator.prometheusConfigReloader.image.repository=ORGANIZATION/configmap-reload-fips \
 --set prometheusOperator.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opencost

# opencost
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opencost` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opencost/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenCost give teams visibility into current and historical Kubernetes and cloud spend and resource allocation.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard OpenCost and OpenCost UI Images are comparable to the official [OpenCost image](https://ghcr.io/opencost/opencost) and [OpenCost UI image](https://ghcr.io/opencost/opencost-ui). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function.

## Getting Started

OpenCost consists of following two images:  
 - cgr.dev/ORGANIZATION/opencost:latest  
 - cgr.dev/ORGANIZATION/opencost-ui:latest  
 
Refer to the [official Helm documentation](https://opencost.io/docs/installation/helm) for information on how to deploy OpenCost. The following is an example using the Helm chart, specifying the Chainguard images.

To get started with Chainguard's OpenCost and OpenCost UI image, we can use OpenCost Helm chart to deploy them.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
opencost:
  ui:
    enabled: true
    image:
      registry: cgr.dev
      repository: ORGANIZATION/opencost-ui
      tag: latest
  image:
    registry: cgr.dev
    repository: ORGANIZATION/opencost
    tag: latest
  prometheus:
    internal:
      enabled: true
      serviceName: "prometheus-server"
      serviceNamespace: "prometheus-system"

```

> [!NOTE]
> Prometheus is a prerequisite for OpenCost installation. OpenCost requires Prometheus for scraping metrics and data storage, so it is recommended to install Prometheus before deploying OpenCost, you can find more information on how to install Prometheus [here](https://opencost.io/docs/installation/prometheus).

Then deploy the Helm chart:

```shell

helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm repo update
helm install opencost opencost/opencost \
  --values values.yaml
```

## Documentation and Resources

- (OpenCost Documentation) [Managing with Helm](https://opencost.io/docs/installation/helm)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### glibc-dynamic

# glibc-dynamic
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/glibc-dynamic` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/glibc-dynamic/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Base image with just enough to run arbitrary glibc binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is meant to be used as just a base image only. It does not contain any programs that can be run, other than `/sbin/ldconfig`. Unlike Chainguard's standard `glibc` container image, the `glibc-dynamic` image also includes `libstdc++`, the GNU C++ standard library implementation.

You must bring your own artifacts to use this image, e.g. with a Docker multi-stage build. If you want locale support other than `C.UTF-8`, you must bring your own locale data as well. This may change in the future based on user feedback.

## Getting Started

To illustrate how you can use Chainguard's `glibc-dynamic` container image, start by creating the following Go program:

```shell
cat > main.go <<EOF
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.Get("http://www.google.com")
	fmt.Println("Hello, world!")
}
EOF
```

This is a `Hello, world!` program, but it includes the line `http.Get("http://www.google.com")` which will require glibc.

Next, create a Dockerfile that uses the Chainguard `glibc-dynamic` container as a base image:

```shell
cat > Dockerfile <<EOF
FROM cgr.dev/chainguard/go AS builder
ADD main.go .
RUN CGO_ENABLED=1 go build -o /tmp/foo main.go

# Use this image as a base image.
FROM cgr.dev/chainguard/glibc-dynamic
COPY --from=builder /tmp/foo /foo
ENTRYPOINT ["/foo"]
EOF
```

Using this Dockerfile, build an image:

```shell
docker build -t glibc-dynamic-example .
```

Then run the newly-built image:

```shell
docker run --rm glibc-dynamic-example
```

This will return the following output, indicating the program was run successfully and the `glibc-dynamic` base image worked as expected:

```
Hello, world!
```

## Documentation and Resources

* [glibc Project Website](https://sourceware.org/glibc)
* [Chainguard Academy: glibc vs. musl](https://edu.chainguard.dev/chainguard/chainguard-images/about/images-compiled-programs/glibc-vs-musl/#python-builds)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-metrics-scraper

# kubernetes-dashboard-metrics-scraper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-metrics-scraper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-metrics-scraper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Module containing the Kubernetes metrics scraper module of the Kubernetes dashboard application

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The `kubernetes-dashboard-metrics-scraper` component is responsible for the front-end user interface and contains both the Angular-based web application and a Go server that handles web-specific logic like settings management. This component serves as the main point of interaction, displaying data retrieved from the Kubernetes API via the API module.

## Usage
To deploy the `kubernetes-dashboard-metrics-scraper` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set web.image.repository = cgr.dev/chainguard/kubernetes-dashboard-metrics-scraper \
--set web.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components, refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### google-cloud-sdk

# google-cloud-sdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/google-cloud-sdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/google-cloud-sdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with the [Google Cloud SDK](https://cloud.google.com/sdk/).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Google Cloud SDK

The Chainguard Google Cloud SDK image contains the `google-cloud-sdk` tools, including `gcloud`, `gsutil`, `bq`, and more.

The default command is `gcloud`.

```shell
$  docker run  cgr.dev/chainguard/google-cloud-sdk:latest
ERROR: (gcloud) Command name argument expected.

Available command groups for gcloud:

  AI and Machine Learning
      ai                      Manage entities in Vertex AI.
      ai-platform             Manage AI Platform jobs and models.
      ml                      Use Google Cloud machine learning capabilities.
      ml-engine               Manage AI Platform jobs and models.
      notebooks               Notebooks Command Group.

  API Platform and Ecosystems
      api-gateway             Manage Cloud API Gateway resources.
      apigee                  Manage Apigee resources.
      endpoints               Create, enable and manage API services.
      recommender             Manage Cloud recommendations and recommendation
                              rules.
      services                List, enable and disable APIs and services.

  Anthos CLI
      anthos                  Anthos command Group.

```

You can also use `gsutil` or `bq`:

```shell
$ docker run  cgr.dev/chainguard/google-cloud-sdk:latest gsutil
Usage: gsutil [-D] [-DD] [-h header]... [-i service_account] [-m] [-o section:flag=value]... [-q] [-u user_project] [command [opts...] args...]
Available commands:
  acl              Get, set, or change bucket and/or object ACLs
  autoclass        Configure Autoclass feature
  bucketpolicyonly Configure uniform bucket-level access
  cat              Concatenate object content to stdout
  compose          Concatenate a sequence of objects into a new composite object.
  config           Obtain credentials and create configuration file
  cors             Get or set a CORS JSON document for one or more buckets
  cp               Copy files and objects
  defacl           Get, set, or change default ACL on buckets
  defstorageclass  Get or set the default storage class on buckets
  du               Display object size usage
  hash             Calculate file hashes
  help             Get help about commands and topics
  hmac             CRUD operations on service account HMAC keys.
  iam              Get, set, or change bucket and/or object IAM permissions.
  kms              Configure Cloud KMS encryption
  label            Get, set, or change the label configuration of a bucket.
  lifecycle        Get or set lifecycle configuration for a bucket
  logging          Configure or retrieve logging on buckets
  ```

  ```shell
$ docker run  cgr.dev/chainguard/google-cloud-sdk:latest bq
/usr/share/google-cloud-sdk/platform/bq/bq.py:18: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13
  import pipes
Python script for interacting with BigQuery.

USAGE: bq.py [--global_flags] <command> [--command_flags] [args]

Any of the following commands:
  add-iam-policy-binding, cancel, cp, extract, get-iam-policy, head, help, init,
  insert, load, ls, mk, mkdef, partition, query, remove-iam-policy-binding, rm,
  set-iam-policy, shell, show, truncate, update, version, wait

add-iam-policy-binding     Add a binding to a BigQuery resource's policy in IAM.

                           Usage:
                           add-iam-policy-binding --member=<member>
                           --role=<role> <identifier>

                           One binding consists of a member and a role, which
                           are specified with (required) flags.

                           Examples:

                           bq add-iam-policy-binding \
                           --member='user:myaccount@gmail.com' \
                           --role='roles/bigquery.dataViewer' \
                           table1

                           bq add-iam-policy-binding \
                           --member='serviceAccount:my.service.account@my-
                           domain.com' \
                           --role='roles/bigquery.dataEditor' \
                           project1:dataset1.table1

                           bq add-iam-policy-binding \
                           --member='allAuthenticatedUsers' \
                           --role='roles/bigquery.dataViewer' \
                           --project_id=proj -t ds.table1
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-node-exporter-fips

# prometheus-node-exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-node-exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-node-exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm

To deploy the Chainguard image using the community helm chart, you'll first
need to note the digest for the image, and pass, along with the image name,
when deploying:

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-node-exporter prometheus-community/prometheus-node-exporter \
 --set image.registry=cgr.dev \
 --set image.repository=ORGANIZATION/prometheus-node-exporter-fips \
 --set image.digest=[DIGEST]
```

For more detail, please refer to the [Node Exporter documentation](https://github.com/prometheus/node_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### nginx-prometheus-exporter

# nginx-prometheus-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/nginx-prometheus-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/nginx-prometheus-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The `nginx-prometheus-exporter` image is designed to scrape metrics from an NGINX instance and expose them to Prometheus in a secure and minimal environment. Below are detailed instructions for using the image in both Docker and Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage of the nginx-prometheus-exporter Image

The `nginx-prometheus-exporter` image is designed to scrape metrics from an NGINX instance and expose them to Prometheus in a secure and minimal environment. Below are detailed instructions for using the image in both Docker and Kubernetes environments.

### Running with Docker:

To run nginx-prometheus-exporter with a local NGINX instance, use the following commands:

#### Run NGINX: Start an NGINX instance that has the required /status page enabled.

```bash
docker run -d --name nginx -p 8080:80 nginx:stable-alpine
```

You will need to ensure the /status page is enabled in your NGINX configuration. A simple nginx.conf could look like this:

```nginx
server {
    listen 80;
    location /status {
        stub_status on;
        allow all;
    }
}
```

#### Run the Prometheus Exporter: Start the nginx-prometheus-exporter to scrape metrics from the NGINX instance.

```bash
docker run -d --name nginx-prometheus-exporter -p 9113:9113 --link nginx \
  cgr.dev/chainguard/nginx-prometheus-exporter:latest \
  -nginx.scrape-uri="http://nginx/status"
```

#### Verify Metrics: You can check if the exporter is running and exposing metrics by visiting the following URL:

```bash
http://localhost:9113/metrics
```
You should see metrics related to your NGINX instance, such as:

```bash
nginx_connections_active 1
nginx_connections_reading 0
nginx_connections_writing 1
nginx_connections_waiting 0
```

### Using in Kubernetes

If you're running NGINX in a Kubernetes environment, you can use the following Kubernetes manifest to deploy NGINX and the Prometheus exporter.

#### Deploy NGINX and Exporter

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-exporter-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx-exporter-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:stable-alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: nginx-exporter-test
data:
  default.conf: |
    server {
        listen 80;
        location /status {
            stub_status on;
            allow all;
        }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-prometheus-exporter
  namespace: nginx-exporter-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-prometheus-exporter
  template:
    metadata:
      labels:
        app: nginx-prometheus-exporter
    spec:
      containers:
      - name: nginx-prometheus-exporter
        image: cgr.dev/chainguard/nginx-prometheus-exporter:latest
        args:
        - '-nginx.scrape-uri=http://nginx/status'
        ports:
        - containerPort: 9113
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-prometheus-exporter
  namespace: nginx-exporter-test
spec:
  ports:
  - port: 9113
    targetPort: 9113
  selector:
    app: nginx-prometheus-exporter
```

#### Access Metrics in Kubernetes:

You can use `kubectl port-forward` to forward the exporter service to your local machine for verification:

```bash
kubectl port-forward svc/nginx-prometheus-exporter 9113:9113 -n nginx-exporter-test
```

Access the metrics at:

```bash
http://localhost:9113/metrics
```
Prometheus Configuration: If you’re using Prometheus to scrape the metrics, add the following configuration to your Prometheus configuration file:

```yaml
scrape_configs:
  - job_name: 'nginx-prometheus-exporter'
    static_configs:
      - targets: ['nginx-prometheus-exporter.nginx-exporter-test.svc.cluster.local:9113']
```      
#### Environment Variables and Customization
The nginx-prometheus-exporter allows some additional customization through the following options:

-nginx.scrape-uri: Set the URI where the exporter should scrape NGINX metrics. Defaults to http://localhost/status.
-telemetry.address: Set the address where the Prometheus exporter exposes metrics. Defaults to :9113.

You can pass these as arguments in the Docker run command or in your Kubernetes manifest.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### neuvector

# neuvector-manager
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/neuvector-manager` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/neuvector-manager/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Wolfi-based image for NeuVector - a full lifecycle container security platform.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Install the Helm repository

Install the NeuVector Helm chart repository and update:

```bash
helm repo add neuvector https://neuvector.github.io/neuvector-helm/
helm repo update
```

## Generate internal certificates

Refer to NeuVector's documentation on generating internal certs [here](https://open-docs.neuvector.com/deploying/production/internal). These are
not provided out of the box as they should be changed within a production environment.

Create a namespace for NeuVector:

```bash
kubectl create ns neuvector
```

Create a secret with the internal certs:

```bash
kubectl create secret generic internal-cert -n neuvector --from-file=cert.key --from-file=cert.pem --from-file=ca.cert
```

## Deploy CRD

Deploy the custom resource definition:

```bash
helm install core neuvector/crd -n neuvector
```

## Deploy core

Deploy NeuVector core:

```bash
helm install core neuvector/core -n neuvector \
  --set registry=cgr.dev \
  \
  --set controller.image.repository=chainguard/neuvector-controller \
  --set controller.internal.certificate.secret=internal-cert \
  --set controller.internal.certificate.keyFile=cert.key \
  --set controller.internal.certificate.pemFile=cert.pem \
  --set controller.internal.certificate.caFile=ca.cert \
  \
  --set enforcer.image.repository=chainguard/neuvector-enforcer \
  --set enforcer.internal.certificate.secret=internal-cert \
  --set enforcer.internal.certificate.keyFile=cert.key \
  --set enforcer.internal.certificate.pemFile=cert.pem \
  --set enforcer.internal.certificate.caFile=ca.cert \
  \
  --set manager.image.repository=chainguard/neuvector-manager \
  \
  --set cve.scanner.image.registry=cgr.dev \
  --set cve.scanner.image.repository=chainguard/neuvector-scanner \
  --set cve.scanner.internal.certificate.secret=internal-cert \
  --set cve.scanner.internal.certificate.keyFile=cert.key \
  --set cve.scanner.internal.certificate.pemFile=cert.pem \
  --set cve.scanner.internal.certificate.caFile=ca.cert \
  \
  --set cve.updater.image.registry=cgr.dev \
  --set cve.updater.image.repository=chainguard/neuvector-updater \
  \
  --set crdwebhook.enabled=false
```

Note that the container runtime will need to be changed depending on where NeuVector is deployed.
For example, for k3s we would set:

```bash
  --set k3s.enabled=true \
  --set k3s.runtimePath=/run/k3s/containerd/containerd.sock
```

By default, the runtime is set to docker.

The `*.internal.certificate.*` entries can all be removed except for `*.internal.certificate.secret`
if using the default values of `keyFile=tls.key`, `pemFile=tls.pem`, and `caFile=ca.crt`.

## Deploy monitor

Deploy the monitor chart with prometheus exporter:

```bash
helm install monitor neuvector/monitor -n neuvector \
  --set registry=cgr.dev \
  --set exporter.apiSvc=neuvector-svc-controller:10443 \
  --set exporter.image.repository=chainguard/neuvector-prometheus-exporter
```

The API service is changed as by default it points to a non-existent `neuvector-svc-controller-api` service.

You're now running NeuVector with Chainguard images! Consult [NeuVector's documentation](https://open-docs.neuvector.com/) for additional configuration.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-10585

# zulu-jdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zulu-jdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zulu-jdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest-cpu
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

Azul Zulu Builds of OpenJDK (Zulu) are open source, TCK-tested and certified builds of OpenJDK. Zulu is available for a wide range of hardware platforms and operating systems. These builds are a drop-in replacement for any other OpenJDK distribution.

Zulu is a component of Azul Platform Core, that is designed for enterprise, distribution (ISV), and embedded (OEM) use cases, and provides tight security and the cost efficiencies you need to run today’s business–critical, Java-based services.

This section shows how to use Azul Zulu with Chainguard containers, regularly-updated, secure-by-default container images.

Chainguard's obligation to provide the Chainguard Container known as zulu-jdk or zulu-jre ("Azul Container") is conditioned on Customer maintaining an active license and support agreement with Azul Systems, Inc. for Azul Platform Core ("Azul Subscription") for the duration of any applicable order. In the event Customer's Azul Subscription is terminated for any reason during the order subscription term, Chainguard may immediately terminate access to the Azul Container without penalty or refund.

## Compatibility Notes

The `zulu-jdk` is based on Azul Zulu Builds of OpenJDK (Zulu). These are certified OpenJDK builds provided by [Azul Platform Core](https://www.azul.com/products/core/). Zulu brings tight security and the cost efficiencies you need to run today's business–critical, Java-based services.

The `zulu-jdk` image is part of the Chainguard Images collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production.

## Image variants

This `zulu-jdk` image comes in two tag variants, `cpu` and `psu`. Each corresponds to the latest Zulu 21 JDK updates provided by Azul. Critical Patch Update (CPU) contains critical security-only changes. The Patched Set Update (PSU) encompasses all changes, including security and non-security bug/feature updates.

See Azul's [CPU, PSU and SLA. Making Sense of TLAs for Java Updates](https://www.azul.com/blog/cpu-psu-and-sla-making-sense-of-tlas-for-java-updates/) page for more information about the variants.

## Getting Started

To test the `zulu-jdk` image, start by pulling the image:

```bash
docker pull cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu
```

Replace `ORGANIZATION` with your organization's name.

Next, run a container using the image you just downloaded:

```bash
docker run -it --rm cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Create a simple Java application, for example, `HelloWorld.java`:

```java
public class HelloWorld {
     public static void main(String[] args) {
          System.out.println("Hello world");
     }
}
```

Then compile and run the application inside the container:

```bash
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/zulu-jdk:latest-cpu java HelloWorld
```

You should see the output `Hello world`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### etcd-fips

# etcd-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/etcd-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/etcd-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### jupyterhub-k8s-hub-fips

# jupyterhub-k8s-hub-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/jupyterhub-k8s-hub-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/jupyterhub-k8s-hub-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The image is not intended to be used directly. It requires some configuration files to be mounted into the container. See the [JupyterHub documentation](https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html) for more information.

Since the image is non-root, we are using `1000` as the UID and GID for the user. This user has
write access to `/usr/local/etc/jupyterhub`.

You can run the image using the Helm Chart with:

```shell
helm repo add jupyterhub https://hub.jupyter.org/helm-chart/
helm repo update
helm upgrade --install jupyterhub jupyterhub/jupyterhub \
  --set hub.image.name=cgr.dev/chainguard-private/jupyterhub-k8s-hub-fips \
  --set hub.image.tag=$VERSION \
  --set hub.config.JupyterHub.db_url=/usr/local/etc/jupyterhub/jupyterhub.sqlite
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### vertical-pod-autoscaler-fips

# vertical-pod-autoscaler-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/vertical-pod-autoscaler-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/vertical-pod-autoscaler-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-config-reloader-fips

# prometheus-config-reloader-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-config-reloader-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-config-reloader-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage
For full instructions on prometheus-operator, refer to the
[official documentation](https://prometheus-operator.dev).
The GitHub repository can also be [found here](https://github.com/prometheus-operator/prometheus-operator).

### Helm
To deploy via helm, please refer to the upstream
[helm charts documentation](https://github.com/prometheus-community/helm-charts)
for comprehensive instructions, which includes
[supported parameters](https://github.com/prometheus-community/helm-charts/blob/eef28b4b566c463242774814cfa5a94a9dec3e99/charts/kube-prometheus-stack/values.yaml#L2059)

Below is an example of how to use the helm chart, overriding the image with the
chainguard image:

```bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prom-config-reloader prometheus-community/kube-prometheus-stack \
 --set prometheusOperator.prometheusConfigReloader.image.registry=cgr.dev \
 --set prometheusOperator.prometheusConfigReloader.image.repository=ORGANIZATION/prometheus-config-reloader-fips \
 --set prometheusOperator.image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pgpool2_exporter-fips

# pgpool2_exporter-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pgpool2_exporter-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pgpool2_exporter-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A FIPS-compliant Prometheus exporter image for Pgpool-II metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is compatible with the upstream [pgpool2_exporter-fips](https://hub.docker.com/r/pgpool/pgpool2_exporter) image. Switching to Chainguard `pgpool2_exporter-fips` image should not require any changes to your existing setup. 
- Supported `Pgpool-II 3.6` and later.
## Getting Started
### Docker

The following environment variables configure the docker container:
- `POSTGRES_USERNAME` PostgreSQL user name. Default is `postgres`.
- `POSTGRES_PASSWORD` PostgreSQL user password. Default is `postgres`.
- `POSTGRES_DATABASE` Database name. Default is `postgres`.
- `PGPOOL_SERVICE` Pgpool-II hostname. Default is `localhost`.
- `PGPOOL_SERVICE_PORT` Pgpool-II port number. Default is `9999`.

```shell
docker run --name pgpool2_exporter \
  --net=host --rm \
  -e POSTGRES_USERNAME=<username> \
  -e POSTGRES_PASSWORD=<password> \
  -e POSTGRES_DATABASE=<database> \
  -e PGPOOL_SERVICE=<hostname> \
  -e PGPOOL_SERVICE_PORT=<port> \
  -e SSLMODE=<sslmode> \
  cgr.dev/ORGANIZATION/pgpool2_exporter-fips:latest
```

## Documentation and Resources
For more information, please refer to [the official documentation for pgpool2_exporter project](https://github.com/pgpool/pgpool2_exporter/blob/master/README.md) 

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### portieris

# portieris
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/portieris` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/portieris/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes Admission Controller for verifying image trust.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image is based on the upstream [IBM Portieris image](https://github.com/IBM/portieris), which serves as a Kubernetes Admission Controller for verifying image trust. While this image is designed to function similarly to the upstream version, there are a few key differences and enhancements tailored to Chainguard's security-first approach.

- OCI Reference: This image is hosted at `cgr.dev/chainguard/portieris` as opposed to the original icr.io/portieris used in the upstream version. When deploying with Helm, ensure the `image.host` is overridden accordingly.
- Security: Chainguard images are regularly updated to minimize vulnerabilities (CVEs), ensuring that security patches are promptly applied, providing a safer alternative to the upstream image.
- Minimalism: This image has been stripped down to only essential components, providing minimal and secure images tailored to Chainguard's security-first approach.

## Getting Started

### Installation with the upstream helm chart

This upstream image maintains an [Portieris helm chart](https://github.com/IBM/portieris/tree/main/helm/portieris) and a README document describing how to deploy the chart. At a minimum the user will have to override the OCI reference.  This Helm Chart uses the term `image.host` to refer to what would usually be referred to as the `image.registry`.

```bash
cat <<EOF > values.yaml
image:
  host: icr.io/portieris => cgr.dev/chainguard
  pullSecret:
  image: portieris
  tag: "latest"
  pullPolicy: Always
UseCertManager: true
EOF

```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### sbt

# sbt
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/sbt` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/sbt/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gatekeeper-fips

# gatekeeper-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gatekeeper-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gatekeeper-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS-compliant [Gatekeeper](https://open-policy-agent.github.io/gatekeeper) image for enforcing Kubernetes policies using Open Policy Agent

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `gatekeeper-fips` image is a drop-in replacement for the upstream `openpolicyagent/gatekeeper` controller image. It is fully compatible with the official [Gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper) and supports all core functionality, including admission webhook validation, constraint enforcement, audit, and metrics. This image is designed to be minimal, secure alternative and runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

### FIPS Support

The `gatekeeper-fips` Chainguard Container ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

You can deploy this image using the [opa/gatekeeper Helm chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper). Be sure to override the image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/gatekeeper-fips
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `gatekeeper-fips` helm chart

```shell
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update
helm install gatekeeper/gatekeeper --name-template=gatekeeper --namespace gatekeeper-system --create-namespace -f values.yaml --wait
```

## Documentation
- [Official Gatekeeper documentation](https://open-policy-agent.github.io/gatekeeper/website/docs/)
- [Gatekeeper Github Repository](https://github.com/open-policy-agent/gatekeeper/tree/master)
- [Gatekeeper Helm Chart](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloudflared

# cloudflared
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloudflared` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloudflared/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cloudflare Tunnel client (formerly Argo Tunnel)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `cloudflared` image is built with the standard Go toolchain, rather than Cloudflare’s patched fork. It is otherwise functionally equivalent to the upstream [`cloudflared`](https://github.com/cloudflare/cloudflared) container image.

This image enables integration into security-focused environments and reproducible builds while maintaining full compatibility with expected `cloudflared` behavior.

## Quick Start
You can quickly get started with the `cloudflared` image using Docker:

```sh
docker run -it cgr.dev/ORGANIZATION/cloudflared:latest tunnel --no-autoupdate --hello-world
```
This command runs the built-in hello-world tunnel check.

To start cloudflared as a DNS proxy on port 1053, run:
```sh
docker run -it -p 1053:5053/tcp -p 1053:5053/udp cgr.dev/ORGANIZATION/cloudflared:latest proxy-dns
```

## Notes
- The upstream Helm chart documentation has not been updated in several months; using [this chart](https://github.com/cloudflare/helm-charts) is not recommended.
- For Kubernetes deployment instructions, refer to k8s-TESTING.md

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-1862

# request-1862
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-1862` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-1862/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Triton Inference Server provides an optimized cloud and edge inferencing solution.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-iamguarded-fips

# keycloak-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based [Keycloak](https://www.keycloak.org/) IAMGuarded image for identity and access management.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Keycloak IAMGuarded FIPS is a FIPS-compliant security-enhanced variant of Keycloak designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination includes configuration management capabilities and provides additional security benefits over standard Keycloak deployments, with full FIPS compliance.

## Helm Chart Installation

The Keycloak IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Keycloak FIPS image
image:
  registry: myregistry.example.com
  repository: mirrored/keycloak-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Keycloak Config CLI
keycloakConfigCli:
  image:
    registry: myregistry.example.com
    repository: mirrored/keycloak-config-cli-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install keycloak oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/keycloak
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/keycloak:$tag
   Digest: sha256:...
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Keycloak IAMGuarded FIPS installation using standard Keycloak verification methods. The deployment functions as a standard Keycloak instance with FIPS compliance, so all typical Keycloak validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Keycloak IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both Keycloak and Kubernetes environments. This FIPS variant ensures compliance with FIPS 140-2 standards. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## Prerequisites

- DB connection password must be at least 112 bits.
- A keystore file must be provided to enable FIPS mode.
- Keystore password must be at least 112 bits.

## Keycloak Specific Configuration

Keycloak provides a mechanism to configure and customize the image. This process
is outlined in the [Keycloak image documentation](https://github.com/keycloak/keycloak/blob/main/docs/guides/server/containers.adoc).

There are subtle differences in the executable paths used in the Chainguard
image. Below is the example copied from the documentation, updated with the
correct paths:

```bash
FROM cgr.dev/chainguard/keycloak-iamguarded-fips:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /usr/share/java/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/iamguarded/keycloak/bin/kc.sh build

FROM cgr.dev/chainguard/keycloak:latest
COPY --from=builder /usr/share/java/keycloak/ /usr/share/java/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/opt/iamguarded/keycloak/bin/kc.sh"]
```

## Disclaimer

This image is equipped with the essential components for Keycloak to operate in
FIPS mode. However, it's important for users to ensure they use it in line with
FIPS compliance standards.

This includes tasks such as keystore generation, configuration, and launching
Keycloak with the correct configuration parameters. More guidance is provided in
the sections below.

## Keystore

Keycloak requires a bcfips-compatible keystore to manage its SSL/TLS
certificates.

Although Keycloak supports various keystore types, only BCKFS offers the
capability to operate in approved _(strict)_ mode under FIPS standards, ensuring
only approved ciphers are used.

### BCKFS Keystore creation

To create keystore you can use keytool from this image like so:

```bash
kubectl run -q --rm --attach create-keystore \
  --image=cgr.dev/ORGANIZATION/keycloak-iamguarded-fips --restart=Never --command -- \
    sh -c ' \
      keytool -v -keystore "/tmp/server.keystore" \
      -storetype bcfks \
      -providername BCFIPS \
      -alias "localhost" \
      -genkeypair -sigalg SHA512withRSA -keyalg RSA \
      -dname CN="localhost" \
      -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
      -keypass "<YOUR TLS KEY PASSWORD, can be the same>"; \
      cat /tmp/server.keystore' > server.keystore
```

### BCKFS Truststore creation

To create a truststore and import and trust an existing CA certificate you can also use keytool:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/keycloak-iamguarded-fips \
  -v -keystore /tmp/keystore/truststore.bckfs \
  -storetype bcfks \
  -providername BCFIPS \
  -import -file /tmp/keystore/MyCA.crt \
  -storepass "<YOUR TRUSTSTORE PASSWORD>" \
  -trustcacerts \
  -noprompt
```

You can similarly use the keycloak container as an init container in your helm
`values.yaml` to import certificates to a BCKFS truststore. When doing this you
may need to set the environment of *just* the init container`JAVA_TOOL_OPTS` to
set the `--module-path` init container and configure the truststore for
keycloak using the `javax.net.ssl` properties using JAVA_OPTS. The need for
JAVA_TOOL_OPTIONS for Java tooling with the BCFIPS provider is documented in
section 2.1.1 in the [Bouncy Castle FIPS Java API User Guide](https://downloads.bouncycastle.org/fips-java/docs/BC-FJA-UserGuide-2.0.0.pdf):

```yaml
extraEnvVars:
- name: JAVA_OPTS
  value: "-Djavax.net.ssl.trustStore=/opt/iamguarded/keycloak/certs/keycloak.truststore.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=FIPS"
  env:
  - name: JAVA_TOOL_OPTIONS
    value: "--module-path=/usr/share/java/bouncycastle-fips -Djava.class.path=/usr/share/java/bouncycastle-fips/bc-fips.jar"
```
** Note on `--truststore-paths` **

Currently it is not possible to use the `--truststore-paths` option when using `--features=fips
--fips-mode=strict`, see this [issue](https://github.com/keycloak/keycloak/issues/28526)

### Deployment

To deploy Keycloak on Kubernetes, you can use the iamguarded helm chart alongside the [KeyCloak FIPS documentation](https://www.Keycloak.org/server/fips).

You will need to do all of the prerequisites mentioned above, and then you need to pass the necessary values to the Helm chart.

Once you create your `server.keystore` using the `BCFIPS` provider, create a Secret object in your Kubernetes cluster to _mount_ it into the Keycloak container later on:

```shell
kubectl create secret generic keycloak-keystore --from-file=server.keystore
```

Set the values to override the necessary fields:

```shell
cat <<EOF > keycloak_values.yaml
extraVolumes:
  - name: "keycloak-keystore"
    secret:
      secretName: "keycloak-keystore"
      items:
        - key: "server.keystore"
          path: "server.keystore"
extraVolumeMounts:
  - name: "keycloak-keystore"
    mountPath: "/usr/share/java/keycloak/conf"
    readOnly: true
auth:
  adminUser: "<ADMIN_USER>"
  adminPassword: "<ADMIN_PASSWORD>"
image:
  registry: cgr.dev
  repository: ORGANIZATION/keycloak-iamguarded-fips
  tag: latest
extraStartupArgs: "--features=fips --fips-mode=strict --https-key-store-password=<KEYSTORE_PASSWORD>"
# If using the chart's postgres, set a long password
postgresql:
  auth:
    password: <LONG_DATABASE_PASSWORD>
EOF
```

### FIPS validation

If you want to validate the FIPS mode as we did in image tests, you can increase the log level to `TRACE`. You'll see debug logs such as the below if Keycloak is running in FIPS mode:

```bash
--log-level='INFO,org.keycloak.common.crypto:TRACE,org.keycloak.crypto:TRACE'
```

Then you will see the following logs:

```bash
trustStoreType: FIPS
FIPS-JVM: enabled
Approved Mode
BouncyCastleFipsProvider
```

## Debugging

#### Invalid Keystore Format with BCFKS in `production` mode

**Error Message**:
```bash
# kc.sh start --features=fips --hostname=localhost --https-key-store-password='**********'
ERROR: Failed to start server in (production) mode
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: Invalid keystore format
```
**Solution:**
BCFKS Keystores default to strict mode, and it's likely you omitted
`--fips-mode=strict` in your arguments. If you wish to run in non-strict mode
with BCFKS, you need to include `--https-key-store-type=bcfks`.

This is called out in the [official documentation](https://www.keycloak.org/server/fips),
but perhaps could benefit from additional clarification.

#### Keystore corrupted error upon launch

**Error Message**:
```bash
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: BCFKS KeyStore corrupted: MAC calculation failed.
ERROR: BCFKS KeyStore corrupted: MAC calculation failed.
```

**Solution:**
The error indicates that a Keystore was detected, but there was an issue
parsing it. Usually this means that the password used to create the keystore
does not match what was provided as the `--https-key-store-password` argument
to Keycloak.

#### Key material not provided error in `production` mode

**Error Message**:
```bash
ERROR: Failed to start server in (production) mode
ERROR: Key material not provided to setup HTTPS. Please configure your
keys/certificates or start the server in development mode.
```

**Solution:**
This error usually indicates that a `.keystore` was not detected in the
`/usr/share/java/keycloak/conf` directory. Ensure you have created a Keystore
and it is accessible to the container in the expected directory.

#### Password must be at least 112 bits

**Error Message**:
```bash
Failed to add user '<admin-user>' to realm 'master': org.keycloak.models.ModelException:
password must be at least 112 bits
FipsUnapprovedOperationError: password must be at least 112 bits
```

**Solution:**
This is expected whenever Keycloak is running in `strict` (approved) mode for
FIPS. Choose a longer admin password which is compliant. Refer to the Keycloak
FIPS [documentation](https://www.keycloak.org/server/fips) for more information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### mountpoint-s3-csi-driver

# mountpoint-s3-csi-driver
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/mountpoint-s3-csi-driver` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/mountpoint-s3-csi-driver/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Built on Mountpoint for Amazon S3, the Mountpoint CSI driver presents an Amazon S3 bucket as a storage volume accessible by containers in your Kubernetes cluster.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is a Helm chart to deploy the Mountpoint for Amazon S3 CSI driver. You can find the chart in the official repository [here](https://github.com/awslabs/mountpoint-s3-csi-driver/tree/main/charts/aws-mountpoint-s3-csi-driver).

You can install the chart by running the following command:

```shell
helm install aws-mountpoint-s3-csi-driver aws/aws-mountpoint-s3-csi-driver \
--set image.repository=cgr.dev/chainguard/mountpoint-s3-csi-driver \
--set image.tag=latest
```

But its also available as an add-on in the EKS cluster, you can enable it by running the following command:

```shell
eksctl create addon --name aws-mountpoint-s3-csi-driver --cluster my-cluster
```

but in case you want to run it as an add-on, do not forget to change the image name to `cgr.dev/chainguard/mountpoint-s3-csi-driver:latest` right after the installation.

For more information how you can use the Mountpoint for Amazon S3 CSI driver, please visit the [TESTING.md](./TESTING.md).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-iamguarded

# valkey-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey is an open source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Valkey IAMGuarded is a security-enhanced variant of Valkey designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Valkey deployments.

## Helm Chart Installation

The Valkey IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/valkey-iamguarded
  digest: sha256:... # Use specific digest instead of tag

sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/valkey-sentinel-iamguarded
    digest: sha256:... # Use specific digest instead of tag

volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/valkey:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Valkey IAMGuarded installation using standard Valkey verification methods. The deployment functions as a standard Valkey instance, so all typical Valkey validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Valkey IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Valkey and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kong-fips

# kong-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kong-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kong-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kong is a Cloud-Native API Gateway and AI Gateway

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard’s Kong image is a lean, Wolfi-based container image. It mirrors the [Docker image from the Kong project](https://docs.konghq.com/gateway/latest/install/docker/) in functionality but has fewer dependencies, minimizing the attack surface.

### FIPS Support
The `kong-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started

The following is an simple example of running the Chainguard Kong image in [**DB-less**](https://docs.konghq.com/gateway/3.9.x/production/deployment-topologies/db-less-and-declarative-config/) mode using Docker:

```shell
docker run -d --name kong \
  -p 8000:8000 \
  -p 8443:8443 \
  -e KONG_DATABASE=off \
  -e KONG_DECLARATIVE_CONFIG=/etc/kong/kong.yml \
  cgr.dev/ORGANIZATION/kong-fips:latest
```

Once the container is running, you can test Kong’s gateway functionality by sending requests to http://localhost:8000.

### Using Kong With a Database

If you prefer to run Kong using a database (PostgreSQL or Cassandra), you can do so by setting the appropriate environment variables.

First, create a custom Docker network to allow the containers to discover and communicate with each other:

```shell
docker network create kong-net
```

Then start a database container. To illustrate, we will use a PostgreSQL container:

```shell
docker run -d --name kong-database \
 --network=kong-net \
 -p 5432:5432 \
 -e "POSTGRES_USER=kong" \
 -e "POSTGRES_DB=kong" \
 -e "POSTGRES_PASSWORD=kongpass" \
 postgres:13
```

Next, prepare the Kong database:

```bash
docker run --rm --network=kong-net \
 -e "KONG_DATABASE=postgres" \
 -e "KONG_PG_HOST=kong-database" \
 -e "KONG_PG_PASSWORD=kongpass" \
 -e "KONG_PASSWORD=test" \
  cgr.dev/ORGANIZATION/kong-fips:latest kong migrations bootstrap
```

Run the following command to start a container with Kong Gateway:

```bash
docker run -d --name kong-gateway \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpass" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 127.0.0.1:8001:8001 \
-p 127.0.0.1:8002:8002 \
-p 127.0.0.1:8444:8444 \
cgr.dev/ORGANIZATION/kong-fips:latest
```

## Documentation and Resources

Please refer to Kong’s [official documentation](https://docs.konghq.com/) for details on configuring your database and other advanced features.

You can explore the following resources to learn more about Kong:
* [Kong Official Documentation](https://docs.konghq.com/)
* [Kong Developer Guide](https://github.com/Kong/kong/blob/master/DEVELOPER.md)
* [Kong Source Code on GitHub](https://github.com/Kong/kong)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### flux-operator-fips

# flux-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/flux-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/flux-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Flux Operator is a Kubernetes controller for managing the lifecycle of Flux CD

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `flux-operator-fips` container image is designed to be a drop-in replacement for the upstream [flux-operator image](https://github.com/controlplaneio-fluxcd/flux-operator/pkgs/container/flux-operator).

## Getting Started

### Helm

Create a `values.yaml` file:

```yaml
cat > values.yaml <<EOF
image:
  name: cgr.dev/ORGANIZATION/flux-operator-fips
  tag: latest
EOF
```

Add the Helm repository and install:

```shell
helm install flux-operator oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator \
  --namespace flux-system \
  --create-namespace -f values.yaml
```

## Documentation and Resources
- [flux-operator](https://fluxcd.control-plane.io/operator/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-infrastructure-bundle

# newrelic-infrastructure-bundle
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-infrastructure-bundle` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-infrastructure-bundle/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-infrastructure-bundle](https://github.com/newrelic/infrastructure-bundle) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's `newrelic-infrastructure-bundle` container image is comparable to [the newrelic-infrastructure-bundle image maintained by Newrelic](https://hub.docker.com/r/newrelic/infrastructure-bundle). Like most other Chainguard container images, the newrelic-infrastructure-bundle image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle) chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: ORGANIZATION/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: ORGANIZATION/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: ORGANIZATION/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### langfuse

# langfuse
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/langfuse` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/langfuse/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Langfuse is an open-source observability and analytics platform for LLM applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Langfuse is an open-source LLM observability and analytics platform. Chainguard's langfuse container images are comparable to the standard [Langfuse images available on Docker Hub](https://hub.docker.com/u/langfuse). However, the Chainguard images contain only the minimum set of tools and dependencies needed to function. This means it does not include things like a shell or a package manager.

### langfuse-web

The `langfuse-web` image contains the [langfuse frontend](https://github.com/langfuse/langfuse/tree/main/web). Chainguard's langfuse-web container image is comparable to the upstream `langfuse/langfuse` image available on [Docker Hub](https://hub.docker.com/r/langfuse/langfuse).

### langfuse-worker

The `langfuse-worker` image contains the [langfuse backend](https://github.com/langfuse/langfuse/tree/main/worker). Chainguard's langfuse-worker container image is comparable to the upstream langfuse/langfuse-worker image available on [Docker Hub](https://hub.docker.com/r/langfuse/langfuse-worker). 

## Getting Started Guide

### Deploying with Helm

The most common deployment case is to use the Langfuse Helm chart, which can be deployed as follows:

```bash
cat <<EOF > values.yaml
langfuse:
  web:
    deploy: true
    image:
      repository: cgr.dev/ORGANIZATION/langfuse
      tag: latest
  worker:
    deploy: true
    image:
      repository: cgr.dev/ORGANIZATION/langfuse-worker
      tag: latest
EOF
```
Then install the helm chart with the following command
```bash
helm install langfuse-worker langfuse \
  --repo https://langfuse.github.io/langfuse-k8s \
  --namespace default \
  --create-namespace \
  --values values.yaml
```

## Documentation and Resources:

- [Langfuse Github Repository](https://github.com/langfuse/langfuse)
- [Langfuse Quickstart Guide](https://langfuse.com/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rqlite-fips

# rqlite-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rqlite-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rqlite-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with rqlite, a lightweight, distributed relational database built on SQLite. rqlite uses the Raft consensus protocol to provide strong consistency across a cluster of nodes, making it an ideal solution for lightweight, fault-tolerant distributed databases.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's rqlite image is comparable to the [`rqlite/rqlite` image available on Docker Hub](https://hub.docker.com/r/rqlite/rqlite).

Be aware of the following specifications for this image:

* **Architecture Support**:
  - Built for x86_64 and arm64 architectures
  - Optimized for containerized environments
* **Network Requirements**:
  - Requires network setup supporting the Raft consensus protocol
  - TCP/UDP communication must be enabled across nodes
  - Default ports: `4001` (HTTP) and `4002` (Raft)
* **Storage**:
  - Persistent storage required for data durability
  - Default data directory: `/rqlite/file/data`

## Getting Started

The Chainguard Vault image contains the `rqlite` and `rqlited` server binaries. The default entrypoint uses the `docker-entrypoint.sh` script from the `rqlite` project.

To run the `rqlite-fips` program, use a command like the following:

```shell
docker run cgr.dev/chainguard/rqlite-fips rqlite-fips
```
```
[rqlited] 2023/03/26 21:53:22 rqlited starting, version 7, SQLite 3.39.4, commit unknown, branch unknown, compiler gc
[rqlited] 2023/03/26 21:53:22 go1.20.2, target architecture is arm64, operating system target is linux
[rqlited] 2023/03/26 21:53:22 launch command: /usr/bin/rqlited -node-id d3d5c2306506 -http-addr 0.0.0.0:4001 -http-adv-addr d3d5c2306506:4001 -raft-addr 0.0.0.0:4002 -raft-adv-addr d3d5c2306506:4002 /rqlite/file/data

            _ _ _
           | (_) |
  _ __ __ _| |_| |_ ___
 | '__/ _  | | | __/ _ \   The lightweight, distributed
 | | | (_| | | | ||  __/   relational database.
 |_|  \__, |_|_|\__\___|
         | |               www.rqlite.io
         |_|

[rqlited] 2023/03/26 21:53:22 Raft TCP mux Listener registered with byte header 1
[rqlited] 2023/03/26 21:53:22 no preexisting node state detected in /rqlite/file/data, node may be bootstrapping
[cluster] 2023/03/26 21:53:22 service listening on d3d5c2306506:4002
```

## Documentation and Resources

* **Official Documentation**:
  - [rqlite Documentation](https://www.rqlite.io/docs/) - Comprehensive guides, API references, and troubleshooting
  - [rqlite GitHub Repository](https://github.com/rqlite/rqlite) - Source code and community discussions

* **Related Resources**:
  - [SQLite Documentation](https://www.sqlite.org/docs.html) - Underlying database documentation
  - [Raft Protocol](https://raft.github.io/) - Understanding the consensus protocol

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kyverno-policy-reporter

# kyverno-policy-reporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kyverno-policy-reporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kyverno-policy-reporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Monitoring and Observability Tool for the [PolicyReport CRD](https://kyverno.github.io/policy-reporter/) with an optional UI.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's `kyverno-policy-reporter` Container Image is comparable to the [official kyverno policy-reporter image](https://ghcr.io/kyverno/policy-reporter:latest). However, the Chainguard image contains only the minimum set of tools and dependencies needed to function. Additionally, it uses a different entrypoint, `/usr/bin/policyreporter run`, compared to upstream's entrypoint of `/app/policyreporter run`.

## Getting Started

To install Chainguard's `kyverno-policy-reporter` container image on your Kubernetes cluster, you can use the official image's Helm chart.

You can override the image by setting the `image.tag`,`image.repository` and `image.tag` values in a `values.yaml` file.

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/kyverno-policy-reporter
  tag: latest
```

You can then invoke the following command to install kyverno-policy-reporter in your cluster.

```shell
helm repo add policy-reporter https://kyverno.github.io/policy-reporter
helm install policy-reporter policy-reporter/policy-reporter -f values.yaml --create-namespace -n policy-reporter
```

Once you have the reporter up and running in your cluster, you can go through the following steps to test out the functionality:

Apply a ClusterPolicy requiring pods to have an app label

```
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-label
spec:
  rules:
    - name: check-label
      match:
        resources:
          kinds:
            - Pod
      validate:
        failureAction: Audit
        message: "Labels 'app' is required on every Pod."
        pattern:
          metadata:
            labels:
              app: "?*"
EOF
```

Create a pod that violates the policy

```
cat <<EOF | kubectl apply -n test-policyreporter -f -
apiVersion: v1
kind: Pod
metadata:
  name: violate-pod
spec:
  containers:
    - name: nginx
      image: nginx:1.14.2
EOF
```

You should now be able to see a policy report resource created in the `test-policyreporter` namespace:
```
kubectl get policyreports -n test-policyreporter
```

## Documentation and Resources
* [Official Kyverno Policy Reporter Documentation](https://kyverno.io/docs/policy-reports/)
* [Official Kyverno Documentation](https://kyverno.io/docs/introduction/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cert-manager-iamguarded

# cert-manager-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cert-manager-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cert-manager-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[cert-manager](https://cert-manager.io) is a tool for provisioning and managing TLS certificates in Kubernetes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

cert-manager IAMGuarded is a security-enhanced variant of cert-manager designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard cert-manager deployments.

## Helm Chart Installation

The cert-manager IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install cert-manager oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# cert-manager controller image
controller:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-controller-iamguarded
    digest: sha256:... # Use specific digest instead of tag
  acmesolver:
    image:
      registry: myregistry.example.com
      repository: mirrored/cert-manager-acmesolver-iamguarded
      digest: sha256:... # Use specific digest instead of tag

# cert-manager webhook image
webhook:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-webhook-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# cert-manager cainjector image
cainjector:
  image:
    registry: myregistry.example.com
    repository: mirrored/cert-manager-cainjector-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install cert-manager oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/cert-manager
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/cert-manager:1.15.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your cert-manager IAMGuarded installation using standard cert-manager verification methods. The deployment functions as a standard cert-manager instance, so all typical cert-manager validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The cert-manager IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both cert-manager and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### volcano

# volcano
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/volcano` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/volcano/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A Kubernetes-native batch scheduling system, extending and enhancing the capabilities of the standard kube-scheduler.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`volcano` is comprised of 3 images:

cgr.dev/ORGANIZATION/vc-scheduler
cgr.dev/ORGANIZATION/vc-controller-manager
cgr.dev/ORGANIZATION/vc-webhook-manager

The Chainguard images run as 'non root', whereas the upstream images default to running as 'root'. Only the minimum set of tools and dependencies are installed.

## Getting Started

We can use the [volcano helm chart](https://github.com/volcano-sh/helm-charts) for testing the volcano images. We can create a `values.yaml` that'll override upstream images with Chainguard images.

```yaml
image_registry               : cgr.dev
controller_image_name        : ORGANIZATION/vc-controller-manager
scheduler_image_name         : ORGANIZATION/vc-scheduler
admission_image_name         : ORGANIZATION/vc-webhook-manager
```

Deploy volcano:

```bash
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace -f values.yaml
```

Once deployed, validate the installation by creating a queue:

```
cat <<EOF | kubectl apply -f -
apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: test-queue
spec:
  weight: 1
  capability:
    cpu: "2"
    memory: "2Gi"
EOF
```

Create a job leveraging the queue:

```
cat <<EOF | kubectl apply -f -
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: test-vcjob
  namespace: volcano-system
spec:
  minAvailable: 1
  schedulerName: volcano
  queue: test-queue
  maxRetry: 3
  policies:
    - event: PodEvicted
      action: RestartJob
  tasks:
    - replicas: 1
      name: worker
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: test-container
              # This example uses the Chainguard busybox image for demonstration purposes.
              image: cgr.dev/chainguard/ORGANIZATION/busybox:latest
              command: ["sh", "-c", "echo 'Hello from Volcano' && sleep 10"]
              resources:
                requests:
                  cpu: "100m"
                  memory: "128Mi"
EOF
```

## Documentation and Resources
* [Official Documentation](https://volcano.sh/en/docs/)
* [Getting Started](https://volcano.sh/en/docs/tutorials/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-cluster-operator-iamguarded-fips

# rabbitmq-cluster-operator-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-cluster-operator-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-cluster-operator-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

RabbitMQ Cluster Kubernetes Operator

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `rabbitmq-cluster-operator-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

RabbitMQ Cluster Operator IAMGuarded is a security-enhanced variant of the RabbitMQ Cluster Operator designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides a Kubernetes operator for declarative deployment and management of RabbitMQ clusters with additional security benefits.

## Helm Chart Installation

The RabbitMQ Cluster Operator IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ Cluster Operator image
clusterOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-cluster-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Messaging Topology Operator
msgTopologyOperator:
  image:
    registry: myregistry.example.com
    repository: mirrored/rabbitmq-messaging-topology-operator-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# RabbitMQ image (used by the operator)
rabbitmqImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Credential Updater image
credentialUpdaterImage:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-default-user-credential-updater-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq-cluster-operator oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq-cluster-operator
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/rabbitmq-cluster-operator:2.14.0
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ Cluster Operator IAMGuarded installation by checking the operator pod status and creating a sample RabbitMQ cluster. The operator should be able to successfully provision and manage RabbitMQ clusters using the RabbitmqCluster custom resource.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ Cluster Operator IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-default-user-credential-updater-fips

# rabbitmq-default-user-credential-updater-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-default-user-credential-updater-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-default-user-credential-updater-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal FIPS compliant image with [default-user-credential-updater](https://github.com/rabbitmq/default-user-credential-updater)

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
`rabbitmq-default-user-credential-updater-fips` is comparable to other common base images, like [`alpine`](https://hub.docker.com/_/alpine), [`debian`](https://hub.docker.com/_/debian), or [`ubuntu`](https://hub.docker.com/_/ubuntu), with the following differences:

* Like all other Chainguard Images, `rabbitmq-default-user-credential-updater-fips` features a stripped down, minimal design
* This base image comes with apk and BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs
* It does not run as the root user

## Prerequisites

To use this image, you'll need:

* Access to a Kubernetes cluster
* RabbitMQ Cluster Operator installed in your cluster
* Appropriate RBAC permissions to deploy RabbitMQ clusters

For detailed installation instructions for the RabbitMQ Cluster Operator, refer to the [official documentation](https://github.com/rabbitmq/cluster-operator).

## Getting Started

The `rabbitmq-default-user-credential-updater-fips` image is designed to work seamlessly with the RabbitMQ Cluster Operator. The credential updater automatically manages default user credentials for RabbitMQ clusters, ensuring secure credential rotation and management.

### Basic Usage with RabbitMQ Cluster Operator

To use this image with the RabbitMQ Cluster Operator, set the `DEFAULT_USER_UPDATER_IMAGE` environment variable in the operator deployment:

```sh
cat > kustomization.yaml <<EOF
resources:
- https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
patches:
- patch: |-
    - op: add
      path: "/spec/template/spec/containers/0/env/-"
      value: 
        name: DEFAULT_USER_UPDATER_IMAGE
        value: cgr.dev/ORGANIZATION/rabbitmq-default-user-credential-updater-fips:latest
  target:
    kind: Deployment
    namespace: rabbitmq-system
    name: rabbitmq-cluster-operator
EOF
```

Apply the configuration:

```sh
kustomize build . | kubectl apply -f -
```

## Documentation and Resources

* [RabbitMQ Cluster Operator Documentation](https://github.com/rabbitmq/cluster-operator)
* [Default User Credential Updater Source](https://github.com/rabbitmq/default-user-credential-updater)
* [Chainguard Academy: RabbitMQ Images](https://edu.chainguard.dev/chainguard/chainguard-images/reference/rabbitmq/)
* [FIPS 140-2 Compliance Guide](https://edu.chainguard.dev/chainguard/chainguard-images/fips-images/)
* [Vulnerability Comparison: RabbitMQ](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/rabbitmq/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cloud-provider-aws-fips

# cloud-provider-aws-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cloud-provider-aws-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cloud-provider-aws-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cloud provider for AWS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There is an Helm chart where you could use to deploy the cloud-provider-aws in your Kubernetes cluster. You can find the chart [here](https://cloud-provider-aws.sigs.k8s.io).

But please make sure that you read the prerequisites here: [https://cloud-provider-aws.sigs.k8s.io/prerequisites/)

Here is the command to install the cloud-provider-aws's Helm chart:

```bash
helm repo add aws-cloud-controller-manager https://kubernetes.github.io/cloud-provider-aws
helm repo update

helm upgrade --install aws-cloud-controller-manager aws-cloud-controller-manager/aws-cloud-controller-manager \
  --set image.repository=cgr.dev/ORGANIZATION/cloud-provider-aws-fips \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### ipfs-cluster-fips

# ipfs-cluster-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/ipfs-cluster-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/ipfs-cluster-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Pinset orchestration for IPFS

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Getting Started

To get started with IPFS Cluster, you can use the [docker-compose.yaml](https://github.com/ipfs-cluster/ipfs-cluster/blob/master/docker-compose.yml) file provided in the [IPFS Cluster GitHub repository](https://github.com/ipfs-cluster/ipfs-cluster). This file contains the necessary configuration to run IPFS Cluster in a Docker environment.

To run IPFS Cluster using Docker Compose, follow these steps:

1. **Modify the compose manifest to use Chainguard's image:**:
```bash
services:
  cluster0:
    image: cgr.dev/ORGANIZATION/ipfs-cluster-fips:latest
```

2. **Create an `.env` file** in the root directory of the cloned repository with the following content:
```env
CLUSTER_SECRET=your_secret
```

3. **Run Docker Compose**:
```bash
docker-compose up -d
```

> **NOTE**: You can learn more about the deployment options and configurations in the [IPFS Cluster Deployment documentation](https://ipfscluster.io/documentation/deployment/).

4. **Interact with IPFS Cluster**:
You can use the IPFS Cluster CLI to interact with the cluster. For example, to list peers, you can run:
```bash
ipfs-cluster-ctl peers ls
```

That's it! You now have a running IPFS Cluster instance using the Chainguard Container image.

If you want to enable SSL options for secure communication, you can refer to the [IPFS Cluster documentation on SSL](https://ipfscluster.io/documentation/reference/configuration/#restapi) for detailed instructions on how to set up SSL certificates and configure your cluster accordingly.

## Documentation and Resources

- [IPFS Cluster Documentation](https://ipfscluster.io/documentation/)
- [IPFS Cluster GitHub Repository](https://github.com/ipfs-cluster/ipfs-cluster)
- [Set up server infrastructure with IPFS Cluster](https://docs.ipfs.tech/install/server-infrastructure/#set-up-server-infrastructure-with-ipfs-cluster)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chainguard-base

# chainguard-base
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chainguard-base` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chainguard-base/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image useful as a base for building secure images.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

`chainguard-base` is comparable to other common base images, like [`alpine`](https://hub.docker.com/_/alpine), [`debian`](https://hub.docker.com/_/debian), or [`ubuntu`](https://hub.docker.com/_/ubuntu), with the following differences:

* Like all other Chainguard Images, `chainguard-base` features a stripped down, minimal design
* This base image comes with apk and BusyBox and reports as being a Chainguard image.
* It has few-to-zero CVEs

## Getting Started

The `chainguard-base` image includes a shell and package manager, making it useful for installing an application’s OS-level dependencies. The image will start in a shell by default:

```sh
docker run -it cgr.dev/ORGANIZATION/chainguard-base
```
```
30d670f520ad:/#
```

You can run commands from within the shell like this, or you can run commands directly on your local machine without opening a shell:

```sh
docker run cgr.dev/ORGANIZATION/chainguard-base ps
```
```
PID   USER 	TIME  COMMAND
	1 root  	0:00 ps
```

This image is commonly used in Dockerfiles, as in the following example:

```
FROM cgr.dev/ORGANIZATION/chainguard-base

RUN apk update && apk add redis

ENTRYPOINT ["/usr/bin/redis-server"]
```

This example Dockerfile will update `apk` and install the Redis server onto the base image.

You could use a Dockerfile like this to build a new image:

```sh
docker build -t myredis --progress plain --no-cache .
```
```
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 152B done
#1 DONE 0.0s

#2 [internal] load metadata for cgr.dev/chainguard.edu/chainguard-base:latest
#2 DONE 0.0s

#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s

#4 [1/2] FROM cgr.dev/chainguard.edu/chainguard-base:latest
#4 DONE 0.0s

#5 [2/2] RUN apk update && apk add redis
#5 0.111 fetch https://packages.cgr.dev/extras/x86_64/APKINDEX.tar.gz
#5 5.625 fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
#5 6.824  [https://packages.cgr.dev/extras]
#5 6.824  [https://packages.wolfi.dev/os]
#5 6.824 OK: 87589 distinct packages available
#5 7.139 (1/5) Installing ncurses-terminfo-base (6.5_p20240629-r0)
#5 7.294 (2/5) Installing ncurses (6.5_p20240629-r0)
#5 7.515 (3/5) Installing bash (5.2.37-r1)
#5 7.746 (4/5) Installing posix-libc-utils (2.40-r2)
#5 7.911 (5/5) Installing redis-7.4 (7.4.1-r0)
#5 8.346 OK: 22 MiB in 20 packages
#5 DONE 8.4s

#6 exporting to image
#6 exporting layers 0.0s done
#6 writing image sha256:f7b9c568bce1a0eedc04ed5ee56b3e20669c9d7b2f544d396dff5dd247745a50 done
#6 naming to docker.io/library/myredis2 done
#6 DONE 0.1s
```

Following that, you can run the new image built from the `chainguard-base` image.

```sh
docker run myredis
```

## Configuration

The `chainguard-base` image uses the [ash](https://www.in-ulm.de/~mascheck/various/ash/) shell from BusyBox by default. 

If you need to port a bash and Debian centric entrypoint script to Chainguard Images, you can update your scripts to work in ash. Alternatively, you can install the shell that works with your scripts.

For example:

```sh
docker run -it cgr.dev/ORGANIZATION/chainguard-base
```
```
e9804f9b1ca9:/# echo {1..5}
{1..5}

e9804f9b1ca9:/# apk add bash
fetch https://packages.wolfi.dev/os/aarch64/APKINDEX.tar.gz
(1/3) Installing ncurses-terminfo-base (6.4_p20231125-r1)
(2/3) Installing ncurses (6.4_p20231125-r1)
(3/3) Installing bash (5.2.21-r1)
OK: 20 MiB in 17 packages

e9804f9b1ca9:/# bash

e9804f9b1ca9:/# echo {1..5}
1 2 3 4 5

e9804f9b1ca9:/#
```

Oftentimes, you’ll often need to install extra utilities to provide required dependencies for applications and scripts. These dependencies are likely to have different package names compared to other Linux distributions, so the apk search command can be very useful for finding the package you need.

For example, say you are porting a Dockerfile that uses the `groupadd` command. You could convert this to the BusyBox `addgroup` equivalent, but it’s also perfectly fine to add the `groupadd` utility. The only issue is that there’s no `groupadd` package, so you will have to search for it:

```
e9804f9b1ca9:/# groupadd
/bin/sh: groupadd: not found

e9804f9b1ca9:/# apk add groupadd
ERROR: unable to select packages:
  groupadd (no such package):
	required by: world[groupadd]

e9804f9b1ca9:/# apk update
fetch https://packages.cgr.dev/extras/x86_64/APKINDEX.tar.gz
fetch https://packages.wolfi.dev/os/x86_64/APKINDEX.tar.gz
 [https://packages.cgr.dev/extras]
 [https://packages.wolfi.dev/os]

e9804f9b1ca9:/# apk search groupadd
shadow-4.15.1-r0

e9804f9b1ca9:/# apk add shadow
(1/4) Installing libmd (1.1.0-r1)
(2/4) Installing libbsd (0.12.2-r0)
(3/4) Installing linux-pam (1.6.1-r0)
(4/4) Installing shadow (4.15.1-r0)
OK: 20 MiB in 18 packages

e9804f9b1ca9:/# groupadd
Usage: groupadd [options] GROUP

Options:
  -f, --force               	exit successfully if the group already exists,
                            	and cancel -g if the GID is already used
  -g, --gid GID             	use GID for the new group
  -h, --help                	display this help message and exit
  -K, --key KEY=VALUE       	override /etc/login.defs defaults
  -o, --non-unique          	allow to create groups with duplicate
                            	(non-unique) GID
  -p, --password PASSWORD   	use this encrypted password for the new group
  -r, --system              	create a system account
  -R, --root CHROOT_DIR     	directory to chroot into
  -P, --prefix PREFIX_DIR   	directory prefix
  -U, --users USERS         	list of user members of this group
```

Another useful trick is the `cmd: syntax` for finding packages that provide commands. For example, searching for `ldd` returns multiple results:

```
e9804f9b1ca9:/# apk search ldd
dpkg-dev-1.22.6-r0
nfs-utils-2.6.4-r1
posix-libc-utils-2.39-r1
```

But if you use the `cmd:` syntax it will only return a single result:

```
e9804f9b1ca9:/# apk search cmd:ldd
posix-libc-utils-2.39-r1
```

You can even use the syntax directly in `apk add`:

```
e9804f9b1ca9:/# apk add cmd:ldd
(1/4) Installing ncurses-terminfo-base (6.4_p20231125-r1)
(2/4) Installing ncurses (6.4_p20231125-r1)
(3/4) Installing bash (5.2.21-r1)
(4/4) Installing posix-libc-utils (2.39-r1)
OK: 27 MiB in 22 packages
```

## Documentation and Resources

The following resources provide helpful information on working with Chainguard's base images. Note that some of these resources focus on the `wolfi-base` image — the free-tier alternative to the `chainguard-base` image — but these same principles and practices apply to `chainguard-base`.

* (Blog) [How to use Dockerfiles with wolfi-base images](https://www.chainguard.dev/unchained/how-to-use-dockerfiles-with-wolfi-base-images)
* [Vulnerability Comparison: wolfi-base](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/wolfi-base/)
* [Overview of Migrating to Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migrations-overview/)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### memcached-exporter-iamguarded-fips

# memcached-exporter-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/memcached-exporter-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/memcached-exporter-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A memcached exporter for Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `memcached-exporter-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Memcached Exporter IAMGuarded is the Prometheus metrics exporter component of the Memcached IAMGuarded deployment. This security-enhanced variant is designed to be deployed as part of the Memcached IAMGuarded Helm chart, providing observability for your Memcached instances with additional security benefits.

## Helm Chart Installation

The Memcached Exporter IAMGuarded image is deployed as part of the Memcached IAMGuarded Helm chart, delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached \
  --set "global.org=$ORGANIZATION" \
  --set "metrics.enabled=true"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization. Note that metrics are disabled by default and must be explicitly enabled.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Memcached image
image:
  registry: myregistry.example.com
  repository: mirrored/memcached-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter (this image)
metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/memcached-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install memcached oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached@sha256:DIGEST \
     --set "global.org=$ORGANIZATION" \
     --set "metrics.enabled=true"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/memcached
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/memcached:1.6.38
   Digest: sha256:006bf9154f36313b02ee284e8304194393fc28e9de90ea15e59ec41d9e8e9775
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment with metrics enabled, validate your Memcached Exporter IAMGuarded installation by checking that metrics are exposed on the configured port (default: 9150). The exporter provides standard Prometheus metrics for monitoring your Memcached instances.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Memcached Exporter IAMGuarded component provides security-minded defaults while acknowledging the cluster-specific nature of both Memcached and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### step-cli-fips

# step-cli-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/step-cli-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/step-cli-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-node-exporter

# prometheus-node-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-node-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-node-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus Node Exporter image for exporting node metrics.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Deploy via helm

To deploy the Chainguard image using the community helm chart, you'll first
need to note the digest for the image, and pass, along with the image name,
when deploying:

```bash
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prom-node-exporter prometheus-community/prometheus-node-exporter \
 --set image.registry=cgr.dev \
 --set image.repository=ORGANIZATION/prometheus-node-exporter \
 --set image.digest=[DIGEST]
```

For more detail, please refer to the [Node Exporter documentation](https://github.com/prometheus/node_exporter).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### logstash-iamguarded

# logstash-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/logstash-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/logstash-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Logstash dynamically ingests, transforms, and ships your data regardless of format or complexity.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Logstash IAMGuarded is a security-enhanced variant of Logstash designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Logstash deployments.

## Helm Chart Installation

The Logstash IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/logstash
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install logstash oci://cgr.dev/$ORGANIZATION/iamguarded-charts/logstash \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Logstash image
image:
  registry: myregistry.example.com
  repository: mirrored/logstash-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install logstash oci://cgr.dev/$ORGANIZATION/iamguarded-charts/logstash@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/logstash
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/logstash:7.0.5
   Digest: sha256:228319c8c0872a496471bd888adc895c4c8d259fd72ae7d165da585208bf5670
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Logstash IAMGuarded installation using standard Logstash verification methods. The deployment functions as a standard Logstash instance, so all typical Logstash validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Logstash IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both Logstash and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### argocd-fips

# argocd-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/argocd-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/argocd-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

There are two recommended methods for installing Argo CD: using `helm` and raw manifests. Chainguard's Argo CD Image is designed to be a drop-in replacement for either method.

To use this Image, replace the appropriate `image:` value with the Chainguard Argo CD Image. The following is an example how such a value might appear within a Helm chart:

```yaml
global:
  image:
    repository: cgr.dev/ORGANIZATION/argocd-fips
```

Based on these values, you would install Argo CD using the following `helm` commands. First, add the Argo Helm repository:

```bash
helm repo add argo https://argoproj.github.io/argo-helm
```

Then you can install Argo CD:

```bash
helm install argocd argo/argo-cd \
	--namespace argocd \
	--create-namespace \
	--set global.image.repository="cgr.dev/ORGANIZATION/argocd-fips" \
	--set global.image.tag="latest" \
	--set repoServer.image.repository="cgr.dev/ORGANIZATION/argocd-fips" \
	--set repoServer.image.tag="latest" \
	--set dex.image.repository="cgr.dev/ORGANIZATION/dex-fips" \
	--set dex.image.tag="latest"
```

> NOTE: Setting the tag to `latest` is not recommended, and only shown for illustrative purposes.

### IMPORTANT: Dex FIPS Requirement

**The Chainguard ArgoCD FIPS image MUST be used with the Chainguard Dex FIPS image.** The ArgoCD FIPS binary is dynamically linked and requires FIPS-compliant libraries that are only present in the Chainguard Dex FIPS image. Using the standard Dex image will result in runtime errors.

Required Dex configuration:

```yaml
dex:
  image:
    repository: cgr.dev/ORGANIZATION/dex-fips
    tag: latest  # Use appropriate version tag
```

Optionally, you can also use other Chainguard FIPS Images for complete FIPS compliance:

```yaml
redis:
  image:
    repository: cgr.dev/ORGANIZATION/redis-fips
    tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### k6

# k6
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/k6` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/k6/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Load testing tool for testing APIs, microservices, and websites.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's k6 image is comparable to the [upstream k6 image](https://github.com/grafana/k6) from Grafana. Switching to the Chainguard image should not require any changes to your existing setup. 

## Getting Started
Create and initialize a new script by running the following command:

```
docker run --rm -u $(id -u) -v $PWD:/app -w /app cgr.dev/ORGANIZATION/k6:latest new
```
This command creates a new script file named `script.js` in the current directory. You can also specify a different file name as an argument to the `k6 new` command, for example `k6 new my-test.js`.

Run k6 with the following command:
```
docker run --rm -i cgr.dev/ORGANIZATION/k6:latest run - <script.js
```

> [!NOTE]
> When using the `k6` docker image, the script file will not be available to the container as it runs, meaning that just passing the script name won't work. Instead you must tell k6 to read `stdin` by passing the file name as `-`. Then you pipe the actual file into the container with `<` or equivalent. This will cause the file to be redirected into the container and be read by k6.

## Documentation and Resources
- [Run k6 scripts with TestRun CRD](https://grafana.com/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/)
- [Running k6](https://grafana.com/docs/k6/latest/get-started/running-k6/)
- [Using k6](https://grafana.com/docs/k6/latest/using-k6/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### gradle-fips

# gradle-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/gradle-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/gradle-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Tags and FIPS specific notes

The tags are in the form of `<GRADLE_VERSION>-jdk<OPENJDK_VERSION>[-dev]`, such that one can track `8-jdk21` for Gradle 8.x.x with OpenJDK 21.

The `-dev` variants contain jmods, thus suitable to use jlink.

Note, exclude bc-fips.jars `/usr/share/java/bouncycastle-fips/` module-path from jlink, as jlink is unable to link signed jars. Instead ensure that `--module-path=/usr/share/java/bouncycastle-fips` is used at runtime, with such path copied from either this image, or `jdk-fips` or `jre-fips` images.

OpenJDK 8 is not currently supported for FIPS, thus with this image, one must target at least JDK 11 during build.

Please see specification tab for the extra variables set to ensure Gradle and Java are operating in FIPS mode.

Note, currently regression is present in gradle v8.11 which is
preventing upgrades to v8.11+ builds.

## Using gradle

Chainguard gradle images come with different versions of OpenJDK, ensure you choose the correct image tag for your application needs.  In these examples we will use a Chainguard gradle image based on OpenJDK 11.

__NOTE__: if you are running Docker on Mac M1 you may experience intermittent container high CPU and container / JVM crashes.  There have been [reports](https://github.com/metanorma/metanorma-docker/issues/126) of this behaviour and also affects non Chainguard images.  It is expected that using `arm` based images will address the problem which is in development for Chainguard images.  When running the examples below you might experience gradle builds hanging.  If you do, you can `docker ps` and `docker kill $PID` and retry.  This is not an ideal experience and will be improved.

Check the gradle version
```
 % docker run gradle-fips --version

Welcome to Gradle 8.0.1-20230224000000+0000!

Here are the highlights of this release:
 - Improvements to the Kotlin DSL
 - Fine-grained parallelism from the first build with configuration cache
 - Configurable Gradle user home cache cleanup

------------------------------------------------------------
Gradle 8.0.1-20230224000000+0000
------------------------------------------------------------

Build time:   2023-02-24 00:00:00 UTC
Revision:     68959bf76cef4d28c678f2e2085ee84e8647b77a

Kotlin:       1.8.10
Groovy:       3.0.13
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          11.0.18-internal (wolfi 11.0.18-internal+0-wolfi-r1)
OS:           Linux 5.15.49-linuxkit aarch64
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4454

# request-4454
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4454` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4454/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wasmer

# wasmer
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wasmer` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wasmer/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This image contains the `wasmer` tool which can be used to compile or run wasm binaries.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### clickhouse-keeper

# clickhouse-keeper
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/clickhouse-keeper` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/clickhouse-keeper/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

ClickHouse Keeper is a distributed coordination service that provides a ZooKeeper-compatible API for managing ClickHouse clusters. It handles distributed consensus, configuration management, and leader election using the Raft algorithm.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Chainguard's ClickHouse Keeper container image is comparable to the [official ClickHouse Keeper image](https://hub.docker.com/r/clickhouse/clickhouse-keeper). Like most other Chainguard container images, the ClickHouse Keeper image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

ClickHouse Keeper provides a ZooKeeper-compatible API and uses the Raft consensus algorithm for distributed coordination. It's designed as a modern replacement for ZooKeeper in ClickHouse clusters.

**Important:** ClickHouse Keeper is bundled into the main ClickHouse server binary. When deploying with [ClickStack](https://github.com/hyperdxio/helm-charts/tree/main/charts/clickstack) (the recommended upstream Helm chart), ClickHouse Keeper is deployed using the bundled binary from the main ClickHouse image, so this separate ClickHouse Keeper image is not needed.

This separate ClickHouse Keeper image is only needed if you are using the [Altinity ClickHouse Helm chart](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse), which deploys ClickHouse Keeper as a separate component with its own dedicated image.

## Getting Started

### Docker Usage

ClickHouse Keeper is typically deployed as a cluster of 3 or more nodes for high availability. For testing purposes, you can run a single node:

```sh
docker run -d --rm --name clickhouse-keeper \
  -p 9181:9181 \
  cgr.dev/ORGANIZATION/clickhouse-keeper:latest
```

The default ports for ClickHouse Keeper are:
- `9181`: Client connections (ZooKeeper-compatible API)
- `9444`: Raft protocol communication between keeper nodes

### Kubernetes Deployment

Deploy using the [Altinity ClickHouse Helm chart](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse):

```sh
helm repo add clickhouse https://helm.altinity.com
helm repo update
```

Create a `values.yaml` file to use the Chainguard ClickHouse Keeper image:

```yaml
keeper:
  enabled: true
  image:
    repository: cgr.dev/ORGANIZATION/clickhouse-keeper
    tag: latest
```

Deploy the ClickHouse cluster with Keeper:

```sh
helm install clickhouse clickhouse/clickhouse -f values.yaml
```

For more details on ClickHouse Keeper configuration with the Altinity Helm chart, see the [chart documentation](https://github.com/Altinity/helm-charts/tree/main/charts/clickhouse).

### Verifying ClickHouse Keeper

You can verify the Keeper cluster is functioning by using the `clickhouse-keeper-client` tool:

```sh
kubectl exec -it <keeper-pod-name> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "ls /"
```

To test data replication across the cluster:

```sh
# Write data on one node
kubectl exec -it <keeper-pod-0> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "create /test-data 'test-value'"

# Read data from another node
kubectl exec -it <keeper-pod-1> -- \
  clickhouse-keeper-client --host 127.0.0.1 --port 9181 \
  --query "get /test-data"
```

When using the `clickhouse-keeper-client` tool with this image, note that the history file feature requires a writable directory. Use the `--history-file` flag to specify a location or disable it:

```bash
clickhouse-keeper-client --history-file=/dev/null --host 127.0.0.1 --port 2181 --query "ls /"
```

## Documentation and Resources

- [ClickHouse Keeper Official Documentation](https://clickhouse.com/docs/en/guides/sre/keeper/clickhouse-keeper)
- [Altinity ClickHouse Operator Documentation](https://github.com/Altinity/clickhouse-operator/tree/master/docs)
- [ClickHouse Keeper Configuration Reference](https://clickhouse.com/docs/en/operations/clickhouse-keeper)
- [Disaster Recovery Guide](https://clickhouse.com/docs/guides/sre/keeper/clickhouse-keeper#recovering-after-losing-quorum)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### buck2

# buck2
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/buck2` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/buck2/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [buck2](https://buck2.build) build system binaries and toolchain.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The default entrypoint is set to the `buck` binary, and a default C/C++ toolchain is installed in the image.

```
docker run cgr.dev/chainguard/buck2:latest
buck2 8cb388050e28f9386ccc2458d6dcf55137e2f3b13008b2a13000994b38c496db <local>
A build system

Documentation: https://buck2.build/docs/

USAGE:
    buck2 [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help
            Print help information

        --isolation-dir <ISOLATION_DIR>
            Instances of Buck2 share a daemon if and only if their isolation directory is identical.
            The isolation directory also influences the output paths provided by Buck2, and as a
            result using a non-default isolation dir will cause cache misses (and slower builds)

            [env: BUCK_ISOLATION_DIR=]
            [default: v2]

    -v, --verbose <NUMBER>
            How verbose buck should be while logging. Values: 0 = Quiet, errors only; 1 = default; 2
            = more info about errors; 3 = more info about everything

            [default: 1]

    -V, --version
            Print version information

SUBCOMMANDS:
    aquery
            Perform queries on the action graph (experimental)
    audit
            Perform lower level queries
    build
            Build the specified targets
    bxl
            Run BXL scripts
    clean
            Delete generated files and caches
    cquery
            Perform queries on the configured target graph
    ctargets
            Resolve target patterns to configured targets
    docs
            Print documentation of specified symbols
    help
            Print this message or the help of the given subcommand(s)
    init
            Initialize a buck2 project
    install
            Build and install an application
    kill
            Kill the buck daemon
    killall
            Kill all buck2 processes on the machine
    log
            Commands for interacting with buck2 logs
    lsp
            Start an LSP server for starlark files
    profile
            Profiling mechanisms
    query
            Alias for `uquery`
    rage
            Record information about the previous failed buck2 command
    root
            Find buck cell, project or package root
    run
            Build and run the selected target
    server
            Start, query, and control the http server
    starlark
            Run Starlark operations
    status
            Buckd status
    subscribe
            Subscribe to updates from the Buck2 daemon
    targets
            Show details about the specified targets
    test
            Build and test the specified targets
    uquery
            Perform queries on the unconfigured target graph
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rstudio-fips

# rstudio-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rstudio-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rstudio-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### celeborn

# celeborn
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/celeborn` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/celeborn/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Celeborn is dedicated to improving the efficiency and elasticity of different map-reduce engines and provides an elastic, high-efficient management service for intermediate data including shuffle data, spilled data, result data, etc. Currently, Celeborn is focusing on shuffle data.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image is comparable to the [apache/celeborn](https://hub.docker.com/r/apache/celeborn) image available from Docker Hub. Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started

### Helm

You can use the [official Celeborn Helm chart](https://github.com/apache/celeborn/tree/main/charts/celeborn) and replace the image data in `values.yaml` with the Chainguard image to install Celeborn.

Use the following `values.yaml` file to configure the Helm chart:

```yaml
image:
  registry: cgr.dev
  repository: ORGANIZATION/celeborn
  tag: latest
```

Install the `celeborn` chart with your custom `values.yaml` file:

```bash
git clone https://github.com/apache/celeborn.git
cd celeborn
helm install celeborn charts/celeborn -n celeborn --create-namespace --values values.yaml

NAME: celeborn
LAST DEPLOYED: <DATE>
NAMESPACE: celeborn
STATUS: deployed
REVISION: 1
TEST SUITE: None
```

## Documentation and Resources

* [Official celeborn repository](https://github.com/apache/celeborn).
* [Celeborn overview and deployment guide](https://celeborn.apache.org/docs/latest/deploy/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### wave

# wave
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/wave` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/wave/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Wave watches Deployments within a Kubernetes cluster and ensures that each Deployment's Pods always have up to date configuration.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Warning

Starting from versions [v0.6.0](https://github.com/wave-k8s/wave/releases/tag/v0.6.0), [wave](https://github.com/wave-k8s/wave) project add [supports](https://github.com/wave-k8s/wave/pull/145) for `go1.22` with Kubernetes `v1.29`.

If you are using older versions of Kubernetes, please note that the latest version of wave may or may not be compatible with your Kubernetes version.

If you notice any behavioral changes or issues between your version of wave vs the latest Chainguard image, please [file an issue](https://github.com/wave-k8s/wave/issues/new) on the upstream repository.

## Usage

You can deploy the wave with the Helm:

```shell
helm repo add wave-k8s https://wave-k8s.github.io/wave/
helm update
helm install wave wave-k8s/wave \
  --namespace wave \
	--create-namespace \
	--set image.repository="cgr.dev/chainguard/wave" \
	--set image.tag="latest" \
```

Find more on the [Helm Chart values](https://github.com/wave-k8s/wave/tree/master/charts/wave)!

Please follow upstream [documentation](https://wave-k8s.github.io/wave) for usage and configuration.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### duckdb

# duckdb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/duckdb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/duckdb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

DuckDB is an analytical in-process SQL database management system.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Image for `duckdb` is meant to serve as a drop-in replacement for [datacatering/duckdb image from Docker Hub](https://hub.docker.com/r/datacatering/duckdb). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

## Getting Started

To use Chainguard's DuckDB image, you can pass an SQL query as an argument to the image:

```shell
docker run --rm k3d-k3d.localhost:5005/duckdb:latest :memory: "SELECT 'foo' AS bar;"
```
```Output
┌─────────┐
│   bar   │
│ varchar │
├─────────┤
│ foo     │
└─────────┘
```

## Documentation and Resources

You can refer to the official [CLI API documentation](https://duckdb.org/docs/api/cli/overview.html) for more information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kafka-iamguarded

# kafka-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kafka-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kafka-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Apache Kafka distributed event store and stream-processing platform, compatible with iamguarded charts

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

Kafka IAMGuarded is a security-enhanced variant of Kafka designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Kafka deployments.

## Helm Chart Installation

The Kafka IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/kafka
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main Kafka image
image:
  registry: myregistry.example.com
  repository: mirrored/kafka-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag

externalAccess:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded
    digest: sha256:... # Use specific digest instead of tag

metrics:
  jmx:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/jmx-exporter-iamguarded
      digest: sha256:... # Use specific digest instead of tag

defaultInitContainers:
  volumePermissions:
    enabled: true
    image:
      registry: myregistry.example.com
      repository: mirrored/os-shell-iamguarded
      digest: sha256:... # Use specific digest instead of tag
  autodiscovery:
    image:
      registry: myregistry.example.com
      repository = mirrored/kubectl-iamguarded
      digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install kafka oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/kafka
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/kafka:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```
   
   Digest value for illustrative purposes only.

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Kafka IAMGuarded installation using standard Kafka verification methods. The deployment functions as a standard Kafka instance, so all typical Kafka validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### python

# python
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/python` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/python/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal Python image based on Wolfi.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Description

The `python` Chainguard Image provides a minimal Python runtime suitable for workloads such as web applications, CLI utilities, interfacing with APIs, or other tasks.

## Variants

We have two image variants available:

- A `python:latest-dev` variant that contains the `pip`, `uv`, and `apk` package managers and the `bash`, `ash`, and `sh` shells.
- A minimal runtime variant that removes shells and package managers for additional security.

To pull the minimal runtime variant from `cgr.dev`:

```sh
docker pull cgr.dev/chainguard/python:latest
```
To pull the dev variant:

```sh
docker pull cgr.dev/chainguard/python:latest-dev
```

## Usage Notes

The entrypoint for the `python` Chainguard Image is `/usr/bin/python`. Commands run as part of `docker run` or a `CMD` statement in a Dockerfile will be passed as arguments to `python`.

To access the shell in the `python:latest-dev` image, you'll need to include an `--entrypoint` option, as in the following example.

```sh
docker run -it --entrypoint /bin/bash chainguard/python:latest-dev
```

Also note that the `python` image uses the `nonroot` user by default. To perform operations such as installing packages with `apk`, run the image as root.

```sh
docker run -it --user root --entrypoint /bin/bash chainguard/python:latest-dev
```

We recommend against using the root user in a production environment.

## Packages

If you require additional packages that can be installed with the `pip` package manager, we recommend using a multistage build. This process involves installing packages in a virtual environment using the `latest-dev` variant, then copying this environment over to the minimal runtime image. 

The following is a minimal example of a Dockerfile that uses a multistage build to run an `app.py` script after installing dependencies listed in a `requirements.txt` file.

```Dockerfile
# syntax=docker/dockerfile:1

FROM cgr.dev/chainguard/python:latest-dev as dev

WORKDIR /app

RUN python -m venv venv
ENV PATH="/app/venv/bin":$PATH
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

FROM cgr.dev/chainguard/python:latest

WORKDIR /app

COPY app.py app.py
COPY --from=dev /app/venv /app/venv
ENV PATH="/app/venv/bin:$PATH"

ENTRYPOINT ["python", "app.py"]
```

For a more complete example, see [Getting Started with the Python Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/python/) on Chainguard Academy.

## Resources

- [Getting Started with the Python Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/python/)
- [Migrating to Python Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migrating-python/)
- [Updating a Python Microservice for Chainguard Images](https://edu.chainguard.dev/chainguard/migration/porting-apps-to-chainguard/#updating-the-python-microservice)
- [Debugging Distroless Images](https://edu.chainguard.dev/chainguard/chainguard-images/debugging-distroless-images/)
- [Blog Post: Securely Containerize a Python Application with Chainguard Images](https://dev.to/chainguard/securely-containerize-a-python-application-with-chainguard-images-bn8)
- [Video: How to containerize a Python application with a multi-stage build using Chainguard Images](https://www.youtube.com/watch?v=2D0JULd4E5A)
- [Learning Lab: Deploying a Flask App with Python and nginx Chainguard Images](https://www.youtube.com/watch?v=i6bDKplnp6I)

## Get this image as a Chainguard VM

This image is also available as a Chainguard VM, available to deploy on Amazon AWS EC2, Google Cloud Compute Engine, Microsoft Azure and On-Prem through VMware, KVM and QEMU virtualization. Complete our [registration form](https://get.chainguard.dev/vmearlyaccesswaitlist?utm_source=readmes) to get access to Chainguard VMs and try it out for yourself.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-2773

# request-2773
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-2773` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-2773/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### keycloak-fips

# keycloak-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/keycloak-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/keycloak-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Disclaimer

This image is equipped with the essential components for Keycloak to operate in
FIPS mode. However, it's important for users to ensure they use it in line with
FIPS compliance standards.

This includes tasks such as keystore generation, configuration, and launching
Keycloak with the correct configuration parameters. More guidance is provided in
the sections below.

## Keystore

Keycloak requires a bcfips-compatible keystore to manage its SSL/TLS
certificates.

Although Keycloak supports various keystore types, only BCKFS offers the
capability to operate in approved _(strict)_ mode under FIPS standards, ensuring
only approved ciphers are used.

### BCKFS Keystore creation

To create keystore in BCKFS format you can use keytool from this image like so:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/chainguard-private/keycloak-fips \
  -v -keystore /tmp/keystore/server.keystore \
  -storetype bcfks \
  -providername BCFIPS \
  -alias "localhost" \
  -genkeypair -sigalg SHA512withRSA -keyalg RSA \
  -dname CN="localhost" \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
  -keypass "<YOUR TLS KEY PASSWORD, can be the same>"
```

To view the keystore
```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/chainguard-private/keycloak-fips \
  -v -keystore /tmp/keystore/server.keystore \
  -list \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>"
```

### BCKFS Truststore creation

To create a truststore and import and trust an existing CA certificate you can also use keytool:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/chainguard-private/keycloak-fips \
  -v -keystore /tmp/keystore/truststore.bckfs \
  -storetype bcfks \
  -providername BCFIPS \
  -import -file /tmp/keystore/MyCA.crt \
  -storepass "<YOUR TRUSTSTORE PASSWORD>" \
  -trustcacerts \
  -noprompt
```

When using keytool you may need to set the environment variable
`JAVA_TOOL_OPTIONS` to set the `--module-path` as documented in section 2.1.1
in the [Bouncy Castle FIPS Java API User
Guide](https://downloads.bouncycastle.org/fips-java/docs/BC-FJA-UserGuide-2.0.0.pdf):

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/chainguard-private/keycloak-fips \
  -e JAVA_TOOL_OPTIONS="--module-path=/usr/share/java/bouncycastle-fips -Djava.class.path=/usr/share/java/bouncycastle-fips/bc-fips.jar" \
  ...
```

To use a truststore in a keycloak container configure it using `javax.net.ssl` properties:

```bash
JAVA_OPTS="-Djavax.net.ssl.trustStore=/tmp/keycloak.truststore.jks -Djavax.net.ssl.trustStorePassword=<YOURTRUSTSTOREPASSWORD>"
```

** Note on `--truststore-paths` **

Currently it is not possible to use the `--truststore-paths` option when using `--features=fips
--fips-mode=strict`, see this [issue](https://github.com/keycloak/keycloak/issues/28526)

## Run image

> This image aligns with the original
> [upstream image](https://quay.io/repository/Keycloak/Keycloak?tab=info) regarding
> its entrypoint and command-line arguments. Also see the
> Keycloak [GitHub repository](https://github.com/Keycloak/Keycloak/tree/main),
and the [KeyCloak FIPS documentation](https://www.Keycloak.org/server/fips).

### Running in development mode

Example of launching Keycloak in `development` mode, with HTTP enabled and
strict hostname resolution not enforced:

```bash
docker run -v $(pwd)/server.keystore:/usr/share/java/keycloak/conf/server.keystore \
  --rm --name local-Keycloak -p 8080:8080 \
  -e KEYCLOAK_ADMIN=admin \
  -e KEYCLOAK_ADMIN_PASSWORD='<PASSWORD-FOR-ADMIN-USER>' \
    <YOUR-REGISTRY>/keycloak-fips:latest \
    start-dev \
      --features=fips \
      --fips-mode=strict \
      --https-key-store-password='<KEYSTORE-PASSWORD>' \
      --hostname=localhost \
      --log-level='INFO,org.keycloak.common.crypto:TRACE,org.keycloak.crypto:TRACE'
```

In this example, the Keycloak UI is accessible via:
[http://localhost:8080](http://localhost:8080).

### Running in production mode

Example of running Keycloak in `production` mode, enforcing the use of HTTPS
and requiring a hostname to be provided:

```bash
docker run -v /local/path/to/server.keystore:/usr/share/java/keycloak/conf/server.keystore \
  --rm --name local-Keycloak -p 8443:8443 \
  -e KEYCLOAK_ADMIN=admin \
  -e KEYCLOAK_ADMIN_PASSWORD='<PASSWORD-FOR-ADMIN-USER>' \
  	cgr.dev/chainguard/Keycloak-fips:latest \
  	start \
      --features=fips \
      --fips-mode=strict \
      --https-key-store-password='<KEYSTORE-PASSWORD>' \
      --hostname=localhost \
      --log-level='INFO,org.keycloak.common.crypto:TRACE,org.keycloak.crypto:TRACE'
```

In this example, the Keycloak UI is accessible via:
[https://localhost:8443](https://localhost:8443).

### FIPS validation

You'll see debug logs such as the below if Keycloak is running in FIPS mode:

```bash
KC(BCFIPS version 1.000204 Approved Mode) version 1.0 - class org.Keycloak.crypto.fips.KeycloakFipsSecurityProvider,
 BCFIPS version 1.000204 - class org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
```

Additionally, you can check bcfips is enforcing minimum password lengths, by
running the container with a non-compliant admin password, such as `1234`:

```bash
Caused by: org.bouncycastle.crypto.fips.FipsUnapprovedOperationError:
password must be at least 112 bits
```

## Customizing the image

Keycloak provides a mechanism to configure and customize the image. This process
is outlined in the [Keycloak image documentation](https://github.com/Keycloak/Keycloak/blob/main/docs/guides/server/containers.adoc).

There are subtle differences in the executable paths used in the Chainguard
image. Below is the example copied from the documentation, updated with the
correct paths:

```bash
FROM cgr.dev/chainguard/Keycloak-fips:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /usr/share/java/Keycloak

# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /usr/share/java/Keycloak/bin/kc.sh build

FROM cgr.dev/chainguard/Keycloak-fips:latest
COPY --from=builder /usr/share/java/Keycloak/ /usr/share/java/Keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/usr/share/java/Keycloak/bin/kc.sh"]
```

## Debugging

#### Invalid Keystore Format with BCFKS in `production` mode

**Error Message**:
```bash
# kc.sh start --features=fips --hostname=localhost --https-key-store-password='**********'
ERROR: Failed to start server in (production) mode
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: Invalid keystore format
```
**Solution:**
BCFKS Keystores default to strict mode, and it's likely you omitted
`--fips-mode=strict` in your arguments. If you wish to run in non-strict mode
with BCFKS, you need to include `--https-key-store-type=bcfks`.

This is called out in the [official documentation](https://www.keycloak.org/server/fips),
but perhaps could benefit from additional clarification.

#### Keystore corrupted error upon launch

**Error Message**:
```bash
ERROR: Unable to start HTTP server
ERROR: java.io.IOException: BCFKS KeyStore corrupted: MAC calculation failed.
ERROR: BCFKS KeyStore corrupted: MAC calculation failed.
```

**Solution:**
The error indicates that a Keystore was detected, but there was an issue
parsing it. Usually this means that the password used to create the keystore
does not match what was provided as the `--https-key-store-password` argument
to Keycloak.

#### Key material not provided error in `production` mode

**Error Message**:
```bash
ERROR: Failed to start server in (production) mode
ERROR: Key material not provided to setup HTTPS. Please configure your
keys/certificates or start the server in development mode.
```

**Solution:**
This error usually indicates that a `.keystore` was not detected in the
`/usr/share/java/keycloak/conf` directory. Ensure you have created a Keystore
and it is accessible to the container in the expected directory.

#### Password must be at least 112 bits

**Error Message**:
```bash
Failed to add user '<admin-user>' to realm 'master': org.keycloak.models.ModelException:
password must be at least 112 bits
FipsUnapprovedOperationError: password must be at least 112 bits
```

**Solution:**
This is expected whenever Keycloak is running in `strict` (approved) mode for
FIPS. Choose a longer admin password which is compliant. Refer to the Keycloak
FIPS [documentation](https://www.keycloak.org/server/fips) for more information.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-admission-webhook-fips

# prometheus-admission-webhook-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-admission-webhook-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-admission-webhook-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### liberica-jdk

# liberica-jdk
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/liberica-jdk` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/liberica-jdk/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Free and open source Progressive Java Runtime for modern Java deployments

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The `liberica-jdk` image is a production-ready distribution of [OpenJDK provided by Liberica](https://bell-sw.com/libericajdk/). This image is part of the Chainguard Images collection, which are minimal, regularly-updated container images designed with security in mind. The image can be pulled from `cgr.dev` and is suitable for use in various environments, including production.

## Getting Started

To test the `liberica-jdk` image, start by pulling the image:

```sh
docker pull cgr.dev/ORGANIZATION/liberica-jdk:latest
```

Replace `ORGANIZATION` with your organization's name.

Next, run a container using the image you just downloaded:

```sh
docker run -it --rm cgr.dev/ORGANIZATION/liberica-jdk:latest java -version
```

This command will start a container and display the Java version to verify that the image is working correctly.

Create a simple Java application, for example, `HelloWorld.java`:

```java
    public class HelloWorld {
         public static void main(String[] args) {
              System.out.println("Hello, World!");
         }
    }
```

Then compile and run the application inside the container:

```shell
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/liberica-jdk:latest javac HelloWorld.java
docker run -it --rm -v $(pwd):/workspace -w /workspace cgr.dev/ORGANIZATION/liberica-jdk:latest java HelloWorld
```
You should see the output `Hello, World!`, indicating that the image can compile and run Java applications.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### openresty

# openresty
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/openresty` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/openresty/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenResty is a high Performance Web Platform Based on Nginx and LuaJIT.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To start an OpenResty container with this image, you can use the following command:

```sh
docker run --name openresty -p 80:80 cgr.dev/chainguard/openresty
```

This will start OpenResty in non-daemon mode with the openresty's default Nginx [configuration file](https://github.com/openresty/docker-openresty/blob/master/nginx.conf).

To adhere to stricter security guidelines, in Chainguard's OpenResty image, the default locations for writable files are moved as follows:
- logs: `/var/log/openresty/`
- `nginx.conf`: `/etc/nginx/nginx.conf`
- `default.conf`: `/etc/nginx/conf.d/default.conf`
- `*_temp` directories: `/var/run/openresty/`

### Configuration

You can mount your custom configuration files to the container.

```sh
docker run --name openresty -p 80:80 -v /path/to/your/nginx.conf:/etc/nginx/nginx.conf cgr.dev/chainguard/openresty
```

For more information, refer to the official [OpenResty documentation](https://openresty.org/en/) and the [OpenResty image documentation](https://github.com/openresty/docker-openresty/tree/master).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-collector-contrib-fips

# opentelemetry-collector-contrib-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-collector-contrib-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-collector-contrib-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with [opentelemetry-collector-contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib).

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using this image

Chainguard cgr.dev/chainguard/opentelemetry-collector-contrib-fips is a FIPS-enabled drop in replacement for the upstream image, tested using the community [helm chart](https://opentelemetry.io/docs/kubernetes/helm/collector/).

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set mode=<daemonset|deployment|statefulset> \
   --set image.repository=cgr.dev/chainguard/opentelemetry-collector-contrib-fips \
   --set image.tag=latest
```

To use custom configuration it is easier to use a values.yaml file:

```yaml
mode: daemonset
configMap:
  create: false
image:
  tag: latest
  repository: cgr.dev/chainguard/opentelemetry-collector-contrib-fips
command:
  extraArgs:
    - "--config=/conf/custom-config.yaml"
extraVolumeMounts:
  - name: "custom-vm"
    mountPath: "/conf"
extraVolumes:
  - name: "custom-vm"
    configMap:
      name: "custom"
```

```bash
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install open-telemetry opentelemetry/opentelemetry-collector --namespace open-telemetry-custom-config -f values.yaml
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### db-operator-fips

# db-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/db-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/db-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The DB Operator creates databases and make them available in the cluster via Custom Resource.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard `db-operator-fips` image is FIPS-compliant and meant to serve as a drop-in replacement for the [official db-operator image](https://ghcr.io/db-operator/db-operator:latest). Switching to Chainguard `db-operator-fips` image should not require any changes to your existing setup. 
The image is completely compatible with [official Helm chart for db-operator](https://db-operator.github.io/charts)

### FIPS Support
The `db-operator-fips` Chainguard Image ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/)

## Getting Started
`db-operator-fips` can be deployed using Official Helm chart:

db-operator Deployments need certmanager CRDs to set up:
```
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
```

Deploy using helm by overriding with Chainguard `db-operator-fips` image:
Use the following `values.yaml` file to configure the Helm chart.
```yaml
image:
  repository: cgr.dev/ORGANIZATION/db-operator-fips
  tag: latest
```

Deploy the Helm chart:
```shell
helm repo add db-operator https://db-operator.github.io/charts
helm repo update
helm install db-operator db-operator/db-operator \
  --values values.yaml
```

Apply relevant CRDs based on use case:
```
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_databases.yaml
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_dbusers.yaml
kubectl apply -f https://raw.githubusercontent.com/db-operator/db-operator/main/config/crd/bases/kinda.rocks_dbinstances.yaml
```

The operator should be ready to use in the environment.

## Documentation and Resources
For full instructions on this image, refer to [official repository for db-operator](https://github.com/db-operator/db-operator). Other resourceful content:
- [How it works](https://github.com/db-operator/db-operator/blob/main/docs/howitworks.md)
- [Examples](https://github.com/db-operator/db-operator/tree/main/examples)
- [Configuration and Setup Docs](https://github.com/db-operator/db-operator/tree/main/docs)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### pvc-autoresizer-fips

# pvc-autoresizer-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/pvc-autoresizer-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/pvc-autoresizer-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

pvc-autoresizer is a Kubernetes controller that monitors persistent volume claims (PVCs) and automatically resizes them based on usage metrics collected from Prometheus.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
This image provides a secure and minimal environment for running the `pvc-autoresizer controller`. It maintains functional parity with the upstream [pvc-autoresizer](https://github.com/topolvm/pvc-autoresizer/tree/main) image and is compatible with Kubernetes environments where it monitors persistent volume claims (PVCs) and automatically
resizes them based on usage metrics collected from Prometheus. Switching to the Chainguard image should not require changes to your existing Kubernetes setup.

### FIPS Support

The `pvc-autoresizer-fips` Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

The easiest way to deploy this image is with the [pvc-autoresizer Helm Chart](https://github.com/topolvm/pvc-autoresizer/tree/main/charts/pvc-autoresizer).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/pvc-autoresizer-fips
  pullPolicy: IfNotPresent
  tag: "latest"
```

Then, deploy the `pvc-autoresizer` using helm

```shell
helm repo add pvc-autoresizer https://topolvm.github.io/pvc-autoresizer/
helm install --create-namespace --namespace pvc-autoresizer pvc-autoresizer pvc-autoresizer/pvc-autoresizer -f values.yaml
```

### Documentation and Resources:

For more information, please refer to [the official documentation for pvc-autoresizer](https://github.com/topolvm/pvc-autoresizer/tree/main).
- [pvc-autoresizer Github Repository](https://github.com/topolvm/pvc-autoresizer/tree/main)
- [pvc-autoresizer Exporter Helm Chart](https://github.com/topolvm/pvc-autoresizer/tree/main/charts/pvc-autoresizer)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### newrelic-prometheus

# newrelic-prometheus
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/newrelic-prometheus` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/newrelic-prometheus/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal [newrelic-prometheus](https://github.com/newrelic/nri-prometheus) container image.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

These images are a drop-in replacement for the `newrelic` project. The images are tested against the upstream recommended [`nri-bundle`](https://github.com/newrelic/helm-charts/tree/master/charts/nri-bundle). chart.

A minimum sample of the `values.yaml` required to replace the installation with Chainguard Images is below:

> Note that `latest` is used below for brevity. In long term deployments this is discouraged.

```yaml
# minimal-values.yaml
global:
  cluster: $CLUSTER_NAME
  licenseKey: $LICENSE_KEY

newrelic-infrastructure:
  images:
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-infrastructure-bundle
      tag: latest
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-nri-kubernetes
      tag: latest

nri-prometheus:
  enabled: true
  image:
    registry: cgr.dev
    repository: chainguard/newrelic-nri-prometheus
    tag: latest

nri-kube-events:
  enabled: true
  images:
    integration:
      registry: cgr.dev
      repository: chainguard/newrelic-kube-events
      tag: latest
    agent:
      registry: cgr.dev
      repository: chainguard/newrelic-k8s-events-forwarder
      tag: latest

newrelic-logging:
  enabled: true
  image:
    repository: cgr.dev/chainguard/newrelic-fluent-bit-output
    tag: latest

newrelic-prometheus-agent:
  enabled: true
  images:
    configurator:
      registry: cgr.dev
      repository: chainguard/newrelic-prometheus-agent
      tag: latest
    prometheus:
      registry: cgr.dev
      repository: chainguard/prometheus
      tag: latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### prometheus-statsd-exporter

# prometheus-statsd-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/prometheus-statsd-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/prometheus-statsd-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based Prometheus StatsD Exporter image for exporting metrics to StatsD.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

This image provides a secure, minimal environment for running the Prometheus StatsD Exporter. It maintains functional parity with the upstream [prometheus-statsd-exporter](https://github.com/prometheus/statsd_exporter) image and is compatible with Prometheus and standard StatsD clients. Switching to the Chainguard image should not require changes to your existing Kubernetes setup, provided the StatsD UDP port (default: 9125) and Prometheus metrics endpoint (default: 9102) are correctly configured and accessible.

## Getting Started

The easiest way to deploy this image is with the [prometheus-statsd-exporter Helm Chart](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-statsd-exporter).

You can override the image by setting the following values in a `values.yaml` file.

```yaml
image:
  repository: cgr.dev/ORGANIZATION/prometheus-statsd-exporter
  tag: "latest"
```
Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the prometheus-statsd-exporter using helm

```shell
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-statsd-exporter prometheus-community/prometheus-statsd-exporter -f values.yaml
```

Check that the pods are running
```shell
kubectl get pods -n default
NAME                                          READY   STATUS    RESTARTS   AGE
prometheus-statsd-exporter-56cffb4694-52p5x   1/1     Running   0          17m
```

Also you can check the logs of container
```shell
kubectl logs prometheus-statsd-exporter-56cffb4694-52p5x
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:296 msg="Starting StatsD -> Prometheus Exporter" version="(version=0.28.0, branch=HEAD, revision=c0a390a2c43f77863278615b47d46e886bdca726)"
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:297 msg="Build context" context="(go=go1.23.2, platform=linux/amd64, user=root@783240c1e627, date=20241025-13:53:47, tags=unknown)"
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:346 msg="Accepting StatsD Traffic" udp=:9125 tcp=:9125 unixgram=""
time=2025-04-15T14:59:38.748Z level=INFO source=main.go:347 msg="Accepting Prometheus Requests" addr=:9102
```

## Documentation and Resources:

For more information, please refer to [the official documentation for StatsD Exporter project](https://github.com/prometheus/statsd_exporter).
- [Prometheus StatsD Exporter Github Repository](https://github.com/prometheus/statsd_exporter)
- [StatsD Exporter Helm Chart](https://prometheus-community.github.io/helm-charts/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### weaviate

# weaviate
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/weaviate` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/weaviate/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal container image for running the weaviate vector database.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image should be a drop-in replacement for the upstream `weaviate` image.

Note that this image does not include a config file by default, and one is required to start the server.
This can be specified using the `--config-file` parameter.

```
% docker run cgr.dev/chainguard/weaviate --help
Usage:
  weaviate [OPTIONS]

Cloud-native, modular vector search engine

Application Options:
      --scheme=            the listeners to enable, this can be repeated and
                           defaults to the schemes in the swagger spec
      --cleanup-timeout=   grace period for which to wait before killing idle
                           connections (default: 10s)
      --graceful-timeout=  grace period for which to wait before shutting down
                           the server (default: 15s)
      --max-header-size=   controls the maximum number of bytes the server will
                           read parsing the request header's keys and values,
                           including the request line. It does not limit the
                           size of the request body. (default: 1MiB)
      --socket-path=       the unix socket to listen on (default:
                           /var/run/weaviate.sock)
      --host=              the IP to listen on (default: localhost) [$HOST]
      --port=              the port to listen on for insecure connections,
                           defaults to a random value [$PORT]
      --listen-limit=      limit the number of outstanding requests
      --keep-alive=        sets the TCP keep-alive timeouts on accepted
                           connections. It prunes dead TCP connections ( e.g.
                           closing laptop mid-download) (default: 3m)
      --read-timeout=      maximum duration before timing out read of the
                           request (default: 30s)
      --write-timeout=     maximum duration before timing out write of the
                           response (default: 60s)
      --tls-host=          the IP to listen on for tls, when not specified it's
                           the same as --host [$TLS_HOST]
      --tls-port=          the port to listen on for secure connections,
                           defaults to a random value [$TLS_PORT]
      --tls-certificate=   the certificate to use for secure connections
                           [$TLS_CERTIFICATE]
      --tls-key=           the private key to use for secure connections
                           [$TLS_PRIVATE_KEY]
      --tls-ca=            the certificate authority file to be used with
                           mutual tls auth [$TLS_CA_CERTIFICATE]
      --tls-listen-limit=  limit the number of outstanding requests
      --tls-keep-alive=    sets the TCP keep-alive timeouts on accepted
                           connections. It prunes dead TCP connections ( e.g.
                           closing laptop mid-download)
      --tls-read-timeout=  maximum duration before timing out read of the
                           request
      --tls-write-timeout= maximum duration before timing out write of the
                           response

Connector config & MQTT config:
      --config-file=       path to config file (default: ./weaviate.conf.json)

Help Options:
  -h, --help               Show this help message
```

## Helm Deployment

This image is a drop-in replacement for the upstream `weaviate` image, and can be used in the [standard Helm charts](https://github.com/weaviate/weaviate-helm).
To deploy in that helm chart, you can use:

```
$ helm repo add weaviate https://weaviate.github.io/weaviate-helm
$ helm install my-weaviate weaviate/weaviate \
    --set image.registry=cgr.dev \
    --set image.repo=chainguard/weaviate \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-4368

# request-4368
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-4368` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-4368/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### grafana-beyla

# grafana-beyla
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/grafana-beyla` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/grafana-beyla/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open source eBPF-based auto-instrumentation tool that helps you easily get started with application observability

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard Image for Grafana Beyla is meant to serve as a drop-in replacement for [the official Grafana Beyla image](https://hub.docker.com/r/grafana/beyla). Like most other Chainguard Images, this image has few-to-zero CVEs and does not run as the root user.

Since Beyla uses eBPF to instrument applications, it requires certain kernel capabilities to run. When deploying with Docker or Kubernetes, you'll need to provide the necessary privileges.

## Getting Started

Grafana Beyla automatically instruments your applications using eBPF to provide instant observability without code changes. It can be deployed as a sidecar or standalone container.

### Using Docker to Deploy

To run Beyla with Docker, you need to provide the necessary capabilities and mount the host's `/sys` filesystem:

```bash
docker run --rm --privileged \
  -v /sys/kernel/debug:/sys/kernel/debug:ro \
  cgr.dev/ORGANIZATION/grafana-beyla:latest
```

### Using Kubernetes to Deploy

For Kubernetes deployments, Beyla can run as a DaemonSet or sidecar. Here's an example DaemonSet configuration:

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: beyla
spec:
  selector:
    matchLabels:
      app: beyla
  template:
    metadata:
      labels:
        app: beyla
    spec:
      hostPID: true
      containers:
      - name: beyla
        image: cgr.dev/ORGANIZATION/grafana-beyla:latest
        securityContext:
          privileged: true
        env:
        - name: BEYLA_KUBERNETES_ENABLE
          value: "true"
        - name: BEYLA_METRICS_ENDPOINT
          value: "0.0.0.0:9090"
        volumeMounts:
        - name: sys-kernel-debug
          mountPath: /sys/kernel/debug
      volumes:
      - name: sys-kernel-debug
        hostPath:
          path: /sys/kernel/debug
```

Also you can use the official helm chart to deploy Beyla in your Kubernetes cluster. More details can be found in the [Beyla Helm Chart documentation](https://grafana.com/docs/beyla/latest/setup/kubernetes-helm).

In addition to that you can find lots of quick start examples in the [Beyla quickstart guides documentation](https://grafana.com/docs/beyla/latest/quickstart).

### Configuration

Beyla can be configured through environment variables or a configuration file. Key configuration options include:

- `BEYLA_OPEN_PORT`: The port of the application to instrument
- `BEYLA_SERVICE_NAME`: Name for the instrumented service
- `BEYLA_METRICS_ENDPOINT`: Prometheus metrics endpoint
- `BEYLA_TRACES_ENDPOINT`: OpenTelemetry traces endpoint
- `BEYLA_KUBERNETES_ENABLE`: Enable Kubernetes metadata enrichment

You can find more options in the [official documentation](https://grafana.com/docs/beyla/latest/configure/options/#beyla-global-configuration-properties).

## Documentation and Resources

- [Grafana Beyla documentation](https://grafana.com/docs/beyla/latest/)
- [Grafana Beyla GitHub repository](https://github.com/grafana/beyla)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### rabbitmq-iamguarded

# rabbitmq-iamguarded
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/rabbitmq-iamguarded` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/rabbitmq-iamguarded/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[RabbitMQ](https://github.com/rabbitmq/rabbitmq-server) RabbitMQ is a message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Overview

RabbitMQ IAMGuarded is a security-enhanced variant of RabbitMQ designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard RabbitMQ deployments.

## Helm Chart Installation

The RabbitMQ IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# Main RabbitMQ image
image:
  registry: myregistry.example.com
  repository: mirrored/rabbitmq-iamguarded
  digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install rabbitmq oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/rabbitmq
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/rabbitmq:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your RabbitMQ IAMGuarded installation using standard RabbitMQ verification methods. The deployment functions as a standard RabbitMQ instance, so all typical RabbitMQ validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The RabbitMQ IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both RabbitMQ and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spark-operator-fips

# spark-operator-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spark-operator-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spark-operator-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A minimal, FIPS 140-3 compliant image for Spark Operator. Facilitates the deployment and management of Apache Spark applications in Kubernetes environments.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

While Chainguard's Spark Operator FIPS image is comparable to the [Kubeflow Spark Operator image on Docker Hub](https://hub.docker.com/r/kubeflow/spark-operator), Chainguard's image is also FIPS 140-3 compliant. Chainguard's image includes only the minimum set of dependencies needed to run Spark Operator.

Chainguard provides a FIPS compliant Spark image that must be used with the operator.

## FIPS Support

This image contains Bouncy Castle crypto libraries for FIPS.

The FIPS certified version of Bouncy Castle (CMVP [#4743]) is compliant with the FIPS 140-3 standard when used in accordance with the [Bouncy Castle Security Policy].

This image also ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

### Creating a KeyStore

Before getting up and running with Spark Operator FIPS, you'll need to create a BCFKS KeyStore:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-operator-fips:TAG \
  -v -keystore /tmp/keystore/keystore.bcfks \
  -storetype bcfks \
  -providername BCFIPS \
  -alias "localhost" \
  -genkeypair -sigalg SHA512withRSA -keyalg RSA \
  -dname CN="localhost" \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>" \
  -keypass "<YOUR TLS KEY PASSWORD, can be the same>"
```

You can now use keytool to view the KeyStore:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-operator-fips:TAG \
  -v -keystore /tmp/keystore/keystore.bcfks \
  -list \
  -storepass "<YOUR TLS KEYSTORE PASSWORD>"
```

After the KeyStore has been generated, the operator will need to be configured to use it. To do so, you'll need to mount a custom configuration file that will be used by Spark when applications are submitted by the operator.

Create a file, `spark.properties`, with the following contents:

```
spark.ssl.enabled=true
spark.ssl.keyStorePassword=<YOUR TLS KEYSTORE PASSWORD>
spark.ssl.keyStoreType=BCFKS
spark.ssl.keyStore=/usr/lib/spark/conf/keystore.bcfks
```

We will use this later when you deploy the operator. Please consult the official documentation for [configuring Spark](https://spark.apache.org/docs/latest/configuration.html) for guidance on what properties are best for your environment.

### Creating a TrustStore

To create a TrustStore and import and trust an existing CA certificate you can also use keytool:

```bash
docker run -v $(pwd):/tmp/keystore --entrypoint keytool cgr.dev/ORGANIZATION/spark-operator-fips:TAG \
  -v -keystore /tmp/keystore/truststore.bckfs \
  -storetype bcfks \
  -providername BCFIPS \
  -import -file /tmp/keystore/MyCA.crt \
  -storepass "<YOUR TRUSTSTORE PASSWORD>" \
  -trustcacerts \
  -noprompt
```

Configuring the installation of Spark shipped with the operator for use with your TrustStore can be done in your config file as with the KeyStore above. For example, the properties below may be set:

```
spark.ssl.trustStorePassword=<YOUR TRUSTSTORE PASSWORD>
spark.ssl.trustStoreType=BCFKS
spark.ssl.trustStore=/usr/lib/spark/conf/truststore.bcfks
```

If you'd like to use a TrustStore type other than BCFKS, you'll need to set the environment variables below in your values manifest:

```bash
controller:
  env:
  - name: JAVA_TRUSTSTORE_OPTIONS
    value: "-Djavax.net.ssl.trustStoreType=<TRUSTSTORE TYPE>"
  - name: JDK_JAVA_OPTIONS
    value: "--add-exports=java.base/sun.security.internal.spec=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED -Djavax.net.ssl.trustStoreType=<TRUSTSTORE TYPE>"
```

The same variables will need to be overridden for the driver and executor in each job.

### Preparation

Before deploying Spark Operator FIPS, you'll need to create a ConfigMap, `spark-props`, containing your Spark configuration file:

```bash
kubectl create configmap spark-props --from-file=spark.properties
```

Then you'll need to create a PV, secret, or ConfigMap that contains your KeyStore/TrustStore. As an example, to create a secret that contains your KeyStores, you'd first encode both via base64:

```bash
base64 -i ./keystore.bcfks
base64 -i ./truststore.bcfks
```

Then create a resource for the secret in a file, `keystores-secret.yaml`:

```yaml
apiVersion: v1
data:
  keystore.bcfks: |-
    <base64 encoded KeyStore goes here>
  truststore.bcfks: |-
    <base64 encoded TrustStore goes here>
kind: Secret
metadata:
  name: keystores
type: Opaque
```

And apply the resource:

```bash
kubectl apply -f ./keystores-secret.yaml
```

Finally, you'll need to create a values manifest, `values.yaml`:

```yaml
image:
  registry: "cgr.dev"
  repository: "ORGANIZATION/spark-operator-fips"
  tag: "latest"

controller:
  volumes:
  - name: "keystores"
    secret:
      secretName: "keystores"
  - name: "spark-props"
    configMap:
      name: "spark-props"
  - name: "tmp"
    emptyDir:
      sizeLimit: "1Gi"
  volumeMounts:
  - name: "keystores"
    mountPath: "/keystores"
    readOnly: false
  - name: "spark-props"
    mountPath: "/usr/lib/spark/conf/spark-defaults.conf"
    subPath: "spark.properties"
    readOnly: true
  - name: "tmp"
    mountPath: "/tmp"
    readOnly: false
```

Note that a volume must be mounted for `tmp` as it contains Spark artifacts.

### Deployment

To deploy Spark Operator FIPS, start by adding the Helm chart repository:

```bash
helm repo add spark-operator https://kubeflow.github.io/spark-operator
helm repo update
```

Then deploy the operator with Helm:

```bash
helm install spark-operator spark-operator/spark-operator --values ./values.yaml
```

### Submitting Applications

All resources using the operator must be updated as every driver and executor must be configured to use the KeyStore and TrustStore you've generated above. In addition to the KeyStore and TrustStore, you'll also need to provide the same configuration file you created for the operator.

Unlike with the operator, we'll need to mount the config file as `spark.properties` instead of `spark-defaults.conf`, as the operator overrides the default properties file.

As an example, every job's resource should have a similar template:

```yaml
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
...
spec:
  ...
  image: cgr.dev/ORGANIZATION/spark-fips:latest
  ...
  volumes:
  - name: keystores
    secret:
      secretName: keystores
  - name: spark-props
    configMap:
      name: spark-props
      ...
  driver:
    ...
    volumeMounts:
    - name: keystores
      mountPath: /keystores
      readOnly: false
    - name: spark-props
      mountPath: /usr/lib/spark/conf/spark.properties
      subPath: spark.properties
      readOnly: true
  executor:
    ...
    volumeMounts:
    - name: keystores
      mountPath: /keystores
      readOnly: false
    - name: spark-props
      mountPath: /usr/lib/spark/conf/spark.properties
      subPath: spark.properties
      readOnly: true
      ...
```

Submitting your application is as easy as applying the resource that contains the definition for the job:

```bash
kubectl apply -f ./path/to/your/job's/resource/definition.yaml
```

You should now be up and running with Spark Operator FIPS!

## Documentation and Resources

- [Overview](https://www.kubeflow.org/docs/components/spark-operator/overview/)
- [Getting Started](https://www.kubeflow.org/docs/components/spark-operator/getting-started/)
- [User Guide](https://www.kubeflow.org/docs/components/spark-operator/user-guide/)
- [GitHub Repository](https://github.com/kubeflow/spark-operator)
- [Helm Chart](https://github.com/kubeflow/spark-operator/tree/master/charts/spark-operator-chart)
- [Configuring Spark](https://spark.apache.org/docs/latest/configuration.html)
- [Spark Documentation](https://spark.apache.org/documentation.html)
- [Spark Quick Start Tutorial](https://spark.apache.org/docs/latest/quick-start.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### cerbos

# cerbos
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cerbos` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/cerbos/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Cerbos is the open core, language-agnostic, scalable authorization solution that makes user permissions and authorization simple to implement and manage by writing context-aware access control policies for your application resources.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `cerbos` image is a drop-in replacement for the upstream [cerbos/cerbos](https://ghcr.io/cerbos/cerbos) container image. It is fully compatible with the official [cerbos Helm charts](https://github.com/cerbos/helm-charts/) and supports all core functionality of the `cerbos` application. This image is designed to be a minimal, secure alternative that runs as a non-root user. Switching to this image should not require any changes to your existing deployment configuration.

## Getting Started

### Kubernetes Helm Chart Deployment
You can deploy this image using the [official cerbos Helm charts](https://github.com/cerbos/helm-charts/). Be sure to override the image to use the `cerbos` Chainguard Image by setting the following values in a `values.yaml` file:

```yaml
image:
  repository: cgr.dev/ORGANIZATION/cerbos
  release: latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard registry.

Then, deploy the `cerbos` Helm chart, as shown in the following shell example.

```shell
helm repo add cerbos oci://ghcr.io/cerbos/helm-charts/cerbos
helm repo update
HELM_EXPERIMENTAL_OCI=1 helm install cerbos oci://ghcr.io/cerbos/helm-charts/cerbos -f values.yaml --wait
```

You can verify that the Cerbos Helm chart deployed successfully with `kubectl`, as shown in the following command. This will show you the Cerbos pod running from the chart's deployment.

```shell
kubectl get pods | grep cerbos
```

### Docker Container Deployment

To deploy Cerbos using Docker, you can do so using the `docker run` command. By default, Cerbos listens on port 3592 for HTTP requests, and port 3593 for gRPC requests, requiring that these ports be exposed. Execute the following command in your terminal to deploy Cerbos with its default configuration. Please note that the `-d` flag is included to run the container in a detached state, as otherwise Cerbos logs would occupy the terminal. 

```shell
docker run -d -p 3592:3592 -p 3593:3593 --name "cerbos" cgr.dev/ORGANIZATION/cerbos
```

When you are finished with this container, you can remove it with the `docker rm` command, as follows:

```shell
docker rm cerbos
```

To apply custom policies and configurations to Cerbos, the `/policies` and `/config` directories are mounted volumes at runtime. To demonstrate this, begin by using the following commands to create these directories and navigate to them.

```shell
mkdir -p ~/chainguard_cerbos_demo/policies
mkdir -p ~/chainguard_cerbos_demo/config
cd ~/chainguard_cerbos_demo
```

Then, copy the following YAML data into a new file, `policies/derived_roles_common.yaml`:

```shell
cat > policies/derived_roles_common.yaml << 'EOF'
---
apiVersion: "api.cerbos.dev/v1"
derivedRoles:
  name: common_roles
  definitions:
    - name: owner
      parentRoles: ["user"]
      condition:
        match:
          expr: request.resource.attr.owner == request.principal.id
EOF
```

Repeat this process for the configuration of `policies/resource_album.yaml`:

```shell
cat > policies/resource_album.yaml << 'EOF'
---
apiVersion: api.cerbos.dev/v1
resourcePolicy:
  version: "default"
  importDerivedRoles:
    - common_roles
  resource: "album:object"
  rules:
    - actions: ['*']
      effect: EFFECT_ALLOW
      derivedRoles:
        - owner

    - actions: ['view:public']
      effect: EFFECT_ALLOW
      roles:
        - user
      condition:
        match:
          expr: request.resource.attr.public == true
EOF
```

To apply a custom Cerbos configuration, we repeat the process once more for the `config/conf.yaml` file. Note that this configuration establishes a username `linky` and password `LinkyAdmin`, which is utilized for demonstrative purposes only, and should be changed in production use.

```shell
cat > config/conf.yaml << 'EOF'
---
server:
  httpListenAddr: ":3592"
  grpcListenAddr: ":3593"
  adminAPI:
    adminCredentials:
      passwordHash: JDJ5JDEwJGcuRHZ4MFR5a0FQUEZOU1pPMTdkbS5RV242MFY2Um9HYVR0eUpLMzdEQzZxU3g2Wi5SM3kuCgo= # echo "LinkyAdmin" | htpasswd -niBC 10 cerbos | cut -d ':' -f 2 | base64
      username: linky
    enabled: true

storage:
  driver: "disk"
  disk:
    directory: "/policies"
    watchForChanges: true

audit:
  enabled: true # Set to false to completely disable audit logging.
  accessLogsEnabled: true # Log API access attempts
  decisionLogsEnabled: true # Log policy decisions
  backend: local # Audit backend to use.
  local: # Configuration for the local audit backend
    storagePath: /auditlogs # Path to store the data
    retentionPeriod: 168h # Records older than this will be automatically deleted
EOF
```

With all configurations and policies in place, we are ready to deploy our container using the following `docker run` command:

```shell
docker run -d -p 3592:3592 -p 3593:3593 -v $(pwd)/policies:/policies -v $(pwd)/config:/config --name "cerbos" cgr.dev/ORGANIZATION/cerbos server --config=/config/conf.yaml
```

The Cerbos container will now be running with our custom configuration settings. We can test this deployment by sending a simple request to the Cerbos server, using `cURL` as follows.

```shell
curl --silent -H "Content-Type: application/json" \
    --data-binary @- \
    "http://localhost:3592/api/check/resources?pretty" << 'EOF'
{
  "requestId": "quickstart",
  "principal": {
    "id": "linky",
    "roles": [
      "user"
    ],
    "attr": {
      "beta_tester": true
    }
  },
  "resources": [
    {
      "actions": [
        "view:public",
        "comment"
      ],
      "resource": {
        "kind": "album:object",
        "id": "LINKY001",
        "attr": {
          "owner": "linky",
          "public": false,
          "flagged": false
        }
      }
    },
    {
      "actions": [
        "view:public",
        "comment"
      ],
      "resource": {
        "kind": "album:object",
        "id": "WOLFI002",
        "attr": {
          "owner": "wolfi",
          "public": true,
          "flagged": false
        }
      }
    }
  ]
}
EOF
```

You should receive the following in response, reflecting the successful application of the configured Cerbos policies:

```json
{
  "requestId": "quickstart",
  "results": [
    {
      "resource": {
        "id": "LINKY001",
        "kind": "album:object"
      },
      "actions": {
        "comment": "EFFECT_ALLOW",
        "view:public": "EFFECT_ALLOW"
      }
    },
    {
      "resource": {
        "id": "WOLFI002",
        "kind": "album:object"
      },
      "actions": {
        "comment": "EFFECT_DENY",
        "view:public": "EFFECT_ALLOW"
      }
    }
  ]
}
```

We can also verify that the Admin API service was configured correctly with the use of the `cerbosctl` Chainguard Image. First, pull this image from the Chainguard registry using the following command.

```shell
docker pull cgr.dev/ORGANIZATION/cerbosctl
```

With the image pulled locally, execute the following command in your terminal to use `cerbosctl` to query the `cerbos` Chainguard Image's Admin API for its `resource_policies`.

```shell
docker run --rm --network host cgr.dev/ORGANIZATION/cerbosctl get resource_policies --plaintext --username linky --password LinkyAdmin
```

The response from the Admin API should be similar to the following output.

```shell
POLICY ID               NAME            VERSION SCOPE
resource_album.yaml     album:object    default
```

The same can be repeated for a query for Cerbos' `derived_roles`:

```shell
docker run --rm --network host cgr.dev/ORGANIZATION/cerbosctl get derived_roles --plaintext --username linky --password LinkyAdmin
```

The expected output for this request is shown in the following snippet.

```shell
POLICY ID                    NAME
derived_roles_common.yaml    common_roles
```

To clean up your system after completing this demonstration, be sure to run the following commands.
```shell
rm -r ~/chainguard_cerbos_demo && docker rm "cerbos"
```

## Documentation
- [Cerbos GitHub Repository](https://github.com/cerbos/cerbos)
- [Cerbos Helm Charts](https://github.com/cerbos/helm-charts/)
- [Cerbos Documentation](https://docs.cerbos.dev/cerbos-hub/getting-started.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kiali

# kiali
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kiali` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kiali/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

Kiali is a management console for Istio service mesh. It provides graphs, metrics, traces, and validations for your mesh. The Chainguard `kiali` container image is comparable to the [upstream Kiali image](https://hub.docker.com/r/kiali/kiali). Chainguard's `kiali` container image was designed with security and minimalism in mind, and there fore doesn't include things like a shell or package manager.

## Getting Started

Kiali is typically deployed alongside Istio service mesh using Helm charts or Kubernetes manifests. Kiali requires metrics from Prometheus to function properly. Here's a complete example using Helm charts.

First, add the required Helm repositories:

```shell
helm repo add kiali https://kiali.org/helm-charts/
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts/
helm repo update
```

Install Prometheus first (required for Kiali to collect metrics):

```shell
helm install prometheus prometheus-community/prometheus \
  --namespace kiali \
  --create-namespace
```

Then install Kiali with Prometheus integration:

```shell
helm install kiali kiali/kiali-server \
  --namespace kiali \
  --set auth.strategy=anonymous \
  --set deployment.image_name=cgr.dev/ORGANIZATION/kiali \
  --set deployment.image_version=latest \
  --set external_services.prometheus.url=http://prometheus-server.kiali:80
```

You can then access the Kiali dashboard by port-forwarding:

```shell
kubectl -n kiali port-forward svc/kiali 20001:20001
```

Open http://localhost:20001/kiali in your browser to access the Kiali web interface.

To verify Kiali is working correctly, you can test the API endpoint:

```shell
curl -f http://localhost:20001/kiali/api
```

For production deployments, configure proper authentication instead of using anonymous access:

```shell
helm install kiali kiali/kiali-server \
  --namespace kiali \
  --create-namespace \
  --set auth.strategy=openid \
  --set deployment.image_name=cgr.dev/ORGANIZATION/kiali \
  --set deployment.image_version=latest \
  --set external_services.prometheus.url=http://prometheus-server.kiali:80
```

## Documentation and Resources

- [Official Kiali Documentation](https://kiali.io/docs/)
- [Kiali GitHub Repository](https://github.com/kiali/kiali)
- [Kiali Helm Charts](https://kiali.org/helm-charts/)
- [Getting Started with Kiali](https://kiali.io/docs/installation/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### local-volume-node-cleanup-fips

# local-volume-node-cleanup-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/local-volume-node-cleanup-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/local-volume-node-cleanup-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The local volume node cleanup controller removes PersistentVolumes and PersistentVolumeClaims that reference deleted Nodes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-kvrocks

# apache-kvrocks
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-kvrocks` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-kvrocks/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[Apache Kvrocks](https://kvrocks.apache.org/) is a distributed key-value database. Apache Kvrocks uses RocksDB as its storage engine and is compatible with Redis protocol.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Apache Kvrocks container image is comparable to [the Kvrocks image maintained by Apache](https://hub.docker.com/r/apache/kvrocks). Like most other Chainguard container images, the Apache Kvrocks image contains only the dependencies it needs to function, and doesn't include things like a shell or package manager.

## Getting Started
You can start the container with Docker by starting the image and exposing port 6666 - such as:

```bash
  docker run -d --name exporter \
  -p 6666:6666 \
  cgr.dev/ORGANIZATION/apache-kvrocks:latest
```

Next, use `redis-cli` or `valkey-cli` command to connect to the `kvrocks` server. This example will set a key named `samplekey` to the value `examplevalue`:

```shell
redis-cli -p 6666 SET samplekey examplevalue
```

To ensure the database is working correctly, test that you can retrieve the value you just set:

```shell
redis-cli -p 6666 GET samplekey
```

## Using with kvrocks-operator

This image can be used with the [kvrocks-operator](https://github.com/RocksLabs/kvrocks-operator).

First, deploy the operator [by following these instructions from the Kvrocks GitHub repository](https://github.com/RocksLabs/kvrocks-operator?tab=readme-ov-file#deploy).

Next, deploy `kruise`:

```shell
helm repo add openkruise https://openkruise.github.io/charts/
helm repo update
helm install kruise openkruise/kruise
```

Following that, deploy the `kvrocks` CRDs and operator:

```shell
helm repo add kvrocks-operator https://rockslabs.github.io/kvrocks-operator
helm install kvrocks-crd kvrocks-operator/kvrocks-crd -n kvrocks
helm install kvrocks-operator kvrocks-operator/kvrocks-operator -n kvrocks
```

Finally, deploy an instance of a `kvrocks` cluster, by providing a `KVRocks` manifest like the following:

```

apiVersion: kvrocks.apache.org/v1alpha1
kind: KVRocks
metadata:
  name: kvrocks-test
spec:
  image: cgr.dev/ORGANIZATION/apache-kvrocks:latest
  imagePullPolicy: IfNotPresent
  master: 1
  replicas: 3
  password: "..."
  # ...
```

Replace `# ...` with the remaining setup of your specification, including settings for `kvrocksConfig` field as well as any other fields. Please refer to the [standard.yaml](https://github.com/RocksLabs/kvrocks-operator/blob/0f74878/examples/standard.yaml) manifest for an example definition of a `kvrocks` cluster.

## Documentation & Resources

Please refer to the upstream [documentation](https://kvrocks.apache.org/) for more details about Apache Kvrocks.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### request-307

# request-307
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/request-307` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/request-307/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-event-exporter

# kubernetes-event-exporter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-event-exporter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-event-exporter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist [wolfi](https://github.com/wolfi-dev)-based image of [Kubernetes Event Exporter](https://github.com/resmoio/kubernetes-event-exporter) for exporting Kubernetes events to various outputs to be used for observability or alerting purposes.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

The upstream project provides Kubernetes manifests which can be used to deploy
this image. Please see the [GitHub README](https://github.com/resmoio/kubernetes-event-exporter)
for more information. This directs users to the `deploy` sub-directory of the
repository.

If using these reference manifests, you'll need to ensure you update the image
reference in [02-deployment.yaml](https://github.com/resmoio/kubernetes-event-exporter/blob/master/deploy/02-deployment.yaml)
to use this Chainguard image.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### spicedb

# spicedb
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/spicedb` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/spicedb/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

[SpiceDB](https://authzed.com/spicedb) is an open-source authorization database inspired by Google's Zanzibar, providing scalable and fine-grained access control for applications.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `spicedb` image is designed to be a drop-in replacement for the upstream [`authzed/spicedb`](https://hub.docker.com/r/authzed/spicedb) image.
There are no breaking changes between the upstream and Chainguard images.

## Getting Started

### Running with Docker

To quickly test SpiceDB locally, run the following command:

```sh
docker run -d \
  cgr.dev/ORGANIZATION/spicedb:latest \
  serve \
  --grpc-preshared-key "somerandomkeyatleastthirtytwocharacters"
```

### Deploying to Kubernetes with the SpiceDB Operator

The recommended way to deploy SpiceDB on Kubernetes is using the [SpiceDB Operator](https://github.com/authzed/spicedb-operator). First, install the operator:

```sh
kubectl apply --server-side -f https://github.com/authzed/spicedb-operator/releases/latest/download/bundle.yaml
```

Then create a SpiceDB cluster:

```yaml
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: spicedb-config
stringData:
  preshared_key: "somerandomkeyatleastthirtytwocharacters"
---
apiVersion: authzed.com/v1alpha1
kind: SpiceDBCluster
metadata:
  name: spicedb
spec:
  config:
    image: "cgr.dev/ORGANIZATION/spicedb:latest"
  secretName: spicedb-config
EOF
```

**Note**: The SpiceDB operator v1.20.1 has a bug that incorrectly parses image references containing ports (e.g., `registry:5000/image`). If you encounter image pull errors with such references, use the workaround of patching the deployment after creation instead of specifying the image in the CR.

## Documentation and Resources

* [Official SpiceDB Documentation](https://authzed.com/docs/spicedb/getting-started/discovering-spicedb)
* [SpiceDB on GitHub](https://github.com/authzed/spicedb)
* [SpiceDB Playground](https://play.authzed.com/) - Interactive environment for testing schemas

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### valkey-iamguarded-fips

# valkey-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/valkey-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/valkey-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Valkey is an open source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `valkey-sentinel-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

Valkey IAMGuarded FIPS is a FIPS-compliant security-enhanced variant of Valkey designed to be deployed using its companion IAMGuarded Helm chart. This image and chart combination provides additional security benefits over standard Valkey deployments with FIPS 140-2 compliance.

## Helm Chart Installation

The Valkey IAMGuarded Helm chart is delivered exclusively through the same OCI registry as your Chainguard images:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
image:
  registry: myregistry.example.com
  repository: mirrored/valkey-iamguarded-fips
  digest: sha256:... # Use specific digest instead of tag

sentinel:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/valkey-sentinel-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

metrics:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-redis-exporter-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

kubectl:
  image:
    registry: myregistry.example.com
    repository: mirrored/kubectl-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install valkey oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/valkey
   Pulled: cgr.dev/ORGANIZATION/iamguarded-charts/valkey:16.0.2
   Digest: sha256:6471bd888adc895c4c8d259fd72ae7d165da585208bf5670228319c8c0872a49
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your Valkey IAMGuarded FIPS installation using standard Valkey verification methods. The deployment functions as a standard Valkey instance, so all typical Valkey validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The Valkey IAMGuarded FIPS chart provides security-minded defaults while acknowledging the cluster-specific nature of both Valkey and Kubernetes environments. This FIPS-compliant variant ensures cryptographic operations meet FIPS 140-2 standards. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### karpenter

# karpenter
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/karpenter` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/karpenter/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimal image with Karpenter.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Using Karpenter

The Chainguard Karpenter image contains the `karpenter` controller and is a drop-in replacement for the upstream image.

To try it out, follow the [official installation
instructions](https://karpenter.sh/preview/getting-started/getting-started-with-karpenter/) but edit
the Helm command to use the Chainguard image. To do this, you'll first need to retrieve the digest
of the Chainguard image, which you can do with
[crane](https://github.com/google/go-containerregistry/tree/main/cmd/crane) or Docker:

```
$ DIGEST=$(crane digest --platform linux/amd64 cgr.dev/chainguard/karpenter:latest)
$ echo $DIGEST
sha256:8a178372c9e105300104d48065d61022fe1bd268737edaba4ac83e2c10159276

$ docker manifest inspect cgr.dev/chainguard/karpenter | \
  jq '.manifests[] | select(.platform.architecture == "amd64").digest'
$ echo $DIGEST
sha256:8a178372c9e105300104d48065d61022fe1bd268737edaba4ac83e2c10159276
```
Note that you need to specify the platform required to get the correct digest.

Finally, edit the `helm upgrade` command to include the following lines:

```
--set controller.image.repository=cgr.dev/chainguard/karpenter \
--set controller.image.digest=$DIGEST \
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### kubernetes-dashboard-api

# kubernetes-dashboard-api
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/kubernetes-dashboard-api` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/kubernetes-dashboard-api/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Stateless Go module, which could be referred to as a Kubernetes API extension

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

The kubernetes-dashboard-api module serves crucial functions including data aggregation, event handling, and supporting pagination for Kubernetes resources.

## Usage
To deploy the `kubernetes-dashboard-api` using Helm, follow these steps:

```bash
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kubernetes-dashboard --create-namespace \
--set api.image.repository = cgr.dev/chainguard/kubernetes-dashboard-api \
--set api.image.tag = latest
```

## Accessing the Dashboard
To interact with the Dashboard securely, set up a Service Account with necessary permissions. Create a Bearer Token for ServiceAccount and Use kubectl proxy to access Dashboard with a simple URL.

For more in-depth details about the Kubernetes Dashboard and its components, refer to:

[Kubernetes Dashboard GitHub](https://github.com/kubernetes/dashboard) 
[Development Documentation](https://github.com/kubernetes/dashboard/blob/master/DEVELOPMENT.md)
[Accessing the Dashboard Guide](https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md)
[Access Control Documentation](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### crossplane-function-go-templating-fips

# crossplane-function-go-templating-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/crossplane-function-go-templating-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/crossplane-function-go-templating-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

This composition function allows you to compose Crossplane resources using Go templates.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `crossplane-function-go-templating-fips` container image is a drop-in replacement for the upstream [ghcr.io/crossplane-contrib/function-go-templating](https://github.com/crossplane-contrib/function-go-templating/pkgs/container/function-go-templating) image.

## Getting Started Guide

### Install Crossplane

```bash
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane
```

### Install the Function

Deploy the function to your cluster:

```yaml
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
  name: function-go-templating
spec:
  package: cgr.dev/ORGANIZATION/crossplane-function-go-templating-fips:latest
```

Apply this configuration:
```bash
kubectl apply -f function.yaml
```

Verify the function is healthy:
```bash
kubectl get functions
```

For usage examples and detailed documentation, refer to the [upstream project](https://github.com/crossplane-contrib/function-go-templating?tab=readme-ov-file#function-go-templating).

## Documentation and Resources
- [Crossplane Functions Documentation](https://docs.crossplane.io/v2.0/packages/functions/)
- [Upstream Project](https://github.com/crossplane-contrib/function-go-templating)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### falcosidekick

# falcosidekick
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/falcosidekick` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/falcosidekick/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based image for `falcosidekick`.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

`falcosidekick` is a simple daemon for connecting Falco to your ecosystem. It takes a Falco events and forward them to different outputs in a fan-out way.

## Usage

`falcosidekick` is the entrypoint for the container image. Run with `help` to view
list of supported commands and options:

```bash
docker run cgr.dev/chainguard/falcosidekick:latest help
```

For more information, refer to the falco documentation:
- [Install and operate falco](https://falco.org/docs/install-operate/running/)
- [Falco GitHub](https://github.com/falcosecurity/falco)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### aws-cli-fips

# aws-cli-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/aws-cli-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/aws-cli-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard `aws-cli-fips` container image is comparable to the upstream [Amazon AWS CLI image](https://hub.docker.com/r/amazon/aws-cli), with improved security and few-to-zero CVEs. 

### FIPS Support

This Chainguard Container ships with a validated redistribution of the OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Containers, consult the [guide on FIPS-enabled Chainguard Containers on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Getting Started

Before using the `aws-cli-fips` Chainguard Container, you need to configure your [AWS credentials](https://github.com/aws/aws-cli/tree/v2#getting-started). There are a number of ways you can do this, so we encourage you to review the official [AWS credentials documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#configure-precedence) to determine what method works best for you.

AWS credentials and configurations are typically stored in a directory named `.aws`. Assuming you've already set up your AWS credentials locally, you can share them from your host machine to a container by mounting this directory as a volume. The following command follows this method to retrieve a list of S3 buckets:

```shell
docker run --rm -v ~/.aws:/home/nonroot/.aws:ro cgr.dev/ORGANIZATION/aws-cli-fips:latest s3 ls
```

Note that Chainguard's `aws-cli-fips` container image has a single user `nonroot` with uid `65532`, belonging to gid `65532`; the previous command mounts the local `.aws` directory under this user's home directory. Be aware that if you follow this method you may need to adjust the permissions of your local credentials file in order for the container to be able to read it.

## Documentation and Resources

- [AWS CLI User Guide](https://docs.aws.amazon.com/cli/latest/userguide/)
- [AWS CLI Configuration and Credential File Settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### victoriametrics-operator

# victoriametrics-operator
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/victoriametrics-operator` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/victoriametrics-operator/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Kubernetes operator for Victoria Metrics

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

To install the VictoriaMetrics operator using the Helm chart, refer to the
installation instructions provided in the README of the relevant chart:

- [victoria-metrics-operator/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-operator/README.md)
- [victoria-metrics-k8s-stack/README.md](https://github.com/VictoriaMetrics/helm-charts/blob/master/charts/victoria-metrics-k8s-stack/README.md)).

For additional information, see the [quick start guide](https://docs.victoriametrics.com/operator/quick-start).

Below is an example:

```bash
helm repo add vm https://victoriametrics.github.io/helm-charts/
helm repo update
```

Specify the Chainguard image when deploying the chart:

```bash
helm install vmoperator vm/victoria-metrics-operator \
    --set image.registry=cgr.dev \
    --set image.repository=ORGANIZATION/victoriametrics-operator \
    --set image.tag=latest
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### zipkin-slim

# zipkin-slim
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/zipkin-slim` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/zipkin-slim/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Smaller distribution of Zipkin which supports Elasticsearch storage and HTTP or gRPC span collection

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
Chainguard's Zipkin Slim image is comparable to the [upstream Zipkin image](https://github.com/openzipkin/zipkin). Switching to the Chainguard image should not require any changes to your existing setup.

## Getting Started
You can start Zipkin Slim using the following command:

```shell
docker run -p 9411:9411 cgr.dev/ORGANIZATION/zipkin-slim:latest
```

Once the server is running, you can access the Zipkin UI at [http://localhost:9411/zipkin](http://localhost:9411/zipkin).

You can configure your application to send traces with [Zipkin instrumentation](https://zipkin.io/pages/tracers_instrumentation). The following is an example of using Zipkin with a Go application through OpenCensus.

Before running the application, make sure you have [Go tools](https://go.dev/doc/install) installed to build and run the sample application. 

Create a `main.go` file to with the content from this [GitHub repo](https://github.com/chrismld/opencensus-golang-tutorial/blob/zipkin/src/main.go)

Initialize a new Go module:

```shell
go mod init myproject
go mod tidy
```

Once you have the code ready and Zipkin is running, run the application with the following command:

```shell
go run main.go 
```

In the browser, open the URL http://localhost:8080/list and refresh the page as many times as you wish to generate a trace every time you hit the “/list” endpoint. You can also do it through a command line with `curl http://localhost:8080/list`

Go back to the Zipkin browser window and hit **RUN QUERY**; this will allow you to see the traces and inspect their details.

## Documentation and Resources
- [Zipkin on Docker](https://hub.docker.com/r/openzipkin/zipkin)
- [Zipkin Tutorial](https://www.sentinelone.com/blog/zipkin-tutorial-distributed-tracing/)
- [Zipkin Docker Examples](https://github.com/openzipkin/zipkin/blob/master/docker/examples/README.md)
- [Zipkin instrumentation](https://zipkin.io/pages/tracers_instrumentation)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### consul-fips

# consul-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/consul-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/consul-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### php

# php
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/php` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/php/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Minimalist Wolfi-based PHP images for building and running PHP applications. Includes both `dev` and `fpm` variants.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes

The Chainguard PHP Image is comparable to the [official PHP Image from Docker Hub](https://hub.docker.com/_/php). However, the Chainguard image does not run as the root user and contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a shell or a package manager.

Because PHP applications typically require the installation of third-party dependencies with Composer, using a fully distroless image for building your application would not work. In cases like this, it's recommended that you implement a [multi-stage Docker build](https://docs.docker.com/build/building/multi-stage/) that uses one of the PHP image's `-dev` variants to set up the application.

Note that chainguard also offers a `php:latest-fpm` image. This is the distroless `php-fpm` image variant, designed to be used together with our [Nginx](https://images.chainguard.dev/directory/image/nginx/overview) image.

## Getting Started

To better understand how you can work with the Chainguard PHP image, we encourage you to check out our guide on [getting started with PHP](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/php/). This resource demonstrates how you can use Chainguard's PHP Image to set up a distroless container image as a runtime to execute a command-line PHP application.

When creating a Dockerfile to extend Chainguard's PHP images, the recommended approach is to set up a multi-stage build so that you're able to install your Composer dependencies on a separate environment and then copy the files over to a smaller production image.

### Command-line Scripts and Applications

The following example demonstrates how to set up a multi-stage Dockerfile build in the context of command-line PHP applications:

```Dockerfile
FROM cgr.dev/chainguard/php:latest-dev AS builder
COPY . /app
RUN cd /app && \
    composer install --no-progress --no-dev --prefer-dist

FROM cgr.dev/chainguard/php:latest
COPY --from=builder /app /app

ENTRYPOINT [ "php", "/app/command" ]
```

### Web Applications and APIs

For web applications, you should follow the same principle, but using the `php-fpm` variant for the final image. You'll also need a custom `nginx.conf` file to set up your Nginx service with PHP-FPM.

A good way to test your setup locally is by using [Docker Compose](https://docs.docker.com/compose/compose-file/). The following `docker-compose.yaml` file demonstrates how to create a web server environment using the [Nginx Chainguard Image](https://images.chainguard.dev/directory/image/nginx/overview):

```yaml
version: "3.7"
services:
  app:
    image: cgr.dev/chainguard/php:latest-fpm
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./:/app
    networks:
      - wolfi

  nginx:
    image: cgr.dev/chainguard/nginx
    restart: unless-stopped
    ports:
      - 8000:80
    volumes:
      - ./:/app
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - wolfi

networks:
  wolfi:
    driver: bridge
```

Notice that the Nginx service has a volume share to set up a custom config file. The following `nginx.conf` file sets up Nginx to serve pages from an `/app/public` folder and redirects requests to `.php` files to the `app` service on port `9000`.

```php
events {
  worker_connections  1024;
}

http {
    server {
        listen 80;
        index index.php index.html;
        root /app/public;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
}
```

## Configuration

To install application dependencies from your host machine, you can use the `latest-dev` variant with a shared volume:

```shell
docker run --rm -v ${PWD}:/work --entrypoint composer --user root \
    cgr.dev/chainguard/php:latest-dev \
    install --working-dir=/work
```

To obtain information about modules available for the Chainguard PHP image, you can run the following command:

```shell
docker run --rm --entrypoint php cgr.dev/chainguard/php:latest -m
```

To obtain detailed information about the environment, you can run a `php --info` command on any of the image tags and use `grep` to look for a specific module or extension.

For instance, to check for `curl` settings, you can run:

```shell
docker run --rm cgr.dev/chainguard/php:latest --info | grep curl
```

## Documentation and Resources

* [Getting Started with the PHP Chainguard Image](https://edu.chainguard.dev/chainguard/chainguard-images/getting-started/php/)
* [Migrating to PHP Chainguard Images](https://edu.chainguard.dev/chainguard/migration/migrating-php/)
* [Vulnerability Comparison: php](https://edu.chainguard.dev/chainguard/chainguard-images/vuln-comparison/php/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### trillian-fips

# trillian-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/trillian-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/trillian-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Trillian FIPS Images

Trillian is Google's open-source implementation of a transparent, scalable data store using Merkle trees. It serves as the foundation for transparency logs including Certificate Transparency and the Sigstore Rekor transparency log. Trillian provides cryptographic proofs of inclusion and consistency for all data added to the log, ensuring tamper-evident storage.

These FIPS-validated versions provide the same functionality with additional cryptographic compliance for regulated environments.

Chainguard offers two core Trillian FIPS components:

## trillian-logserver-fips

The Trillian log server is the main gRPC service that handles API requests for transparency log operations:

- **Data Retrieval**: Processes get/set requests for Merkle tree data
- **Proof Generation**: Serves inclusion and consistency proofs to verify entries
- **Tree Management**: Manages multiple independent Merkle trees within a single service
- **Client Interface**: Provides the primary API endpoint for transparency log clients

## trillian-logsigner-fips

The Trillian log signer operates as a background service that maintains the cryptographic integrity of the transparency log:

- **Entry Processing**: Periodically processes pending log entries from the queue
- **Tree Updates**: Adds verified entries to the Merkle tree structure
- **Signing**: Updates and signs the tree head to ensure cryptographic consistency
- **Sequencing**: Assigns sequence numbers to entries in normal log mode

## Compatibility Notes

The Chainguard `trillian-logserver-fips` and `trillian-logsigner-fips` images are designed to be drop-in replacements for the standard Trillian components with added FIPS compliance.

### FIPS Support

These Chainguard Images ship with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

> [!NOTE]
> Trillian is currently in maintenance mode. For new transparency log implementations, consider using [Trillian Tessera](https://github.com/transparency-dev/trillian-tessera).

## Getting Started

Deploy the Trillian components individually in Kubernetes.

Note that both components require a MySQL database for storage. Along with the name of your organization in the container's `image` field, you will need to update the `--mysql_uri` argument in both examples to reflect your own configuration. 

### Log Server Deployment

Create a deployment for the log server:

```yaml
cat > trillian-logserver-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: trillian-logserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: trillian-logserver
  template:
    metadata:
      labels:
        app: trillian-logserver
    spec:
      containers:
      - name: logserver
        image: cgr.dev/ORGANIZATION/trillian-logserver-fips:latest
        ports:
        - containerPort: 8090
        - containerPort: 8091
        args:
        - --storage_system=mysql
        - --mysql_uri=user:password@tcp(mysql:3306)/trillian
        - --rpc_endpoint=0.0.0.0:8090
        - --http_endpoint=0.0.0.0:8091
---
apiVersion: v1
kind: Service
metadata:
  name: trillian-logserver
spec:
  selector:
    app: trillian-logserver
  ports:
  - name: grpc
    port: 8090
    targetPort: 8090
  - name: http
    port: 8091
    targetPort: 8091
EOF
```

### Log Signer Deployment

Create a deployment for the log signer:

```yaml
cat > trillian-logsigner-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: trillian-logsigner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: trillian-logsigner
  template:
    metadata:
      labels:
        app: trillian-logsigner
    spec:
      containers:
      - name: logsigner
        image: cgr.dev/ORGANIZATION/trillian-logsigner-fips:latest
        args:
        - --storage_system=mysql
        - --mysql_uri=user:password@tcp(mysql:3306)/trillian
        - --sequencer_interval=1s
        - --batch_size=50
EOF
```

Apply the deployments:

```shell
kubectl apply -f trillian-logserver-deployment.yaml
kubectl apply -f trillian-logsigner-deployment.yaml
```

## Documentation and Resources

- [Trillian GitHub Repository](https://github.com/google/trillian)
- [Certificate Transparency Documentation](https://certificate-transparency.org/)
- [Sigstore Documentation](https://docs.sigstore.dev/)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### apache-hop-fips

# apache-hop-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/apache-hop-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/apache-hop-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Data orchestration and engineering platform for managing ETL/ELT workflows.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## FIPS Compliance

The `apache-hop-fips` Chainguard Image ships with a validated redistribution of the Bouncy Castle FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

### FIPS Configuration Details

This image is pre-configured with the following FIPS-specific settings:

- **Module Path**: The Bouncy Castle FIPS provider is automatically configured via `JAVA_TOOL_OPTIONS` with `--module-path=/usr/share/java/bouncycastle-fips`
- **Trust Store Type**: Default trust store type is set to `BCFKS` for FIPS compliance
- **Key Store Type**: Supports `BCFKS` keystore format for secure key management
- **CLASSPATH**: Pre-configured to include FIPS provider libraries at `/usr/share/java/bouncycastle-fips/*` and `/opt/hop/lib/fips/*`

These settings ensure the container operates in FIPS-compliant mode without requiring additional configuration.

## Usage

### Running with Docker 
```bash
docker run -d \
  -p 8081:8081 \
  -e HOP_SERVER_USER=admin \
  -e HOP_SERVER_PASS=admin \
  cgr.dev/ORGANIZATION/apache-hop-fips:latest
```

### Kubernetes Deployment

Deploy with Helm using FIPS configuration:

```bash
# Add the Apache Hop repository
helm repo add hop https://hop.apache.org/
helm repo update

# Create values file for FIPS deployment
cat <<EOF > values-fips.yaml
server:
  image:
    name: cgr.dev/ORGANIZATION/apache-hop-fips
    tag: latest
EOF

# Install with FIPS configuration
helm install apache-hop-fips hop/hop -f values-fips.yaml
```

For detailed documentation on Apache Hop, visit the [official Apache Hop documentation](https://hop.apache.org/manual/latest/).

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### postgres-repmgr-iamguarded-fips

# postgres-repmgr-iamguarded-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/postgres-repmgr-iamguarded-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/postgres-repmgr-iamguarded-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

PostgreSQL HA, a cluster solution using the PostgreSQL replication manager.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

### FIPS support

The `postgres-repmgr-iamguarded-fips` Chainguard Image ships with a validated redistribution of OpenSSL's FIPS provider module. For more on FIPS support in Chainguard Images, consult the [guide on FIPS-enabled Chainguard Images on Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/fips-images/).

## Overview

PostgreSQL HA IAMGuarded is a security-enhanced variant of PostgreSQL HA, a cluster solution using the PostgreSQL replication manager. This image and chart combination includes a deployment of PostgreSQL cluster, Pgpool-II and an exporter for Prometheus metrics and provides additional security benefits over standard PostgreSQL deployments.

## Helm Chart Installation

The PostgreSQL HA Helm Chart provides solution using the PostgreSQL replication manager:

```
cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
```

### Basic Installation

Once authenticated (see below) you can install the chart with standard Helm commands and your
organization name:

```bash
helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha \
  --set "global.org=$ORGANIZATION"
```

**Important:** Replace `$ORGANIZATION` with your Chainguard organization name. The default organization in the chart values is `chainguard-private`, which must be changed to match your organization.

### Configuration Requirements

#### Organization Setting
The `global.org` value is **required** and can be set either:
- Via `--set` flag during installation
- In your existing `values.yaml` file

#### Registry Configuration
For users who mirror images to custom repositories:
- Use `global.imageRegistry` to override the default `cgr.dev`
- For complex mirroring strategies, consult the chart's `values.yaml` for individual image configuration options including `registry`, `repository`, `tag`, and `digest`

Example `values.yaml` for individual image configuration:
```yaml
# PostgreSQL with replication manager image
postgresql:
  image:
    registry: myregistry.example.com
    repository: mirrored/postgres-repmgr-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Pgpool-II image
pgpool:
  image:
    registry: myregistry.example.com
    repository: mirrored/pgpool2-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag

# Prometheus Exporter
metrics:
  image:
    registry: myregistry.example.com
    repository: mirrored/prometheus-postgres-exporter-iamguarded
    digest: sha256:... # Use specific digest instead of tag

# OS Shell image for volume permissions
volumePermissions:
  enabled: true
  image:
    registry: myregistry.example.com
    repository: mirrored/os-shell-iamguarded-fips
    digest: sha256:... # Use specific digest instead of tag
```

#### Authentication

For detailed instructions on configuring authentication and pull credentials for iamguarded images, please refer to our comprehensive guide:

[How to Use Chainguard Helm Charts](https://edu.chainguard.dev/chainguard/chainguard-images/how-to-use/use-chainguard-helm-charts/)
### Best Practices

1. **Pin to Digest**: While charts follow the same tagging scheme as Chainguard images, always pin to a specific chart digest to prevent unexpected updates:
   ```bash
   helm install postgresql-ha oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha@sha256:DIGEST \
     --set "global.org=$ORGANIZATION"
   ```

   The digest can be found in the output of `helm pull` e.g:

   ```bash
   helm pull oci://cgr.dev/$ORGANIZATION/iamguarded-charts/postgresql-ha
   Pulled: cgr.dev/chainguard-private/iamguarded-charts/postgresql-ha:16.0.3
   Digest: sha256:b8ec9be981d894c6fdbe37b9b43a5293feb22b30c97b8b9c58c7af96facb0397
   ```

2. **Review Default Values**: The chart provides security-minded defaults that are sensible but may not be production-ready for all use cases. Review the chart's `values.yaml` (run `helm show values`) for the full range of configuration options.

3. **Image Pinning**: All IAMGuarded charts pin images to specific digests that have been tested for compatibility, ensuring reliable deployments.

## Validation

After deployment, validate your PostgreSQL IAMGuarded installation using standard PostgreSQL verification methods. The deployment functions as a standard PostgreSQL instance, so all typical PostgreSQL validation procedures apply.

## Prerequisites

Prerequisites are defined in the chart's `Chart.yaml` and individual templates. No additional requirements beyond standard Kubernetes and Helm functionality are needed.

## Security Considerations

The PostgreSQL HA IAMGuarded chart provides security-minded defaults while acknowledging the cluster-specific nature of both PostgreSQL and Kubernetes environments. Review and adjust settings based on your specific security requirements and cluster configuration.

For detailed configuration options and advanced usage, refer to the chart's `values.yaml` file.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### caddy

# caddy
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/caddy` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/caddy/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

Open source web server with automatic HTTPS written in Go

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Usage

This image comes with a default configuration `Caddyfile` located in `/etc/caddy/Caddyfile`.

Please refer to [upstream's excellent (and comprehensive) documentation](https://caddyserver.com/docs/) on the subject of configuring Caddy for your needs.

The following example runs `caddy` with a custom configuration file:

```
docker run -it --rm -v "$(pwd)/Caddyfile:/etc/caddy/Caddyfile" cgr.dev/chainguard/caddy caddy run --config /etc/caddy/Caddyfile
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### opentelemetry-python-instrumentation

# opentelemetry-python-instrumentation
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/opentelemetry-python-instrumentation` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/opentelemetry-python-instrumentation/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

OpenTelemetry auto-instrumentation and instrumentation libraries for Python

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## Compatibility Notes
The Chainguard opentelemetry-python-instrumentation image is comparable to the official opentelemetry-python-instrumentation images. The Chainguard image contains only the minimum set of tools and dependencies needed to function. This means it doesn't include things like a package manager.

## Getting Started
This image is designed to work with the [OpenTelemetry Operator](https://github.com/open-telemetry/opentelemetry-operator) for automatic Python application instrumentation in Kubernetes. The operator injects the instrumentation as an init container into your application pods.

To use this image, create an `Instrumentation` custom resource:

```yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: python-instrumentation
  namespace: my-app-namespace
spec:
  exporter:
    endpoint: http://otel-collector:4317
  propagators:
    - tracecontext
    - baggage
  python:
    image: cgr.dev/ORGANIZATION/opentelemetry-python-instrumentation:latest
```

Then annotate your Python application pods to enable auto-instrumentation:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-python-app
  annotations:
    instrumentation.opentelemetry.io/inject-python: "true"
spec:
  containers:
  - name: app
    image: my-python-app:latest
```

The operator will automatically inject an init container that copies the OpenTelemetry instrumentation packages into your application pod and configures the necessary environment variables (PYTHONPATH, OTEL_* variables) to enable automatic tracing.

## Documentation and Resources
- [GitHub for upstream code](https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation)
- [Official Docs](https://opentelemetry.io/docs/languages/python/)
- [OpenTelemetry Operator Documentation](https://github.com/open-telemetry/opentelemetry-operator)

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### chisel

# chisel
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/chisel` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/chisel/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

A fast TCP/UDP tunnel over HTTP

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

## What is Chisel?

Chisel is a fast TCP/UDP tunnel, transported over HTTP, secured via SSH. It allows you to create secure tunnels through firewalls and NAT devices. This container image provides both server and client functionality for creating encrypted tunnels.

## Usage

The chisel container can be run in two modes: server and client.

### Server Mode

Start a chisel server with authentication:
```bash
docker run -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server --auth username:password
```

Start a server without authentication (not recommended for production):
```bash
docker run -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server
```

### Client Mode

Connect to a chisel server and create a tunnel:
```bash
docker run -p 28080:28080 --name chisel-client -d \
  cgr.dev/$ORGANIZATION/chisel client --auth username:password \
  http://server-host:8080 28080:target-host:80
```

## Complete Example

Here's a complete example that demonstrates setting up a tunnel to access an nginx server:

1. Create a Docker network:
```bash
docker network create chisel-test
```

2. Start an nginx server:
```bash
docker run --network chisel-test -p 18080:8080 --name nginx -d \
  cgr.dev/$ORGANIZATION/nginx
```

3. Start the chisel server:
```bash
docker run --network chisel-test -p 8080:8080 --name chisel-server -d \
  cgr.dev/$ORGANIZATION/chisel server --auth testuser:S3cr3tP@ssword
```

4. Start the chisel client to create a tunnel:
```bash
docker run --network chisel-test -p 28080:28080 --name chisel-client -d \
  cgr.dev/$ORGANIZATION/chisel client --auth testuser:S3cr3tP@ssword \
  http://chisel-server:8080 28080:nginx:8080
```

5. Test the tunnel:
```bash
# Access nginx directly
curl http://localhost:18080

# Access nginx through the chisel tunnel
curl http://localhost:28080
```

## Common Use Cases

- **Bypassing firewalls**: Create tunnels through restrictive network environments
- **Accessing internal services**: Expose internal services through a single HTTP endpoint
- **Reverse tunnels**: Allow external access to services behind NAT
- **Port forwarding**: Forward local ports to remote services

## Security Notes

- Always use authentication (`--auth username:password`) in production environments
- Consider using TLS/HTTPS for the transport layer when possible
- Regularly rotate authentication credentials
- Monitor tunnel usage and connections

## Troubleshooting

Check server logs:
```bash
docker logs chisel-server
```

Check client logs:
```bash
docker logs chisel-client
```

The server should show "Listening on" and the client should show "Connected" when the tunnel is established successfully.

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->

### tekton-cli-fips

# tekton-cli-fips
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/tekton-cli-fips` |

* [View container image in the Chainguard Containers Directory](https://images.chainguard.dev/directory/image/tekton-cli-fips/versions) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/contact?utm_source=readmes) for enterprise support, SLAs, and access to older tags.

---

# Chainguard Container for REPO_NAME

The Tekton Pipelines CLI project provides a command-line interface (CLI) for interacting with Tekton, an open-source framework for Continuous Integration and Delivery (CI/CD) systems.

Chainguard Containers are regularly-updated, secure-by-default container images.

## Download this Container Image
For those with access, this container image is available on `cgr.dev`:

```
docker pull cgr.dev/ORGANIZATION/REPO_NAME:latest
```

Be sure to replace the `ORGANIZATION` placeholder with the name used for your organization's private repository within the Chainguard Registry.

[Tekton](https://tekton.dev) provides a cloud-native Pipeline resource, mainly intended for CI/CD use cases.

The [Tekton CLI](https://tekton.dev/docs/cli/) is a command-line interface for Tekton.

## Usage

These images a drop-in replacement for the upstream images.

You can use an [upstream release](https://github.com/tektoncd/pipeline/releases) and replace the released images with those from Chainguard.

```bash
docker run cgr.dev/chainguard/tekton-cli-fips version
```

## What are Chainguard Containers?

Chainguard's free tier of Starter container images are built with [Wolfi](https://edu.chainguard.dev/open-source/wolfi/overview?utm_source=readmes), our minimal Linux _[undistro](https://edu.chainguard.dev/open-source/wolfi/overview/#why-undistro)_.

All other Chainguard Containers are built with [Chainguard OS](https://edu.chainguard.dev/chainguard/chainguard-os/overview/?utm_source=readmes), Chainguard's minimal Linux operating system designed to produce container images that meet the requirements of a more secure software supply chain.

The main features of Chainguard Containers include:

* Minimal design, without unnecessary software bloat
* Daily builds to ensure container images are up-to-date with available security patches
* [High quality build-time SBOMs](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/?utm_source=readmes) attesting to the provenance of all artifacts within the image
* [Verifiable signatures](https://edu.chainguard.dev/chainguard/chainguard-images/working-with-images/retrieve-image-sboms/) provided by [Sigstore](https://edu.chainguard.dev/open-source/sigstore/cosign/an-introduction-to-cosign/?utm_source=readmes)
* Reproducible builds with Cosign and apko ([read more about reproducibility](https://www.chainguard.dev/unchained/reproducing-chainguards-reproducible-image-builds?utm_source=readmes))

For cases where you need container images with shells and package managers to build or debug, most Chainguard Containers come paired with [a *development*, or `-dev`, variant](https://edu.chainguard.dev/chainguard/chainguard-images/about/differences-development-production/).

In all other cases, including Chainguard Containers tagged as `:latest` or with a specific version number, the container images include only an open-source application and its runtime dependencies. These minimal container images typically do not contain a shell or package manager.

Although the `-dev` container image variants have similar security features as their more minimal versions, they include additional software that is typically not necessary in production environments. We recommend using multi-stage builds to copy artifacts from the `-dev` variant into a more minimal production image.

## Need additional packages?

To improve security, Chainguard Containers include only essential dependencies. Need more packages? Chainguard customers can use [Custom Assembly](https://edu.chainguard.dev/chainguard/chainguard-images/features/ca-docs/custom-assembly/) to add packages, either through the Console, `chainctl`, or API.

To use Custom Assembly in the Chainguard Console: navigate to the image you'd like to customize in [your Organization's list of images](https://console.chainguard.dev/images/organization), and click on the **Customize image** button at the top of the page.

## Learn More

Refer to our Chainguard Containers documentation on [Chainguard Academy](https://edu.chainguard.dev/?utm_source=readmes). Chainguard also offers [VMs](https://www.chainguard.dev/vms?utm_source=readmes) and [Libraries](https://www.chainguard.dev/libraries?utm_source=readmes) — [contact us](https://www.chainguard.dev/contact?utm_source=readmes) for access.

## Trademarks

_This software listing is packaged by Chainguard. The trademarks set forth in this offering are owned by their respective companies, and use of them does not imply any affiliation, sponsorship, or endorsement by such companies._

<!-- IMAGE_SEPARATOR -->
